Compare commits
1 commit
main
...
krille/new
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
47312f160e |
588 changed files with 103914 additions and 135389 deletions
3
.github/CODEOWNERS
vendored
3
.github/CODEOWNERS
vendored
|
|
@ -1,3 +0,0 @@
|
|||
* @krille-chan
|
||||
pubspec.* @dependabot
|
||||
lib/l10n/*.arb @weblate
|
||||
22
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
22
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
|
@ -34,28 +34,6 @@ body:
|
|||
placeholder: "e.g. 1.12.0"
|
||||
validations:
|
||||
required: true
|
||||
- type: dropdown
|
||||
id: platform
|
||||
attributes:
|
||||
label: "Platform"
|
||||
description: "Select the platform where the bug occurs."
|
||||
options:
|
||||
- Android (PlayStore)
|
||||
- Android (F-Droid)
|
||||
- Android (Other)
|
||||
- iOS (iPhone)
|
||||
- iOS (iPad)
|
||||
- Web (Chrome(ium))
|
||||
- Web (Firefox)
|
||||
- Web (Safari)
|
||||
- Linux (Snap)
|
||||
- Linux (Flatpak)
|
||||
- Linux (Other)
|
||||
- macOS (iOS/iPadOS version)
|
||||
- macOS (Self-compiled)
|
||||
- Windows (Self-compiled)
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
id: platform-info
|
||||
attributes:
|
||||
|
|
|
|||
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
|
|
@ -1,5 +1,5 @@
|
|||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: 👬 FluffyChat Community
|
||||
url: https://matrix.to/#/#fluffy-space:matrix.org
|
||||
about: Please ask and answer questions here.
|
||||
url: https://matrix.to/#/#fluffychat:matrix.org
|
||||
about: Please ask and answer questions here.
|
||||
5
.github/ISSUE_TEMPLATE/test_report.md
vendored
5
.github/ISSUE_TEMPLATE/test_report.md
vendored
|
|
@ -2,7 +2,7 @@
|
|||
name: 📝 Test
|
||||
about: A detailed protocol for testing all features
|
||||
title: 'Test Report'
|
||||
labels: test
|
||||
label: test
|
||||
---
|
||||
|
||||
1. App receives push notifications over Firebase Cloud Messaging when it is in background/terminated:
|
||||
|
|
@ -39,6 +39,3 @@ labels: test
|
|||
10. Drag&Drop to send a file into a chat still works:
|
||||
- [ ] Web
|
||||
- [ ] Linux
|
||||
11. Deeplinks are still working? https://matrix.to/#/@krille:janian.de
|
||||
- [ ] Android
|
||||
- [ ] iOS
|
||||
50
.github/actions/free_up_space/action.yaml
vendored
50
.github/actions/free_up_space/action.yaml
vendored
|
|
@ -1,50 +0,0 @@
|
|||
name: "Free up space"
|
||||
|
||||
inputs:
|
||||
target:
|
||||
required: true
|
||||
|
||||
runs:
|
||||
using: "composite"
|
||||
steps:
|
||||
- name: Free up space
|
||||
shell: bash
|
||||
run: |
|
||||
sudo rm -rf /usr/share/dotnet
|
||||
sudo rm -rf /usr/local/share/boost
|
||||
sudo rm -rf /usr/local/share/chromium
|
||||
sudo rm -rf /usr/local/share/powershell
|
||||
sudo rm -rf /usr/local/share/vcpkg
|
||||
sudo rm -rf /usr/local/share/miniconda
|
||||
sudo rm -rf /opt/ghc
|
||||
sudo rm -rf /opt/hostedtoolcache/CodeQL
|
||||
sudo rm -rf /opt/hostedtoolcache/go
|
||||
sudo rm -rf /opt/hostedtoolcache/Python
|
||||
sudo rm -rf /opt/hostedtoolcache/node
|
||||
sudo rm -rf /opt/hostedtoolcache/R
|
||||
sudo rm -rf /opt/hostedtoolcache/Java
|
||||
sudo rm -rf /opt/hostedtoolcache/LLVM
|
||||
sudo rm -rf /opt/hostedtoolcache/Swift
|
||||
sudo rm -rf /opt/hostedtoolcache/Php
|
||||
sudo rm -rf /opt/hostedtoolcache/Perl
|
||||
sudo rm -rf /opt/hostedtoolcache/Scala
|
||||
sudo rm -rf /opt/hostedtoolcache/Julia
|
||||
sudo rm -rf /opt/hostedtoolcache/Mono
|
||||
sudo rm -rf /opt/hostedtoolcache/PowerShell
|
||||
sudo rm -rf /opt/hostedtoolcache/Crystal
|
||||
sudo rm -rf /opt/hostedtoolcache/Elixir
|
||||
sudo rm -rf /opt/hostedtoolcache/Erlang
|
||||
sudo rm -rf /opt/hostedtoolcache/FSharp
|
||||
sudo rm -rf /opt/hostedtoolcache/Haskell
|
||||
sudo rm -rf /opt/hostedtoolcache/OCaml
|
||||
sudo rm -rf /opt/hostedtoolcache/Sbt
|
||||
sudo rm -rf /opt/hostedtoolcache/Solidity
|
||||
sudo rm -rf /opt/hostedtoolcache/VisualStudio
|
||||
sudo rm -rf /opt/hostedtoolcache/WinAppDriver
|
||||
sudo rm -rf /opt/hostedtoolcache/Xamarin
|
||||
sudo rm -rf /opt/hostedtoolcache/Yarn
|
||||
sudo rm -rf /opt/hostedtoolcache/Zephyr
|
||||
sudo rm -rf /opt/hostedtoolcache/zig
|
||||
sudo rm -rf /opt/hostedtoolcache/zulu
|
||||
sudo rm -rf /opt/hostedtoolcache/azcopy
|
||||
echo "export CARGO_BUILD_JOBS=1" >> $GITHUB_ENV
|
||||
12
.github/dependabot.yml
vendored
12
.github/dependabot.yml
vendored
|
|
@ -9,15 +9,3 @@ updates:
|
|||
commit-message:
|
||||
prefix: "build: "
|
||||
include: "scope"
|
||||
assignees:
|
||||
- "krille-chan"
|
||||
open-pull-requests-limit: 5
|
||||
- package-ecosystem: "github-actions"
|
||||
directory: "/"
|
||||
schedule:
|
||||
interval: "daily"
|
||||
allow:
|
||||
- dependency-name: "*"
|
||||
commit-message:
|
||||
prefix: "build: "
|
||||
include: "scope"
|
||||
|
|
|
|||
14
.github/pull_request_template.md
vendored
14
.github/pull_request_template.md
vendored
|
|
@ -1,14 +0,0 @@
|
|||
*Thank you so much for your contribution to FluffyChat ❤️❤️❤️*
|
||||
|
||||
- [ ] I have read and understood the [contributing guidelines](https://github.com/krille-chan/fluffychat/blob/main/CONTRIBUTING.md).
|
||||
|
||||
### Pull Request has been tested on:
|
||||
|
||||
- [ ] Android
|
||||
- [ ] iOS
|
||||
- [ ] Browser (Chromium based)
|
||||
- [ ] Browser (Firefox based)
|
||||
- [ ] Browser (WebKit based)
|
||||
- [ ] Desktop Linux
|
||||
- [ ] Desktop Windows
|
||||
- [ ] Desktop macOS
|
||||
232
.github/workflows/integrate.yaml
vendored
232
.github/workflows/integrate.yaml
vendored
|
|
@ -8,242 +8,76 @@ jobs:
|
|||
code_tests:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: webiny/action-conventional-commits@v1.3.1
|
||||
- run: ./scripts/generate-locale-config.sh
|
||||
- run: git diff --exit-code
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- name: Check for unused translations
|
||||
run: flutter pub run translations_cleaner list-unused-terms -a
|
||||
- run: flutter pub get
|
||||
- name: Check if pubspec.lock is up to date
|
||||
run: git diff --exit-code pubspec.lock
|
||||
- name: Check 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: Search unused dependencies
|
||||
run: |
|
||||
dart pub global activate dependency_validator
|
||||
dart pub global run dependency_validator
|
||||
- run: dart run dart_code_linter:metrics analyze lib --reporter=github
|
||||
- run: dart run dart_code_linter:metrics check-unused-code lib
|
||||
- run: dart run dart_code_linter:metrics check-unused-files lib
|
||||
- run: dart run dart_code_linter:metrics check-unused-l10n lib
|
||||
- name: Check for commented-out Dart code with semicolons
|
||||
run: |
|
||||
if grep -R --include="*.dart" -nE '^[[:space:]]*//[^/<].*;[[:space:]]*$' lib/; then
|
||||
echo ""
|
||||
echo "❌ Found commented-out Dart code ending with semicolon."
|
||||
exit 1
|
||||
fi
|
||||
- name: Add Firebase Messaging
|
||||
run: ./scripts/add-firebase-messaging.sh
|
||||
- name: Apply google services patch
|
||||
run: git apply ./scripts/enable-android-google-services.patch
|
||||
- run: flutter analyze
|
||||
- run: flutter test
|
||||
|
||||
build_debug_apk:
|
||||
needs: [ code_tests ]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: ./.github/actions/free_up_space
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
with:
|
||||
cache: true
|
||||
- name: Cache Gradle
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
~/.gradle/caches
|
||||
~/.gradle/wrapper
|
||||
key: gradle-${{ runner.os }}-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
|
||||
restore-keys: gradle-${{ runner.os }}-
|
||||
- run: ./scripts/add-firebase-messaging.sh
|
||||
- run: flutter build apk --debug --target-platform android-x64
|
||||
- name: Upload Debug APK
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: debug-apk-x64
|
||||
path: build/app/outputs/flutter-apk/app-debug.apk
|
||||
- run: flutter pub get
|
||||
- run: flutter build apk --debug
|
||||
|
||||
build_debug_web:
|
||||
needs: [ code_tests ]
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
- run: flutter pub get
|
||||
- name: Prepare web
|
||||
run: ./scripts/prepare-web.sh
|
||||
- run: flutter build web --dart-define=WITH_SEMANTICS=true
|
||||
- name: Upload Web Build
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: Web Build
|
||||
path: build/web
|
||||
- run: flutter build web
|
||||
|
||||
build_debug_linux:
|
||||
needs: [ code_tests ]
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [ x64, arm64 ]
|
||||
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
- 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 git wget curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
||||
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
|
||||
- name: Install Flutter
|
||||
run: |
|
||||
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
||||
./flutter/bin/flutter doctor
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: ./flutter/bin/flutter pub get
|
||||
- run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }}
|
||||
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 -y
|
||||
- run: flutter pub get
|
||||
- run: flutter build linux --target-platform linux-x64
|
||||
|
||||
build_debug_ios:
|
||||
needs: [ code_tests ]
|
||||
runs-on: macos-15
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- name: Use Xcode 16.4
|
||||
run: sudo xcode-select --switch /Applications/Xcode_16.4.app
|
||||
- run: brew install sqlcipher
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- name: Add Firebase Messaging
|
||||
run: |
|
||||
flutter pub add fcm_shared_isolate:0.1.0
|
||||
sed -i '' 's,//<GOOGLE_SERVICES>,,g' lib/utils/background_push.dart
|
||||
- name: Setup Xcode version
|
||||
uses: maxim-lobanov/setup-xcode@v1.5.1
|
||||
- run: flutter pub get
|
||||
- run: flutter build ios --no-codesign
|
||||
|
||||
integration_test:
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 60
|
||||
needs: [ build_debug_apk ]
|
||||
strategy:
|
||||
matrix:
|
||||
api-level: [34]
|
||||
env:
|
||||
ANDROID_USER_HOME: /home/runner/.android
|
||||
ANDROID_EMULATOR_HOME: /home/runner/.android
|
||||
ANDROID_AVD_HOME: /home/runner/.android/avd
|
||||
AVD_CONFIG_PATH: "~/.android/avd/test.avd/config.ini"
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: debug-apk-x64
|
||||
path: .
|
||||
- uses: ./.github/actions/free_up_space
|
||||
# https://github.blog/changelog/2023-02-23-hardware-accelerated-android-virtualization-on-actions-windows-and-linux-larger-hosted-runners/
|
||||
- name: Enable KVM group perms
|
||||
run: |
|
||||
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' | sudo tee /etc/udev/rules.d/99-kvm4all.rules
|
||||
sudo udevadm control --reload-rules
|
||||
sudo udevadm trigger --name-match=kvm
|
||||
- name: AVD cache
|
||||
uses: actions/cache@v5
|
||||
id: avd-cache
|
||||
with:
|
||||
path: ~/.android/*
|
||||
key: avd-${{ matrix.api-level }}-integration_docker
|
||||
- name: create AVD and generate snapshot for caching
|
||||
if: steps.avd-cache.outputs.cache-hit != 'true'
|
||||
uses: reactivecircus/android-emulator-runner@d94c3fbe4fe6a29e4a5ba47c12fb47677c73656b
|
||||
with:
|
||||
api-level: ${{ matrix.api-level }}
|
||||
target: google_apis
|
||||
arch: x86_64
|
||||
cores: 16
|
||||
ndk: 28.2.13676358
|
||||
force-avd-creation: false
|
||||
disk-size: 4096M
|
||||
ram-size: 4096M
|
||||
sdcard-path-or-size: 4096M
|
||||
emulator-options: -no-window -wipe-data -accel on -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
script: |
|
||||
cat ${{ env.AVD_CONFIG_PATH }}
|
||||
|
||||
sed -i.bak 's/hw.lcd.density = .*/hw.lcd.density=420/' ${{ env.AVD_CONFIG_PATH }}
|
||||
sed -i.bak 's/hw.lcd.height = .*/hw.lcd.height=1920/' ${{ env.AVD_CONFIG_PATH }}
|
||||
sed -i.bak 's/hw.lcd.width = .*/hw.lcd.width=1080/' ${{ env.AVD_CONFIG_PATH }}
|
||||
|
||||
if ! grep -q "hw.lcd.density" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.density = 420" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi
|
||||
if ! grep -q "hw.lcd.height" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.height = 1920" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi
|
||||
if ! grep -q "hw.lcd.width" ${{ env.AVD_CONFIG_PATH }} && echo "hw.lcd.width = 1080" >> ${{ env.AVD_CONFIG_PATH }}; then :; fi
|
||||
|
||||
echo "Emulator settings (${{ env.AVD_CONFIG_PATH }})"
|
||||
cat ${{ env.AVD_CONFIG_PATH }}
|
||||
echo "Generated AVD snapshot for caching."
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
cache: true
|
||||
- uses: remarkablemark/setup-maestro-cli@v1
|
||||
- name: Load integration test env
|
||||
run: cat integration_test/data/integration_users.env >> $GITHUB_ENV
|
||||
- name: Prepare Homeserver
|
||||
run: |
|
||||
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
|
||||
while ! curl -XGET "http://$HOMESERVER/_matrix/client/v3/login" >/dev/null 2>/dev/null; do
|
||||
echo "Waiting for homeserver to be available... (GET http://$HOMESERVER/_matrix/client/v3/login)"
|
||||
sleep 2
|
||||
done
|
||||
|
||||
echo "Homeserver is online!"
|
||||
|
||||
# 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"
|
||||
|
||||
- name: Integration tests
|
||||
id: integration_tests
|
||||
uses: reactivecircus/android-emulator-runner@v2
|
||||
with:
|
||||
api-level: ${{ matrix.api-level }}
|
||||
target: google_apis
|
||||
arch: x86_64
|
||||
cores: 16
|
||||
ndk: 28.2.13676358
|
||||
force-avd-creation: false
|
||||
disk-size: 4096M
|
||||
ram-size: 4096M
|
||||
sdcard-path-or-size: 4096M
|
||||
emulator-options: -no-snapshot-save -no-window -wipe-data -accel on -gpu swiftshader_indirect -noaudio -no-boot-anim -camera-back none
|
||||
script: |
|
||||
flutter run --use-application-binary=$PWD/app-debug.apk > flutter_logs.txt 2>&1 &
|
||||
FLUTTER_PID=$!
|
||||
maestro test integration_test/login.yaml --env HOMESERVER=10.0.2.2 --env USER1_NAME=${USER1_NAME} --env USER1_PW=${USER1_PW}
|
||||
kill $FLUTTER_PID 2>/dev/null || true
|
||||
cp flutter_logs.txt ~/.maestro/tests/
|
||||
- name: Upload Flutter and Maestro logs
|
||||
if: failure()
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: maestro-logs
|
||||
path: ~/.maestro/tests
|
||||
if-no-files-found: ignore
|
||||
|
|
@ -10,18 +10,17 @@ jobs:
|
|||
issues: write
|
||||
pull-requests: write
|
||||
steps:
|
||||
- uses: actions/stale@v9
|
||||
- uses: actions/stale@v5
|
||||
with:
|
||||
days-before-issue-stale: 365
|
||||
days-before-issue-stale: 30
|
||||
days-before-issue-close: 14
|
||||
stale-issue-label: "stale"
|
||||
stale-issue-message: "This issue is stale because it has been open for 365 days with no activity."
|
||||
stale-issue-message: "This issue is stale because it has been open for 30 days with no activity."
|
||||
close-issue-message: "This issue was closed because it has been inactive for 14 days since being marked as stale."
|
||||
stale-pr-message: "This pull request is stale because it has been open for 365 days with no activity."
|
||||
stale-pr-message: "This pull request is stale because it has been open for 30 days with no activity."
|
||||
close-pr-message: "This pull request was closed because it has been inactive for 14 days since being marked as stale."
|
||||
days-before-pr-stale: 365
|
||||
days-before-pr-stale: 30
|
||||
days-before-pr-close: 14
|
||||
exempt-milestones: true
|
||||
exempt-assignees: krille-chan
|
||||
operations-per-run: 500
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
50
.github/workflows/main_deploy.yaml
vendored
50
.github/workflows/main_deploy.yaml
vendored
|
|
@ -4,7 +4,6 @@ on:
|
|||
push:
|
||||
branches:
|
||||
- main
|
||||
workflow_dispatch:
|
||||
|
||||
concurrency:
|
||||
group: main_deploy
|
||||
|
|
@ -14,47 +13,53 @@ jobs:
|
|||
deploy_web:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
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
|
||||
- run: rm ./assets/vodozemac/.gitignore
|
||||
- run: flutter pub get
|
||||
- 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
|
||||
run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps --base-href "/web/"
|
||||
- name: Build Website
|
||||
run: |
|
||||
cd docs && npx tailwindcss -o ./tailwind.css --minify && cd ..
|
||||
mv docs public
|
||||
mv repo public || true
|
||||
mv build/web/ public/web
|
||||
echo "fluffychat.im" > ./public/CNAME
|
||||
- name: Deploy to GitHub Pages
|
||||
uses: peaceiris/actions-gh-pages@v4
|
||||
uses: peaceiris/actions-gh-pages@v3
|
||||
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@v6
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '3.3'
|
||||
- uses: ./.github/actions/free_up_space
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
ruby-version: 2.7
|
||||
- name: Install Fastlane
|
||||
run: gem install fastlane -NV
|
||||
- name: Add Firebase Messaging
|
||||
run: |
|
||||
echo '${{secrets.GOOGLE_SERVICES_JSON}}' | base64 -d > android/app/google-services.json
|
||||
./scripts/add-firebase-messaging.sh
|
||||
- name: Apply Google Services Patch
|
||||
run: git apply ./scripts/enable-android-google-services.patch
|
||||
- run: flutter pub get
|
||||
- name: Prepare Android Release Build
|
||||
env:
|
||||
|
|
@ -63,10 +68,7 @@ jobs:
|
|||
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
|
||||
- name: Set changelog
|
||||
working-directory: android/fastlane/metadata/android/en-US/changelogs
|
||||
run: git log --no-merges -1 --pretty=%B > default.txt
|
||||
run: flutter build appbundle --target-platform android-arm,android-arm64,android-x64
|
||||
- name: Deploy Android Release
|
||||
run: |
|
||||
mkdir -p build/android
|
||||
|
|
|
|||
60
.github/workflows/matrix_notify.yaml
vendored
60
.github/workflows/matrix_notify.yaml
vendored
|
|
@ -1,60 +0,0 @@
|
|||
name: Matrix Notification
|
||||
|
||||
on:
|
||||
issues:
|
||||
types: [opened]
|
||||
pull_request_target:
|
||||
types: [opened]
|
||||
|
||||
jobs:
|
||||
notify:
|
||||
if: ${{ (github.event_name == 'issues' && github.event.issue.user.login != 'krille-chan') || (github.event_name == 'pull_request_target' && github.event.pull_request.user.login != 'krille-chan') }}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Send notification to Matrix room
|
||||
env:
|
||||
HOMESERVER: ${{ secrets.MATRIX_HOMESERVER }}
|
||||
ACCESS_TOKEN: ${{ secrets.MATRIX_ACCESS_TOKEN }}
|
||||
ROOM_ID: ${{ secrets.MATRIX_ROOM_ID }}
|
||||
EVENT_NAME: ${{ github.event_name }}
|
||||
ISSUE_TITLE: ${{ github.event.issue.title }}
|
||||
ISSUE_URL: ${{ github.event.issue.html_url }}
|
||||
ISSUE_LABELS: ${{ join(github.event.issue.labels.*.name, ', ') }}
|
||||
ISSUE_AUTHOR: ${{ github.event.issue.user.login }}
|
||||
PR_TITLE: ${{ github.event.pull_request.title }}
|
||||
PR_URL: ${{ github.event.pull_request.html_url }}
|
||||
PR_LABELS: ${{ join(github.event.pull_request.labels.*.name, ', ') }}
|
||||
PR_AUTHOR: ${{ github.event.pull_request.user.login }}
|
||||
run: |
|
||||
if [ "${EVENT_NAME}" = "issues" ]; then
|
||||
EMOJI="📝"
|
||||
PREFIX="New Issue"
|
||||
TITLE="${ISSUE_TITLE}"
|
||||
URL="${ISSUE_URL}"
|
||||
LABELS="${ISSUE_LABELS}"
|
||||
AUTHOR="${ISSUE_AUTHOR}"
|
||||
else
|
||||
EMOJI="🔀"
|
||||
PREFIX="New Pull Request"
|
||||
TITLE="${PR_TITLE}"
|
||||
URL="${PR_URL}"
|
||||
LABELS="${PR_LABELS}"
|
||||
AUTHOR="${PR_AUTHOR}"
|
||||
fi
|
||||
|
||||
AUTHOR_URL="https://github.com/${AUTHOR}"
|
||||
PLAIN="${EMOJI} ${PREFIX} by ${AUTHOR}: ${TITLE} - ${URL}"
|
||||
HTML="<h3>${EMOJI} ${PREFIX}</h3>"
|
||||
HTML="${HTML}<b><a href='${URL}'>${TITLE}</a></b><br/>"
|
||||
HTML="${HTML}👤 <a href='${AUTHOR_URL}'>${AUTHOR}</a>"
|
||||
if [ -n "${LABELS}" ]; then
|
||||
HTML="${HTML}<br/>🏷️ ${LABELS}"
|
||||
fi
|
||||
TXN_ID=$(date +%s%N)
|
||||
|
||||
curl -s -o /dev/null -w "%{http_code}" -X PUT \
|
||||
"${HOMESERVER}/_matrix/client/v3/rooms/${ROOM_ID}/send/m.room.message/${TXN_ID}" \
|
||||
-H "Authorization: Bearer ${ACCESS_TOKEN}" \
|
||||
-H "Content-Type: application/json" \
|
||||
-d "$(jq -n --arg body "$PLAIN" --arg html "$HTML" \
|
||||
'{"msgtype":"m.notice","body":$body,"format":"org.matrix.custom.html","formatted_body":$html}')"
|
||||
139
.github/workflows/release.yaml
vendored
139
.github/workflows/release.yaml
vendored
|
|
@ -9,31 +9,27 @@ 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@v6
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
- 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
|
||||
- run: rm ./assets/vodozemac/.gitignore
|
||||
- name: Build Release Web
|
||||
run: flutter build web --dart-define=FLUTTER_WEB_CANVASKIT_URL=canvaskit/ --release --source-maps
|
||||
- name: Create archive
|
||||
run: tar -czf fluffychat-web.tar.gz build/web/
|
||||
- name: Upload Web Build
|
||||
uses: actions/upload-artifact@v7
|
||||
uses: actions/upload-artifact@v2
|
||||
with:
|
||||
name: Web Build
|
||||
path: fluffychat-web.tar.gz
|
||||
|
|
@ -46,48 +42,21 @@ jobs:
|
|||
asset_path: fluffychat-web.tar.gz
|
||||
asset_name: fluffychat-web.tar.gz
|
||||
asset_content_type: application/gzip
|
||||
- name: Clone fluffychat website
|
||||
run: |
|
||||
git clone https://github.com/krille-chan/fluffychat-website.git
|
||||
cp CHANGELOG.md fluffychat-website/
|
||||
cp PRIVACY.md fluffychat-website/
|
||||
- name: Build website
|
||||
working-directory: fluffychat-website
|
||||
run: |
|
||||
npm install tailwindcss @tailwindcss/cli
|
||||
npx tailwindcss -i ./src/styles.css -o ./src/assets/tailwind.css --minify
|
||||
npx @11ty/eleventy
|
||||
mv public ../
|
||||
- name: Copy FluffyChat web into it
|
||||
run: |
|
||||
mkdir public/web
|
||||
mkdir public/nightly
|
||||
cp -r build/web/* public/web/
|
||||
cp -r build/web/* public/nightly/
|
||||
echo "fluffychat.im" >> public/CNAME
|
||||
- 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@v6
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- name: Add Firebase Messaging
|
||||
run: |
|
||||
echo '${{secrets.GOOGLE_SERVICES_JSON}}' | base64 -d > android/app/google-services.json
|
||||
./scripts/add-firebase-messaging.sh
|
||||
- uses: ./.github/actions/free_up_space
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- name: Apply Google Services Patch
|
||||
run: git apply ./scripts/enable-android-google-services.patch
|
||||
- run: flutter pub get
|
||||
- name: Prepare Android Release Build
|
||||
env:
|
||||
|
|
@ -95,7 +64,7 @@ jobs:
|
|||
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 --target-platform android-arm,android-arm64
|
||||
- run: flutter build apk --release
|
||||
- name: Upload to release
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
|
|
@ -107,55 +76,50 @@ jobs:
|
|||
asset_content_type: application/vnd.android.package-archive
|
||||
|
||||
build_linux:
|
||||
strategy:
|
||||
matrix:
|
||||
arch: [ x64, arm64 ]
|
||||
runs-on: ${{ matrix.arch == 'arm64' && 'ubuntu-24.04-arm' || 'ubuntu-latest'}}
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
- 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 curl clang cmake ninja-build pkg-config libgtk-3-dev libblkid-dev liblzma-dev libjsoncpp-dev cmake-data libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.1-dev -y
|
||||
- run: echo "FLUTTER_VERSION=$(yq '.environment.flutter' < .tool_versions.yaml)" >> $GITHUB_ENV
|
||||
- name: Install Flutter
|
||||
run: |
|
||||
git clone --branch ${{ env.FLUTTER_VERSION }} https://github.com/flutter/flutter.git
|
||||
./flutter/bin/flutter doctor
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
- run: ./flutter/bin/flutter pub get
|
||||
- run: ./flutter/bin/flutter build linux --target-platform linux-${{ matrix.arch }}
|
||||
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 -y
|
||||
- run: flutter pub get
|
||||
- run: flutter build linux --release --target-platform linux-x64
|
||||
- name: Create archive
|
||||
run: tar -czf fluffychat-linux-${{ matrix.arch }}.tar.gz -C build/linux/${{ matrix.arch }}/release/bundle/ .
|
||||
run: tar -czf fluffychat-linux-x64.tar.gz -C build/linux/x64/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_path: fluffychat-linux-x64.tar.gz
|
||||
asset_name: fluffychat-linux-x64.tar.gz
|
||||
asset_content_type: application/gzip
|
||||
|
||||
deploy_playstore:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6
|
||||
- uses: actions/checkout@v2
|
||||
- run: cat .github/workflows/versions.env >> $GITHUB_ENV
|
||||
- uses: actions/setup-java@v1
|
||||
with:
|
||||
java-version: ${{ env.JAVA_VERSION }}
|
||||
- uses: subosito/flutter-action@v2
|
||||
with:
|
||||
flutter-version-file: .tool_versions.yaml
|
||||
flutter-version: ${{ env.FLUTTER_VERSION }}
|
||||
cache: true
|
||||
- name: Set up Ruby
|
||||
uses: ruby/setup-ruby@v1
|
||||
with:
|
||||
ruby-version: '3.3'
|
||||
- uses: ./.github/actions/free_up_space
|
||||
- uses: moonrepo/setup-rust@v1
|
||||
ruby-version: 2.7
|
||||
- name: Install Fastlane
|
||||
working-directory: android
|
||||
run: gem install fastlane -NV
|
||||
- name: Add Firebase Messaging
|
||||
run: |
|
||||
echo '${{secrets.GOOGLE_SERVICES_JSON}}' | base64 -d > android/app/google-services.json
|
||||
./scripts/add-firebase-messaging.sh
|
||||
- name: Apply Google Services Patch
|
||||
run: git apply ./scripts/enable-android-google-services.patch
|
||||
- run: flutter pub get
|
||||
- name: Prepare Android Release Build
|
||||
env:
|
||||
|
|
@ -164,7 +128,7 @@ jobs:
|
|||
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
|
||||
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/})"
|
||||
|
|
@ -182,30 +146,3 @@ jobs:
|
|||
bundle exec fastlane deploy_release
|
||||
fi
|
||||
cd ..
|
||||
|
||||
deploy_docker:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
packages: write
|
||||
steps:
|
||||
- name: Check out Git repository
|
||||
uses: actions/checkout@v6
|
||||
- name: Log in to the Container registry
|
||||
uses: docker/login-action@v4
|
||||
with:
|
||||
registry: ${{ env.REGISTRY }}
|
||||
username: ${{ github.actor }}
|
||||
password: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Extract metadata (tags, labels) for Docker
|
||||
id: meta
|
||||
uses: docker/metadata-action@v6
|
||||
with:
|
||||
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v7
|
||||
with:
|
||||
context: .
|
||||
push: true
|
||||
tags: ${{ steps.meta.outputs.tags }}
|
||||
labels: ${{ steps.meta.outputs.labels }}
|
||||
|
|
|
|||
21
.github/workflows/stale.yaml
vendored
21
.github/workflows/stale.yaml
vendored
|
|
@ -1,21 +0,0 @@
|
|||
name: 'Close stale issues and PRs'
|
||||
on:
|
||||
schedule:
|
||||
- cron: '30 1 * * *'
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/stale@v10
|
||||
with:
|
||||
stale-issue-message: 'This issue is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 30 days.'
|
||||
stale-pr-message: 'This PR is stale because it has been open 365 days with no activity. Remove stale label or comment or this will be closed in 30 days.'
|
||||
close-issue-message: 'This issue was closed because it has been stalled for 30 days with no activity.'
|
||||
close-pr-message: 'This PR was closed because it has been stalled for 30 days with no activity.'
|
||||
days-before-issue-stale: 365
|
||||
days-before-pr-stale: 365
|
||||
days-before-issue-close: 30
|
||||
days-before-pr-close: 30
|
||||
exempt-all-assignees: true
|
||||
operations-per-run: 1000
|
||||
2
.github/workflows/versions.env
vendored
Normal file
2
.github/workflows/versions.env
vendored
Normal file
|
|
@ -0,0 +1,2 @@
|
|||
FLUTTER_VERSION=3.13.9
|
||||
JAVA_VERSION=17
|
||||
2518
.gitignore
vendored
2518
.gitignore
vendored
File diff suppressed because it is too large
Load diff
12
.metadata
12
.metadata
|
|
@ -4,7 +4,7 @@
|
|||
# This file should be version controlled and should not be manually edited.
|
||||
|
||||
version:
|
||||
revision: "fcf2c11572af6f390246c056bc905eca609533a0"
|
||||
revision: "efbf63d9c66b9f6ec30e9ad4611189aa80003d31"
|
||||
channel: "stable"
|
||||
|
||||
project_type: app
|
||||
|
|
@ -13,11 +13,11 @@ project_type: app
|
|||
migration:
|
||||
platforms:
|
||||
- platform: root
|
||||
create_revision: fcf2c11572af6f390246c056bc905eca609533a0
|
||||
base_revision: fcf2c11572af6f390246c056bc905eca609533a0
|
||||
- platform: android
|
||||
create_revision: fcf2c11572af6f390246c056bc905eca609533a0
|
||||
base_revision: fcf2c11572af6f390246c056bc905eca609533a0
|
||||
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
|
||||
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
|
||||
- platform: linux
|
||||
create_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
|
||||
base_revision: efbf63d9c66b9f6ec30e9ad4611189aa80003d31
|
||||
|
||||
# User provided section
|
||||
|
||||
|
|
|
|||
|
|
@ -1,2 +0,0 @@
|
|||
environment:
|
||||
flutter: 3.41.4
|
||||
1840
CHANGELOG.md
1840
CHANGELOG.md
File diff suppressed because it is too large
Load diff
12
Dockerfile
12
Dockerfile
|
|
@ -1,18 +1,8 @@
|
|||
FROM ghcr.io/cirruslabs/flutter as builder
|
||||
RUN sudo apt update && sudo apt install curl wget jq build-essential -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
|
||||
|
||||
RUN sudo apt update && sudo apt install curl jq -y
|
||||
COPY . /app
|
||||
WORKDIR /app
|
||||
RUN curl https://sh.rustup.rs -sSf | bash -s -- -y
|
||||
ENV PATH="/root/.cargo/bin:${PATH}"
|
||||
RUN rustup component add rust-src --toolchain nightly-x86_64-unknown-linux-gnu
|
||||
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
|
||||
|
||||
|
|
|
|||
47
PRIVACY.md
47
PRIVACY.md
|
|
@ -1,34 +1,35 @@
|
|||
# Privacy
|
||||
|
||||
FluffyChat is available on Android, iOS, Linux and as a web version. Desktop versions for Windows and macOS may follow.
|
||||
FluffyChat is available on Android, iOS and as a web version. Desktop versions for Windows, Linux and macOS may follow.
|
||||
|
||||
* [Matrix](#matrix)
|
||||
* Sentry
|
||||
* [Database](#database)
|
||||
* [Encryption](#encryption)
|
||||
* [App Permissions](#app-permissions)
|
||||
* [Push Notifications](#push-notifications)
|
||||
* [PlayStore Safety Standards](#playstore-safety)
|
||||
* [Stories](#stories)
|
||||
|
||||
## <a id="matrix" href="#matrix">#</a> Matrix
|
||||
## Matrix<a id="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.
|
||||
FluffyChat only communicates with the selected server, with sentry.io if enabled and with [OpenStreetMap](https://openstreetmap.org) to display maps.
|
||||
|
||||
More information is available at: [https://matrix.org](https://matrix.org)
|
||||
|
||||
## <a id="database" href="#database">#</a> 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.
|
||||
## Database<a id="database"/>
|
||||
FluffyChat caches some data received from the server in a local database on the device of the user.
|
||||
|
||||
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)
|
||||
More information is available at: [https://pub.dev/packages/hive](https://pub.dev/packages/hive)
|
||||
|
||||
## <a id="encryption" href="#encryption">#</a> Encryption
|
||||
## Encryption<a id="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 [Vodozemac](https://github.com/matrix-org/vodozemac) and enables it by default for private chats.
|
||||
FluffyChat is able to use End-To-End-Encryption as a tech preview.
|
||||
|
||||
## <a id="app-permissions" href="#app-permissions">#</a> App Permissions
|
||||
## App Permissions<a id="app-permissions"/>
|
||||
|
||||
The permissions are the same on Android and iOS but may differ in the name. This are the Android Permissions:
|
||||
|
||||
|
|
@ -51,7 +52,7 @@ 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.
|
||||
|
||||
## <a id="push-notifications" href="#push-notifications">#</a> Push Notifications
|
||||
## Push Notifications<a id="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
|
||||
|
|
@ -59,7 +60,7 @@ FluffyChat uses the Firebase Cloud Messaging service for push notifications on A
|
|||
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://github.com/krille-chan/fluffygate](https://github.com/krille-chan/fluffygate)
|
||||
[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
|
||||
|
|
@ -94,20 +95,22 @@ A typical push notification could look like this:
|
|||
|
||||
FluffyChat sets the `event_id_only` flag at the Matrix Server. This server is then responsible to send the correct data.
|
||||
|
||||
## Stories<a id="stories"/>
|
||||
|
||||
# <a id="playstore-safety" href="#playstore-safety">#</a> Explanation of FluffyChat's Compliance with Google Play Store's Safety Standards
|
||||
FluffyChat supports stories which is a feature similar to WhatsApp status or Instagram stories. However it is just a different GUI for the same room-related communication. More information about the feature can be found here:
|
||||
|
||||
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.
|
||||
https://github.com/krillefear/matrix-doc/blob/main/proposals/3588-stories-as-rooms.md
|
||||
|
||||
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.
|
||||
Stories are basically:
|
||||
|
||||
#### Reporting Content or Users:
|
||||
- End to end encrypted rooms
|
||||
- Read-only rooms with only one admin who can post stuff (while there is no technical limitation to have multiple admins)
|
||||
|
||||
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.
|
||||
By default:
|
||||
|
||||
In addition to reporting messages, users can also report other users following a similar process.
|
||||
- The user has to invite all contacts manually to a story room
|
||||
- The user can only invite contacts (matrix users the user shares a DM room with) to the story room
|
||||
- The story room is created when the first story is posted
|
||||
- User can mute and leave story rooms
|
||||
|
||||
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/
|
||||
The user is informed in the app that in theory all contacts can see each other in the story room. The user must give consent here. However the user is at any time able to create a group chat and invite all of their contacts to this chat in any matrix client which has the same result.
|
||||
|
|
|
|||
73
README.md
73
README.md
|
|
@ -1,12 +1,12 @@
|
|||

|
||||
|
||||
[FluffyChat](https://fluffy.chat) 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.
|
||||
[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/#/#fluffy-space:matrix.org)
|
||||
- 📰 [[Mastodon] Get updates on social media](https://troet.cafe/@krille)
|
||||
- 🌍 [[m] Join the community](https://matrix.to/#/#fluffychat:matrix.org)
|
||||
- 📰 [[Mastodon] Get updates on social media](https://mastodon.art/@krille)
|
||||
- 🖥️ [[Famedly] Server hosting and professional support](https://famedly.com/kontakt)
|
||||
- 💝 [[Liberapay] Support FluffyChat development](https://de.liberapay.com/KrilleChritzelius)
|
||||
|
||||
|
|
@ -14,8 +14,7 @@
|
|||
|
||||
### Screenshots:
|
||||
|
||||
<img src="https://github.com/krille-chan/fluffychat-website/blob/main/src/assets/screenshots/mobile.png?raw=true" height="300">
|
||||
<img src="https://github.com/krille-chan/fluffychat-website/blob/main/src/assets/screenshots/desktop.png?raw=true" height="300">
|
||||

|
||||
|
||||
# Features
|
||||
|
||||
|
|
@ -44,72 +43,18 @@
|
|||
|
||||
Please visit the website for installation instructions:
|
||||
|
||||
- https://fluffy.chat
|
||||
- https://fluffychat.im
|
||||
|
||||
# How to build
|
||||
|
||||
1. To build FluffyChat you need [Flutter](https://flutter.dev) and [Rust](https://www.rust-lang.org/tools/install)
|
||||
Please visit the [Wiki](https://github.com/krille-chan/fluffychat/wiki) for build instructions:
|
||||
|
||||
2. Clone the repo:
|
||||
```
|
||||
git clone https://github.com/krille-chan/fluffychat.git
|
||||
cd fluffychat
|
||||
```
|
||||
3. Choose your target platform below and enable support for it.
|
||||
3.1 If you want, enable Googles Firebase Cloud Messaging:
|
||||
|
||||
`./scripts/add-firebase-messaging.sh`
|
||||
|
||||
4. Debug with: `flutter run`
|
||||
|
||||
### Android
|
||||
|
||||
* Build with: `flutter build apk`
|
||||
|
||||
### iOS / iPadOS
|
||||
|
||||
* Have a Mac with Xcode installed, and set up for Xcode-managed app signing
|
||||
* If you want automatic app installation to connected devices, make sure you have Apple Configurator installed, with the Automation Tools (`cfgutil`) enabled
|
||||
* Set a few environment variables
|
||||
* FLUFFYCHAT_NEW_TEAM: the Apple Developer team that your certificates should live under
|
||||
* FLUFFYCHAT_NEW_GROUP: the group you want App IDs and such to live under (ie: com.example.fluffychat)
|
||||
* FLUFFYCHAT_INSTALL_IPA: set to `1` if you want the IPA to be deployed to connected devices after building, otherwise unset
|
||||
* Run `./scripts/build-ios.sh`
|
||||
|
||||
### Web
|
||||
|
||||
* Build with:
|
||||
```bash
|
||||
./scripts/prepare-web.sh # To install Vodozemac
|
||||
flutter build web --release
|
||||
```
|
||||
|
||||
* Optionally configure by serving a `config.json` at the same path as fluffychat.
|
||||
An example can be found at `config.sample.json`. All values there are optional.
|
||||
**Please only the values, you really need**. If you e.g. only want
|
||||
to change the default homeserver, then only modify the `defaultHomeserver` key.
|
||||
|
||||
### Desktop (Linux, Windows, macOS)
|
||||
|
||||
* Enable Desktop support in Flutter: https://flutter.dev/desktop
|
||||
|
||||
#### Install custom dependencies (Linux)
|
||||
|
||||
```bash
|
||||
sudo apt install libjsoncpp1 libsecret-1-dev libsecret-1-0 librhash0 libwebkit2gtk-4.0-dev lld
|
||||
```
|
||||
|
||||
* Build with one of these:
|
||||
```bash
|
||||
flutter build linux --release
|
||||
flutter build windows --release
|
||||
flutter build macos --release
|
||||
```
|
||||
- https://github.com/krille-chan/fluffychat/wiki/How-To-Build
|
||||
|
||||
|
||||
# Special thanks
|
||||
|
||||
* <a href="https://github.com/fabiyamada">Fabiyamada</a> is a graphics designer and has made the fluffychat logo and the banner. Big thanks for her great designs.
|
||||
* <a href="https://github.com/fabiyamada">Fabiyamada</a> is a graphics designer from Brasil and has made the fluffychat logo and the banner. Big thanks for her great designs.
|
||||
|
||||
* <a href="https://github.com/advocatux">Advocatux</a> has made the Spanish translation with great love and care. He always stands by my side and supports my work with great commitment.
|
||||
|
||||
|
|
@ -117,6 +62,8 @@ flutter build macos --release
|
|||
|
||||
* Also thanks to all translators and testers! With your help, fluffychat is now available in more than 12 languages.
|
||||
|
||||
* <a href="https://github.com/googlefonts/noto-emoji/">Noto Emoji Font</a> for the awesome emojis.
|
||||
|
||||
* <a href="https://github.com/madsrh/WoodenBeaver">WoodenBeaver</a> 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
|
||||
|
|
|
|||
15
SECURITY.md
15
SECURITY.md
|
|
@ -1,15 +0,0 @@
|
|||
# Security Policy
|
||||
|
||||
If you believe you have discovered a security vulnerability in this project, **do not open a public issue**.
|
||||
|
||||
To report a security issue responsibly, please go to the Security tab or visit:
|
||||
|
||||
https://github.com/krille-chan/fluffychat/security/advisories/new
|
||||
|
||||
The following information can help us address the issue:
|
||||
|
||||
- Clear steps to reproduce the vulnerability
|
||||
- The software version you are using
|
||||
- The affected platforms
|
||||
|
||||
We appreciate your report and will respond as quickly as possible. Please note that this project is maintained by volunteers and is provided without guarantees.
|
||||
|
|
@ -2,75 +2,52 @@ 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
|
||||
- cancel_subscriptions
|
||||
- always_declare_return_types
|
||||
- avoid_void_async
|
||||
- no_adjacent_strings_in_list
|
||||
- test_types_in_equals
|
||||
- throw_in_finally
|
||||
- unnecessary_statements
|
||||
- avoid_bool_literals_in_conditional_expressions
|
||||
- prefer_single_quotes
|
||||
- prefer_const_declarations
|
||||
- unnecessary_lambdas
|
||||
- combinators_ordering
|
||||
- noop_primitive_operations
|
||||
- unnecessary_null_checks
|
||||
- unnecessary_null_in_if_null_operators
|
||||
- unnecessary_to_list_in_spreads
|
||||
- use_is_even_rather_than_modulo
|
||||
- use_super_parameters
|
||||
# Flutter specific:
|
||||
- use_colored_box
|
||||
|
||||
analyzer:
|
||||
plugins:
|
||||
- dart_code_linter
|
||||
errors:
|
||||
todo: ignore
|
||||
use_build_context_synchronously: ignore
|
||||
exclude:
|
||||
- lib/generated_plugin_registrant.dart
|
||||
- lib/l10n/*.dart
|
||||
|
||||
dart_code_linter:
|
||||
dart_code_metrics:
|
||||
metrics:
|
||||
cyclomatic-complexity: 20
|
||||
number-of-arguments: 4
|
||||
maximum-nesting-level: 5
|
||||
source-lines-of-code: 50
|
||||
maintainability-index: 40
|
||||
rules:
|
||||
# Dart specific:
|
||||
- avoid-dynamic
|
||||
- avoid-redundant-async
|
||||
- avoid-unnecessary-type-assertions
|
||||
- avoid-unnecessary-type-casts
|
||||
- avoid-unrelated-type-assertions
|
||||
- no-boolean-literal-compare
|
||||
- no-empty-block
|
||||
- prefer-conditional-expressions
|
||||
- no-equal-then-else
|
||||
- prefer-first
|
||||
- prefer-last
|
||||
- prefer-immediate-return
|
||||
- prefer-enums-by-name
|
||||
- avoid-unnecessary-conditionals
|
||||
# TODO:
|
||||
# - member-ordering
|
||||
# - avoid-global-state
|
||||
# - prefer-match-file-name
|
||||
# - avoid-banned-imports:
|
||||
# entries:
|
||||
# - paths: ['some/folder/.*\.dart', 'another/folder/.*\.dart']
|
||||
# deny: ['package:flutter/material.dart']
|
||||
# message: 'Do not import Flutter Material Design library, we should not depend on it!'
|
||||
# - no-magic-number:
|
||||
# allowed: [-1, 0, 1,2,4,6,8,12,16,32,40,56,64]
|
||||
# allow-only-once: true
|
||||
# Flutter specific:
|
||||
- prefer-media-query-direct-access
|
||||
- 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-correct-edge-insets-constructor
|
||||
- avoid-returning-widgets
|
||||
# TODO:
|
||||
# - prefer-single-widget-per-file:
|
||||
# ignore-private-widgets: true
|
||||
# - prefer-extracting-callbacks
|
||||
- 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
|
||||
|
|
|
|||
87
android/app/build.gradle
Normal file
87
android/app/build.gradle
Normal file
|
|
@ -0,0 +1,87 @@
|
|||
def localProperties = new Properties()
|
||||
def localPropertiesFile = rootProject.file('local.properties')
|
||||
if (localPropertiesFile.exists()) {
|
||||
localPropertiesFile.withReader('UTF-8') { reader ->
|
||||
localProperties.load(reader)
|
||||
}
|
||||
}
|
||||
|
||||
def flutterRoot = localProperties.getProperty('flutter.sdk')
|
||||
if (flutterRoot == null) {
|
||||
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
|
||||
}
|
||||
|
||||
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
|
||||
if (flutterVersionCode == null) {
|
||||
flutterVersionCode = '1'
|
||||
}
|
||||
|
||||
def flutterVersionName = localProperties.getProperty('flutter.versionName')
|
||||
if (flutterVersionName == null) {
|
||||
flutterVersionName = '1.0'
|
||||
}
|
||||
|
||||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
|
||||
|
||||
def keystoreProperties = new Properties()
|
||||
def keystorePropertiesFile = rootProject.file('key.properties')
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
|
||||
}
|
||||
|
||||
android {
|
||||
compileSdkVersion 34
|
||||
|
||||
sourceSets {
|
||||
main.java.srcDirs += 'src/main/kotlin'
|
||||
}
|
||||
|
||||
lintOptions {
|
||||
disable 'InvalidPackage'
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId "chat.fluffy.fluffychat"
|
||||
minSdkVersion 19
|
||||
targetSdkVersion 33
|
||||
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
|
||||
applicationIdSuffix ".debug"
|
||||
versionNameSuffix "-debug"
|
||||
}
|
||||
release {
|
||||
signingConfig signingConfigs.release
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source '../..'
|
||||
}
|
||||
|
||||
dependencies {
|
||||
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
|
||||
//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'
|
||||
}
|
||||
|
||||
//apply plugin: 'com.google.gms.google-services'
|
||||
|
|
@ -1,95 +0,0 @@
|
|||
import java.util.Properties
|
||||
import java.io.FileInputStream
|
||||
|
||||
plugins {
|
||||
id("com.android.application")
|
||||
id("kotlin-android")
|
||||
// The Flutter Gradle Plugin must be applied after the Android and Kotlin Gradle plugins.
|
||||
id("dev.flutter.flutter-gradle-plugin")
|
||||
}
|
||||
|
||||
if (file("google-services.json").exists()) {
|
||||
apply(plugin = "com.google.gms.google-services")
|
||||
}
|
||||
|
||||
dependencies {
|
||||
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.1.4") // For flutter_local_notifications // Workaround for: https://github.com/MaikuB/flutter_local_notifications/issues/2286
|
||||
implementation("androidx.core:core-ktx:1.17.0") // For Android Auto
|
||||
}
|
||||
|
||||
|
||||
// Workaround for https://pub.dev/packages/unifiedpush#the-build-fails-because-of-duplicate-classes
|
||||
configurations.all {
|
||||
// Use the latest version published: https://central.sonatype.com/artifact/com.google.crypto.tink/tink-android
|
||||
val tink = "com.google.crypto.tink:tink-android:1.17.0"
|
||||
// You can also use the library declaration catalog
|
||||
// val tink = libs.google.tink
|
||||
resolutionStrategy {
|
||||
force(tink)
|
||||
dependencySubstitution {
|
||||
substitute(module("com.google.crypto.tink:tink")).using(module(tink))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
android {
|
||||
namespace = "chat.fluffy.fluffychat"
|
||||
compileSdk = flutter.compileSdkVersion
|
||||
ndkVersion = flutter.ndkVersion
|
||||
|
||||
compileOptions {
|
||||
sourceCompatibility = JavaVersion.VERSION_11
|
||||
targetCompatibility = JavaVersion.VERSION_11
|
||||
isCoreLibraryDesugaringEnabled = true
|
||||
}
|
||||
|
||||
kotlinOptions {
|
||||
jvmTarget = JavaVersion.VERSION_11.toString()
|
||||
}
|
||||
|
||||
signingConfigs {
|
||||
create("release") {
|
||||
keyAlias = "dummyAlias"
|
||||
keyPassword = "dummyPassword"
|
||||
storeFile = file("dummy.keystore")
|
||||
storePassword = "dummyStorePassword"
|
||||
}
|
||||
}
|
||||
|
||||
val keystoreProperties = Properties()
|
||||
val keystorePropertiesFile = rootProject.file("key.properties")
|
||||
if (keystorePropertiesFile.exists()) {
|
||||
keystoreProperties.load(FileInputStream(keystorePropertiesFile))
|
||||
signingConfigs.getByName("release").apply {
|
||||
keyAlias = keystoreProperties["keyAlias"] as String
|
||||
keyPassword = keystoreProperties["keyPassword"] as String
|
||||
storeFile = keystoreProperties["storeFile"]?.let { file(it) }
|
||||
storePassword = keystoreProperties["storePassword"] as String
|
||||
}
|
||||
}
|
||||
|
||||
defaultConfig {
|
||||
applicationId = "chat.fluffy.fluffychat"
|
||||
minSdk = flutter.minSdkVersion
|
||||
targetSdk = flutter.targetSdkVersion
|
||||
versionCode = flutter.versionCode
|
||||
versionName = flutter.versionName
|
||||
ndk { // Workaround for https://github.com/flutter/flutter/issues/162153#issuecomment-2612443642
|
||||
abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86_64", "x86")
|
||||
}
|
||||
}
|
||||
|
||||
buildTypes {
|
||||
release {
|
||||
signingConfig = signingConfigs.getByName("release")
|
||||
isMinifyEnabled = true
|
||||
isShrinkResources = true
|
||||
proguardFiles(getDefaultProguardFile("proguard-android.txt"), "proguard-rules.pro")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
flutter {
|
||||
source = "../.."
|
||||
}
|
||||
46
android/app/google-services.json
Normal file
46
android/app/google-services.json
Normal file
|
|
@ -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"
|
||||
}
|
||||
1
android/app/proguard-rules.pro
vendored
1
android/app/proguard-rules.pro
vendored
|
|
@ -1 +0,0 @@
|
|||
-keep class net.sqlcipher.** { *; }
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:installLocation="auto">
|
||||
package="chat.fluffy.fluffychat" android:installLocation="auto">
|
||||
<!-- io.flutter.app.FlutterApplication is an android.app.Application that
|
||||
calls FlutterMain.startInitialization(this); in its onCreate method.
|
||||
In most cases you can leave this as-is, but you if you want to provide
|
||||
|
|
@ -17,10 +17,16 @@
|
|||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||
<uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE"/>
|
||||
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
||||
|
||||
<!-- To make app compatible with tablets -->
|
||||
<uses-feature android:name="android.hardware.camera" android:required="false"/>
|
||||
<uses-feature android:name="android.hardware.microphone" android:required="false" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_STATE"
|
||||
android:maxSdkVersion="29" />
|
||||
<uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
|
||||
|
||||
<uses-permission android:name="android.permission.CALL_PHONE" />
|
||||
<uses-permission android:name="android.permission.USE_FULL_SCREEN_INTENT" />
|
||||
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
|
||||
|
||||
<uses-sdk
|
||||
tools:overrideLibrary="io.wazo.callkeep, net.touchcapture.qr.flutterqr, com.cloudwebrtc.webrtc, org.webrtc, com.it_nomads.fluttersecurestorage, com.pichillilorenzo.flutter_inappwebview, com.example.video_compress, com.otaliastudios.transcoder, com.otaliastudios.opengl, com.kineapps.flutter_file_dialog, com.llfbandit.record, com.pravera.flutter_foreground_task"/>
|
||||
|
|
@ -30,7 +36,6 @@
|
|||
android:requestLegacyExternalStorage="true"
|
||||
android:allowBackup="false"
|
||||
android:fullBackupContent="false"
|
||||
android:localeConfig="@xml/locale_config"
|
||||
>
|
||||
<activity
|
||||
android:name=".MainActivity"
|
||||
|
|
@ -46,14 +51,10 @@
|
|||
<action android:name="android.intent.action.MAIN"/>
|
||||
<category android:name="android.intent.category.LAUNCHER"/>
|
||||
</intent-filter>
|
||||
|
||||
<!-- App can open on notification action -->
|
||||
<intent-filter>
|
||||
<action android:name="FLUTTER_NOTIFICATION_CLICK" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- App can open https://matrix.to urls -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
|
|
@ -62,40 +63,42 @@
|
|||
android:scheme="https"
|
||||
android:host="matrix.to"/>
|
||||
</intent-filter>
|
||||
|
||||
<!-- App can open matrix: uris -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="matrix" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- App can open im.fluffychat:// uris -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="im.fluffychat" android:host="chat" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- App can receive shared text -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="text/*" />
|
||||
</intent-filter>
|
||||
|
||||
<!-- App can receive shared any type of files -->
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:mimeType="document/*" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND_MULTIPLE" />
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="*/*" />
|
||||
<data android:mimeType="image/*" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="video/*" />
|
||||
</intent-filter>
|
||||
<intent-filter>
|
||||
<action android:name="android.intent.action.SEND" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<data android:mimeType="audio/*" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
|
|
@ -106,7 +109,7 @@
|
|||
<action android:name="android.intent.action.VIEW" />
|
||||
<category android:name="android.intent.category.DEFAULT" />
|
||||
<category android:name="android.intent.category.BROWSABLE" />
|
||||
<data android:scheme="im.fluffychat" android:path="/login"/>
|
||||
<data android:scheme="im.fluffychat" android:host="login"/>
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
|
|
@ -121,13 +124,29 @@
|
|||
android:foregroundServiceType="camera|microphone|mediaProjection">
|
||||
</service>
|
||||
|
||||
<!-- From flutter_local_notifications package for notification actions -->
|
||||
<receiver android:exported="false" android:name="com.dexterous.flutterlocalnotifications.ActionBroadcastReceiver" />
|
||||
<service android:name="io.wazo.callkeep.VoiceConnectionService"
|
||||
android:label="Wazo"
|
||||
android:foregroundServiceType="camera|microphone|mediaProjection"
|
||||
android:permission="android.permission.BIND_TELECOM_CONNECTION_SERVICE"
|
||||
android:exported="true">
|
||||
<intent-filter>
|
||||
<action android:name="android.telecom.ConnectionService" />
|
||||
</intent-filter>
|
||||
</service>
|
||||
|
||||
<!-- To make notifications available in Android Auto -->
|
||||
<meta-data
|
||||
android:name="com.google.android.gms.car.application"
|
||||
android:resource="@xml/automotive_app_desc"/>
|
||||
<receiver android:name="org.unifiedpush.flutter.connector.UnifiedPushReceiver"
|
||||
tools:replace="android:enabled"
|
||||
android:enabled="false">
|
||||
</receiver>
|
||||
|
||||
<receiver android:exported="false" android:enabled="true" android:name=".UnifiedPushReceiver">
|
||||
<intent-filter>
|
||||
<action android:name="org.unifiedpush.flutter.connector.MESSAGE"/>
|
||||
<action android:name="org.unifiedpush.flutter.connector.UNREGISTERED"/>
|
||||
<action android:name="org.unifiedpush.flutter.connector.NEW_ENDPOINT"/>
|
||||
<action android:name="org.unifiedpush.flutter.connector.REGISTRATION_FAILED" />
|
||||
</intent-filter>
|
||||
</receiver>
|
||||
|
||||
<!-- Don't delete the meta-data below.
|
||||
This is used by the Flutter tool to generate GeneratedPluginRegistrant.java -->
|
||||
|
|
|
|||
|
|
@ -2,9 +2,17 @@
|
|||
|
||||
import com.famedly.fcm_shared_isolate.FcmSharedIsolateService
|
||||
|
||||
import chat.fluffy.fluffychat.MainActivity
|
||||
|
||||
import io.flutter.embedding.android.FlutterActivity
|
||||
import io.flutter.embedding.engine.FlutterEngine
|
||||
import io.flutter.view.FlutterMain
|
||||
import io.flutter.embedding.engine.dart.DartExecutor.DartEntrypoint
|
||||
|
||||
import android.content.Context
|
||||
import android.os.Bundle
|
||||
import android.util.Log
|
||||
import android.view.WindowManager
|
||||
|
||||
class FcmPushService : FcmSharedIsolateService() {
|
||||
override fun getEngine(): FlutterEngine {
|
||||
|
|
|
|||
|
|
@ -4,11 +4,13 @@ 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)
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,23 @@
|
|||
package chat.fluffy.fluffychat
|
||||
|
||||
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
|
||||
}
|
||||
}
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
<automotiveApp>
|
||||
<uses name="notification" />
|
||||
</automotiveApp>
|
||||
|
|
@ -1,60 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<locale-config xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<locale android:name="ar"/>
|
||||
<locale android:name="be"/>
|
||||
<locale android:name="bn"/>
|
||||
<locale android:name="bo"/>
|
||||
<locale android:name="ca"/>
|
||||
<locale android:name="cs"/>
|
||||
<locale android:name="da"/>
|
||||
<locale android:name="de"/>
|
||||
<locale android:name="el"/>
|
||||
<locale android:name="en"/>
|
||||
<locale android:name="eo"/>
|
||||
<locale android:name="es"/>
|
||||
<locale android:name="et"/>
|
||||
<locale android:name="eu"/>
|
||||
<locale android:name="fa"/>
|
||||
<locale android:name="fi"/>
|
||||
<locale android:name="fil"/>
|
||||
<locale android:name="fr"/>
|
||||
<locale android:name="ga"/>
|
||||
<locale android:name="gl"/>
|
||||
<locale android:name="he"/>
|
||||
<locale android:name="hi"/>
|
||||
<locale android:name="hr"/>
|
||||
<locale android:name="hu"/>
|
||||
<locale android:name="ia"/>
|
||||
<locale android:name="id"/>
|
||||
<locale android:name="ie"/>
|
||||
<locale android:name="it"/>
|
||||
<locale android:name="ja"/>
|
||||
<locale android:name="ka"/>
|
||||
<locale android:name="kab"/>
|
||||
<locale android:name="ko"/>
|
||||
<locale android:name="lt"/>
|
||||
<locale android:name="lv"/>
|
||||
<locale android:name="nb"/>
|
||||
<locale android:name="nl"/>
|
||||
<locale android:name="pl"/>
|
||||
<locale android:name="pt"/>
|
||||
<locale android:name="pt"/>
|
||||
<locale android:name="pt"/>
|
||||
<locale android:name="ro"/>
|
||||
<locale android:name="ru"/>
|
||||
<locale android:name="sk"/>
|
||||
<locale android:name="sl"/>
|
||||
<locale android:name="sq"/>
|
||||
<locale android:name="sr"/>
|
||||
<locale android:name="sv"/>
|
||||
<locale android:name="ta"/>
|
||||
<locale android:name="te"/>
|
||||
<locale android:name="th"/>
|
||||
<locale android:name="tr"/>
|
||||
<locale android:name="uk"/>
|
||||
<locale android:name="uz"/>
|
||||
<locale android:name="vi"/>
|
||||
<locale android:name="yue"/>
|
||||
<locale android:name="zh"/>
|
||||
<locale android:name="zh"/>
|
||||
</locale-config>
|
||||
32
android/build.gradle
Normal file
32
android/build.gradle
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
buildscript {
|
||||
ext.kotlin_version = '1.8.0'
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
|
||||
dependencies {
|
||||
classpath 'com.android.tools.build:gradle:7.1.2'
|
||||
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
|
||||
//classpath 'com.google.gms:google-services:4.3.8'
|
||||
}
|
||||
}
|
||||
|
||||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
rootProject.buildDir = '../build'
|
||||
subprojects {
|
||||
project.buildDir = "${rootProject.buildDir}/${project.name}"
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(':app')
|
||||
}
|
||||
|
||||
tasks.register("clean", Delete) {
|
||||
delete rootProject.buildDir
|
||||
}
|
||||
|
|
@ -1,21 +0,0 @@
|
|||
allprojects {
|
||||
repositories {
|
||||
google()
|
||||
mavenCentral()
|
||||
}
|
||||
}
|
||||
|
||||
val newBuildDir: Directory = rootProject.layout.buildDirectory.dir("../../build").get()
|
||||
rootProject.layout.buildDirectory.value(newBuildDir)
|
||||
|
||||
subprojects {
|
||||
val newSubprojectBuildDir: Directory = newBuildDir.dir(project.name)
|
||||
project.layout.buildDirectory.value(newSubprojectBuildDir)
|
||||
}
|
||||
subprojects {
|
||||
project.evaluationDependsOn(":app")
|
||||
}
|
||||
|
||||
tasks.register<Delete>("clean") {
|
||||
delete(rootProject.layout.buildDirectory)
|
||||
}
|
||||
|
|
@ -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)
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
FluffyChat 2.5.0 introduces a new homeserver picker for onboarding,
|
||||
better image compression performance and several smaller new features,
|
||||
design adjustments and bug fixes.
|
||||
|
|
@ -1,4 +1,4 @@
|
|||
FluffyChat is an open, nonprofit and cute Matrix messenger app for Ubuntu Touch, Android and iOS.
|
||||
FluffyChat is an open, nonprofit and cute matrix messenger app for Ubuntu Touch, Android and iOS.
|
||||
|
||||
Open
|
||||
Opensource and open development where everyone can join.
|
||||
|
|
@ -9,7 +9,7 @@ FluffyChat is donation funded.
|
|||
Cute ♥
|
||||
Cute design and many theme settings including a dark mode.
|
||||
|
||||
One-to-one and group chats
|
||||
One-to-one and groupchats
|
||||
Unlimited groups and direct chats.
|
||||
|
||||
Easy
|
||||
|
|
@ -22,11 +22,11 @@ Decentralized
|
|||
There is no "FluffyChat server" you are forced to use. Use the server you find trustworthy or host your own.
|
||||
|
||||
Compatible
|
||||
Compatible with Element, Fractal, Nheko and all Matrix messengers.
|
||||
Compatible with Element, 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 your loved.
|
||||
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. ♥
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
org.gradle.jvmargs=-Xmx4608m
|
||||
org.gradle.jvmargs=-Xmx1536M
|
||||
android.useAndroidX=true
|
||||
android.enableJetifier=true
|
||||
kotlin.jvm.target.validation.mode=IGNORE
|
||||
|
|
@ -1,6 +1,6 @@
|
|||
#Mon Mar 17 08:36:03 CET 2025
|
||||
#Fri Jun 23 08:50:38 CEST 2017
|
||||
distributionBase=GRADLE_USER_HOME
|
||||
distributionPath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-all.zip
|
||||
zipStoreBase=GRADLE_USER_HOME
|
||||
zipStorePath=wrapper/dists
|
||||
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-all.zip
|
||||
|
|
|
|||
11
android/settings.gradle
Normal file
11
android/settings.gradle
Normal file
|
|
@ -0,0 +1,11 @@
|
|||
include ':app'
|
||||
|
||||
def localPropertiesFile = new File(rootProject.projectDir, "local.properties")
|
||||
def properties = new Properties()
|
||||
|
||||
assert localPropertiesFile.exists()
|
||||
localPropertiesFile.withReader("UTF-8") { reader -> properties.load(reader) }
|
||||
|
||||
def flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
assert flutterSdkPath != null, "flutter.sdk not set in local.properties"
|
||||
apply from: "$flutterSdkPath/packages/flutter_tools/gradle/app_plugin_loader.gradle"
|
||||
|
|
@ -1,28 +0,0 @@
|
|||
pluginManagement {
|
||||
val flutterSdkPath = run {
|
||||
val properties = java.util.Properties()
|
||||
file("local.properties").inputStream().use { properties.load(it) }
|
||||
val flutterSdkPath = properties.getProperty("flutter.sdk")
|
||||
require(flutterSdkPath != null) { "flutter.sdk not set in local.properties" }
|
||||
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.9.1" apply false
|
||||
id("org.jetbrains.kotlin.android") version "2.1.0" apply false
|
||||
if (file("app/google-services.json").exists()) {
|
||||
id("com.google.gms.google-services") version "4.3.8" apply false
|
||||
}
|
||||
}
|
||||
|
||||
include(":app")
|
||||
3
appimage/.gitignore
vendored
Normal file
3
appimage/.gitignore
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
FluffyChat.AppDir
|
||||
*.AppImage
|
||||
*.AppImage.zsync
|
||||
4
appimage/AppRun
Executable file
4
appimage/AppRun
Executable file
|
|
@ -0,0 +1,4 @@
|
|||
#!/bin/sh
|
||||
|
||||
cd "$(dirname "$0")"
|
||||
exec ./fluffychat
|
||||
9
appimage/FluffyChat.desktop
Normal file
9
appimage/FluffyChat.desktop
Normal file
|
|
@ -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;
|
||||
24
appimage/README.md
Normal file
24
appimage/README.md
Normal file
|
|
@ -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
|
||||
```
|
||||
BIN
assets/backup.png
Normal file
BIN
assets/backup.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 6.7 KiB |
BIN
assets/banner_dark.png
Normal file
BIN
assets/banner_dark.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 66 KiB |
185
assets/chat.svg
Normal file
185
assets/chat.svg
Normal file
|
|
@ -0,0 +1,185 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:cc="http://creativecommons.org/ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" width="210mm" height="297mm" viewBox="0 0 210 297" version="1.1" id="svg8" inkscape:version="0.92.3 (d244b95, 2018-08-02)" sodipodi:docname="1.svg">
|
||||
<defs id="defs2"/>
|
||||
<sodipodi:namedview id="base" pagecolor="#ffffff" bordercolor="#666666" borderopacity="1.0" inkscape:pageopacity="0.0" inkscape:pageshadow="2" inkscape:zoom="0.5" inkscape:cx="675" inkscape:cy="548.18772" inkscape:document-units="mm" inkscape:current-layer="layer1" showgrid="false" inkscape:window-width="640" inkscape:window-height="748" inkscape:window-x="640" inkscape:window-y="24" inkscape:window-maximized="0"/>
|
||||
<metadata id="metadata5">
|
||||
<rdf:RDF>
|
||||
<cc:Work rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
|
||||
<dc:title/>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g inkscape:label="Layer 1" inkscape:groupmode="layer" id="layer1">
|
||||
<g id="g3735" transform="matrix(1.3863783,0,0,1.3863783,53.572287,59.067903)">
|
||||
<path id="path3715" d="m 12.7,30.7 c 4,5.3 1.9,-0.3 7.3,-0.3 5.4,0 8,-5.1 7.9,-10.4 C 27.8,14.7 16.2,7.7 11.1,9.4 c -3.2,1.2 -1.6,17 1.6,21.3 z" class="st0" inkscape:connector-curvature="0" style="fill:#878787"/>
|
||||
|
||||
<path id="path3717" d="m 14.6,25.1 c 2.3,3 9.3,-1.9 9.3,-5 0,-3.1 -6.7,-7.1 -9.6,-6 -1.9,0.6 -1.6,8.5 0.3,11 z" class="st1" inkscape:connector-curvature="0" style="fill:#ffffff"/>
|
||||
|
||||
<path id="path3719" d="m 61,30.6 c -3.9,5.3 -1.9,-0.2 -7.3,-0.2 -5.4,0 -8,-5 -8,-10.4 0,-5.4 11.7,-12.4 16.7,-10.7 3.3,1.1 1.8,17 -1.4,21.3 z" class="st0" inkscape:connector-curvature="0" style="fill:#878787"/>
|
||||
|
||||
<path id="path3721" d="m 59.1,25 c -2.3,3.1 -9.3,-1.8 -9.3,-4.9 0,-3.1 6.7,-7.1 9.6,-6.1 1.8,0.6 1.5,8.5 -0.3,11 z" class="st1" inkscape:connector-curvature="0" style="fill:#ffffff"/>
|
||||
|
||||
<g id="g3725">
|
||||
<path id="path3723" d="m 30.7,60.8 c 0.2,2.1 2.6,3.6 4.9,2.1 0.5,-0.3 0.8,-0.9 0.9,-1.4 0.1,-0.3 0.4,-0.6 0.8,-0.6 0.4,0 0.7,0.2 0.8,0.6 0.1,0.5 0.3,0.9 0.7,1.2 2.3,1.8 4.9,0.3 5.1,-1.9 0,-0.3 0.2,-0.6 0.5,-0.7 0.3,-0.1 0.6,0 0.8,0.2 0.6,0.6 1.3,1 2.1,1 0,0 0,0 0,0 1,0 2,-0.5 2.6,-1.5 0.4,-0.6 0.5,-1.2 0.4,-2 0,-0.3 0.1,-0.6 0.3,-0.8 0.2,-0.2 0.6,-0.2 0.8,0 0.6,0.3 1.3,0.5 2,0.3 1.1,-0.2 2,-1.1 2.3,-2.1 0.2,-0.7 0.1,-1.4 -0.2,-2.1 -0.1,-0.3 -0.1,-0.6 0.1,-0.8 0.2,-0.2 0.5,-0.3 0.8,-0.3 0.7,0.1 1.3,0.1 1.9,-0.2 0.9,-0.4 1.5,-1.2 1.7,-2.2 0.2,-1 -0.1,-1.9 -0.8,-2.6 -0.2,-0.2 -0.3,-0.5 -0.2,-0.8 0.1,-0.3 0.4,-0.5 0.7,-0.5 0.7,0 1.5,-0.2 2,-0.8 1.7,-1.8 0.9,-4.2 -1,-5 -0.3,-0.1 -0.5,-0.4 -0.5,-0.8 0,-0.3 0.3,-0.6 0.6,-0.7 0.6,-0.1 1.1,-0.4 1.5,-0.8 1.6,-2.1 0.3,-4.7 -1.8,-5 -0.3,0 -0.6,-0.3 -0.6,-0.6 -0.1,-0.3 0,-0.6 0.3,-0.8 0.8,-0.6 1.2,-1.4 1.2,-2.3 0,-0.3 -0.1,-0.7 -0.3,-1 -1.3,-2 -2.1,-2.2 -3,-2.1 -0.3,0 -0.6,-0.1 -0.7,-0.4 -0.2,-0.3 -0.1,-0.6 0,-0.8 0.3,-0.5 0.5,-1 0.5,-1.6 0,-0.7 -0.2,-1.4 -0.6,-1.9 -0.6,-0.7 -1.4,-1.1 -2.3,-1.2 -0.4,0 -0.8,0.1 -1.2,0.2 -0.3,0.1 -0.6,0.1 -0.8,-0.2 -0.2,-0.2 -0.3,-0.5 -0.2,-0.8 0.2,-0.6 0.2,-1.2 0,-1.8 -0.4,-1.1 -1.3,-1.9 -2.5,-2.1 -0.8,-0.1 -1.6,0.1 -2.3,0.7 -0.2,0.2 -0.6,0.2 -0.8,0.1 -0.3,-0.1 -0.4,-0.4 -0.4,-0.7 0.1,-1.2 -0.5,-2.2 -1.4,-2.7 -1.8,-0.9 -3.5,0 -4.2,1.3 -0.2,0.3 -0.5,0.5 -0.8,0.4 -0.3,0 -0.6,-0.3 -0.6,-0.6 -0.2,-1 -0.8,-1.8 -1.7,-2.2 -1.9,-0.8 -3.9,0.3 -4.2,2.1 -0.1,0.3 -0.3,0.6 -0.6,0.6 C 33,14.3 32.7,14.1 32.5,13.8 32,13.1 31,12.5 30,12.5 c -1.6,0 -3,1.3 -3.1,2.9 0,0 0,0.1 0,0.1 v 0.1 c 0,0.3 -0.2,0.6 -0.4,0.7 -0.3,0.1 -0.6,0.1 -0.8,-0.1 -0.6,-0.5 -1.4,-0.7 -2.3,-0.6 -1.1,0.1 -2.1,1 -2.4,2.1 -0.2,0.6 -0.2,1.2 0,1.8 0.1,0.3 0,0.6 -0.2,0.8 -0.2,0.2 -0.5,0.3 -0.8,0.2 -0.6,-0.2 -1.2,-0.3 -1.8,-0.1 -1.1,0.3 -2,1.2 -2.2,2.3 -0.2,0.8 0,1.6 0.5,2.3 0.2,0.2 0.2,0.6 0,0.8 -0.2,0.3 -0.4,0.4 -0.7,0.4 h -0.1 c 0,0 -0.1,0 -0.1,0 -1.6,0 -3,1.3 -3.1,2.9 0,1 0.5,2 1.3,2.6 0.3,0.2 0.4,0.5 0.3,0.8 -0.1,0.3 -0.4,0.6 -0.7,0.6 -0.5,0 -1,0.2 -1.4,0.5 -2.1,2 -0.9,4.8 1.2,5.3 0.3,0.1 0.6,0.4 0.6,0.7 0,0.3 -0.2,0.7 -0.5,0.8 -0.4,0.2 -0.8,0.4 -1.1,0.8 -1.6,2.3 0,4.9 2.2,4.9 0.3,0 0.6,0.2 0.7,0.5 0.1,0.3 0.1,0.6 -0.2,0.8 -0.6,0.6 -0.9,1.4 -0.8,2.2 0.1,1.1 0.8,2.1 1.9,2.6 0.6,0.3 1.2,0.3 1.8,0.2 0.3,-0.1 0.6,0 0.8,0.3 0.2,0.2 0.2,0.6 0.1,0.8 -0.3,0.6 -0.4,1.3 -0.2,2 0.3,1.1 1.1,1.9 2.2,2.2 1,0.2 1.7,-0.1 2.2,-0.3 0.2,-0.1 -1.3,3.6 -2.4,6.1 -0.3,0.8 0.5,1.7 1.4,1.3 3.2,-1.7 8.8,-4.2 8.8,-4 z" class="st0" inkscape:connector-curvature="0" style="fill:#878787"/>
|
||||
|
||||
</g>
|
||||
|
||||
<g id="g3733">
|
||||
<circle id="circle3727" r="3.7" cy="38.299999" cx="24.9" class="st1" style="fill:#ffffff"/>
|
||||
|
||||
<path id="path3729" d="m 40.7,38.3 c 0,2.1 -1.7,3.7 -3.7,3.7 -2.1,0 -3.7,-1.7 -3.7,-3.7 0,-2 7.4,-2.1 7.4,0 z" class="st1" inkscape:connector-curvature="0" style="fill:#ffffff"/>
|
||||
|
||||
<circle id="circle3731" r="3.7" cy="38.299999" cx="49" class="st1" style="fill:#ffffff"/>
|
||||
|
||||
</g>
|
||||
|
||||
</g>
|
||||
<g transform="matrix(0.20394939,0,0,0.20394939,53.147489,17.386415)" id="layer1-3">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.14331597,0,0,0.14331597,115.93632,6.4245667)" id="layer1-7" inkscape:label="Layer 1">
|
||||
<g style="display:inline" id="g4845-5" transform="matrix(0,-1,-1,0,373.50506,516.50504)">
|
||||
<g inkscape:label="Layer 1" id="g4778-3" transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)" inkscape:export-filename="next01.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90">
|
||||
<g style="display:inline" id="g4780-5" transform="matrix(-1,0,0,1,575.99999,611)">
|
||||
<rect transform="scale(-1,1)" y="345.36221" x="-438.00244" height="96" width="96.037987" id="rect4782-6" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"/>
|
||||
<path inkscape:connector-curvature="0" id="path4170" d="m 429.99929,393.33773 c 0,0.004 -9.5e-4,0.007 -0.007,0.009 -0.001,0.007 -0.006,0.007 -0.009,0.009 -0.003,0.006 -0.008,0.008 -0.011,0.009 -0.003,0.006 -0.003,0.006 -0.007,0.009 -10.86428,5.06033 -21.9364,8.97057 -28.72087,11.19382 -0.006,7.31383 -0.28348,19.36 -1.77427,30.84126 -0.004,10e-4 -0.006,0.002 -0.009,-0.002 -0.007,10e-4 -0.01,-0.004 -0.0129,-0.007 -0.007,-10e-4 -0.009,-0.004 -0.011,-0.007 -0.007,-10e-4 -0.006,-0.002 -0.009,-0.004 -8.17196,-8.76466 -15.31373,-18.08322 -19.52571,-23.8462 -6.9601,2.25521 -18.50812,5.71446 -29.89293,7.84517 -0.002,-0.003 -0.003,-0.004 0,-0.009 -0.003,-0.006 10e-4,-0.01 0.002,-0.0129 -0.001,-0.007 10e-4,-0.011 0.002,-0.0129 -0.001,-0.007 -0.001,-0.008 0,-0.011 5.81401,-10.47791 12.47128,-20.14765 16.65275,-25.93264 -4.29657,-5.92015 -11.1555,-15.83137 -16.70025,-25.99521 0.002,-0.003 0.006,-0.003 0.0111,-0.002 0.004,-0.004 0.01,-0.002 0.0129,-0.002 0.006,-0.003 0.011,-0.002 0.0129,-0.002 0.006,-0.003 0.007,-0.004 0.0111,-0.004 11.76574,2.28943 23.02338,5.63169 29.81955,7.81927 4.30503,-5.9142 11.61263,-15.49511 19.56888,-23.90661 0.003,10e-4 0.006,0.003 0.007,0.009 0.006,0.003 0.006,0.008 0.007,0.011 0.004,0.004 0.006,0.0112 0.007,0.0129 0.004,0.004 0.007,0.004 0.009,0.009 1.4575,11.89244 1.75546,23.62651 1.77428,30.76358 6.95749,2.26527 18.3316,6.25356 28.7921,11.21756 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(-0.05275813,-0.13325181,0.13325181,-0.05275813,6.9661783,108.94066)" id="layer1-7-2" inkscape:label="Layer 1">
|
||||
<g style="display:inline" id="g4845-5-9" transform="matrix(0,-1,-1,0,373.50506,516.50504)">
|
||||
<g inkscape:label="Layer 1" id="g4778-3-1" transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)" inkscape:export-filename="next01.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90">
|
||||
<g style="display:inline" id="g4780-5-2" transform="matrix(-1,0,0,1,575.99999,611)">
|
||||
<rect transform="scale(-1,1)" y="345.36221" x="-438.00244" height="96" width="96.037987" id="rect4782-6-7" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"/>
|
||||
<path inkscape:connector-curvature="0" id="path4170-0" d="m 429.99929,393.33773 c 0,0.004 -9.5e-4,0.007 -0.007,0.009 -0.001,0.007 -0.006,0.007 -0.009,0.009 -0.003,0.006 -0.008,0.008 -0.011,0.009 -0.003,0.006 -0.003,0.006 -0.007,0.009 -10.86428,5.06033 -21.9364,8.97057 -28.72087,11.19382 -0.006,7.31383 -0.28348,19.36 -1.77427,30.84126 -0.004,10e-4 -0.006,0.002 -0.009,-0.002 -0.007,10e-4 -0.01,-0.004 -0.0129,-0.007 -0.007,-10e-4 -0.009,-0.004 -0.011,-0.007 -0.007,-10e-4 -0.006,-0.002 -0.009,-0.004 -8.17196,-8.76466 -15.31373,-18.08322 -19.52571,-23.8462 -6.9601,2.25521 -18.50812,5.71446 -29.89293,7.84517 -0.002,-0.003 -0.003,-0.004 0,-0.009 -0.003,-0.006 10e-4,-0.01 0.002,-0.0129 -0.001,-0.007 10e-4,-0.011 0.002,-0.0129 -0.001,-0.007 -0.001,-0.008 0,-0.011 5.81401,-10.47791 12.47128,-20.14765 16.65275,-25.93264 -4.29657,-5.92015 -11.1555,-15.83137 -16.70025,-25.99521 0.002,-0.003 0.006,-0.003 0.0111,-0.002 0.004,-0.004 0.01,-0.002 0.0129,-0.002 0.006,-0.003 0.011,-0.002 0.0129,-0.002 0.006,-0.003 0.007,-0.004 0.0111,-0.004 11.76574,2.28943 23.02338,5.63169 29.81955,7.81927 4.30503,-5.9142 11.61263,-15.49511 19.56888,-23.90661 0.003,10e-4 0.006,0.003 0.007,0.009 0.006,0.003 0.006,0.008 0.007,0.011 0.004,0.004 0.006,0.0112 0.007,0.0129 0.004,0.004 0.007,0.004 0.009,0.009 1.4575,11.89244 1.75546,23.62651 1.77428,30.76358 6.95749,2.26527 18.3316,6.25356 28.7921,11.21756 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.11335991,-0.05676641,0.05676641,0.11335991,131.32884,182.57734)" id="layer1-3-9">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845-3">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778-6">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780-0">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782-62"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849-6" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(-0.08526503,-0.09382307,0.09382307,-0.08526503,162.91459,100.60822)" id="layer1-3-1">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845-8">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778-7">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780-9">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782-2"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849-0" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.10698289,0.06802614,-0.06802614,0.10698289,41.950743,171.57375)" id="layer1-3-2">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845-37">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778-5">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780-92">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782-28"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849-9" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.21497396,0,0,0.21497395,186.37278,111.09076)" id="layer1-7-7" inkscape:label="Layer 1">
|
||||
<g style="display:inline" id="g4845-5-3" transform="matrix(0,-1,-1,0,373.50506,516.50504)">
|
||||
<g inkscape:label="Layer 1" id="g4778-3-6" transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)" inkscape:export-filename="next01.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90">
|
||||
<g style="display:inline" id="g4780-5-1" transform="matrix(-1,0,0,1,575.99999,611)">
|
||||
<rect transform="scale(-1,1)" y="345.36221" x="-438.00244" height="96" width="96.037987" id="rect4782-6-2" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"/>
|
||||
<path inkscape:connector-curvature="0" id="path4170-9" d="m 429.99929,393.33773 c 0,0.004 -9.5e-4,0.007 -0.007,0.009 -0.001,0.007 -0.006,0.007 -0.009,0.009 -0.003,0.006 -0.008,0.008 -0.011,0.009 -0.003,0.006 -0.003,0.006 -0.007,0.009 -10.86428,5.06033 -21.9364,8.97057 -28.72087,11.19382 -0.006,7.31383 -0.28348,19.36 -1.77427,30.84126 -0.004,10e-4 -0.006,0.002 -0.009,-0.002 -0.007,10e-4 -0.01,-0.004 -0.0129,-0.007 -0.007,-10e-4 -0.009,-0.004 -0.011,-0.007 -0.007,-10e-4 -0.006,-0.002 -0.009,-0.004 -8.17196,-8.76466 -15.31373,-18.08322 -19.52571,-23.8462 -6.9601,2.25521 -18.50812,5.71446 -29.89293,7.84517 -0.002,-0.003 -0.003,-0.004 0,-0.009 -0.003,-0.006 10e-4,-0.01 0.002,-0.0129 -0.001,-0.007 10e-4,-0.011 0.002,-0.0129 -0.001,-0.007 -0.001,-0.008 0,-0.011 5.81401,-10.47791 12.47128,-20.14765 16.65275,-25.93264 -4.29657,-5.92015 -11.1555,-15.83137 -16.70025,-25.99521 0.002,-0.003 0.006,-0.003 0.0111,-0.002 0.004,-0.004 0.01,-0.002 0.0129,-0.002 0.006,-0.003 0.011,-0.002 0.0129,-0.002 0.006,-0.003 0.007,-0.004 0.0111,-0.004 11.76574,2.28943 23.02338,5.63169 29.81955,7.81927 4.30503,-5.9142 11.61263,-15.49511 19.56888,-23.90661 0.003,10e-4 0.006,0.003 0.007,0.009 0.006,0.003 0.006,0.008 0.007,0.011 0.004,0.004 0.006,0.0112 0.007,0.0129 0.004,0.004 0.007,0.004 0.009,0.009 1.4575,11.89244 1.75546,23.62651 1.77428,30.76358 6.95749,2.26527 18.3316,6.25356 28.7921,11.21756 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(-0.08041856,0.09800893,-0.09800893,-0.08041856,139.91992,284.24876)" id="layer1-3-1-3">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845-8-1">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778-7-9">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780-9-4">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782-2-7"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849-0-8" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.01456664,-0.07599603,0.07599603,0.01456664,80.480787,182.36304)" id="layer1-7-2-4" inkscape:label="Layer 1">
|
||||
<g style="display:inline" id="g4845-5-9-5" transform="matrix(0,-1,-1,0,373.50506,516.50504)">
|
||||
<g inkscape:label="Layer 1" id="g4778-3-1-0" transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)" inkscape:export-filename="next01.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90">
|
||||
<g style="display:inline" id="g4780-5-2-3" transform="matrix(-1,0,0,1,575.99999,611)">
|
||||
<rect transform="scale(-1,1)" y="345.36221" x="-438.00244" height="96" width="96.037987" id="rect4782-6-7-6" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"/>
|
||||
<path inkscape:connector-curvature="0" id="path4170-0-1" d="m 429.99929,393.33773 c 0,0.004 -9.5e-4,0.007 -0.007,0.009 -0.001,0.007 -0.006,0.007 -0.009,0.009 -0.003,0.006 -0.008,0.008 -0.011,0.009 -0.003,0.006 -0.003,0.006 -0.007,0.009 -10.86428,5.06033 -21.9364,8.97057 -28.72087,11.19382 -0.006,7.31383 -0.28348,19.36 -1.77427,30.84126 -0.004,10e-4 -0.006,0.002 -0.009,-0.002 -0.007,10e-4 -0.01,-0.004 -0.0129,-0.007 -0.007,-10e-4 -0.009,-0.004 -0.011,-0.007 -0.007,-10e-4 -0.006,-0.002 -0.009,-0.004 -8.17196,-8.76466 -15.31373,-18.08322 -19.52571,-23.8462 -6.9601,2.25521 -18.50812,5.71446 -29.89293,7.84517 -0.002,-0.003 -0.003,-0.004 0,-0.009 -0.003,-0.006 10e-4,-0.01 0.002,-0.0129 -0.001,-0.007 10e-4,-0.011 0.002,-0.0129 -0.001,-0.007 -0.001,-0.008 0,-0.011 5.81401,-10.47791 12.47128,-20.14765 16.65275,-25.93264 -4.29657,-5.92015 -11.1555,-15.83137 -16.70025,-25.99521 0.002,-0.003 0.006,-0.003 0.0111,-0.002 0.004,-0.004 0.01,-0.002 0.0129,-0.002 0.006,-0.003 0.011,-0.002 0.0129,-0.002 0.006,-0.003 0.007,-0.004 0.0111,-0.004 11.76574,2.28943 23.02338,5.63169 29.81955,7.81927 4.30503,-5.9142 11.61263,-15.49511 19.56888,-23.90661 0.003,10e-4 0.006,0.003 0.007,0.009 0.006,0.003 0.006,0.008 0.007,0.011 0.004,0.004 0.006,0.0112 0.007,0.0129 0.004,0.004 0.007,0.004 0.009,0.009 1.4575,11.89244 1.75546,23.62651 1.77428,30.76358 6.95749,2.26527 18.3316,6.25356 28.7921,11.21756 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(-0.12765378,0.07360069,-0.07360069,-0.12765378,81.653111,258.78327)" id="layer1-7-2-0" inkscape:label="Layer 1">
|
||||
<g style="display:inline" id="g4845-5-9-6" transform="matrix(0,-1,-1,0,373.50506,516.50504)">
|
||||
<g inkscape:label="Layer 1" id="g4778-3-1-3" transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)" inkscape:export-filename="next01.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90">
|
||||
<g style="display:inline" id="g4780-5-2-2" transform="matrix(-1,0,0,1,575.99999,611)">
|
||||
<rect transform="scale(-1,1)" y="345.36221" x="-438.00244" height="96" width="96.037987" id="rect4782-6-7-0" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"/>
|
||||
<path inkscape:connector-curvature="0" id="path4170-0-6" d="m 429.99929,393.33773 c 0,0.004 -9.5e-4,0.007 -0.007,0.009 -0.001,0.007 -0.006,0.007 -0.009,0.009 -0.003,0.006 -0.008,0.008 -0.011,0.009 -0.003,0.006 -0.003,0.006 -0.007,0.009 -10.86428,5.06033 -21.9364,8.97057 -28.72087,11.19382 -0.006,7.31383 -0.28348,19.36 -1.77427,30.84126 -0.004,10e-4 -0.006,0.002 -0.009,-0.002 -0.007,10e-4 -0.01,-0.004 -0.0129,-0.007 -0.007,-10e-4 -0.009,-0.004 -0.011,-0.007 -0.007,-10e-4 -0.006,-0.002 -0.009,-0.004 -8.17196,-8.76466 -15.31373,-18.08322 -19.52571,-23.8462 -6.9601,2.25521 -18.50812,5.71446 -29.89293,7.84517 -0.002,-0.003 -0.003,-0.004 0,-0.009 -0.003,-0.006 10e-4,-0.01 0.002,-0.0129 -0.001,-0.007 10e-4,-0.011 0.002,-0.0129 -0.001,-0.007 -0.001,-0.008 0,-0.011 5.81401,-10.47791 12.47128,-20.14765 16.65275,-25.93264 -4.29657,-5.92015 -11.1555,-15.83137 -16.70025,-25.99521 0.002,-0.003 0.006,-0.003 0.0111,-0.002 0.004,-0.004 0.01,-0.002 0.0129,-0.002 0.006,-0.003 0.011,-0.002 0.0129,-0.002 0.006,-0.003 0.007,-0.004 0.0111,-0.004 11.76574,2.28943 23.02338,5.63169 29.81955,7.81927 4.30503,-5.9142 11.61263,-15.49511 19.56888,-23.90661 0.003,10e-4 0.006,0.003 0.007,0.009 0.006,0.003 0.006,0.008 0.007,0.011 0.004,0.004 0.006,0.0112 0.007,0.0129 0.004,0.004 0.007,0.004 0.009,0.009 1.4575,11.89244 1.75546,23.62651 1.77428,30.76358 6.95749,2.26527 18.3316,6.25356 28.7921,11.21756 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(-0.12725507,-0.14002765,0.14002765,-0.12725507,1.4536,290.74091)" id="layer1-3-1-1">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845-8-5">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778-7-5">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780-9-47">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782-2-6"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849-0-5" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(-0.04494106,-0.11350812,0.11350812,-0.04494106,164.40006,247.77949)" id="layer1-7-2-6" inkscape:label="Layer 1">
|
||||
<g style="display:inline" id="g4845-5-9-9" transform="matrix(0,-1,-1,0,373.50506,516.50504)">
|
||||
<g inkscape:label="Layer 1" id="g4778-3-1-37" transform="matrix(-0.9996045,0,0,1,575.94296,-611.00001)" inkscape:export-filename="next01.png" inkscape:export-xdpi="90" inkscape:export-ydpi="90">
|
||||
<g style="display:inline" id="g4780-5-2-4" transform="matrix(-1,0,0,1,575.99999,611)">
|
||||
<rect transform="scale(-1,1)" y="345.36221" x="-438.00244" height="96" width="96.037987" id="rect4782-6-7-5" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:none;stroke:none;stroke-width:4;marker:none;enable-background:accumulate"/>
|
||||
<path inkscape:connector-curvature="0" id="path4170-0-2" d="m 429.99929,393.33773 c 0,0.004 -9.5e-4,0.007 -0.007,0.009 -0.001,0.007 -0.006,0.007 -0.009,0.009 -0.003,0.006 -0.008,0.008 -0.011,0.009 -0.003,0.006 -0.003,0.006 -0.007,0.009 -10.86428,5.06033 -21.9364,8.97057 -28.72087,11.19382 -0.006,7.31383 -0.28348,19.36 -1.77427,30.84126 -0.004,10e-4 -0.006,0.002 -0.009,-0.002 -0.007,10e-4 -0.01,-0.004 -0.0129,-0.007 -0.007,-10e-4 -0.009,-0.004 -0.011,-0.007 -0.007,-10e-4 -0.006,-0.002 -0.009,-0.004 -8.17196,-8.76466 -15.31373,-18.08322 -19.52571,-23.8462 -6.9601,2.25521 -18.50812,5.71446 -29.89293,7.84517 -0.002,-0.003 -0.003,-0.004 0,-0.009 -0.003,-0.006 10e-4,-0.01 0.002,-0.0129 -0.001,-0.007 10e-4,-0.011 0.002,-0.0129 -0.001,-0.007 -0.001,-0.008 0,-0.011 5.81401,-10.47791 12.47128,-20.14765 16.65275,-25.93264 -4.29657,-5.92015 -11.1555,-15.83137 -16.70025,-25.99521 0.002,-0.003 0.006,-0.003 0.0111,-0.002 0.004,-0.004 0.01,-0.002 0.0129,-0.002 0.006,-0.003 0.011,-0.002 0.0129,-0.002 0.006,-0.003 0.007,-0.004 0.0111,-0.004 11.76574,2.28943 23.02338,5.63169 29.81955,7.81927 4.30503,-5.9142 11.61263,-15.49511 19.56888,-23.90661 0.003,10e-4 0.006,0.003 0.007,0.009 0.006,0.003 0.006,0.008 0.007,0.011 0.004,0.004 0.006,0.0112 0.007,0.0129 0.004,0.004 0.007,0.004 0.009,0.009 1.4575,11.89244 1.75546,23.62651 1.77428,30.76358 6.95749,2.26527 18.3316,6.25356 28.7921,11.21756 z" style="color:#000000;display:inline;overflow:visible;visibility:visible;fill:#808080;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:3;marker:none;enable-background:accumulate"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.11335991,-0.05676641,0.05676641,0.11335991,164.93091,31.23567)" id="layer1-3-9-5">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845-3-4">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778-6-7">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780-0-4">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782-62-4"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849-6-3" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.07328708,0.04660033,-0.04660033,0.07328708,202.61287,11.89896)" id="layer1-3-2-0">
|
||||
<g transform="matrix(0,-1,-1,0,373.51,516.51)" id="g4845-37-7">
|
||||
<g transform="matrix(-0.9996,0,0,1,575.94,-611)" id="g4778-5-8">
|
||||
<g transform="matrix(-1,0,0,1,576,611)" id="g4780-92-6">
|
||||
<rect x="-438" y="345.35999" width="96.038002" height="96" transform="scale(-1,1)" style="color:#000000;fill:none" id="rect4782-28-8"/>
|
||||
<path d="m 430,411.93 c 0,11.675 -9.3424,21.174 -20.961,21.429 -5.3915,0 -9.5995,-1.413 -13.487,-2.8571 -16.066,-6.7837 -29.485,-20 -45.584,-37.143 16.098,-17.143 29.518,-30.359 45.584,-37.143 3.888,-1.4441 8.096,-2.8571 13.487,-2.8571 11.618,0.25447 20.961,9.7538 20.961,21.429 0,7.9422 -4.3266,14.87 -10.748,18.571 6.4217,3.7014 10.748,10.629 10.748,18.571 z" style="color:#000000;fill:#808080" id="path4849-9-8" inkscape:connector-curvature="0"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<style id="style3713" type="text/css">
|
||||
.st0{fill:#878787;}
|
||||
.st1{fill:#FFFFFF;}
|
||||
</style>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 27 KiB |
BIN
assets/favicon.ico
Normal file
BIN
assets/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 133 KiB |
168
assets/info-logo.svg
Normal file
168
assets/info-logo.svg
Normal file
|
|
@ -0,0 +1,168 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Generator: Adobe Illustrator 22.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
|
||||
<svg
|
||||
version="1.1"
|
||||
x="0px"
|
||||
y="0px"
|
||||
viewBox="0 0 640 640"
|
||||
xml:space="preserve"
|
||||
id="svg24"
|
||||
sodipodi:docname="info-logo.svg"
|
||||
inkscape:version="1.2.1 (9c6d41e410, 2022-07-14, custom)"
|
||||
width="640"
|
||||
height="640"
|
||||
inkscape:export-filename="info-logo.png"
|
||||
inkscape:export-xdpi="96"
|
||||
inkscape:export-ydpi="96"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"><defs
|
||||
id="defs29" /><sodipodi:namedview
|
||||
id="namedview26"
|
||||
pagecolor="#505050"
|
||||
bordercolor="#eeeeee"
|
||||
borderopacity="1"
|
||||
inkscape:showpageshadow="0"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pagecheckerboard="0"
|
||||
inkscape:deskcolor="#505050"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="235.113"
|
||||
inkscape:cy="375.4737"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1012"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg24" />
|
||||
<style
|
||||
type="text/css"
|
||||
id="style2">
|
||||
.st0{fill:url(#SVGID_1_);}
|
||||
.st1{fill:#F094BE;}
|
||||
.st2{fill:#4D3F92;}
|
||||
.st3{fill:#FFFFFF;}
|
||||
</style>
|
||||
|
||||
|
||||
<text
|
||||
xml:space="preserve"
|
||||
style="font-size:26.6667px;line-height:1.25;font-family:'Noto Sans Linear B';-inkscape-font-specification:'Noto Sans Linear B';display:none;fill:#ff0000;fill-opacity:0.993491"
|
||||
x="94.643097"
|
||||
y="633.18518"
|
||||
id="text455"
|
||||
inkscape:label="Note: I do not know the original font used...."
|
||||
sodipodi:insensitive="true"><tspan
|
||||
sodipodi:role="line"
|
||||
id="tspan453"
|
||||
x="0"
|
||||
y="0"
|
||||
style="font-size:26.6667px;fill:#ff0000;fill-opacity:0.993491">Note: I do not know the original font used....</tspan></text><g
|
||||
id="Capa_2"
|
||||
transform="matrix(1.6168892,0,0,1.6168895,172.88889,94.00966)"
|
||||
style="image-rendering:auto">
|
||||
<g
|
||||
id="g21"
|
||||
transform="translate(9.4535881e-5,0.46581846)">
|
||||
<path
|
||||
class="st2"
|
||||
d="m 151.6,95.1 c 1.5,-0.3 2.8,-1 3.8,-2 4,-5.3 0.8,-11.8 -4.5,-12.6 -0.8,0 -1.5,-0.8 -1.5,-1.5 0,-0.3 0,-0.5 0,-0.5 0.8,-0.8 1.5,-1.8 2.5,-3.3 8.1,-10.8 11.8,-50.6 3.8,-53.7 -9.8,-3.3 -29.7,6.3 -38.3,17.4 -0.5,-0.3 -1,-1 -1,-1.8 0.3,-3 -1.3,-5.5 -3.5,-6.8 -4.5,-2.3 -8.8,0 -10.6,3.3 -0.5,0.8 -1.3,1.3 -2,1 -0.8,0 -1.5,-0.8 -1.5,-1.5 -0.5,-2.5 -2,-4.5 -4.3,-5.5 -4.8,-2 -9.8,0.8 -10.6,5.3 -0.3,0.8 -0.8,1.5 -1.5,1.5 -0.8,0.3 -1.5,-0.3 -2,-1 -1.5,-2.3 -4,-3.8 -6.5,-3.8 -4,0 -7.6,3.3 -7.8,7.3 v 0.3 0.3 c 0,0.8 -0.5,1.5 -1,1.8 H 64.8 C 56.5,28.5 36.3,18.6 26.3,21.9 c -8.1,2.8 -4.3,42.6 4,53.4 1.5,2 2.8,3.5 3.8,4.5 -0.3,0.8 -1,1.5 -1.8,1.5 -1.3,0 -2.5,0.5 -3.5,1.3 -5.3,5 -2.3,12.1 3,13.4 0.8,0.3 1.5,1 1.5,1.8 0,0.8 -0.5,1.8 -1.3,2 -1,0.5 -2,1 -2.8,2 -4,5.8 0,12.3 5.5,12.3 0.8,0 1.5,0.5 1.8,1.3 0.3,0.8 0.3,1.5 -0.5,2 -1.5,1.5 -2.3,3.5 -2,5.5 0.3,2.8 2,5.3 4.8,6.5 1.5,0.8 3,0.8 4.5,0.5 0.8,-0.3 1.5,0 2,0.8 0.5,0.5 0.5,1.5 0.3,2 -0.8,1.5 -1,3.3 -0.5,5 0.8,2.8 2.8,4.8 5.5,5.5 2.5,0.5 4.3,-0.3 5.5,-0.8 0.5,-0.3 -3.3,9.1 -6,15.4 -0.8,2 1.3,4.3 3.5,3.3 8.3,-3.8 22.2,-10.3 22.2,-9.8 0.5,5.3 6.5,9.1 12.3,5.3 1.3,-0.8 2,-2.3 2.3,-3.5 0.3,-0.8 1,-1.5 2,-1.5 1,0 1.8,0.5 2,1.5 0.3,1.3 0.8,2.3 1.8,3 5.8,4.5 12.3,0.8 12.8,-4.8 0,-0.8 0.5,-1.5 1.3,-1.8 0.8,-0.3 1.5,0 2,0.5 1.5,1.5 3.3,2.5 5.3,2.5 v 0 c 2.5,0 5,-1.3 6.5,-3.8 1,-1.5 1.3,-3 1,-5 0,-0.8 0.3,-1.5 0.8,-2 0.5,-0.5 1.5,-0.5 2,0 1.5,0.8 3.3,1.3 5,0.8 2.8,-0.5 5,-2.8 5.8,-5.3 0.5,-1.8 0.3,-3.5 -0.5,-5.3 -0.3,-0.8 -0.3,-1.5 0.3,-2 0.6,-0.5 1.3,-0.8 2,-0.8 1.8,0.3 3.3,0.3 4.8,-0.5 2.3,-1 3.8,-3 4.3,-5.5 0.5,-2.5 -0.3,-4.8 -2,-6.5 -0.5,-0.5 -0.8,-1.3 -0.5,-2 0.3,-0.7 1,-1.3 1.8,-1.3 1.8,0 3.8,-0.5 5,-2 4.3,-4.5 2.3,-10.6 -2.5,-12.6 -0.8,-0.3 -1.3,-1 -1.3,-2 0,-0.9 0.7,-1.6 1.5,-1.6 z"
|
||||
id="path7"
|
||||
style="stroke:#ffffff;stroke-width:4.32930058;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke markers fill" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m 131.4,42.2 c 0.5,1.5 0.5,3 0,4.5 -0.3,0.8 0,1.5 0.5,2 0.5,0.5 1.3,0.8 2,0.5 1,-0.5 2,-0.5 3,-0.5 2.3,0 4.3,1 5.8,3 1,1.3 1.8,3 1.5,4.8 0,1.5 -0.5,2.8 -1.3,4 -0.5,0.5 -0.5,1.5 0,2 0.3,0.3 0.5,0.8 1,0.8 1,-0.3 2,-1 2.8,-2 4.5,-6.3 5.3,-26.2 0.8,-27.7 -4.5,-1.5 -12.3,1.5 -17.9,6 1.1,0.5 1.6,1.3 1.8,2.6 z"
|
||||
id="path9" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m 39,63.6 c 0.3,-0.3 0.5,-0.5 0.8,-0.8 0.5,-0.8 0.3,-1.5 0,-2 C 38.5,59 38.2,57 38.5,55 39,52.2 41.3,50 44,49.2 c 1.5,-0.5 3,-0.3 4.5,0.3 0.8,0.3 1.5,0 2,-0.5 0.5,-0.5 0.8,-1.3 0.5,-2 -0.5,-1.5 -0.5,-3 0,-4.5 0.3,-1 0.8,-2 1.5,-2.8 -5.5,-4.5 -13.9,-7.8 -18.4,-6.3 -4.5,1.5 -3.7,21.4 0.9,27.7 1,1.5 2.2,2.2 4,2.5 z"
|
||||
id="path11" />
|
||||
<g
|
||||
id="g19">
|
||||
<circle
|
||||
class="st3"
|
||||
cx="60.900002"
|
||||
cy="94.599998"
|
||||
r="9.3000002"
|
||||
id="circle13" />
|
||||
<path
|
||||
class="st3"
|
||||
d="m 100.7,94.6 c 0,5.3 -4.3,9.3 -9.3,9.3 -5.3,0 -9.3,-4.3 -9.3,-9.3 0,-5 18.6,-5.3 18.6,0 z"
|
||||
id="path15" />
|
||||
<circle
|
||||
class="st3"
|
||||
cx="121.6"
|
||||
cy="94.599998"
|
||||
r="9.3000002"
|
||||
id="circle17" />
|
||||
</g>
|
||||
</g>
|
||||
</g><g
|
||||
id="g2720"
|
||||
inkscape:label="fluffychat"
|
||||
style="display:inline;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
transform="matrix(0.92025338,0,0,0.92025338,-6.3220161,-4.7055202)"><g
|
||||
id="g14535"
|
||||
inkscape:label="chat"
|
||||
style="fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 562.92197,448.4866 c -2.60917,-0.30486 -5.17384,1.64339 -5.69858,4.21245 -0.55728,2.72842 -0.24323,7.91189 -0.24323,7.91189 -2.74579,-0.0686 -5.55869,-0.59559 -7.95219,1.32171 -2.65609,2.12765 -2.58626,7.00643 0,8.95134 2.34163,1.76095 7.95219,1.25707 7.95219,1.25707 0,10.01284 3.8e-4,19.77116 0,29.784 0.49843,4.92696 4.90461,8.87339 9.77862,9.22679 3.37489,0.31796 6.92487,0.1972 10.13895,-0.94458 2.75868,-1.13315 4.655,-4.36744 3.42462,-7.26639 -0.79803,-2.84864 -4.22476,-3.70476 -6.73165,-2.71773 -2.98388,1.72425 -4.84172,-1.67013 -4.47089,-4.25546 -0.0315,-8.02703 0.014,-16.05409 0.003,-24.08114 2.70412,-0.0577 5.42586,0.12654 8.11662,-0.11491 4.83581,-0.90643 5.26253,-8.45876 0.98226,-10.6606 -1.74161,-0.89591 -5.46982,-0.20326 -9.09888,-0.20326 0,0 0.006,-8.17372 -0.31554,-8.93716 -0.95528,-2.26675 -3.55257,-3.48402 -5.8856,-3.48402 z"
|
||||
id="path14479"
|
||||
sodipodi:nodetypes="sscssscccsscccscsss"
|
||||
inkscape:label="t" /><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 533.83203,458.7646 c -3.15141,-0.34296 -5.3587,2.78921 -5.64507,5.62849 -4.36454,-3.26144 -9.61516,-5.8459 -15.20756,-5.3963 -6.1831,0.04 -12.19324,2.65617 -16.52963,7.04459 -4.78443,4.13385 -6.10787,10.65878 -6.45154,16.67045 -0.74696,9.79875 2.9723,20.42469 11.3567,26.07195 4.72285,3.21814 10.72707,3.94029 16.29823,3.34602 3.96818,-0.47405 7.23684,-2.99092 10.0626,-5.63903 0.94876,3.35182 4.62364,5.93313 8.09234,4.68427 2.67575,-0.73754 4.24888,-3.52866 3.90033,-6.20541 -0.023,-13.74703 0.0461,-27.49708 -0.0348,-41.24221 -0.22956,-2.88413 -2.96011,-5.18257 -5.84164,-4.96282 z m -5.64507,23.94723 c 1.07828,6.5283 -1.60114,14.12719 -7.86545,17.06103 -4.79574,2.30687 -11.28382,1.71783 -14.76373,-2.60852 -4.1706,-4.99711 -5.43623,-12.34122 -2.74467,-18.33861 1.20342,-3.17686 3.3771,-6.03449 6.51321,-7.48705 5.19868,-2.91069 11.95962,-0.98785 15.64553,3.45474 1.89114,2.17769 3.29829,4.97591 3.21511,7.91841 z"
|
||||
id="path12957"
|
||||
sodipodi:nodetypes="ccsssscccscccscc"
|
||||
inkscape:label="a" /><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 443.06641,439.94141 c -3.26433,-0.0465 -6.38452,2.89404 -5.90305,6.25001 0.0229,19.9673 -0.0459,39.93753 0.0344,59.903 0.62565,4.36445 6.57701,6.42025 9.82803,3.46417 2.47654,-1.86092 1.63462,-5.09581 1.78481,-7.74763 0.014,-6.16519 -0.16754,-10.96992 0,-17.13031 0.10617,-3.90402 0.32092,-9.9351 3.79481,-12.41759 3.66729,-2.85819 10.09275,-3.39125 13.27607,-0.31533 3.28466,3.17383 3.05437,10.54267 3.05369,11.74336 -0.005,8.0496 -0.0355,16.10183 0.0353,24.14882 0.80701,3.40737 5.32389,3.39114 8.08366,2.86381 3.60962,-0.47168 4.05352,-4.29795 3.6902,-7.21157 -0.059,-9.29553 0.25875,-18.60594 -0.25343,-27.89111 -0.49072,-5.78736 -2.03801,-10.89373 -6.23092,-13.58338 -5.57775,-3.57799 -14.24081,-3.55982 -19.88013,0 l -5.56919,3.51556 c -0.0217,-6.95923 0.0434,-13.9211 -0.0327,-20.87868 -0.34574,-2.71871 -3.05656,-4.71379 -5.71157,-4.71313 z"
|
||||
id="path12939"
|
||||
sodipodi:nodetypes="sscssscssssscascccs"
|
||||
inkscape:label="h" /><path
|
||||
style="color:#000000;fill:#00a1bc;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 391.91477,465.80108 c -7.57016,7.75562 -8.50788,19.94372 -5.30926,29.86701 3.38934,9.70476 13.24407,16.98333 23.65486,16.44674 6.17898,0.0435 12.93496,-1.24727 17.5401,-5.62829 2.78827,-3.46147 -0.34158,-10.49924 -5.13073,-8.5498 -3.84026,1.83312 -7.88892,3.96797 -12.31147,3.2528 -7.29184,-0.63102 -13.62087,-6.9993 -13.71248,-14.4019 -0.47868,-6.96567 3.61497,-14.86735 10.88009,-16.32616 4.0948,-0.89565 8.1361,0.43964 11.84821,2.0877 2.74473,1.20129 6.92733,2.38997 8.54085,-1.1092 2.05726,-3.93759 -1.06922,-8.39249 -4.75218,-9.94292 -7.03297,-3.7132 -15.61905,-3.33367 -23.00158,-0.92478 -3.03694,1.2244 -5.80603,3.05639 -8.24641,5.2288 z"
|
||||
id="path12912"
|
||||
sodipodi:nodetypes="ssssscccssssssccccss"
|
||||
inkscape:label="c" /></g><g
|
||||
id="g14529"
|
||||
inkscape:label="fluffy"
|
||||
style="fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 364.1013,507.69269 c -0.28866,4.09909 -1.36926,8.95002 -5.67816,10.59919 -4.72351,1.73746 -10.372,1.86184 -14.85523,-0.654 -3.7123,-2.44424 -9.3586,0.29378 -8.95093,4.93619 0.18108,4.54251 4.91635,6.57172 8.83075,6.98673 8.42045,1.69401 18.29318,1.4336 25.17485,-4.32187 4.05818,-3.36451 7.25406,-8.26315 6.89092,-13.72643 0.55108,-15.0706 0.12618,-30.15744 0.2469,-45.233 0,-5.07272 -4.90962,-8.01177 -8.99688,-5.70693 -3.44378,2.45795 -2.39927,9.5583 -2.66313,14.77473 -0.0893,6.25566 0.19851,12.54437 -0.16132,18.7791 -1.9182,7.73184 -13.50136,9.71442 -18.10525,3.34532 -2.59461,-4.37765 -1.10335,-9.66951 -1.51487,-14.47456 -0.1096,-6.36844 0.2575,-12.78073 -0.2057,-19.12097 -1.55752,-5.57454 -11.54277,-5.31263 -11.57028,0.97725 -0.0947,10.73576 -0.20144,21.49831 0.0772,32.23681 0.40229,5.90824 3.9844,11.55506 9.57033,13.81024 7.19201,3.59272 15.68253,1.22319 21.91078,-3.2078 z"
|
||||
id="path8185"
|
||||
sodipodi:nodetypes="sasssccccccszssssss"
|
||||
inkscape:label="y" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path8140"
|
||||
id="use8146-8"
|
||||
transform="translate(160.70024)"
|
||||
inkscape:label="f"
|
||||
style="fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" /><use
|
||||
x="0"
|
||||
y="0"
|
||||
xlink:href="#path8140"
|
||||
id="use8146"
|
||||
transform="translate(120.79317)"
|
||||
inkscape:label="f"
|
||||
style="fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" /><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 203.09961,459.81323 c -3.4821,0.005 -6.38987,3.50283 -5.7894,6.9306 0.0673,9.26978 -0.15327,18.54633 0.13261,27.81164 0.35452,5.09017 2.57678,10.21523 6.82972,13.22644 5.55736,4.38774 13.10608,4.7518 19.86263,3.9702 6.13229,-0.79837 11.54541,-4.96558 14.38597,-10.38016 2.82972,-5.25148 2.04801,-11.37621 2.1897,-17.10493 -0.10216,-6.59361 0.13071,-13.20167 -0.0996,-19.78723 -0.72775,-3.82018 -5.84877,-6.11481 -8.99816,-3.58329 -2.51578,1.5391 -2.9212,4.6479 -2.62583,7.32275 -0.008,7.68886 0.16168,15.38634 -0.0559,23.06981 -0.48698,3.93482 -2.69157,8.39569 -6.95923,9.17239 -3.94192,0.90809 -9.00029,0.30019 -11.2182,-3.51487 -2.44119,-4.33438 -1.38965,-9.47747 -1.63329,-14.21621 -0.005,-5.96309 0.0606,-11.92636 -0.006,-17.88931 -0.48316,-2.81114 -3.21405,-4.945 -6.01521,-5.02783 z"
|
||||
id="path1096"
|
||||
inkscape:label="u"
|
||||
sodipodi:nodetypes="sssssssssssasss" /><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 178.07031,440.24903 c -2.94273,-0.099 -6.12137,2.26392 -5.66929,5.43981 0.006,20.3714 -0.0127,40.74317 0.01,61.11433 0.23114,3.95816 5.38988,5.36394 8.48062,3.72849 2.17789,-0.83721 3.06822,-3.17125 2.82068,-5.34227 0,-20.07299 0,-40.14599 0,-60.21898 0.0267,-2.89989 -3.02815,-4.71312 -5.64156,-4.72138 z"
|
||||
id="path1226"
|
||||
inkscape:label="l"
|
||||
sodipodi:nodetypes="sssssss" /><path
|
||||
style="color:#000000;fill:#444444;fill-opacity:1;stroke:#ffffff;stroke-width:7.6066007;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"
|
||||
d="m 139.73461,448.98277 c -1.14826,3.54622 -0.82212,7.38974 -0.94471,11.07629 -3.09968,0.1617 -6.7129,-0.69772 -9.15473,1.75098 -2.7547,2.92023 -1.92459,9.01668 2.44338,9.87866 2.20538,0.45339 4.47409,0.19142 6.71135,0.26152 0.0152,11.5529 -0.0304,23.10713 0.0229,34.65919 -0.10894,3.56452 3.75176,4.97291 6.73777,4.56755 3.00221,0.16258 5.93165,-2.21911 5.51966,-5.39349 0,-11.27775 0,-22.5555 0,-33.83325 3.22434,-0.0869 6.4758,0.20412 9.67787,-0.21167 4.22512,-0.5039 5.63076,-6.354 2.95775,-9.24029 -2.71637,-2.28723 -6.44022,-1.38284 -9.70112,-1.5715 -0.97817,0 -1.95633,0 -2.9345,0 -0.005,-2.94202 -0.4927,-6.38548 1.50629,-8.82582 2.27205,-1.97081 5.68412,-1.89124 8.14223,-0.31788 3.12241,1.35659 5.95844,-2.03832 6.28128,-4.89774 0.55889,-3.56544 -2.59547,-6.6544 -6.01774,-6.93035 -7.34549,-1.08714 -15.56841,1.21331 -20.11043,7.37767 -0.40614,0.53074 -0.78524,1.08209 -1.13728,1.65013 z"
|
||||
id="path8140"
|
||||
inkscape:label="f"
|
||||
sodipodi:nodetypes="scszscszscszscsszcs" /></g></g></svg>
|
||||
|
After Width: | Height: | Size: 15 KiB |
0
assets/js/package/.gitkeep
Normal file
0
assets/js/package/.gitkeep
Normal file
2663
assets/l10n/intl_ar.arb
Normal file
2663
assets/l10n/intl_ar.arb
Normal file
File diff suppressed because it is too large
Load diff
25
assets/l10n/intl_bn.arb
Normal file
25
assets/l10n/intl_bn.arb
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
"@@last_modified": "2021-08-14 12:41:10.154280",
|
||||
"about": "সম্পর্কে",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "স্বীকার করি",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "{username} আমন্ত্রণ গ্রহণ করেছে",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"account": "অ্যাকাউন্ট",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
2016
assets/l10n/intl_ca.arb
Normal file
2016
assets/l10n/intl_ca.arb
Normal file
File diff suppressed because it is too large
Load diff
2570
assets/l10n/intl_cs.arb
Normal file
2570
assets/l10n/intl_cs.arb
Normal file
File diff suppressed because it is too large
Load diff
2663
assets/l10n/intl_de.arb
Normal file
2663
assets/l10n/intl_de.arb
Normal file
File diff suppressed because it is too large
Load diff
1
assets/l10n/intl_el.arb
Normal file
1
assets/l10n/intl_el.arb
Normal file
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
2258
assets/l10n/intl_es.arb
Normal file
2258
assets/l10n/intl_es.arb
Normal file
File diff suppressed because it is too large
Load diff
2661
assets/l10n/intl_et.arb
Normal file
2661
assets/l10n/intl_et.arb
Normal file
File diff suppressed because it is too large
Load diff
2654
assets/l10n/intl_eu.arb
Normal file
2654
assets/l10n/intl_eu.arb
Normal file
File diff suppressed because it is too large
Load diff
2506
assets/l10n/intl_fa.arb
Normal file
2506
assets/l10n/intl_fa.arb
Normal file
File diff suppressed because it is too large
Load diff
2624
assets/l10n/intl_fi.arb
Normal file
2624
assets/l10n/intl_fi.arb
Normal file
File diff suppressed because it is too large
Load diff
2518
assets/l10n/intl_fr.arb
Normal file
2518
assets/l10n/intl_fr.arb
Normal file
File diff suppressed because it is too large
Load diff
2101
assets/l10n/intl_ga.arb
Normal file
2101
assets/l10n/intl_ga.arb
Normal file
File diff suppressed because it is too large
Load diff
2661
assets/l10n/intl_gl.arb
Normal file
2661
assets/l10n/intl_gl.arb
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
1
assets/l10n/intl_hi.arb
Normal file
1
assets/l10n/intl_hi.arb
Normal file
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
2629
assets/l10n/intl_hr.arb
Normal file
2629
assets/l10n/intl_hr.arb
Normal file
File diff suppressed because it is too large
Load diff
2008
assets/l10n/intl_hu.arb
Normal file
2008
assets/l10n/intl_hu.arb
Normal file
File diff suppressed because it is too large
Load diff
2620
assets/l10n/intl_id.arb
Normal file
2620
assets/l10n/intl_id.arb
Normal file
File diff suppressed because it is too large
Load diff
1213
assets/l10n/intl_ie.arb
Normal file
1213
assets/l10n/intl_ie.arb
Normal file
File diff suppressed because it is too large
Load diff
1970
assets/l10n/intl_it.arb
Normal file
1970
assets/l10n/intl_it.arb
Normal file
File diff suppressed because it is too large
Load diff
2399
assets/l10n/intl_ja.arb
Normal file
2399
assets/l10n/intl_ja.arb
Normal file
File diff suppressed because it is too large
Load diff
2236
assets/l10n/intl_ko.arb
Normal file
2236
assets/l10n/intl_ko.arb
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
1
assets/l10n/intl_lv.arb
Normal file
1
assets/l10n/intl_lv.arb
Normal file
|
|
@ -0,0 +1 @@
|
|||
{}
|
||||
1783
assets/l10n/intl_nb.arb
Normal file
1783
assets/l10n/intl_nb.arb
Normal file
File diff suppressed because it is too large
Load diff
2660
assets/l10n/intl_nl.arb
Normal file
2660
assets/l10n/intl_nl.arb
Normal file
File diff suppressed because it is too large
Load diff
2614
assets/l10n/intl_pl.arb
Normal file
2614
assets/l10n/intl_pl.arb
Normal file
File diff suppressed because it is too large
Load diff
120
assets/l10n/intl_pt.arb
Normal file
120
assets/l10n/intl_pt.arb
Normal file
|
|
@ -0,0 +1,120 @@
|
|||
{
|
||||
"@@last_modified": "2021-08-14 12:41:09.940318",
|
||||
"copiedToClipboard": "Copiada para a área de transferência",
|
||||
"@copiedToClipboard": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"login": "Iniciar sessão",
|
||||
"@login": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"about": "Sobre",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"admin": "Admin",
|
||||
"@admin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "Tens a certeza?",
|
||||
"@areYouSure": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"notifications": "Notificações",
|
||||
"@notifications": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"account": "Conta",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cancel": "Cancelar",
|
||||
"@cancel": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"delete": "Eliminar",
|
||||
"@delete": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"dateAndTimeOfDay": "{date}, {timeOfDay}",
|
||||
"@dateAndTimeOfDay": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"date": {},
|
||||
"timeOfDay": {}
|
||||
}
|
||||
},
|
||||
"dateWithYear": "{day}-{month}-{year}",
|
||||
"@dateWithYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"year": {},
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
},
|
||||
"help": "Ajuda",
|
||||
"@help": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"messages": "Mensagens",
|
||||
"@messages": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"reason": "Razão",
|
||||
"@reason": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"privacy": "Privacidade",
|
||||
"@privacy": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"openCamera": "Abrir câmara",
|
||||
"@openCamera": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"settings": "Configurações",
|
||||
"@settings": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"logout": "Terminar sessão",
|
||||
"@logout": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"search": "Pesquisar",
|
||||
"@search": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"users": "Utilizadores",
|
||||
"@users": {},
|
||||
"close": "Fechar",
|
||||
"@close": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"dateWithoutYear": "{day}-{month}",
|
||||
"@dateWithoutYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
}
|
||||
}
|
||||
2480
assets/l10n/intl_pt_BR.arb
Normal file
2480
assets/l10n/intl_pt_BR.arb
Normal file
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
2506
assets/l10n/intl_ro.arb
Normal file
2506
assets/l10n/intl_ro.arb
Normal file
File diff suppressed because it is too large
Load diff
2621
assets/l10n/intl_ru.arb
Normal file
2621
assets/l10n/intl_ru.arb
Normal file
File diff suppressed because it is too large
Load diff
1423
assets/l10n/intl_sk.arb
Normal file
1423
assets/l10n/intl_sk.arb
Normal file
File diff suppressed because it is too large
Load diff
606
assets/l10n/intl_sl.arb
Normal file
606
assets/l10n/intl_sl.arb
Normal file
|
|
@ -0,0 +1,606 @@
|
|||
{
|
||||
"passwordsDoNotMatch": "Geslo se ne ujema!",
|
||||
"@passwordsDoNotMatch": {},
|
||||
"pleaseEnterValidEmail": "Vnesite veljaven elektronski naslov.",
|
||||
"@pleaseEnterValidEmail": {},
|
||||
"repeatPassword": "Ponovite geslo",
|
||||
"@repeatPassword": {},
|
||||
"about": "O aplikaciji",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "Sprejmi",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"account": "Račun",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "Uporabnik {username} je aktiviral šifriranje od konca do konca",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"addEmail": "Dodajte e-pošto",
|
||||
"@addEmail": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"addGroupDescription": "Dodajte opis skupine",
|
||||
"@addGroupDescription": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"addToSpace": "Dodajte v prostor",
|
||||
"@addToSpace": {},
|
||||
"alias": "vzdevek",
|
||||
"@alias": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"all": "Vse",
|
||||
"@all": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"allChats": "Vsi klepeti",
|
||||
"@allChats": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"answeredTheCall": "Oseba {senderName} je odgovorila na klic",
|
||||
"@answeredTheCall": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"senderName": {}
|
||||
}
|
||||
},
|
||||
"anyoneCanJoin": "Pridruži se lahko vsak",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"appLock": "Zaklepanje aplikacije",
|
||||
"@appLock": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"askSSSSSign": "Če želite podpisati drugo osebo, vnesite geslo za varno trgovino ali obnovitveni ključ.",
|
||||
"@askSSSSSign": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"askVerificationRequest": "Ali želite sprejeti to zahtevo za preverjanje od {username}?",
|
||||
"@askVerificationRequest": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"autoplayImages": "Samodejno predvajajte animirane nalepke in čustva",
|
||||
"@autoplayImages": {
|
||||
"type": "text",
|
||||
"placeholder": {}
|
||||
},
|
||||
"badServerLoginTypesException": "Domači strežnik podpira vrste prijave:\n{serverVersions}\nToda ta aplikacija podpira samo:\n{supportedVersions}",
|
||||
"@badServerLoginTypesException": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"serverVersions": {},
|
||||
"supportedVersions": {}
|
||||
}
|
||||
},
|
||||
"sendOnEnter": "Pošlji ob vstopu",
|
||||
"@sendOnEnter": {},
|
||||
"banFromChat": "Prepoved klepeta",
|
||||
"@banFromChat": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"banned": "Prepovedano",
|
||||
"@banned": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"bannedUser": "{username} je prepovedan v {targetName}",
|
||||
"@bannedUser": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"targetName": {}
|
||||
}
|
||||
},
|
||||
"blockDevice": "Blokirana naprava",
|
||||
"@blockDevice": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blocked": "Blokirano",
|
||||
"@blocked": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"botMessages": "Botova sporočila",
|
||||
"@botMessages": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cancel": "Prekliči",
|
||||
"@cancel": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cantOpenUri": "URI-ja {uri} ni mogoče odpreti",
|
||||
"@cantOpenUri": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"uri": {}
|
||||
}
|
||||
},
|
||||
"changedTheChatAvatar": "{username} je spremenil avatar za klepet",
|
||||
"@changedTheChatAvatar": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheChatPermissions": "{username} je spremenila dovoljenja za klepet",
|
||||
"@changedTheChatPermissions": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheDisplaynameTo": "{username} je spremenil svoje prikazno ime v: '{displayname}'",
|
||||
"@changedTheDisplaynameTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"displayname": {}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRules": "{username} je spremenila pravila dostopa za goste",
|
||||
"@changedTheGuestAccessRules": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRulesTo": "{username} je spremenila pravila dostopa za goste v: {rules}",
|
||||
"@changedTheGuestAccessRulesTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"rules": {}
|
||||
}
|
||||
},
|
||||
"changedTheHistoryVisibilityTo": "{username} je spremenil vidnost zgodovine v: {rules}",
|
||||
"@changedTheHistoryVisibilityTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"rules": {}
|
||||
}
|
||||
},
|
||||
"changedTheJoinRules": "{username} je spremenil pravila za pridružitev",
|
||||
"@changedTheJoinRules": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheJoinRulesTo": "{username} je spremenila pravila pridružitve v: {joinRules}",
|
||||
"@changedTheJoinRulesTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"joinRules": {}
|
||||
}
|
||||
},
|
||||
"changedTheProfileAvatar": "{username} je spremenil avatar",
|
||||
"@changedTheProfileAvatar": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheRoomAliases": "{username} je spremenil vzdevke sobe",
|
||||
"@changedTheRoomAliases": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheRoomInvitationLink": "{username} je spremenil povezavo za povabilo",
|
||||
"@changedTheRoomInvitationLink": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changePassword": "Spremeni geslo",
|
||||
"@changePassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeTheHomeserver": "Spremenite domači strežnik",
|
||||
"@changeTheHomeserver": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeTheme": "Spremenite svoj slog",
|
||||
"@changeTheme": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeTheNameOfTheGroup": "Spremenite ime skupine",
|
||||
"@changeTheNameOfTheGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeYourAvatar": "Spremenite svoj avatar",
|
||||
"@changeYourAvatar": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chat": "Klepet",
|
||||
"@chat": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"yourChatBackupHasBeenSetUp": "Varnostna kopija klepeta je nastavljena.",
|
||||
"@yourChatBackupHasBeenSetUp": {},
|
||||
"chatBackup": "Varnostno kopiranje klepeta",
|
||||
"@chatBackup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatDetails": "Podrobnosti klepeta",
|
||||
"@chatDetails": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatHasBeenAddedToThisSpace": "Klepet je bil dodan v ta prostor",
|
||||
"@chatHasBeenAddedToThisSpace": {},
|
||||
"chats": "Klepeti",
|
||||
"@chats": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAStrongPassword": "Izberite močno geslo",
|
||||
"@chooseAStrongPassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAUsername": "Izberi uporabniško ime",
|
||||
"@chooseAUsername": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"clearArchive": "Počisti arhiv",
|
||||
"@clearArchive": {},
|
||||
"close": "Zapri",
|
||||
"@close": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_ban": "Izključi določenega uporabnika iz te sobe",
|
||||
"@commandHint_ban": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /ban"
|
||||
},
|
||||
"commandHint_html": "Pošljite besedilo v obliki HTML",
|
||||
"@commandHint_html": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /html"
|
||||
},
|
||||
"commandHint_invite": "Povabi danega uporabnika v to sobo",
|
||||
"@commandHint_invite": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /invite"
|
||||
},
|
||||
"commandHint_join": "Pridružite se dani sobi",
|
||||
"@commandHint_join": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /join"
|
||||
},
|
||||
"commandHint_kick": "Odstranite danega uporabnika iz te sobe",
|
||||
"@commandHint_kick": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /kick"
|
||||
},
|
||||
"commandHint_me": "Opisi sebe",
|
||||
"@commandHint_me": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /me"
|
||||
},
|
||||
"commandHint_myroomavatar": "Nastavite svojo sliko za to sobo",
|
||||
"@commandHint_myroomavatar": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /myroomavatar"
|
||||
},
|
||||
"commandHint_op": "Nastavite raven moči danega uporabnika (privzeto: 50)",
|
||||
"@commandHint_op": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /op"
|
||||
},
|
||||
"commandHint_react": "Pošljite odgovor kot reakcijo",
|
||||
"@commandHint_react": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /react"
|
||||
},
|
||||
"commandHint_send": "Pošlji besedilo",
|
||||
"@commandHint_send": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /send"
|
||||
},
|
||||
"commandHint_unban": "Prekliči izključitev določenega uporabnika iz te sobe",
|
||||
"@commandHint_unban": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /unban"
|
||||
},
|
||||
"commandInvalid": "Ukaz ni veljaven",
|
||||
"@commandInvalid": {
|
||||
"type": "text"
|
||||
},
|
||||
"commandMissing": "{command} is not a command.",
|
||||
"@commandMissing": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"command": {}
|
||||
},
|
||||
"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": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"compareNumbersMatch": "Primerjajte in se prepričajte, da se naslednje številke ujemajo s številkami druge naprave:",
|
||||
"@compareNumbersMatch": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"configureChat": "Konfigurirajte klepet",
|
||||
"@configureChat": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"confirm": "Potrdi",
|
||||
"@confirm": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"containsDisplayName": "Vsebuje prikazno ime",
|
||||
"@containsDisplayName": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"containsUserName": "Vsebuje uporabniško ime",
|
||||
"@containsUserName": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"pleaseChooseAtLeastChars": "Izberite najmanj {min} znakov.",
|
||||
"@pleaseChooseAtLeastChars": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"min": {}
|
||||
}
|
||||
},
|
||||
"archive": "Arhiv",
|
||||
"@archive": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "Ali si prepričan?",
|
||||
"@areYouSure": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "{username} je sprejel povabilo",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"areYouSureYouWantToLogout": "Ali ste prepričani, da se želite odjaviti?",
|
||||
"@areYouSureYouWantToLogout": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changedTheChatDescriptionTo": "{username} je spremenil opis klepeta v: '{description}'",
|
||||
"@changedTheChatDescriptionTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"description": {}
|
||||
}
|
||||
},
|
||||
"areGuestsAllowedToJoin": "Ali se lahko gostujoči uporabniki pridružijo",
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"admin": "Admin",
|
||||
"@admin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"badServerVersionsException": "Domači strežnik podpira različice Spec:\n{serverVersions}\nToda ta aplikacija podpira samo {supportedVersions}",
|
||||
"@badServerVersionsException": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"serverVersions": {},
|
||||
"supportedVersions": {}
|
||||
}
|
||||
},
|
||||
"changedTheChatNameTo": "{username} je spremenil ime klepeta v: '{chatname}'",
|
||||
"@changedTheChatNameTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"chatname": {}
|
||||
}
|
||||
},
|
||||
"changeDeviceName": "Spremenite ime naprave",
|
||||
"@changeDeviceName": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeWallpaper": "Spremeni ozadje",
|
||||
"@changeWallpaper": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changedTheHistoryVisibility": "{username} je spremenila vidnost zgodovine",
|
||||
"@changedTheHistoryVisibility": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"channelCorruptedDecryptError": "Šifriranje je poškodovano",
|
||||
"@channelCorruptedDecryptError": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"contentHasBeenReported": "Vsebina je bila prijavljena skrbnikom strežnika",
|
||||
"@contentHasBeenReported": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatBackupDescription": "Varnostna kopija klepeta je zavarovana z varnostnim ključem. Prosimo, pazite, da ga ne izgubite.",
|
||||
"@chatBackupDescription": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_myroomnick": "Nastavite prikazno ime za to sobo",
|
||||
"@commandHint_myroomnick": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /myroomnick"
|
||||
},
|
||||
"connect": "Povežite se",
|
||||
"@connect": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"contactHasBeenInvitedToTheGroup": "Kontakt je bil povabljen v skupino",
|
||||
"@contactHasBeenInvitedToTheGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_leave": "Zapusti to sobo",
|
||||
"@commandHint_leave": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /leave"
|
||||
},
|
||||
"commandHint_plain": "Pošlji neformatirano besedilo",
|
||||
"@commandHint_plain": {
|
||||
"type": "text",
|
||||
"description": "Usage hint for the command /plain"
|
||||
},
|
||||
"copiedToClipboard": "Kopirano v odložišče",
|
||||
"@copiedToClipboard": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"copy": "Kopiraj",
|
||||
"@copy": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"copyToClipboard": "Kopiraj v odložišče",
|
||||
"@copyToClipboard": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"couldNotDecryptMessage": "Sporočila ni bilo mogoče dešifrirati: {error}",
|
||||
"@couldNotDecryptMessage": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"error": {}
|
||||
}
|
||||
},
|
||||
"countParticipants": "{count} udeležencev",
|
||||
"@countParticipants": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
}
|
||||
},
|
||||
"create": "Ustvari",
|
||||
"@create": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"createNewGroup": "Ustvari novo skupino",
|
||||
"@createNewGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"createNewSpace": "Nov prostor",
|
||||
"@createNewSpace": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"currentlyActive": "Trenutno aktiven",
|
||||
"@currentlyActive": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"darkTheme": "Temno",
|
||||
"@darkTheme": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"defaultPermissionLevel": "Privzeta raven dovoljenja",
|
||||
"@defaultPermissionLevel": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"dateWithYear": "{day}-{month}-{year}",
|
||||
"@dateWithYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"year": {},
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
},
|
||||
"dateWithoutYear": "{month}-{day}",
|
||||
"@dateWithoutYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
},
|
||||
"createdTheChat": "{username} je ustvaril klepet",
|
||||
"@createdTheChat": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"dateAndTimeOfDay": "{date}, {timeOfDay}",
|
||||
"@dateAndTimeOfDay": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"date": {},
|
||||
"timeOfDay": {}
|
||||
}
|
||||
},
|
||||
"deactivateAccountWarning": "S tem boste deaktivirali vaš uporabniški račun. Tega ni mogoče razveljaviti! Ali si prepričan?",
|
||||
"@deactivateAccountWarning": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
20
assets/l10n/intl_ta.arb
Normal file
20
assets/l10n/intl_ta.arb
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
"@@last_modified": "2021-08-14 12:41:09.826673",
|
||||
"acceptedTheInvitation": "{username} அழைப்பை ஏற்றுக்கொண்டார்",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"accept": "ஏற்றுக்கொள்",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"about": "பற்றி",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
250
assets/l10n/intl_th.arb
Normal file
250
assets/l10n/intl_th.arb
Normal file
|
|
@ -0,0 +1,250 @@
|
|||
{
|
||||
"hugContent": "{senderName} กอดคุณ",
|
||||
"@hugContent": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"senderName": {}
|
||||
}
|
||||
},
|
||||
"commandHint_cuddle": "ส่งเคล้าเคลียให้",
|
||||
"@commandHint_cuddle": {},
|
||||
"admin": "แอดมิน",
|
||||
"@admin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"supposedMxid": "อันนี้ควรเป็น {mxid}",
|
||||
"@supposedMxid": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"mxid": {}
|
||||
}
|
||||
},
|
||||
"askSSSSSign": "เพื่อให้สามารถลงนามบุคคลอื่นได้ โปรดป้อนรหัสผ่านร้านค้าที่ปลอดภัยหรือรหัสกู้คืนของคุณ",
|
||||
"@askSSSSSign": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"remove": "ลบออก",
|
||||
"@remove": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areGuestsAllowedToJoin": "ผู้ใช้ทั่วไปได้รับอนุญาตให้เข้าร่วมหรือไม่",
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"pleaseEnterValidEmail": "กรุณาใส่อีเมล์ที่ถูกต้อง",
|
||||
"@pleaseEnterValidEmail": {},
|
||||
"sendOnEnter": "ส่งเมื่อกด enter",
|
||||
"@sendOnEnter": {},
|
||||
"answeredTheCall": "{senderName} รับสายแล้ว",
|
||||
"@answeredTheCall": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"senderName": {}
|
||||
}
|
||||
},
|
||||
"pleaseChooseAtLeastChars": "กรุณาใส่รหัสอย่างน้อย {min} ตัว",
|
||||
"@pleaseChooseAtLeastChars": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"min": {}
|
||||
}
|
||||
},
|
||||
"alias": "นามแฝง",
|
||||
"@alias": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"all": "ทั้งหมด",
|
||||
"@all": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"badServerLoginTypesException": "โฮมเซิร์ฟเวอร์รองรับประเภทการเข้าสู่ระบบ:\n{serverVersions}\nแต่แอปนี้รองรับเฉพาะ:\n{supportedVersions}",
|
||||
"@badServerLoginTypesException": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"serverVersions": {},
|
||||
"supportedVersions": {}
|
||||
}
|
||||
},
|
||||
"updateNow": "เริ่มการอัปเดตในเบื้องหลัง",
|
||||
"@updateNow": {},
|
||||
"edit": "แก้ไข",
|
||||
"@edit": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"copy": "คัดลอก",
|
||||
"@copy": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importFromZipFile": "นำเข้าจากไฟล์ .zip",
|
||||
"@importFromZipFile": {},
|
||||
"autoplayImages": "เล่นสติ๊กเกอร์และอิโมจิแบบเคลื่อนไหวโดยอัตโนมัติ",
|
||||
"@autoplayImages": {
|
||||
"type": "text",
|
||||
"placeholder": {}
|
||||
},
|
||||
"updateAvailable": "มีการอัปเดต FluffyChat แล้ว",
|
||||
"@updateAvailable": {},
|
||||
"help": "ช่วยเหลือ",
|
||||
"@help": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatDetails": "รายละเอียดแชท",
|
||||
"@chatDetails": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"repeatPassword": "ใส่รหัสผ่านอีกรอบ",
|
||||
"@repeatPassword": {},
|
||||
"delete": "ลบออก",
|
||||
"@delete": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "👍 {username} ได้รับการชวนแล้ว",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"send": "ส่ง",
|
||||
"@send": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"exportEmotePack": "ส่งอิโมจิแพ็คออกเป็นไฟล์ .zip",
|
||||
"@exportEmotePack": {},
|
||||
"account": "บัญชี",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"savedEmotePack": "บันท฿กแพ็คอิโมจิไว้ที่ {path}!",
|
||||
"@savedEmotePack": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"path": {}
|
||||
}
|
||||
},
|
||||
"chat": "แชท",
|
||||
"@chat": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "คุณแน่ใจไหม?",
|
||||
"@areYouSure": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"allChats": "แชททั้งหมด",
|
||||
"@allChats": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"passwordsDoNotMatch": "รหัสผ่านของคุณไม่ตรงกัน",
|
||||
"@passwordsDoNotMatch": {},
|
||||
"addToSpace": "เพิ่มไปที่ space",
|
||||
"@addToSpace": {},
|
||||
"importZipFile": "นำเข้าไฟล์ .zip",
|
||||
"@importZipFile": {},
|
||||
"about": "เกี่ยวกับ",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "🔐 {username} เปิดใช้งาน end to end encryption",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"fluffychat": "FluffyChat",
|
||||
"@fluffychat": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"googlyEyesContent": "{senderName} ส่งตากวนๆให้คุณ",
|
||||
"@googlyEyesContent": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"senderName": {}
|
||||
}
|
||||
},
|
||||
"addChatDescription": "เพิ่มคำอธิบายการแชท",
|
||||
"@addChatDescription": {},
|
||||
"appLock": "ล็อคแอป",
|
||||
"@appLock": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"sendTypingNotifications": "ส่งการแจ้งเตือนการพิมพ์",
|
||||
"@sendTypingNotifications": {},
|
||||
"importEmojis": "นำเข้าอ๊โมจิ",
|
||||
"@importEmojis": {},
|
||||
"confirmMatrixId": "กรุณายืนยัน Matrix ID ของคุณเพื่อลบบัญชีของคุณ",
|
||||
"@confirmMatrixId": {},
|
||||
"notAnImage": "ไม่ใช่ไฟล์รูปภาพ",
|
||||
"@notAnImage": {},
|
||||
"areYouSureYouWantToLogout": "คุณแน่ใจว่าคุณต้องการที่จะออกจากระบบ?",
|
||||
"@areYouSureYouWantToLogout": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cuddleContent": "{senderName} เคล้าเคลียคุณ",
|
||||
"@cuddleContent": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"senderName": {}
|
||||
}
|
||||
},
|
||||
"askVerificationRequest": "ยอมรับคำขอยืนยันนี้จาก {username} หรือไม่",
|
||||
"@askVerificationRequest": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"addEmail": "เพิ่มอีเมล",
|
||||
"@addEmail": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_hug": "ส่งกอดให้",
|
||||
"@commandHint_hug": {},
|
||||
"replace": "แทนที่",
|
||||
"@replace": {},
|
||||
"archive": "คลังเก็บ",
|
||||
"@archive": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "ยอมรับ",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"commandHint_googly": "ส่งสายตากวนๆ มาให้หน่อย",
|
||||
"@commandHint_googly": {},
|
||||
"pin": "ปักหมุด",
|
||||
"@pin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"importNow": "นำเข้าเลย",
|
||||
"@importNow": {},
|
||||
"anyoneCanJoin": "ใครๆ ก็สามารถเข้าร่วมได้",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
2621
assets/l10n/intl_tr.arb
Normal file
2621
assets/l10n/intl_tr.arb
Normal file
File diff suppressed because it is too large
Load diff
2663
assets/l10n/intl_uk.arb
Normal file
2663
assets/l10n/intl_uk.arb
Normal file
File diff suppressed because it is too large
Load diff
452
assets/l10n/intl_vi.arb
Normal file
452
assets/l10n/intl_vi.arb
Normal file
|
|
@ -0,0 +1,452 @@
|
|||
{
|
||||
"@@last_modified": "2021-08-14 12:41:09.781172",
|
||||
"about": "Giới thiệu",
|
||||
"@about": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"accept": "Đồng ý",
|
||||
"@accept": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"acceptedTheInvitation": "{username} đã đồng ý lời mời",
|
||||
"@acceptedTheInvitation": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"account": "Tài khoản",
|
||||
"@account": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"activatedEndToEndEncryption": "{username} đã kích hoạt mã hóa đầu cuối 2 chiều",
|
||||
"@activatedEndToEndEncryption": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"addGroupDescription": "Thêm mô tả cho nhóm",
|
||||
"@addGroupDescription": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"admin": "Quản trị viên",
|
||||
"@admin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"alias": "bí danh",
|
||||
"@alias": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"answeredTheCall": "{senderName} đã trả lời cuộc gọi",
|
||||
"@answeredTheCall": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"senderName": {}
|
||||
}
|
||||
},
|
||||
"anyoneCanJoin": "Mọi người đều có thể gia nhập",
|
||||
"@anyoneCanJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"archive": "Lưu trữ",
|
||||
"@archive": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areGuestsAllowedToJoin": "Khách vãng lai có được tham gia không",
|
||||
"@areGuestsAllowedToJoin": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"areYouSure": "Bạn chắc chứ?",
|
||||
"@areYouSure": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blockDevice": "Thiết bị bị chặn",
|
||||
"@blockDevice": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"verified": "Đã xác thực",
|
||||
"@verified": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"transferFromAnotherDevice": "Chuyển từ thiết bị khác",
|
||||
"@transferFromAnotherDevice": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"showPassword": "Hiển thị mật khẩu",
|
||||
"@showPassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"pleaseFollowInstructionsOnWeb": "Vui lòng làm theo hướng dẫn trên trang web và bấm tiếp",
|
||||
"@pleaseFollowInstructionsOnWeb": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"noEncryptionForPublicRooms": "Bạn chỉ có thể kích hoạt mã hoá khi phòng này không mở",
|
||||
"@noEncryptionForPublicRooms": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"next": "Tiếp",
|
||||
"@next": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"everythingReady": "Mọi thứ đã sẵn sàng!",
|
||||
"@everythingReady": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"emoteSettings": "Cài đặt biểu tượng cảm xúc",
|
||||
"@emoteSettings": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"editDisplayname": "Sửa tên hiển thị",
|
||||
"@editDisplayname": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"downloadFile": "Tải ảnh xuống",
|
||||
"@downloadFile": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"displaynameHasBeenChanged": "Tên hiển thị đã được thay đổi",
|
||||
"@displaynameHasBeenChanged": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"devices": "Các thiết bị",
|
||||
"@devices": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"deviceId": "Mã xác định thiết bị",
|
||||
"@deviceId": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"device": "Thiết bị",
|
||||
"@device": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"deny": "Từ chối",
|
||||
"@deny": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"deleteMessage": "Xoá tin nhắn",
|
||||
"@deleteMessage": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"deleteAccount": "Xoá tài khoản",
|
||||
"@deleteAccount": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"delete": "Xoá",
|
||||
"@delete": {
|
||||
"type": "text",
|
||||
"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": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"dateWithYear": "{day}/{month}/{year}",
|
||||
"@dateWithYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"year": {},
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
},
|
||||
"dateWithoutYear": "{day}/{month}",
|
||||
"@dateWithoutYear": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"month": {},
|
||||
"day": {}
|
||||
}
|
||||
},
|
||||
"dateAndTimeOfDay": "{date}, {timeOfDay}",
|
||||
"@dateAndTimeOfDay": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"date": {},
|
||||
"timeOfDay": {}
|
||||
}
|
||||
},
|
||||
"currentlyActive": "Đang hoạt động",
|
||||
"@currentlyActive": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"createNewGroup": "Tạo một nhóm mới",
|
||||
"@createNewGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"createdTheChat": "{username} đã tạo cuộc trò chuyện",
|
||||
"@createdTheChat": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"create": "Tạo",
|
||||
"@create": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"countParticipants": "{count} thành viên",
|
||||
"@countParticipants": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"count": {}
|
||||
}
|
||||
},
|
||||
"couldNotDecryptMessage": "Không thể giải mã tin nhắn: {error}",
|
||||
"@couldNotDecryptMessage": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"error": {}
|
||||
}
|
||||
},
|
||||
"copy": "Sao chép",
|
||||
"@copy": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"contactHasBeenInvitedToTheGroup": "Liên hệ đã được mời vào nhóm",
|
||||
"@contactHasBeenInvitedToTheGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"connect": "Kết nối",
|
||||
"@connect": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"confirm": "Xác nhận",
|
||||
"@confirm": {
|
||||
"type": "text",
|
||||
"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": "text",
|
||||
"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": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"close": "Đóng",
|
||||
"@close": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAUsername": "Chọn tên người dùng",
|
||||
"@chooseAUsername": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chooseAStrongPassword": "Chọn một mật khẩu mạnh",
|
||||
"@chooseAStrongPassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatDetails": "Chi tiết cuộc trò chuyện",
|
||||
"@chatDetails": {
|
||||
"type": "text",
|
||||
"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": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chatBackup": "Sao lưu cuộc trò chuyện",
|
||||
"@chatBackup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"chat": "Chat",
|
||||
"@chat": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeWallpaper": "Thay hình nền",
|
||||
"@changeWallpaper": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeTheNameOfTheGroup": "Thay đổi tên nhóm",
|
||||
"@changeTheNameOfTheGroup": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changeTheHomeserver": "Thay đổi máy chủ nhà",
|
||||
"@changeTheHomeserver": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changePassword": "Thay đổi mật khẩu",
|
||||
"@changePassword": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"changedTheRoomInvitationLink": "{username} đã thay đổi đường dẫn mời",
|
||||
"@changedTheRoomInvitationLink": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheRoomAliases": "{username} đã đổi địa chỉ phòng chat",
|
||||
"@changedTheRoomAliases": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheProfileAvatar": "{username} đã thay đổi ảnh đại diện của mình",
|
||||
"@changedTheProfileAvatar": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRulesTo": "{username} đã thay đổi quy tắc truy cập đối với khách thành: {rules}",
|
||||
"@changedTheGuestAccessRulesTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"rules": {}
|
||||
}
|
||||
},
|
||||
"changedTheGuestAccessRules": "{username} đã thay đổi quy tắc truy cập đối với khách",
|
||||
"@changedTheGuestAccessRules": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheChatPermissions": "{username} đã thay đổi quyền trong phòng chat",
|
||||
"@changedTheChatPermissions": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changedTheChatNameTo": "{username} đã thay đổi tên phòng chat thành: '{chatname}'",
|
||||
"@changedTheChatNameTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"chatname": {}
|
||||
}
|
||||
},
|
||||
"changedTheChatDescriptionTo": "{username} đã thay đổi mô tả phòng chat thành: '{description}'",
|
||||
"@changedTheChatDescriptionTo": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"description": {}
|
||||
}
|
||||
},
|
||||
"changedTheChatAvatar": "{username} đã thay đổi ảnh phòng chat",
|
||||
"@changedTheChatAvatar": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"changeDeviceName": "Thay đổi tên thiết bị",
|
||||
"@changeDeviceName": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"cancel": "Hủy",
|
||||
"@cancel": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"blocked": "Đã chặn",
|
||||
"@blocked": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"bannedUser": "{username} đã cấm {targetName}",
|
||||
"@bannedUser": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {},
|
||||
"targetName": {}
|
||||
}
|
||||
},
|
||||
"banned": "Đã bị cấm",
|
||||
"@banned": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"banFromChat": "Cấm khỏi cuộc trò chuyện",
|
||||
"@banFromChat": {
|
||||
"type": "text",
|
||||
"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": "text",
|
||||
"placeholders": {
|
||||
"serverVersions": {},
|
||||
"supportedVersions": {}
|
||||
}
|
||||
},
|
||||
"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": "text",
|
||||
"placeholders": {
|
||||
"serverVersions": {},
|
||||
"supportedVersions": {}
|
||||
}
|
||||
},
|
||||
"askVerificationRequest": "Bạn có đồng ý yêu cầu chứng thực từ {username} không?",
|
||||
"@askVerificationRequest": {
|
||||
"type": "text",
|
||||
"placeholders": {
|
||||
"username": {}
|
||||
}
|
||||
},
|
||||
"areYouSureYouWantToLogout": "Bạn có chắc bạn muốn đăng xuất không?",
|
||||
"@areYouSureYouWantToLogout": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
},
|
||||
"addEmail": "Thêm email",
|
||||
"@addEmail": {
|
||||
"type": "text",
|
||||
"placeholders": {}
|
||||
}
|
||||
}
|
||||
2629
assets/l10n/intl_zh.arb
Normal file
2629
assets/l10n/intl_zh.arb
Normal file
File diff suppressed because it is too large
Load diff
1919
assets/l10n/intl_zh_Hant.arb
Normal file
1919
assets/l10n/intl_zh_Hant.arb
Normal file
File diff suppressed because it is too large
Load diff
BIN
assets/login_wallpaper.png
Normal file
BIN
assets/login_wallpaper.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 146 KiB |
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue