mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
Compare commits
292 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 29857e33e2 | |||
| 47cd7de1ae | |||
| 624a3abba2 | |||
| 121985138a | |||
| 7f5efd8927 | |||
| 96d3c9988c | |||
| f6b786a187 | |||
| 11478da6ef | |||
| 72654caca6 | |||
| 44c88badde | |||
| 53a31ec60e | |||
| 718436bf55 | |||
| 5bbf4d70a1 | |||
| 970ca3a409 | |||
| c536ca7f0f | |||
| 07ef2a0b64 | |||
| 5b7de8f8c1 | |||
| 68cbc605be | |||
| 3a510eeaf0 | |||
| ba94f76a90 | |||
| 85e44dcb77 | |||
| 2a8d7b8926 | |||
| d9031cb209 | |||
| bf8457fb40 | |||
| 59392b361b | |||
| 8f0538e756 | |||
| b164cc2fa6 | |||
| f9e5a56e1a | |||
| 96e000e3ea | |||
| ca8833c0c1 | |||
| e95d9d0b49 | |||
| cc434cda55 | |||
| c0e8740f50 | |||
| 80abc18371 | |||
| c9a1de6e4b | |||
| 42e0400014 | |||
| 79064e149a | |||
| 84e09f195c | |||
| f6c4e969e4 | |||
| 86b916c169 | |||
| cf102da4d3 | |||
| 0d7a048988 | |||
| d0f3a3d886 | |||
| 64f0dbeb61 | |||
| 0322b9708b | |||
| c31ae39617 | |||
| 339c3d2be1 | |||
| a75fce8dfa | |||
| b71daed3ec | |||
| fa9d61caa4 | |||
| 975f6d488e | |||
| 3d617bce25 | |||
| d4ba1bbe69 | |||
| 0a4920daae | |||
| 36509a6d79 | |||
| 4da1d21c81 | |||
| 5bbde22ffa | |||
| 1e8ae6d861 | |||
| f9df5aa41b | |||
| c91625b32a | |||
| 598b6659cc | |||
| a2fe5cfb66 | |||
| 86bc70fa5a | |||
| 338417d963 | |||
| 72b25385ba | |||
| 92e3f576ca | |||
| 5beeff5cb6 | |||
| 8e3e58cac8 | |||
| 8b67ff7a00 | |||
| beb22c6f87 | |||
| 11362941fd | |||
| b1101fbce4 | |||
| f7b4e4b16a | |||
| 97fd6a993e | |||
| 83aaaa9ada | |||
| ae286124aa | |||
| 9cc232054c | |||
| 227007c8f6 | |||
| e17e6adefb | |||
| 02225df274 | |||
| e7d6ed66da | |||
| 8d891005d9 | |||
| f648086934 | |||
| fcdd8ce7c1 | |||
| c0be36737d | |||
| f49ded5ae5 | |||
| f41861c026 | |||
| 6d4febb669 | |||
| 3dd62ab05a | |||
| 96d94d3438 | |||
| b729144773 | |||
| 3839267f88 | |||
| d233d07ddc | |||
| 8722d35278 | |||
| ee6bd0f839 | |||
| e3938f6fb5 | |||
| 2dc621a56c | |||
| 3e46c5dfaf | |||
| a04dc5d05b | |||
| 2776d864a8 | |||
| b33fe01e49 | |||
| 15b55f7924 | |||
| 177112ab18 | |||
| c2a99987f3 | |||
| eee233bd02 | |||
| 10cbb13c26 | |||
| 4816150b99 | |||
| 3d7258fa58 | |||
| c462dd3704 | |||
| 0cc26d192d | |||
| 8546c937b2 | |||
| 34b07d6a3b | |||
| fad5128a83 | |||
| 8482dbfd99 | |||
| 4fd38a270c | |||
| b2f9270452 | |||
| 4cc20a2d32 | |||
| 68873464d7 | |||
| c1a0486c1d | |||
| c8c17a2f68 | |||
| 02c0cd5619 | |||
| 9e8084874f | |||
| 07173f7b2f | |||
| 42458a2715 | |||
| b1fdc936a6 | |||
| f34bbdbd9c | |||
| be44632b0b | |||
| b48690dee6 | |||
| d90da57f12 | |||
| 9568279b0f | |||
| 9fb2b7fe73 | |||
| a7b5dfb74c | |||
| 7102723c23 | |||
| 16bda26022 | |||
| 4a5fdd3e0e | |||
| 3790752378 | |||
| cd98fabe43 | |||
| 4a8da196ad | |||
| 743597e848 | |||
| b0f55d6de5 | |||
| 6185971827 | |||
| 1dcd2760b0 | |||
| 10f79aae66 | |||
| b58d61c339 | |||
| 239765e482 | |||
| f8332bac7f | |||
| ed1eef7362 | |||
| 66d8bb94d6 | |||
| 6eb09625ab | |||
| e1bd6a93af | |||
| 93800268e4 | |||
| 0bd59364fd | |||
| 795c54343a | |||
| f026a38a75 | |||
| 530ec70171 | |||
| 1401f56288 | |||
| d172b0cb6d | |||
| 3e0b6826bf | |||
| 79275424ea | |||
| b25c2e3a09 | |||
| 8891314507 | |||
| 5c57987e9f | |||
| b5e114d834 | |||
| 0d1a080a6e | |||
| 0444367002 | |||
| 87d84cfccc | |||
| c090b68bdd | |||
| 2219cea026 | |||
| 852e77b1d9 | |||
| 706d6bf65b | |||
| a02886ca5d | |||
| 29c8ab7c9b | |||
| d8d47d706d | |||
| 99c458406f | |||
| 92eae012b3 | |||
| e4c8386f3f | |||
| 9ed31261e1 | |||
| 4b6df43e97 | |||
| 43b67ba157 | |||
| e6b0983c3e | |||
| c2a320640b | |||
| 838751fe78 | |||
| fc1bba8817 | |||
| 41b86e07f1 | |||
| f5e9bd4f8b | |||
| 5e6aaffb09 | |||
| a35dc263b7 | |||
| 193361c09a | |||
| 392447ea33 | |||
| 5d4006f291 | |||
| c609303348 | |||
| 07047a3ef3 | |||
| ab290fb068 | |||
| 675fc19745 | |||
| fe6c65f75c | |||
| 8ffe1c23c1 | |||
| 6dca71cc87 | |||
| adc1f8c983 | |||
| 73652e4bba | |||
| 5d078bec53 | |||
| b956988a83 | |||
| 247f2c9e61 | |||
| 7b488c7f1b | |||
| 4df8ea2e78 | |||
| 8ff6b392c2 | |||
| c2a858b06e | |||
| bca9473d77 | |||
| b03fe183bb | |||
| 4ecf94dfad | |||
| 6f5ba54f7b | |||
| a67b79952b | |||
| eb5081624a | |||
| 86c2f29920 | |||
| dffbd32c76 | |||
| 3ddf7b2680 | |||
| c0e22d74c4 | |||
| 2b228a893a | |||
| d764b3485a | |||
| 09e5798d59 | |||
| f31b4e4632 | |||
| d72c04682f | |||
| 20995c6912 | |||
| 73b3ea3648 | |||
| 2eb213741c | |||
| bc26c23d58 | |||
| 4a581cb292 | |||
| ab46cbc5dd | |||
| 985b9837c3 | |||
| d50c7ad7f6 | |||
| 82faaebb33 | |||
| 76fb5b6dca | |||
| 91561da351 | |||
| 3ac342782b | |||
| b05a45f559 | |||
| c738c6c522 | |||
| 1be70169ba | |||
| a273c68596 | |||
| 34e1e44338 | |||
| fc9db9c381 | |||
| 27e8a81c9f | |||
| 303d0eedf5 | |||
| 0d8558a6d0 | |||
| 91fc238ddc | |||
| 7959c75df7 | |||
| 0bcf5c9c66 | |||
| cc95fa6b30 | |||
| 38be27271f | |||
| da2a94578a | |||
| 77db70139b | |||
| fdf3da73aa | |||
| 0d93dab692 | |||
| d4cbef1ba1 | |||
| 8545a1e8f9 | |||
| 157ea59ebb | |||
| 7231201c3c | |||
| 695d47da2d | |||
| 968d8e9c34 | |||
| d72c9a6de0 | |||
| bf7917bd67 | |||
| 5ce388522e | |||
| 6c0d1b5f15 | |||
| 70a65e8969 | |||
| af2df8d489 | |||
| 1d34500fba | |||
| bc7baf560b | |||
| c1854b7d50 | |||
| 682dfe503c | |||
| 957f3b3eb0 | |||
| dea96df27b | |||
| 942e5eb8c4 | |||
| ea319313f1 | |||
| bbe329072e | |||
| c64d1e8361 | |||
| cccb3e33fb | |||
| 7e17ed7b1b | |||
| 3c7fc6b0ee | |||
| 77410e5d5e | |||
| 8709ad6ff3 | |||
| 3e29c664ac | |||
| 50d624ef6b | |||
| 11e448267d | |||
| aacf741ef5 | |||
| 420d80ad6c | |||
| 343131c64e | |||
| 9b107fbdeb | |||
| 60d13e258e | |||
| 4f42c2b0d8 | |||
| 48ae1111a6 | |||
| 76dbe32cfc | |||
| 120f42cbba | |||
| 5f46433f40 | |||
| 7b71078c76 |
@@ -8,6 +8,7 @@ on:
|
|||||||
- users
|
- users
|
||||||
tags:
|
tags:
|
||||||
- "v*"
|
- "v*"
|
||||||
|
- "!*-fdroid"
|
||||||
pull_request:
|
pull_request:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
@@ -80,7 +81,7 @@ jobs:
|
|||||||
- name: Setup Haskell
|
- name: Setup Haskell
|
||||||
uses: haskell-actions/setup@v2
|
uses: haskell-actions/setup@v2
|
||||||
with:
|
with:
|
||||||
ghc-version: "9.6.2"
|
ghc-version: "9.6.3"
|
||||||
cabal-version: "3.10.1.0"
|
cabal-version: "3.10.1.0"
|
||||||
|
|
||||||
- name: Cache dependencies
|
- name: Cache dependencies
|
||||||
@@ -260,11 +261,36 @@ jobs:
|
|||||||
# / Windows
|
# / Windows
|
||||||
# rm -rf dist-newstyle/src/direct-sq* is here because of the bug in cabal's dependency which prevents second build from finishing
|
# rm -rf dist-newstyle/src/direct-sq* is here because of the bug in cabal's dependency which prevents second build from finishing
|
||||||
|
|
||||||
|
- name: 'Setup MSYS2'
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'windows-latest'
|
||||||
|
uses: msys2/setup-msys2@v2
|
||||||
|
with:
|
||||||
|
msystem: ucrt64
|
||||||
|
update: true
|
||||||
|
install: >-
|
||||||
|
git
|
||||||
|
perl
|
||||||
|
make
|
||||||
|
pacboy: >-
|
||||||
|
toolchain:p
|
||||||
|
cmake:p
|
||||||
|
|
||||||
|
|
||||||
- name: Windows build
|
- name: Windows build
|
||||||
id: windows_build
|
id: windows_build
|
||||||
if: matrix.os == 'windows-latest'
|
if: matrix.os == 'windows-latest'
|
||||||
shell: bash
|
shell: msys2 {0}
|
||||||
run: |
|
run: |
|
||||||
|
export PATH=$PATH:/c/ghcup/bin
|
||||||
|
scripts/desktop/prepare-openssl-windows.sh
|
||||||
|
openssl_windows_style_path=$(echo `pwd`/dist-newstyle/openssl-1.1.1w | sed 's#/\([a-zA-Z]\)#\1:#' | sed 's#/#\\#g')
|
||||||
|
rm cabal.project.local 2>/dev/null || true
|
||||||
|
echo "ignore-project: False" >> cabal.project.local
|
||||||
|
echo "package direct-sqlcipher" >> cabal.project.local
|
||||||
|
echo " flags: +openssl" >> cabal.project.local
|
||||||
|
echo " extra-include-dirs: $openssl_windows_style_path\include" >> cabal.project.local
|
||||||
|
echo " extra-lib-dirs: $openssl_windows_style_path" >> cabal.project.local
|
||||||
|
|
||||||
rm -rf dist-newstyle/src/direct-sq*
|
rm -rf dist-newstyle/src/direct-sq*
|
||||||
sed -i "s/, unix /--, unix /" simplex-chat.cabal
|
sed -i "s/, unix /--, unix /" simplex-chat.cabal
|
||||||
cabal build --enable-tests
|
cabal build --enable-tests
|
||||||
@@ -292,4 +318,36 @@ jobs:
|
|||||||
body: |
|
body: |
|
||||||
${{ steps.windows_build.outputs.bin_hash }}
|
${{ steps.windows_build.outputs.bin_hash }}
|
||||||
|
|
||||||
|
- name: Windows build desktop
|
||||||
|
id: windows_desktop_build
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'windows-latest'
|
||||||
|
shell: msys2 {0}
|
||||||
|
run: |
|
||||||
|
export PATH=$PATH:/c/ghcup/bin
|
||||||
|
scripts/desktop/build-lib-windows.sh
|
||||||
|
cd apps/multiplatform
|
||||||
|
./gradlew packageMsi
|
||||||
|
path=$(echo $PWD/release/main/msi/*imple*.msi | sed 's#/\([a-z]\)#\1:#' | sed 's#/#\\#g')
|
||||||
|
echo "package_path=$path" >> $GITHUB_OUTPUT
|
||||||
|
echo "package_hash=$(echo SHA2-512\(${{ matrix.desktop_asset_name }}\)= $(openssl sha512 $path | cut -d' ' -f 2))" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- name: Windows upload desktop package to release
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'windows-latest'
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: ${{ steps.windows_desktop_build.outputs.package_path }}
|
||||||
|
asset_name: ${{ matrix.desktop_asset_name }}
|
||||||
|
tag: ${{ github.ref }}
|
||||||
|
|
||||||
|
- name: Windows update desktop package hash
|
||||||
|
if: startsWith(github.ref, 'refs/tags/v') && matrix.os == 'windows-latest'
|
||||||
|
uses: softprops/action-gh-release@v1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
append_body: true
|
||||||
|
body: |
|
||||||
|
${{ steps.windows_desktop_build.outputs.package_hash }}
|
||||||
|
|
||||||
# Windows /
|
# Windows /
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ on:
|
|||||||
- website/**
|
- website/**
|
||||||
- images/**
|
- images/**
|
||||||
- blog/**
|
- blog/**
|
||||||
|
- docs/**
|
||||||
- .github/workflows/web.yml
|
- .github/workflows/web.yml
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
|
|||||||
+4
-4
@@ -8,12 +8,12 @@ RUN a=$(arch); curl https://downloads.haskell.org/~ghcup/$a-linux-ghcup -o /usr/
|
|||||||
chmod +x /usr/bin/ghcup
|
chmod +x /usr/bin/ghcup
|
||||||
|
|
||||||
# Install ghc
|
# Install ghc
|
||||||
RUN ghcup install ghc 8.10.7
|
RUN ghcup install ghc 9.6.3
|
||||||
# Install cabal
|
# Install cabal
|
||||||
RUN ghcup install cabal
|
RUN ghcup install cabal 3.10.1.0
|
||||||
# Set both as default
|
# Set both as default
|
||||||
RUN ghcup set ghc 8.10.7 && \
|
RUN ghcup set ghc 9.6.3 && \
|
||||||
ghcup set cabal
|
ghcup set cabal 3.10.1.0
|
||||||
|
|
||||||
COPY . /project
|
COPY . /project
|
||||||
WORKDIR /project
|
WORKDIR /project
|
||||||
|
|||||||
@@ -119,19 +119,22 @@ Join our translators to help SimpleX grow!
|
|||||||
|locale|language |contributor|[Android](https://play.google.com/store/apps/details?id=chat.simplex.app) and [iOS](https://apps.apple.com/us/app/simplex-chat/id1605771084)|[website](https://simplex.chat)|Github docs|
|
|locale|language |contributor|[Android](https://play.google.com/store/apps/details?id=chat.simplex.app) and [iOS](https://apps.apple.com/us/app/simplex-chat/id1605771084)|[website](https://simplex.chat)|Github docs|
|
||||||
|:----:|:-------:|:---------:|:---------:|:---------:|:---------:|
|
|:----:|:-------:|:---------:|:---------:|:---------:|:---------:|
|
||||||
|🇬🇧 en|English | |✓|✓|✓|✓|
|
|🇬🇧 en|English | |✓|✓|✓|✓|
|
||||||
|ar|العربية |[jermanuts](https://github.com/jermanuts)||[](https://hosted.weblate.org/projects/simplex-chat/website/ar/)||
|
|ar|العربية |[jermanuts](https://github.com/jermanuts)|[](https://hosted.weblate.org/projects/simplex-chat/android/ar/)<br>-|[](https://hosted.weblate.org/projects/simplex-chat/website/ar/)||
|
||||||
|🇧🇬 bg|Български |-|[](https://hosted.weblate.org/projects/simplex-chat/android/bg/)<br>-|||
|
|🇧🇬 bg|Български | |[](https://hosted.weblate.org/projects/simplex-chat/android/bg/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/bg/)|||
|
||||||
|🇨🇿 cs|Čeština |[zen0bit](https://github.com/zen0bit)|[](https://hosted.weblate.org/projects/simplex-chat/android/cs/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/cs/)|[](https://hosted.weblate.org/projects/simplex-chat/website/cs/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/cs)|
|
|🇨🇿 cs|Čeština |[zen0bit](https://github.com/zen0bit)|[](https://hosted.weblate.org/projects/simplex-chat/android/cs/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/cs/)|[](https://hosted.weblate.org/projects/simplex-chat/website/cs/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/cs)|
|
||||||
|🇩🇪 de|Deutsch |[mlanp](https://github.com/mlanp)|[](https://hosted.weblate.org/projects/simplex-chat/android/de/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/de/)|[](https://hosted.weblate.org/projects/simplex-chat/website/de/)||
|
|🇩🇪 de|Deutsch |[mlanp](https://github.com/mlanp)|[](https://hosted.weblate.org/projects/simplex-chat/android/de/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/de/)|[](https://hosted.weblate.org/projects/simplex-chat/website/de/)||
|
||||||
|🇪🇸 es|Español |[Mateyhv](https://github.com/Mateyhv)|[](https://hosted.weblate.org/projects/simplex-chat/android/es/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/es/)|[](https://hosted.weblate.org/projects/simplex-chat/website/es/)||
|
|🇪🇸 es|Español |[Mateyhv](https://github.com/Mateyhv)|[](https://hosted.weblate.org/projects/simplex-chat/android/es/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/es/)|[](https://hosted.weblate.org/projects/simplex-chat/website/es/)||
|
||||||
|
|🇫🇮 fi|Suomi | |[](https://hosted.weblate.org/projects/simplex-chat/android/fi/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/fi/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fi/)||
|
||||||
|🇫🇷 fr|Français |[ishi_sama](https://github.com/ishi-sama)|[](https://hosted.weblate.org/projects/simplex-chat/android/fr/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/fr/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fr/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/fr)|
|
|🇫🇷 fr|Français |[ishi_sama](https://github.com/ishi-sama)|[](https://hosted.weblate.org/projects/simplex-chat/android/fr/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/fr/)|[](https://hosted.weblate.org/projects/simplex-chat/website/fr/)|[✓](https://github.com/simplex-chat/simplex-chat/tree/master/docs/lang/fr)|
|
||||||
|
|🇮🇱 he|עִברִית | |[](https://hosted.weblate.org/projects/simplex-chat/android/he/)<br>-|||
|
||||||
|🇮🇹 it|Italiano |[unbranched](https://github.com/unbranched)|[](https://hosted.weblate.org/projects/simplex-chat/android/it/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/it/)|[](https://hosted.weblate.org/projects/simplex-chat/website/it/)||
|
|🇮🇹 it|Italiano |[unbranched](https://github.com/unbranched)|[](https://hosted.weblate.org/projects/simplex-chat/android/it/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/it/)|[](https://hosted.weblate.org/projects/simplex-chat/website/it/)||
|
||||||
|🇯🇵 ja|Japanese ||[](https://hosted.weblate.org/projects/simplex-chat/android/ja/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/ja/)|||
|
|🇯🇵 ja|日本語 | |[](https://hosted.weblate.org/projects/simplex-chat/android/ja/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/ja/)|[](https://hosted.weblate.org/projects/simplex-chat/website/ja/)||
|
||||||
|🇳🇱 nl|Nederlands|[mika-nl](https://github.com/mika-nl)|[](https://hosted.weblate.org/projects/simplex-chat/android/nl/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/nl/)|[](https://hosted.weblate.org/projects/simplex-chat/website/nl/)||
|
|🇳🇱 nl|Nederlands|[mika-nl](https://github.com/mika-nl)|[](https://hosted.weblate.org/projects/simplex-chat/android/nl/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/nl/)|[](https://hosted.weblate.org/projects/simplex-chat/website/nl/)||
|
||||||
|🇵🇱 pl|Polski |[BxOxSxS](https://github.com/BxOxSxS)|[](https://hosted.weblate.org/projects/simplex-chat/android/pl/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/pl/)|||
|
|🇵🇱 pl|Polski |[BxOxSxS](https://github.com/BxOxSxS)|[](https://hosted.weblate.org/projects/simplex-chat/android/pl/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/pl/)|||
|
||||||
|🇧🇷 pt-BR|Português||[](https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/)<br>-|[](https://hosted.weblate.org/projects/simplex-chat/website/pt_BR/)||
|
|🇧🇷 pt-BR|Português||[](https://hosted.weblate.org/projects/simplex-chat/android/pt_BR/)<br>-|[](https://hosted.weblate.org/projects/simplex-chat/website/pt_BR/)||
|
||||||
|🇷🇺 ru|Русский ||[](https://hosted.weblate.org/projects/simplex-chat/android/ru/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/ru/)|||
|
|🇷🇺 ru|Русский ||[](https://hosted.weblate.org/projects/simplex-chat/android/ru/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/ru/)|||
|
||||||
|🇹🇭 th|ภาษาไทย |[titapa-punpun](https://github.com/titapa-punpun)|[](https://hosted.weblate.org/projects/simplex-chat/android/th/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/th/)|||
|
|🇹🇭 th|ภาษาไทย |[titapa-punpun](https://github.com/titapa-punpun)|[](https://hosted.weblate.org/projects/simplex-chat/android/th/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/th/)|||
|
||||||
|
|🇺🇦 uk|Українська| |[](https://hosted.weblate.org/projects/simplex-chat/android/uk/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/uk/)|[](https://hosted.weblate.org/projects/simplex-chat/website/uk/)||
|
||||||
|🇨🇳 zh-CHS|简体中文|[sith-on-mars](https://github.com/sith-on-mars)<br><br>[Float-hu](https://github.com/Float-hu)|[](https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/)<br> |<br><br>[](https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/)||
|
|🇨🇳 zh-CHS|简体中文|[sith-on-mars](https://github.com/sith-on-mars)<br><br>[Float-hu](https://github.com/Float-hu)|[](https://hosted.weblate.org/projects/simplex-chat/android/zh_Hans/)<br>[](https://hosted.weblate.org/projects/simplex-chat/ios/zh_Hans/)<br> |<br><br>[](https://hosted.weblate.org/projects/simplex-chat/website/zh_Hans/)||
|
||||||
|
|
||||||
Languages in progress: Arabic, Japanese, Korean, Portuguese and [others](https://hosted.weblate.org/projects/simplex-chat/#languages). We will be adding more languages as some of the already added are completed – please suggest new languages, review the [translation guide](./docs/TRANSLATIONS.md) and get in touch with us!
|
Languages in progress: Arabic, Japanese, Korean, Portuguese and [others](https://hosted.weblate.org/projects/simplex-chat/#languages). We will be adding more languages as some of the already added are completed – please suggest new languages, review the [translation guide](./docs/TRANSLATIONS.md) and get in touch with us!
|
||||||
@@ -227,24 +230,18 @@ You can use SimpleX with your own servers and still communicate with people usin
|
|||||||
|
|
||||||
## News and updates
|
## News and updates
|
||||||
|
|
||||||
Recent updates:
|
Recent and important updates:
|
||||||
|
|
||||||
[July 22, 2023. SimpleX Chat: v5.2 released with message delivery receipts](./blog/20230722-simplex-chat-v5-2-message-delivery-receipts.md).
|
[Sep 25, 2023. SimpleX Chat v5.3 released: desktop app, local file encryption, improved groups and directory service](./blog/20230925-simplex-chat-v5-3-desktop-app-local-file-encryption-directory-service.md).
|
||||||
|
|
||||||
|
[Jul 22, 2023. SimpleX Chat: v5.2 released with message delivery receipts](./blog/20230722-simplex-chat-v5-2-message-delivery-receipts.md).
|
||||||
|
|
||||||
[May 23, 2023. SimpleX Chat: v5.1 released with message reactions and self-destruct passcode](./blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.md).
|
[May 23, 2023. SimpleX Chat: v5.1 released with message reactions and self-destruct passcode](./blog/20230523-simplex-chat-v5-1-message-reactions-self-destruct-passcode.md).
|
||||||
|
|
||||||
[Apr 22, 2023. SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb](./blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.md).
|
[Apr 22, 2023. SimpleX Chat: vision and funding, v5.0 released with videos and files up to 1gb](./blog/20230422-simplex-chat-vision-funding-v5-videos-files-passcode.md).
|
||||||
|
|
||||||
[Mar 28, 2023. v4.6 released - with Android 8+ and ARMv7a support, hidden profiles, community moderation, improved audio/video calls and reduced battery usage](./blog/20230328-simplex-chat-v4-6-hidden-profiles.md).
|
|
||||||
|
|
||||||
[Mar 1, 2023. SimpleX File Transfer Protocol – send large files efficiently, privately and securely, soon to be integrated into SimpleX Chat apps.](./blog/20230301-simplex-file-transfer-protocol.md).
|
[Mar 1, 2023. SimpleX File Transfer Protocol – send large files efficiently, privately and securely, soon to be integrated into SimpleX Chat apps.](./blog/20230301-simplex-file-transfer-protocol.md).
|
||||||
|
|
||||||
[Feb 4, 2023. v4.5 released - with multiple user profiles, message draft, transport isolation and Italian interface](./blog/20230204-simplex-chat-v4-5-user-chat-profiles.md).
|
|
||||||
|
|
||||||
[Jan 3, 2023. v4.4 released - with disappearing messages, "live" messages, connection security verifications, GIFs and stickers and with French interface language](./blog/20230103-simplex-chat-v4.4-disappearing-messages.md).
|
|
||||||
|
|
||||||
[Dec 6, 2022. November reviews and v4.3 released - with instant voice messages, irreversible deletion of sent messages and improved server configuration](./blog/20221206-simplex-chat-v4.3-voice-messages.md).
|
|
||||||
|
|
||||||
[Nov 8, 2022. Security audit by Trail of Bits, the new website and v4.2 released](./blog/20221108-simplex-chat-v4.2-security-audit-new-website.md).
|
[Nov 8, 2022. Security audit by Trail of Bits, the new website and v4.2 released](./blog/20221108-simplex-chat-v4.2-security-audit-new-website.md).
|
||||||
|
|
||||||
[Sep 28, 2022. v4.0: encrypted local chat database and many other changes](./blog/20220928-simplex-chat-v4-encrypted-database.md).
|
[Sep 28, 2022. v4.0: encrypted local chat database and many other changes](./blog/20220928-simplex-chat-v4-encrypted-database.md).
|
||||||
@@ -290,18 +287,20 @@ What is already implemented:
|
|||||||
3. [Double ratchet](./docs/GLOSSARY.md#double-ratchet-algorithm) end-to-end encryption in each conversation between two users (or group members). This is the same algorithm that is used in Signal and many other messaging apps; it provides OTR messaging with [forward secrecy](./docs/GLOSSARY.md#forward-secrecy) (each message is encrypted by its own ephemeral key) and [break-in recovery](./docs/GLOSSARY.md#post-compromise-security) (the keys are frequently re-negotiated as part of the message exchange). Two pairs of Curve448 keys are used for the initial [key agreement](./docs/GLOSSARY.md#key-agreement-protocol), initiating party passes these keys via the connection link, accepting side - in the header of the confirmation message.
|
3. [Double ratchet](./docs/GLOSSARY.md#double-ratchet-algorithm) end-to-end encryption in each conversation between two users (or group members). This is the same algorithm that is used in Signal and many other messaging apps; it provides OTR messaging with [forward secrecy](./docs/GLOSSARY.md#forward-secrecy) (each message is encrypted by its own ephemeral key) and [break-in recovery](./docs/GLOSSARY.md#post-compromise-security) (the keys are frequently re-negotiated as part of the message exchange). Two pairs of Curve448 keys are used for the initial [key agreement](./docs/GLOSSARY.md#key-agreement-protocol), initiating party passes these keys via the connection link, accepting side - in the header of the confirmation message.
|
||||||
4. Additional layer of encryption using NaCL cryptobox for the messages delivered from the server to the recipient. This layer avoids having any ciphertext in common between sent and received traffic of the server inside TLS (and there are no identifiers in common as well).
|
4. Additional layer of encryption using NaCL cryptobox for the messages delivered from the server to the recipient. This layer avoids having any ciphertext in common between sent and received traffic of the server inside TLS (and there are no identifiers in common as well).
|
||||||
5. Several levels of [content padding](./docs/GLOSSARY.md#message-padding) to frustrate message size attacks.
|
5. Several levels of [content padding](./docs/GLOSSARY.md#message-padding) to frustrate message size attacks.
|
||||||
6. Starting from v2 of SMP protocol (the current version is v4) all message metadata, including the time when the message was received by the server (rounded to a second) is sent to the recipients inside an encrypted envelope, so even if TLS is compromised it cannot be observed.
|
6. All message metadata, including the time when the message was received by the server (rounded to a second) is sent to the recipients inside an encrypted envelope, so even if TLS is compromised it cannot be observed.
|
||||||
7. Only TLS 1.2/1.3 are allowed for client-server connections, limited to cryptographic algorithms: CHACHA20POLY1305_SHA256, Ed25519/Ed448, Curve25519/Curve448.
|
7. Only TLS 1.2/1.3 are allowed for client-server connections, limited to cryptographic algorithms: CHACHA20POLY1305_SHA256, Ed25519/Ed448, Curve25519/Curve448.
|
||||||
8. To protect against replay attacks SimpleX servers require [tlsunique channel binding](https://www.rfc-editor.org/rfc/rfc5929.html) as session ID in each client command signed with per-queue ephemeral key.
|
8. To protect against replay attacks SimpleX servers require [tlsunique channel binding](https://www.rfc-editor.org/rfc/rfc5929.html) as session ID in each client command signed with per-queue ephemeral key.
|
||||||
9. To protect your IP address all SimpleX Chat clients support accessing messaging servers via Tor - see [v3.1 release announcement](./blog/20220808-simplex-chat-v3.1-chat-groups.md) for more details.
|
9. To protect your IP address all SimpleX Chat clients support accessing messaging servers via Tor - see [v3.1 release announcement](./blog/20220808-simplex-chat-v3.1-chat-groups.md) for more details.
|
||||||
10. Local database encryption with passphrase - your contacts, groups and all sent and received messages are stored encrypted. If you used SimpleX Chat before v4.0 you need to enable the encryption via the app settings.
|
10. Local database encryption with passphrase - your contacts, groups and all sent and received messages are stored encrypted. If you used SimpleX Chat before v4.0 you need to enable the encryption via the app settings.
|
||||||
11. Transport isolation - different TCP connections and Tor circuits are used for traffic of different user profiles, optionally - for different contacts and group member connections.
|
11. Transport isolation - different TCP connections and Tor circuits are used for traffic of different user profiles, optionally - for different contacts and group member connections.
|
||||||
12. Manual messaging queue rotations to move conversation to another SMP relay.
|
12. Manual messaging queue rotations to move conversation to another SMP relay.
|
||||||
|
13. Sending end-to-end encrypted files using [XFTP protocol](https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html).
|
||||||
|
14. Local files encryption, except videos (to be added later).
|
||||||
|
|
||||||
We plan to add:
|
We plan to add:
|
||||||
|
|
||||||
1. Local files encryption. Currently the images and files you send and receive are stored in the app unencrypted, you can delete them via `Settings / Database passphrase & export`. This is currently in progress.
|
1. Senders' SMP relays and recipients' XFTP relays to reduce traffic and conceal IP addresses from the relays chosen, and potentially controlled, by another party.
|
||||||
2. Senders' SMP relays and recipients' XFTP relays to reduce traffic and conceal IP addresses from the relays chosen, and potentially controlled, by another party.
|
2. Post-quantum resistant key exchange in double ratchet protocol.
|
||||||
3. Automatic message queue rotation and redundancy. Currently the queues created between two users are used until the queue is manually changed by the user or contact is deleted. We are planning to add automatic queue rotation to make these identifiers temporary and rotate based on some schedule TBC (e.g., every X messages, or every X hours/days).
|
3. Automatic message queue rotation and redundancy. Currently the queues created between two users are used until the queue is manually changed by the user or contact is deleted. We are planning to add automatic queue rotation to make these identifiers temporary and rotate based on some schedule TBC (e.g., every X messages, or every X hours/days).
|
||||||
4. Message "mixing" - adding latency to message delivery, to protect against traffic correlation by message time.
|
4. Message "mixing" - adding latency to message delivery, to protect against traffic correlation by message time.
|
||||||
5. Reproducible builds – this is the limitation of the development stack, but we will be investing into solving this problem. Users can still build all applications and services from the source code.
|
5. Reproducible builds – this is the limitation of the development stack, but we will be investing into solving this problem. Users can still build all applications and services from the source code.
|
||||||
@@ -365,22 +364,26 @@ Please also join [#simplex-devs](https://simplex.chat/contact#/?v=1-2&smp=smp%3A
|
|||||||
- ✅ Message editing history
|
- ✅ Message editing history
|
||||||
- ✅ Reduced battery and traffic usage in large groups.
|
- ✅ Reduced battery and traffic usage in large groups.
|
||||||
- ✅ Message delivery confirmation (with sender opt-out per contact).
|
- ✅ Message delivery confirmation (with sender opt-out per contact).
|
||||||
- 🏗 Desktop client.
|
- ✅ Desktop client.
|
||||||
|
- ✅ Encryption of local files stored in the app.
|
||||||
|
- 🏗 Using mobile profiles from the desktop app.
|
||||||
|
- Message delivery relay for senders (to conceal IP address from the recipients' servers and to reduce the traffic).
|
||||||
|
- Post-quantum resistant key exchange in double ratchet protocol.
|
||||||
|
- Large groups, communities and public channels.
|
||||||
|
- Privacy & security slider - a simple way to set all settings at once.
|
||||||
|
- Improve sending videos (including encryption of locally stored videos).
|
||||||
|
- Improve experience for the new users.
|
||||||
- SMP queue redundancy and rotation (manual is supported).
|
- SMP queue redundancy and rotation (manual is supported).
|
||||||
- Include optional message into connection request sent via contact address.
|
- Include optional message into connection request sent via contact address.
|
||||||
- Local app files encryption.
|
|
||||||
- Improved navigation and search in the conversation (expand and scroll to quoted message, scroll to search results, etc.).
|
- Improved navigation and search in the conversation (expand and scroll to quoted message, scroll to search results, etc.).
|
||||||
- Large groups, communities and public channels.
|
|
||||||
- Feeds/broadcasts.
|
- Feeds/broadcasts.
|
||||||
- Ephemeral/disappearing/OTR conversations with the existing contacts.
|
- Ephemeral/disappearing/OTR conversations with the existing contacts.
|
||||||
- Privately share your location.
|
- Privately share your location.
|
||||||
- Web widgets for custom interactivity in the chats.
|
- Web widgets for custom interactivity in the chats.
|
||||||
- Programmable chat automations / rules (automatic replies/forward/deletion/sending, reminders, etc.).
|
- Programmable chat automations / rules (automatic replies/forward/deletion/sending, reminders, etc.).
|
||||||
- Supporting the same profile on multiple devices.
|
|
||||||
- Privacy-preserving identity server for optional DNS-based contact/group addresses to simplify connection and discovery, but not used to deliver messages:
|
- Privacy-preserving identity server for optional DNS-based contact/group addresses to simplify connection and discovery, but not used to deliver messages:
|
||||||
- keep all your contacts and groups even if you lose the domain.
|
- keep all your contacts and groups even if you lose the domain.
|
||||||
- the server doesn't have information about your contacts and groups.
|
- the server doesn't have information about your contacts and groups.
|
||||||
- Message delivery relay for senders (to conceal IP address from the recipients' servers and to reduce the traffic).
|
|
||||||
- High capacity multi-node SMP relays.
|
- High capacity multi-node SMP relays.
|
||||||
|
|
||||||
## Disclaimers
|
## Disclaimers
|
||||||
|
|||||||
@@ -55,7 +55,6 @@ class AppDelegate: NSObject, UIApplicationDelegate {
|
|||||||
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
|
didReceiveRemoteNotification userInfo: [AnyHashable : Any],
|
||||||
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
|
fetchCompletionHandler completionHandler: @escaping (UIBackgroundFetchResult) -> Void) {
|
||||||
logger.debug("AppDelegate: didReceiveRemoteNotification")
|
logger.debug("AppDelegate: didReceiveRemoteNotification")
|
||||||
print("*** userInfo", userInfo)
|
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
if let ntfData = userInfo["notificationData"] as? [AnyHashable : Any],
|
if let ntfData = userInfo["notificationData"] as? [AnyHashable : Any],
|
||||||
m.notificationMode != .off {
|
m.notificationMode != .off {
|
||||||
@@ -121,6 +120,10 @@ class AppDelegate: NSObject, UIApplicationDelegate {
|
|||||||
|
|
||||||
BGManager.shared.receiveMessages(complete)
|
BGManager.shared.receiveMessages(complete)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func keepScreenOn(_ on: Bool) {
|
||||||
|
UIApplication.shared.isIdleTimerDisabled = on
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class SceneDelegate: NSObject, ObservableObject, UIWindowSceneDelegate {
|
class SceneDelegate: NSObject, ObservableObject, UIWindowSceneDelegate {
|
||||||
|
|||||||
@@ -31,11 +31,11 @@ struct ContentView: View {
|
|||||||
@State private var chatListActionSheet: ChatListActionSheet? = nil
|
@State private var chatListActionSheet: ChatListActionSheet? = nil
|
||||||
|
|
||||||
private enum ChatListActionSheet: Identifiable {
|
private enum ChatListActionSheet: Identifiable {
|
||||||
case connectViaUrl(action: ConnReqType, link: String)
|
case planAndConnectSheet(sheet: PlanAndConnectActionSheet)
|
||||||
|
|
||||||
var id: String {
|
var id: String {
|
||||||
switch self {
|
switch self {
|
||||||
case let .connectViaUrl(_, link): return "connectViaUrl \(link)"
|
case let .planAndConnectSheet(sheet): return sheet.id
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -93,7 +93,7 @@ struct ContentView: View {
|
|||||||
mainView()
|
mainView()
|
||||||
.actionSheet(item: $chatListActionSheet) { sheet in
|
.actionSheet(item: $chatListActionSheet) { sheet in
|
||||||
switch sheet {
|
switch sheet {
|
||||||
case let .connectViaUrl(action, link): return connectViaUrlSheet(action, link)
|
case let .planAndConnectSheet(sheet): return planAndConnectActionSheet(sheet, dismiss: false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -290,12 +290,16 @@ struct ContentView: View {
|
|||||||
if let url = m.appOpenUrl {
|
if let url = m.appOpenUrl {
|
||||||
m.appOpenUrl = nil
|
m.appOpenUrl = nil
|
||||||
var path = url.path
|
var path = url.path
|
||||||
logger.debug("ContentView.connectViaUrl path: \(path)")
|
|
||||||
if (path == "/contact" || path == "/invitation") {
|
if (path == "/contact" || path == "/invitation") {
|
||||||
path.removeFirst()
|
path.removeFirst()
|
||||||
let action: ConnReqType = path == "contact" ? .contact : .invitation
|
|
||||||
let link = url.absoluteString.replacingOccurrences(of: "///\(path)", with: "/\(path)")
|
let link = url.absoluteString.replacingOccurrences(of: "///\(path)", with: "/\(path)")
|
||||||
chatListActionSheet = .connectViaUrl(action: action, link: link)
|
planAndConnect(
|
||||||
|
link,
|
||||||
|
showAlert: showPlanAndConnectAlert,
|
||||||
|
showActionSheet: { chatListActionSheet = .planAndConnectSheet(sheet: $0) },
|
||||||
|
dismiss: false,
|
||||||
|
incognito: nil
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
AlertManager.shared.showAlert(Alert(title: Text("Error: URL is invalid")))
|
AlertManager.shared.showAlert(Alert(title: Text("Error: URL is invalid")))
|
||||||
}
|
}
|
||||||
@@ -303,20 +307,8 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func connectViaUrlSheet(_ action: ConnReqType, _ link: String) -> ActionSheet {
|
private func showPlanAndConnectAlert(_ alert: PlanAndConnectAlert) {
|
||||||
let title: LocalizedStringKey
|
AlertManager.shared.showAlert(planAndConnectAlert(alert, dismiss: false))
|
||||||
switch action {
|
|
||||||
case .contact: title = "Connect via contact link"
|
|
||||||
case .invitation: title = "Connect via one-time link"
|
|
||||||
}
|
|
||||||
return ActionSheet(
|
|
||||||
title: Text(title),
|
|
||||||
buttons: [
|
|
||||||
.default(Text("Use current profile")) { connectViaLink(link, incognito: false) },
|
|
||||||
.default(Text("Use new incognito profile")) { connectViaLink(link, incognito: true) },
|
|
||||||
.cancel()
|
|
||||||
]
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ class AudioRecorder {
|
|||||||
audioRecorder?.record(forDuration: MAX_VOICE_MESSAGE_LENGTH)
|
audioRecorder?.record(forDuration: MAX_VOICE_MESSAGE_LENGTH)
|
||||||
|
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
|
AppDelegate.keepScreenOn(true)
|
||||||
recordingTimer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in
|
recordingTimer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in
|
||||||
guard let time = self.audioRecorder?.currentTime else { return }
|
guard let time = self.audioRecorder?.currentTime else { return }
|
||||||
self.onTimer?(time)
|
self.onTimer?(time)
|
||||||
@@ -57,6 +58,10 @@ class AudioRecorder {
|
|||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
} catch let error {
|
} catch let error {
|
||||||
|
await MainActor.run {
|
||||||
|
AppDelegate.keepScreenOn(false)
|
||||||
|
}
|
||||||
|
try? av.setCategory(AVAudioSession.Category.soloAmbient)
|
||||||
logger.error("AudioRecorder startAudioRecording error \(error.localizedDescription)")
|
logger.error("AudioRecorder startAudioRecording error \(error.localizedDescription)")
|
||||||
return .error(error.localizedDescription)
|
return .error(error.localizedDescription)
|
||||||
}
|
}
|
||||||
@@ -71,6 +76,8 @@ class AudioRecorder {
|
|||||||
timer.invalidate()
|
timer.invalidate()
|
||||||
}
|
}
|
||||||
recordingTimer = nil
|
recordingTimer = nil
|
||||||
|
AppDelegate.keepScreenOn(false)
|
||||||
|
try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.soloAmbient)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func checkPermission() async -> Bool {
|
private func checkPermission() async -> Bool {
|
||||||
@@ -121,14 +128,19 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
|
|||||||
|
|
||||||
playbackTimer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in
|
playbackTimer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { timer in
|
||||||
if self.audioPlayer?.isPlaying ?? false {
|
if self.audioPlayer?.isPlaying ?? false {
|
||||||
|
AppDelegate.keepScreenOn(true)
|
||||||
guard let time = self.audioPlayer?.currentTime else { return }
|
guard let time = self.audioPlayer?.currentTime else { return }
|
||||||
self.onTimer?(time)
|
self.onTimer?(time)
|
||||||
|
AudioPlayer.changeAudioSession(true)
|
||||||
|
} else {
|
||||||
|
AudioPlayer.changeAudioSession(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func pause() {
|
func pause() {
|
||||||
audioPlayer?.pause()
|
audioPlayer?.pause()
|
||||||
|
AppDelegate.keepScreenOn(false)
|
||||||
}
|
}
|
||||||
|
|
||||||
func play() {
|
func play() {
|
||||||
@@ -149,6 +161,8 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
|
|||||||
func stop() {
|
func stop() {
|
||||||
if let player = audioPlayer {
|
if let player = audioPlayer {
|
||||||
player.stop()
|
player.stop()
|
||||||
|
AppDelegate.keepScreenOn(false)
|
||||||
|
AudioPlayer.changeAudioSession(false)
|
||||||
}
|
}
|
||||||
audioPlayer = nil
|
audioPlayer = nil
|
||||||
if let timer = playbackTimer {
|
if let timer = playbackTimer {
|
||||||
@@ -157,6 +171,24 @@ class AudioPlayer: NSObject, AVAudioPlayerDelegate {
|
|||||||
playbackTimer = nil
|
playbackTimer = nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static func changeAudioSession(_ playback: Bool) {
|
||||||
|
// When there is a audio recording, setting any other category will disable sound
|
||||||
|
if AVAudioSession.sharedInstance().category == .playAndRecord {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if playback {
|
||||||
|
if AVAudioSession.sharedInstance().category != .playback {
|
||||||
|
logger.log("AudioSession: playback")
|
||||||
|
try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.playback, options: .duckOthers)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if AVAudioSession.sharedInstance().category != .soloAmbient {
|
||||||
|
logger.log("AudioSession: soloAmbient")
|
||||||
|
try? AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.soloAmbient)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
|
func audioPlayerDidFinishPlaying(_ player: AVAudioPlayer, successfully flag: Bool) {
|
||||||
stop()
|
stop()
|
||||||
self.onFinishPlayback?()
|
self.onFinishPlayback?()
|
||||||
|
|||||||
@@ -62,8 +62,9 @@ final class ChatModel: ObservableObject {
|
|||||||
// current chat
|
// current chat
|
||||||
@Published var chatId: String?
|
@Published var chatId: String?
|
||||||
@Published var reversedChatItems: [ChatItem] = []
|
@Published var reversedChatItems: [ChatItem] = []
|
||||||
|
var chatItemStatuses: Dictionary<Int64, CIStatus> = [:]
|
||||||
@Published var chatToTop: String?
|
@Published var chatToTop: String?
|
||||||
@Published var groupMembers: [GroupMember] = []
|
@Published var groupMembers: [GMember] = []
|
||||||
// items in the terminal view
|
// items in the terminal view
|
||||||
@Published var showingTerminal = false
|
@Published var showingTerminal = false
|
||||||
@Published var terminalItems: [TerminalItem] = []
|
@Published var terminalItems: [TerminalItem] = []
|
||||||
@@ -84,6 +85,8 @@ final class ChatModel: ObservableObject {
|
|||||||
@Published var activeCall: Call?
|
@Published var activeCall: Call?
|
||||||
@Published var callCommand: WCallCommand?
|
@Published var callCommand: WCallCommand?
|
||||||
@Published var showCallView = false
|
@Published var showCallView = false
|
||||||
|
// remote desktop
|
||||||
|
@Published var remoteCtrlSession: RemoteCtrlSession?
|
||||||
// currently showing QR code
|
// currently showing QR code
|
||||||
@Published var connReqInv: String?
|
@Published var connReqInv: String?
|
||||||
// audio recording and playback
|
// audio recording and playback
|
||||||
@@ -109,6 +112,10 @@ final class ChatModel: ObservableObject {
|
|||||||
notificationMode == .periodic || ntfEnablePeriodicGroupDefault.get()
|
notificationMode == .periodic || ntfEnablePeriodicGroupDefault.get()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var activeRemoteCtrl: Bool {
|
||||||
|
remoteCtrlSession?.active ?? false
|
||||||
|
}
|
||||||
|
|
||||||
func getUser(_ userId: Int64) -> User? {
|
func getUser(_ userId: Int64) -> User? {
|
||||||
currentUser?.userId == userId
|
currentUser?.userId == userId
|
||||||
? currentUser
|
? currentUser
|
||||||
@@ -152,6 +159,20 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func getGroupChat(_ groupId: Int64) -> Chat? {
|
||||||
|
chats.first { chat in
|
||||||
|
if case let .group(groupInfo) = chat.chatInfo {
|
||||||
|
return groupInfo.groupId == groupId
|
||||||
|
} else {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func getGroupMember(_ groupMemberId: Int64) -> GMember? {
|
||||||
|
groupMembers.first { $0.groupMemberId == groupMemberId }
|
||||||
|
}
|
||||||
|
|
||||||
private func getChatIndex(_ id: String) -> Int? {
|
private func getChatIndex(_ id: String) -> Int? {
|
||||||
chats.firstIndex(where: { $0.id == id })
|
chats.firstIndex(where: { $0.id == id })
|
||||||
}
|
}
|
||||||
@@ -165,6 +186,7 @@ final class ChatModel: ObservableObject {
|
|||||||
func updateChatInfo(_ cInfo: ChatInfo) {
|
func updateChatInfo(_ cInfo: ChatInfo) {
|
||||||
if let i = getChatIndex(cInfo.id) {
|
if let i = getChatIndex(cInfo.id) {
|
||||||
chats[i].chatInfo = cInfo
|
chats[i].chatInfo = cInfo
|
||||||
|
chats[i].created = Date.now
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -178,7 +200,7 @@ final class ChatModel: ObservableObject {
|
|||||||
|
|
||||||
func updateContactConnectionStats(_ contact: Contact, _ connectionStats: ConnectionStats) {
|
func updateContactConnectionStats(_ contact: Contact, _ connectionStats: ConnectionStats) {
|
||||||
var updatedConn = contact.activeConn
|
var updatedConn = contact.activeConn
|
||||||
updatedConn.connectionStats = connectionStats
|
updatedConn?.connectionStats = connectionStats
|
||||||
var updatedContact = contact
|
var updatedContact = contact
|
||||||
updatedContact.activeConn = updatedConn
|
updatedContact.activeConn = updatedConn
|
||||||
updateContact(updatedContact)
|
updateContact(updatedContact)
|
||||||
@@ -296,7 +318,11 @@ final class ChatModel: ObservableObject {
|
|||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
withAnimation(itemAnimation()) {
|
withAnimation(itemAnimation()) {
|
||||||
reversedChatItems.insert(cItem, at: hasLiveDummy ? 1 : 0)
|
var ci = cItem
|
||||||
|
if let status = chatItemStatuses.removeValue(forKey: ci.id), case .sndNew = ci.meta.itemStatus {
|
||||||
|
ci.meta.itemStatus = status
|
||||||
|
}
|
||||||
|
reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0)
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -309,26 +335,22 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) {
|
func updateChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem, status: CIStatus? = nil) {
|
||||||
if chatId == cInfo.id, let i = getChatItemIndex(cItem) {
|
if chatId == cInfo.id, let i = getChatItemIndex(cItem) {
|
||||||
withAnimation {
|
withAnimation {
|
||||||
_updateChatItem(at: i, with: cItem)
|
_updateChatItem(at: i, with: cItem)
|
||||||
}
|
}
|
||||||
|
} else if let status = status {
|
||||||
|
chatItemStatuses.updateValue(status, forKey: cItem.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func _updateChatItem(at i: Int, with cItem: ChatItem) {
|
private func _updateChatItem(at i: Int, with cItem: ChatItem) {
|
||||||
let ci = reversedChatItems[i]
|
|
||||||
reversedChatItems[i] = cItem
|
reversedChatItems[i] = cItem
|
||||||
reversedChatItems[i].viewTimestamp = .now
|
reversedChatItems[i].viewTimestamp = .now
|
||||||
// on some occasions the confirmation of message being accepted by the server (tick)
|
|
||||||
// arrives earlier than the response from API, and item remains without tick
|
|
||||||
if case .sndNew = cItem.meta.itemStatus {
|
|
||||||
reversedChatItems[i].meta.itemStatus = ci.meta.itemStatus
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func getChatItemIndex(_ cItem: ChatItem) -> Int? {
|
func getChatItemIndex(_ cItem: ChatItem) -> Int? {
|
||||||
reversedChatItems.firstIndex(where: { $0.id == cItem.id })
|
reversedChatItems.firstIndex(where: { $0.id == cItem.id })
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -464,6 +486,7 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
// clear current chat
|
// clear current chat
|
||||||
if chatId == cInfo.id {
|
if chatId == cInfo.id {
|
||||||
|
chatItemStatuses = [:]
|
||||||
reversedChatItems = []
|
reversedChatItems = []
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -516,27 +539,62 @@ final class ChatModel: ObservableObject {
|
|||||||
users.filter { !$0.user.activeUser }.reduce(0, { unread, next -> Int in unread + next.unreadCount })
|
users.filter { !$0.user.activeUser }.reduce(0, { unread, next -> Int in unread + next.unreadCount })
|
||||||
}
|
}
|
||||||
|
|
||||||
func getConnectedMemberNames(_ ci: ChatItem) -> [String] {
|
// this function analyses "connected" events and assumes that each member will be there only once
|
||||||
guard var i = getChatItemIndex(ci) else { return [] }
|
func getConnectedMemberNames(_ chatItem: ChatItem) -> (Int, [String]) {
|
||||||
|
var count = 0
|
||||||
var ns: [String] = []
|
var ns: [String] = []
|
||||||
while i < reversedChatItems.count, let m = reversedChatItems[i].memberConnected {
|
if let ciCategory = chatItem.mergeCategory,
|
||||||
ns.append(m.displayName)
|
var i = getChatItemIndex(chatItem) {
|
||||||
i += 1
|
while i < reversedChatItems.count {
|
||||||
|
let ci = reversedChatItems[i]
|
||||||
|
if ci.mergeCategory != ciCategory { break }
|
||||||
|
if let m = ci.memberConnected {
|
||||||
|
ns.append(m.displayName)
|
||||||
|
}
|
||||||
|
count += 1
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return ns
|
return (count, ns)
|
||||||
}
|
}
|
||||||
|
|
||||||
func getChatItemNeighbors(_ ci: ChatItem) -> (ChatItem?, ChatItem?) {
|
// returns the index of the passed item and the next item (it has smaller index)
|
||||||
if let i = getChatItemIndex(ci) {
|
func getNextChatItem(_ ci: ChatItem) -> (Int?, ChatItem?) {
|
||||||
return (
|
if let i = getChatItemIndex(ci) {
|
||||||
i + 1 < reversedChatItems.count ? reversedChatItems[i + 1] : nil,
|
(i, i > 0 ? reversedChatItems[i - 1] : nil)
|
||||||
i - 1 >= 0 ? reversedChatItems[i - 1] : nil
|
|
||||||
)
|
|
||||||
} else {
|
} else {
|
||||||
return (nil, nil)
|
(nil, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// returns the index of the first item in the same merged group (the first hidden item)
|
||||||
|
// and the previous visible item with another merge category
|
||||||
|
func getPrevShownChatItem(_ ciIndex: Int?, _ ciCategory: CIMergeCategory?) -> (Int?, ChatItem?) {
|
||||||
|
guard var i = ciIndex else { return (nil, nil) }
|
||||||
|
let fst = reversedChatItems.count - 1
|
||||||
|
while i < fst {
|
||||||
|
i = i + 1
|
||||||
|
let ci = reversedChatItems[i]
|
||||||
|
if ciCategory == nil || ciCategory != ci.mergeCategory {
|
||||||
|
return (i - 1, ci)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (i, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns the previous member in the same merge group and the count of members in this group
|
||||||
|
func getPrevHiddenMember(_ member: GroupMember, _ range: ClosedRange<Int>) -> (GroupMember?, Int) {
|
||||||
|
var prevMember: GroupMember? = nil
|
||||||
|
var memberIds: Set<Int64> = []
|
||||||
|
for i in range {
|
||||||
|
if case let .groupRcv(m) = reversedChatItems[i].chatDir {
|
||||||
|
if prevMember == nil && m.groupMemberId != member.groupMemberId { prevMember = m }
|
||||||
|
memberIds.insert(m.groupMemberId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (prevMember, memberIds.count)
|
||||||
|
}
|
||||||
|
|
||||||
func popChat(_ id: String) {
|
func popChat(_ id: String) {
|
||||||
if let i = getChatIndex(id) {
|
if let i = getChatIndex(id) {
|
||||||
popChat_(i)
|
popChat_(i)
|
||||||
@@ -571,13 +629,14 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
// update current chat
|
// update current chat
|
||||||
if chatId == groupInfo.id {
|
if chatId == groupInfo.id {
|
||||||
if let i = groupMembers.firstIndex(where: { $0.id == member.id }) {
|
if let i = groupMembers.firstIndex(where: { $0.groupMemberId == member.groupMemberId }) {
|
||||||
withAnimation(.default) {
|
withAnimation(.default) {
|
||||||
self.groupMembers[i] = member
|
self.groupMembers[i].wrapped = member
|
||||||
|
self.groupMembers[i].created = Date.now
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
withAnimation { groupMembers.append(member) }
|
withAnimation { groupMembers.append(GMember(member)) }
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -586,11 +645,10 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateGroupMemberConnectionStats(_ groupInfo: GroupInfo, _ member: GroupMember, _ connectionStats: ConnectionStats) {
|
func updateGroupMemberConnectionStats(_ groupInfo: GroupInfo, _ member: GroupMember, _ connectionStats: ConnectionStats) {
|
||||||
if let conn = member.activeConn {
|
if var conn = member.activeConn {
|
||||||
var updatedConn = conn
|
conn.connectionStats = connectionStats
|
||||||
updatedConn.connectionStats = connectionStats
|
|
||||||
var updatedMember = member
|
var updatedMember = member
|
||||||
updatedMember.activeConn = updatedConn
|
updatedMember.activeConn = conn
|
||||||
_ = upsertGroupMember(groupInfo, updatedMember)
|
_ = upsertGroupMember(groupInfo, updatedMember)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -619,11 +677,17 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func setContactNetworkStatus(_ contact: Contact, _ status: NetworkStatus) {
|
func setContactNetworkStatus(_ contact: Contact, _ status: NetworkStatus) {
|
||||||
networkStatuses[contact.activeConn.agentConnId] = status
|
if let conn = contact.activeConn {
|
||||||
|
networkStatuses[conn.agentConnId] = status
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func contactNetworkStatus(_ contact: Contact) -> NetworkStatus {
|
func contactNetworkStatus(_ contact: Contact) -> NetworkStatus {
|
||||||
networkStatuses[contact.activeConn.agentConnId] ?? .unknown
|
if let conn = contact.activeConn {
|
||||||
|
networkStatuses[conn.agentConnId] ?? .unknown
|
||||||
|
} else {
|
||||||
|
.unknown
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -689,40 +753,47 @@ final class Chat: ObservableObject, Identifiable {
|
|||||||
public static var sampleData: Chat = Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])
|
public static var sampleData: Chat = Chat(chatInfo: ChatInfo.sampleData.direct, chatItems: [])
|
||||||
}
|
}
|
||||||
|
|
||||||
enum NetworkStatus: Decodable, Equatable {
|
final class GMember: ObservableObject, Identifiable {
|
||||||
case unknown
|
@Published var wrapped: GroupMember
|
||||||
case connected
|
var created = Date.now
|
||||||
case disconnected
|
|
||||||
case error(String)
|
|
||||||
|
|
||||||
var statusString: LocalizedStringKey {
|
init(_ member: GroupMember) {
|
||||||
get {
|
self.wrapped = member
|
||||||
switch self {
|
|
||||||
case .connected: return "connected"
|
|
||||||
case .error: return "error"
|
|
||||||
default: return "connecting"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var statusExplanation: LocalizedStringKey {
|
var id: String { wrapped.id }
|
||||||
get {
|
var groupId: Int64 { wrapped.groupId }
|
||||||
switch self {
|
var groupMemberId: Int64 { wrapped.groupMemberId }
|
||||||
case .connected: return "You are connected to the server used to receive messages from this contact."
|
var displayName: String { wrapped.displayName }
|
||||||
case let .error(err): return "Trying to connect to the server used to receive messages from this contact (error: \(err))."
|
var viewId: String { get { "\(wrapped.id) \(created.timeIntervalSince1970)" } }
|
||||||
default: return "Trying to connect to the server used to receive messages from this contact."
|
static let sampleData = GMember(GroupMember.sampleData)
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
struct RemoteCtrlSession {
|
||||||
|
var ctrlAppInfo: CtrlAppInfo
|
||||||
|
var appVersion: String
|
||||||
|
var sessionState: UIRemoteCtrlSessionState
|
||||||
|
|
||||||
|
func updateState(_ state: UIRemoteCtrlSessionState) -> RemoteCtrlSession {
|
||||||
|
RemoteCtrlSession(ctrlAppInfo: ctrlAppInfo, appVersion: appVersion, sessionState: state)
|
||||||
}
|
}
|
||||||
|
|
||||||
var imageName: String {
|
var active: Bool {
|
||||||
get {
|
if case .connected = sessionState { true } else { false }
|
||||||
switch self {
|
}
|
||||||
case .unknown: return "circle.dotted"
|
|
||||||
case .connected: return "circle.fill"
|
var sessionCode: String? {
|
||||||
case .disconnected: return "ellipsis.circle.fill"
|
switch sessionState {
|
||||||
case .error: return "exclamationmark.circle.fill"
|
case let .pendingConfirmation(_, sessionCode): sessionCode
|
||||||
}
|
case let .connected(_, sessionCode): sessionCode
|
||||||
|
default: nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum UIRemoteCtrlSessionState {
|
||||||
|
case starting
|
||||||
|
case connecting(remoteCtrl_: RemoteCtrlInfo?)
|
||||||
|
case pendingConfirmation(remoteCtrl_: RemoteCtrlInfo?, sessionCode: String)
|
||||||
|
case connected(remoteCtrl: RemoteCtrlInfo, sessionCode: String)
|
||||||
|
}
|
||||||
|
|||||||
@@ -257,6 +257,12 @@ func setXFTPConfig(_ cfg: XFTPFileConfig?) throws {
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiSetEncryptLocalFiles(_ enable: Bool) throws {
|
||||||
|
let r = chatSendCmdSync(.apiSetEncryptLocalFiles(enable: enable))
|
||||||
|
if case .cmdOk = r { return }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
func apiExportArchive(config: ArchiveConfig) async throws {
|
func apiExportArchive(config: ArchiveConfig) async throws {
|
||||||
try await sendCommandOkResp(.apiExportArchive(config: config))
|
try await sendCommandOkResp(.apiExportArchive(config: config))
|
||||||
}
|
}
|
||||||
@@ -306,6 +312,7 @@ func loadChat(chat: Chat, search: String = "") {
|
|||||||
do {
|
do {
|
||||||
let cInfo = chat.chatInfo
|
let cInfo = chat.chatInfo
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
|
m.chatItemStatuses = [:]
|
||||||
m.reversedChatItems = []
|
m.reversedChatItems = []
|
||||||
let chat = try apiGetChat(type: cInfo.chatType, id: cInfo.apiId, search: search)
|
let chat = try apiGetChat(type: cInfo.chatType, id: cInfo.apiId, search: search)
|
||||||
m.updateChatInfo(chat.chatInfo)
|
m.updateChatInfo(chat.chatInfo)
|
||||||
@@ -495,6 +502,10 @@ func apiSetChatSettings(type: ChatType, id: Int64, chatSettings: ChatSettings) a
|
|||||||
try await sendCommandOkResp(.apiSetChatSettings(type: type, id: id, chatSettings: chatSettings))
|
try await sendCommandOkResp(.apiSetChatSettings(type: type, id: id, chatSettings: chatSettings))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiSetMemberSettings(_ groupId: Int64, _ groupMemberId: Int64, _ memberSettings: GroupMemberSettings) async throws {
|
||||||
|
try await sendCommandOkResp(.apiSetMemberSettings(groupId: groupId, groupMemberId: groupMemberId, memberSettings: memberSettings))
|
||||||
|
}
|
||||||
|
|
||||||
func apiContactInfo(_ contactId: Int64) async throws -> (ConnectionStats?, Profile?) {
|
func apiContactInfo(_ contactId: Int64) async throws -> (ConnectionStats?, Profile?) {
|
||||||
let r = await chatSendCmd(.apiContactInfo(contactId: contactId))
|
let r = await chatSendCmd(.apiContactInfo(contactId: contactId))
|
||||||
if case let .contactInfo(_, _, connStats, customUserProfile) = r { return (connStats, customUserProfile) }
|
if case let .contactInfo(_, _, connStats, customUserProfile) = r { return (connStats, customUserProfile) }
|
||||||
@@ -586,6 +597,14 @@ func apiSetConnectionIncognito(connId: Int64, incognito: Bool) async throws -> P
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiConnectPlan(connReq: String) async throws -> ConnectionPlan {
|
||||||
|
let userId = try currentUserId("apiConnectPlan")
|
||||||
|
let r = await chatSendCmd(.apiConnectPlan(userId: userId, connReq: connReq))
|
||||||
|
if case let .connectionPlan(_, connectionPlan) = r { return connectionPlan }
|
||||||
|
logger.error("apiConnectPlan error: \(responseError(r))")
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
func apiConnect(incognito: Bool, connReq: String) async -> ConnReqType? {
|
func apiConnect(incognito: Bool, connReq: String) async -> ConnReqType? {
|
||||||
let (connReqType, alert) = await apiConnect_(incognito: incognito, connReq: connReq)
|
let (connReqType, alert) = await apiConnect_(incognito: incognito, connReq: connReq)
|
||||||
if let alert = alert {
|
if let alert = alert {
|
||||||
@@ -610,10 +629,7 @@ func apiConnect_(incognito: Bool, connReq: String) async -> (ConnReqType?, Alert
|
|||||||
if let c = m.getContactChat(contact.contactId) {
|
if let c = m.getContactChat(contact.contactId) {
|
||||||
await MainActor.run { m.chatId = c.id }
|
await MainActor.run { m.chatId = c.id }
|
||||||
}
|
}
|
||||||
let alert = mkAlert(
|
let alert = contactAlreadyExistsAlert(contact)
|
||||||
title: "Contact already exists",
|
|
||||||
message: "You are already connected to \(contact.displayName)."
|
|
||||||
)
|
|
||||||
return (nil, alert)
|
return (nil, alert)
|
||||||
case .chatCmdError(_, .error(.invalidConnReq)):
|
case .chatCmdError(_, .error(.invalidConnReq)):
|
||||||
let alert = mkAlert(
|
let alert = mkAlert(
|
||||||
@@ -641,6 +657,13 @@ func apiConnect_(incognito: Bool, connReq: String) async -> (ConnReqType?, Alert
|
|||||||
return (nil, alert)
|
return (nil, alert)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func contactAlreadyExistsAlert(_ contact: Contact) -> Alert {
|
||||||
|
mkAlert(
|
||||||
|
title: "Contact already exists",
|
||||||
|
message: "You are already connected to \(contact.displayName)."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
private func connectionErrorAlert(_ r: ChatResponse) -> Alert {
|
private func connectionErrorAlert(_ r: ChatResponse) -> Alert {
|
||||||
if let networkErrorAlert = networkErrorAlert(r) {
|
if let networkErrorAlert = networkErrorAlert(r) {
|
||||||
return networkErrorAlert
|
return networkErrorAlert
|
||||||
@@ -652,18 +675,30 @@ private func connectionErrorAlert(_ r: ChatResponse) -> Alert {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiDeleteChat(type: ChatType, id: Int64) async throws {
|
func apiConnectContactViaAddress(incognito: Bool, contactId: Int64) async -> (Contact?, Alert?) {
|
||||||
let r = await chatSendCmd(.apiDeleteChat(type: type, id: id), bgTask: false)
|
guard let userId = ChatModel.shared.currentUser?.userId else {
|
||||||
|
logger.error("apiConnectContactViaAddress: no current user")
|
||||||
|
return (nil, nil)
|
||||||
|
}
|
||||||
|
let r = await chatSendCmd(.apiConnectContactViaAddress(userId: userId, incognito: incognito, contactId: contactId))
|
||||||
|
if case let .sentInvitationToContact(_, contact, _) = r { return (contact, nil) }
|
||||||
|
logger.error("apiConnectContactViaAddress error: \(responseError(r))")
|
||||||
|
let alert = connectionErrorAlert(r)
|
||||||
|
return (nil, alert)
|
||||||
|
}
|
||||||
|
|
||||||
|
func apiDeleteChat(type: ChatType, id: Int64, notify: Bool? = nil) async throws {
|
||||||
|
let r = await chatSendCmd(.apiDeleteChat(type: type, id: id, notify: notify), bgTask: false)
|
||||||
if case .direct = type, case .contactDeleted = r { return }
|
if case .direct = type, case .contactDeleted = r { return }
|
||||||
if case .contactConnection = type, case .contactConnectionDeleted = r { return }
|
if case .contactConnection = type, case .contactConnectionDeleted = r { return }
|
||||||
if case .group = type, case .groupDeletedUser = r { return }
|
if case .group = type, case .groupDeletedUser = r { return }
|
||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteChat(_ chat: Chat) async {
|
func deleteChat(_ chat: Chat, notify: Bool? = nil) async {
|
||||||
do {
|
do {
|
||||||
let cInfo = chat.chatInfo
|
let cInfo = chat.chatInfo
|
||||||
try await apiDeleteChat(type: cInfo.chatType, id: cInfo.apiId)
|
try await apiDeleteChat(type: cInfo.chatType, id: cInfo.apiId, notify: notify)
|
||||||
DispatchQueue.main.async { ChatModel.shared.removeChat(cInfo.id) }
|
DispatchQueue.main.async { ChatModel.shared.removeChat(cInfo.id) }
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("deleteChat apiDeleteChat error: \(responseError(error))")
|
logger.error("deleteChat apiDeleteChat error: \(responseError(error))")
|
||||||
@@ -701,8 +736,9 @@ func apiUpdateProfile(profile: Profile) async throws -> (Profile, [Contact])? {
|
|||||||
let userId = try currentUserId("apiUpdateProfile")
|
let userId = try currentUserId("apiUpdateProfile")
|
||||||
let r = await chatSendCmd(.apiUpdateProfile(userId: userId, profile: profile))
|
let r = await chatSendCmd(.apiUpdateProfile(userId: userId, profile: profile))
|
||||||
switch r {
|
switch r {
|
||||||
case .userProfileNoChange: return nil
|
case .userProfileNoChange: return (profile, [])
|
||||||
case let .userProfileUpdated(_, _, toProfile, updateSummary): return (toProfile, updateSummary.changedContacts)
|
case let .userProfileUpdated(_, _, toProfile, updateSummary): return (toProfile, updateSummary.changedContacts)
|
||||||
|
case .chatCmdError(_, .errorStore(.duplicateName)): return nil;
|
||||||
default: throw r
|
default: throw r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -869,6 +905,44 @@ func apiCancelFile(fileId: Int64) async -> AChatItem? {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setLocalDeviceName(_ displayName: String) throws {
|
||||||
|
try sendCommandOkRespSync(.setLocalDeviceName(displayName: displayName))
|
||||||
|
}
|
||||||
|
|
||||||
|
func connectRemoteCtrl(desktopAddress: String) async throws -> (RemoteCtrlInfo?, CtrlAppInfo, String) {
|
||||||
|
let r = await chatSendCmd(.connectRemoteCtrl(xrcpInvitation: desktopAddress))
|
||||||
|
if case let .remoteCtrlConnecting(rc_, ctrlAppInfo, v) = r { return (rc_, ctrlAppInfo, v) }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
|
func findKnownRemoteCtrl() async throws {
|
||||||
|
try await sendCommandOkResp(.findKnownRemoteCtrl)
|
||||||
|
}
|
||||||
|
|
||||||
|
func confirmRemoteCtrl(_ rcId: Int64) async throws {
|
||||||
|
try await sendCommandOkResp(.confirmRemoteCtrl(remoteCtrlId: rcId))
|
||||||
|
}
|
||||||
|
|
||||||
|
func verifyRemoteCtrlSession(_ sessCode: String) async throws -> RemoteCtrlInfo {
|
||||||
|
let r = await chatSendCmd(.verifyRemoteCtrlSession(sessionCode: sessCode))
|
||||||
|
if case let .remoteCtrlConnected(rc) = r { return rc }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
|
func listRemoteCtrls() throws -> [RemoteCtrlInfo] {
|
||||||
|
let r = chatSendCmdSync(.listRemoteCtrls)
|
||||||
|
if case let .remoteCtrlList(rcInfo) = r { return rcInfo }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
|
func stopRemoteCtrl() async throws {
|
||||||
|
try await sendCommandOkResp(.stopRemoteCtrl)
|
||||||
|
}
|
||||||
|
|
||||||
|
func deleteRemoteCtrl(_ rcId: Int64) async throws {
|
||||||
|
try await sendCommandOkResp(.deleteRemoteCtrl(remoteCtrlId: rcId))
|
||||||
|
}
|
||||||
|
|
||||||
func networkErrorAlert(_ r: ChatResponse) -> Alert? {
|
func networkErrorAlert(_ r: ChatResponse) -> Alert? {
|
||||||
switch r {
|
switch r {
|
||||||
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .TIMEOUT))):
|
case let .chatCmdError(_, .errorAgent(.BROKER(addr, .TIMEOUT))):
|
||||||
@@ -944,6 +1018,12 @@ func apiCallStatus(_ contact: Contact, _ status: String) async throws {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiGetNetworkStatuses() throws -> [ConnNetworkStatus] {
|
||||||
|
let r = chatSendCmdSync(.apiGetNetworkStatuses)
|
||||||
|
if case let .networkStatuses(_, statuses) = r { return statuses }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
func markChatRead(_ chat: Chat, aboveItem: ChatItem? = nil) async {
|
func markChatRead(_ chat: Chat, aboveItem: ChatItem? = nil) async {
|
||||||
do {
|
do {
|
||||||
if chat.chatStats.unreadCount > 0 {
|
if chat.chatStats.unreadCount > 0 {
|
||||||
@@ -991,9 +1071,15 @@ private func sendCommandOkResp(_ cmd: ChatCommand) async throws {
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiNewGroup(_ p: GroupProfile) throws -> GroupInfo {
|
private func sendCommandOkRespSync(_ cmd: ChatCommand) throws {
|
||||||
|
let r = chatSendCmdSync(cmd)
|
||||||
|
if case .cmdOk = r { return }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
|
func apiNewGroup(incognito: Bool, groupProfile: GroupProfile) throws -> GroupInfo {
|
||||||
let userId = try currentUserId("apiNewGroup")
|
let userId = try currentUserId("apiNewGroup")
|
||||||
let r = chatSendCmdSync(.apiNewGroup(userId: userId, groupProfile: p))
|
let r = chatSendCmdSync(.apiNewGroup(userId: userId, incognito: incognito, groupProfile: groupProfile))
|
||||||
if case let .groupCreated(_, groupInfo) = r { return groupInfo }
|
if case let .groupCreated(_, groupInfo) = r { return groupInfo }
|
||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
@@ -1053,8 +1139,8 @@ func apiListMembers(_ groupId: Int64) async -> [GroupMember] {
|
|||||||
return []
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
func filterMembersToAdd(_ ms: [GroupMember]) -> [Contact] {
|
func filterMembersToAdd(_ ms: [GMember]) -> [Contact] {
|
||||||
let memberContactIds = ms.compactMap{ m in m.memberCurrent ? m.memberContactId : nil }
|
let memberContactIds = ms.compactMap{ m in m.wrapped.memberCurrent ? m.wrapped.memberContactId : nil }
|
||||||
return ChatModel.shared.chats
|
return ChatModel.shared.chats
|
||||||
.compactMap{ $0.chatInfo.contact }
|
.compactMap{ $0.chatInfo.contact }
|
||||||
.filter{ !memberContactIds.contains($0.apiId) }
|
.filter{ !memberContactIds.contains($0.apiId) }
|
||||||
@@ -1133,6 +1219,7 @@ func initializeChat(start: Bool, dbKey: String? = nil, refreshInvitations: Bool
|
|||||||
try apiSetTempFolder(tempFolder: getTempFilesDirectory().path)
|
try apiSetTempFolder(tempFolder: getTempFilesDirectory().path)
|
||||||
try apiSetFilesFolder(filesFolder: getAppFilesDirectory().path)
|
try apiSetFilesFolder(filesFolder: getAppFilesDirectory().path)
|
||||||
try setXFTPConfig(getXFTPCfg())
|
try setXFTPConfig(getXFTPCfg())
|
||||||
|
try apiSetEncryptLocalFiles(privacyEncryptLocalFilesGroupDefault.get())
|
||||||
m.chatInitialized = true
|
m.chatInitialized = true
|
||||||
m.currentUser = try apiGetActiveUser()
|
m.currentUser = try apiGetActiveUser()
|
||||||
if m.currentUser == nil {
|
if m.currentUser == nil {
|
||||||
@@ -1285,12 +1372,20 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
m.removeChat(connection.id)
|
m.removeChat(connection.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case let .contactDeletedByContact(user, contact):
|
||||||
|
if active(user) && contact.directOrUsed {
|
||||||
|
await MainActor.run {
|
||||||
|
m.updateContact(contact)
|
||||||
|
}
|
||||||
|
}
|
||||||
case let .contactConnected(user, contact, _):
|
case let .contactConnected(user, contact, _):
|
||||||
if active(user) && contact.directOrUsed {
|
if active(user) && contact.directOrUsed {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
m.updateContact(contact)
|
m.updateContact(contact)
|
||||||
m.dismissConnReqView(contact.activeConn.id)
|
if let conn = contact.activeConn {
|
||||||
m.removeChat(contact.activeConn.id)
|
m.dismissConnReqView(conn.id)
|
||||||
|
m.removeChat(conn.id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if contact.directOrUsed {
|
if contact.directOrUsed {
|
||||||
@@ -1303,8 +1398,10 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
if active(user) && contact.directOrUsed {
|
if active(user) && contact.directOrUsed {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
m.updateContact(contact)
|
m.updateContact(contact)
|
||||||
m.dismissConnReqView(contact.activeConn.id)
|
if let conn = contact.activeConn {
|
||||||
m.removeChat(contact.activeConn.id)
|
m.dismissConnReqView(conn.id)
|
||||||
|
m.removeChat(conn.id)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case let .receivedContactRequest(user, contactRequest):
|
case let .receivedContactRequest(user, contactRequest):
|
||||||
@@ -1329,6 +1426,12 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
m.updateChatInfo(cInfo)
|
m.updateChatInfo(cInfo)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case let .groupMemberUpdated(user, groupInfo, _, toMember):
|
||||||
|
if active(user) {
|
||||||
|
await MainActor.run {
|
||||||
|
_ = m.upsertGroupMember(groupInfo, toMember)
|
||||||
|
}
|
||||||
|
}
|
||||||
case let .contactsMerged(user, intoContact, mergedContact):
|
case let .contactsMerged(user, intoContact, mergedContact):
|
||||||
if active(user) && m.hasChat(mergedContact.id) {
|
if active(user) && m.hasChat(mergedContact.id) {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
@@ -1342,13 +1445,6 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
await updateContactsStatus(contactRefs, status: .connected)
|
await updateContactsStatus(contactRefs, status: .connected)
|
||||||
case let .contactsDisconnected(_, contactRefs):
|
case let .contactsDisconnected(_, contactRefs):
|
||||||
await updateContactsStatus(contactRefs, status: .disconnected)
|
await updateContactsStatus(contactRefs, status: .disconnected)
|
||||||
case let .contactSubError(user, contact, chatError):
|
|
||||||
await MainActor.run {
|
|
||||||
if active(user) {
|
|
||||||
m.updateContact(contact)
|
|
||||||
}
|
|
||||||
processContactSubError(contact, chatError)
|
|
||||||
}
|
|
||||||
case let .contactSubSummary(_, contactSubscriptions):
|
case let .contactSubSummary(_, contactSubscriptions):
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
for sub in contactSubscriptions {
|
for sub in contactSubscriptions {
|
||||||
@@ -1363,6 +1459,18 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
case let .networkStatus(status, connections):
|
||||||
|
await MainActor.run {
|
||||||
|
for cId in connections {
|
||||||
|
m.networkStatuses[cId] = status
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case let .networkStatuses(_, statuses): ()
|
||||||
|
await MainActor.run {
|
||||||
|
for s in statuses {
|
||||||
|
m.networkStatuses[s.agentConnId] = s.networkStatus
|
||||||
|
}
|
||||||
|
}
|
||||||
case let .newChatItem(user, aChatItem):
|
case let .newChatItem(user, aChatItem):
|
||||||
let cInfo = aChatItem.chatInfo
|
let cInfo = aChatItem.chatInfo
|
||||||
let cItem = aChatItem.chatItem
|
let cItem = aChatItem.chatItem
|
||||||
@@ -1384,11 +1492,8 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
case let .chatItemStatusUpdated(user, aChatItem):
|
case let .chatItemStatusUpdated(user, aChatItem):
|
||||||
let cInfo = aChatItem.chatInfo
|
let cInfo = aChatItem.chatInfo
|
||||||
let cItem = aChatItem.chatItem
|
let cItem = aChatItem.chatItem
|
||||||
if !cItem.isDeletedContent {
|
if !cItem.isDeletedContent && active(user) {
|
||||||
let added = active(user) ? await MainActor.run { m.upsertChatItem(cInfo, cItem) } : true
|
await MainActor.run { m.updateChatItem(cInfo, cItem, status: cItem.meta.itemStatus) }
|
||||||
if added && cItem.showNotification {
|
|
||||||
NtfManager.shared.notifyMessageReceived(user, cInfo, cItem)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if let endTask = m.messageDelivery[cItem.id] {
|
if let endTask = m.messageDelivery[cItem.id] {
|
||||||
switch cItem.meta.itemStatus {
|
switch cItem.meta.itemStatus {
|
||||||
@@ -1435,9 +1540,19 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
|
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
m.updateGroup(groupInfo)
|
m.updateGroup(groupInfo)
|
||||||
if let hostContact = hostContact {
|
if let conn = hostContact?.activeConn {
|
||||||
m.dismissConnReqView(hostContact.activeConn.id)
|
m.dismissConnReqView(conn.id)
|
||||||
m.removeChat(hostContact.activeConn.id)
|
m.removeChat(conn.id)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case let .groupLinkConnecting(user, groupInfo, hostMember):
|
||||||
|
if !active(user) { return }
|
||||||
|
|
||||||
|
await MainActor.run {
|
||||||
|
m.updateGroup(groupInfo)
|
||||||
|
if let hostConn = hostMember.activeConn {
|
||||||
|
m.dismissConnReqView(hostConn.id)
|
||||||
|
m.removeChat(hostConn.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case let .joinedGroupMemberConnecting(user, groupInfo, _, member):
|
case let .joinedGroupMemberConnecting(user, groupInfo, _, member):
|
||||||
@@ -1499,10 +1614,11 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
m.updateGroup(toGroup)
|
m.updateGroup(toGroup)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case let .memberRole(user, groupInfo, _, _, _, _):
|
case let .memberRole(user, groupInfo, byMember: _, member: member, fromRole: _, toRole: _):
|
||||||
if active(user) {
|
if active(user) {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
m.updateGroup(groupInfo)
|
m.updateGroup(groupInfo)
|
||||||
|
_ = m.upsertGroupMember(groupInfo, member)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case let .newMemberContactReceivedInv(user, contact, _, _):
|
case let .newMemberContactReceivedInv(user, contact, _, _):
|
||||||
@@ -1598,6 +1714,26 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
m.updateGroupMemberConnectionStats(groupInfo, member, ratchetSyncProgress.connectionStats)
|
m.updateGroupMemberConnectionStats(groupInfo, member, ratchetSyncProgress.connectionStats)
|
||||||
}
|
}
|
||||||
|
case let .remoteCtrlFound(remoteCtrl):
|
||||||
|
// TODO multicast
|
||||||
|
logger.debug("\(String(describing: remoteCtrl))")
|
||||||
|
case let .remoteCtrlSessionCode(remoteCtrl_, sessionCode):
|
||||||
|
await MainActor.run {
|
||||||
|
let state = UIRemoteCtrlSessionState.pendingConfirmation(remoteCtrl_: remoteCtrl_, sessionCode: sessionCode)
|
||||||
|
m.remoteCtrlSession = m.remoteCtrlSession?.updateState(state)
|
||||||
|
}
|
||||||
|
case let .remoteCtrlConnected(remoteCtrl):
|
||||||
|
// TODO currently it is returned in response to command, so it is redundant
|
||||||
|
await MainActor.run {
|
||||||
|
let state = UIRemoteCtrlSessionState.connected(remoteCtrl: remoteCtrl, sessionCode: m.remoteCtrlSession?.sessionCode ?? "")
|
||||||
|
m.remoteCtrlSession = m.remoteCtrlSession?.updateState(state)
|
||||||
|
}
|
||||||
|
case .remoteCtrlStopped:
|
||||||
|
// This delay is needed to cancel the session that fails on network failure,
|
||||||
|
// e.g. when user did not grant permission to access local network yet.
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
|
||||||
|
switchToLocalSession()
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
logger.debug("unsupported event: \(res.responseType)")
|
logger.debug("unsupported event: \(res.responseType)")
|
||||||
}
|
}
|
||||||
@@ -1611,6 +1747,19 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func switchToLocalSession() {
|
||||||
|
let m = ChatModel.shared
|
||||||
|
m.remoteCtrlSession = nil
|
||||||
|
do {
|
||||||
|
m.users = try listUsers()
|
||||||
|
try getUserChatData()
|
||||||
|
let statuses = (try apiGetNetworkStatuses()).map { s in (s.agentConnId, s.networkStatus) }
|
||||||
|
m.networkStatuses = Dictionary(uniqueKeysWithValues: statuses)
|
||||||
|
} catch let error {
|
||||||
|
logger.debug("error updating chat data: \(responseError(error))")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func active(_ user: any UserLike) -> Bool {
|
func active(_ user: any UserLike) -> Bool {
|
||||||
user.userId == ChatModel.shared.currentUser?.id
|
user.userId == ChatModel.shared.currentUser?.id
|
||||||
}
|
}
|
||||||
@@ -1643,7 +1792,7 @@ func processContactSubError(_ contact: Contact, _ chatError: ChatError) {
|
|||||||
case .errorAgent(agentError: .SMP(smpErr: .AUTH)): err = "contact deleted"
|
case .errorAgent(agentError: .SMP(smpErr: .AUTH)): err = "contact deleted"
|
||||||
default: err = String(describing: chatError)
|
default: err = String(describing: chatError)
|
||||||
}
|
}
|
||||||
m.setContactNetworkStatus(contact, .error(err))
|
m.setContactNetworkStatus(contact, .error(connectionError: err))
|
||||||
}
|
}
|
||||||
|
|
||||||
func refreshCallInvitations() throws {
|
func refreshCallInvitations() throws {
|
||||||
|
|||||||
@@ -19,7 +19,11 @@ let bgSuspendTimeout: Int = 5 // seconds
|
|||||||
let terminationTimeout: Int = 3 // seconds
|
let terminationTimeout: Int = 3 // seconds
|
||||||
|
|
||||||
private func _suspendChat(timeout: Int) {
|
private func _suspendChat(timeout: Int) {
|
||||||
if ChatModel.ok {
|
// this is a redundant check to prevent logical errors, like the one fixed in this PR
|
||||||
|
let state = appStateGroupDefault.get()
|
||||||
|
if !state.canSuspend {
|
||||||
|
logger.error("_suspendChat called, current state: \(state.rawValue, privacy: .public)")
|
||||||
|
} else if ChatModel.ok {
|
||||||
appStateGroupDefault.set(.suspending)
|
appStateGroupDefault.set(.suspending)
|
||||||
apiSuspendChat(timeoutMicroseconds: timeout * 1000000)
|
apiSuspendChat(timeoutMicroseconds: timeout * 1000000)
|
||||||
let endTask = beginBGTask(chatSuspended)
|
let endTask = beginBGTask(chatSuspended)
|
||||||
@@ -31,9 +35,7 @@ private func _suspendChat(timeout: Int) {
|
|||||||
|
|
||||||
func suspendChat() {
|
func suspendChat() {
|
||||||
suspendLockQueue.sync {
|
suspendLockQueue.sync {
|
||||||
if appStateGroupDefault.get() != .stopped {
|
_suspendChat(timeout: appSuspendTimeout)
|
||||||
_suspendChat(timeout: appSuspendTimeout)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,15 +47,25 @@ func suspendBgRefresh() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var terminating = false
|
||||||
|
|
||||||
func terminateChat() {
|
func terminateChat() {
|
||||||
|
logger.debug("terminateChat")
|
||||||
suspendLockQueue.sync {
|
suspendLockQueue.sync {
|
||||||
switch appStateGroupDefault.get() {
|
switch appStateGroupDefault.get() {
|
||||||
case .suspending:
|
case .suspending:
|
||||||
// suspend instantly if already suspending
|
// suspend instantly if already suspending
|
||||||
_chatSuspended()
|
_chatSuspended()
|
||||||
|
// when apiSuspendChat is called with timeout 0, it won't send any events on suspension
|
||||||
if ChatModel.ok { apiSuspendChat(timeoutMicroseconds: 0) }
|
if ChatModel.ok { apiSuspendChat(timeoutMicroseconds: 0) }
|
||||||
case .stopped: ()
|
chatCloseStore()
|
||||||
|
case .suspended:
|
||||||
|
chatCloseStore()
|
||||||
|
case .stopped:
|
||||||
|
chatCloseStore()
|
||||||
default:
|
default:
|
||||||
|
terminating = true
|
||||||
|
// the store will be closed in _chatSuspended when event is received
|
||||||
_suspendChat(timeout: terminationTimeout)
|
_suspendChat(timeout: terminationTimeout)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -73,10 +85,14 @@ private func _chatSuspended() {
|
|||||||
if ChatModel.shared.chatRunning == true {
|
if ChatModel.shared.chatRunning == true {
|
||||||
ChatReceiver.shared.stop()
|
ChatReceiver.shared.stop()
|
||||||
}
|
}
|
||||||
|
if terminating {
|
||||||
|
chatCloseStore()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func activateChat(appState: AppState = .active) {
|
func activateChat(appState: AppState = .active) {
|
||||||
logger.debug("DEBUGGING: activateChat")
|
logger.debug("DEBUGGING: activateChat")
|
||||||
|
terminating = false
|
||||||
suspendLockQueue.sync {
|
suspendLockQueue.sync {
|
||||||
appStateGroupDefault.set(appState)
|
appStateGroupDefault.set(appState)
|
||||||
if ChatModel.ok { apiActivateChat() }
|
if ChatModel.ok { apiActivateChat() }
|
||||||
@@ -85,6 +101,7 @@ func activateChat(appState: AppState = .active) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func initChatAndMigrate(refreshInvitations: Bool = true) {
|
func initChatAndMigrate(refreshInvitations: Bool = true) {
|
||||||
|
terminating = false
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
if (!m.chatInitialized) {
|
if (!m.chatInitialized) {
|
||||||
do {
|
do {
|
||||||
@@ -97,6 +114,7 @@ func initChatAndMigrate(refreshInvitations: Bool = true) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func startChatAndActivate() {
|
func startChatAndActivate() {
|
||||||
|
terminating = false
|
||||||
logger.debug("DEBUGGING: startChatAndActivate")
|
logger.debug("DEBUGGING: startChatAndActivate")
|
||||||
if ChatModel.shared.chatRunning == true {
|
if ChatModel.shared.chatRunning == true {
|
||||||
ChatReceiver.shared.start()
|
ChatReceiver.shared.start()
|
||||||
|
|||||||
@@ -39,6 +39,7 @@ struct ActiveCallView: View {
|
|||||||
}
|
}
|
||||||
.onAppear {
|
.onAppear {
|
||||||
logger.debug("ActiveCallView: appear client is nil \(client == nil), scenePhase \(String(describing: scenePhase), privacy: .public), canConnectCall \(canConnectCall)")
|
logger.debug("ActiveCallView: appear client is nil \(client == nil), scenePhase \(String(describing: scenePhase), privacy: .public), canConnectCall \(canConnectCall)")
|
||||||
|
AppDelegate.keepScreenOn(true)
|
||||||
createWebRTCClient()
|
createWebRTCClient()
|
||||||
dismissAllSheets()
|
dismissAllSheets()
|
||||||
}
|
}
|
||||||
@@ -48,6 +49,7 @@ struct ActiveCallView: View {
|
|||||||
}
|
}
|
||||||
.onDisappear {
|
.onDisappear {
|
||||||
logger.debug("ActiveCallView: disappear")
|
logger.debug("ActiveCallView: disappear")
|
||||||
|
AppDelegate.keepScreenOn(false)
|
||||||
client?.endCall()
|
client?.endCall()
|
||||||
}
|
}
|
||||||
.onChange(of: m.callCommand) { _ in sendCommandToClient()}
|
.onChange(of: m.callCommand) { _ in sendCommandToClient()}
|
||||||
|
|||||||
@@ -108,7 +108,6 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
try audioSession.setActive(true)
|
try audioSession.setActive(true)
|
||||||
logger.debug("audioSession activated")
|
logger.debug("audioSession activated")
|
||||||
} catch {
|
} catch {
|
||||||
print(error)
|
|
||||||
logger.error("failed activating audio session")
|
logger.error("failed activating audio session")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -121,7 +120,6 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
try audioSession.setActive(false)
|
try audioSession.setActive(false)
|
||||||
logger.debug("audioSession deactivated")
|
logger.debug("audioSession deactivated")
|
||||||
} catch {
|
} catch {
|
||||||
print(error)
|
|
||||||
logger.error("failed deactivating audio session")
|
logger.error("failed deactivating audio session")
|
||||||
}
|
}
|
||||||
suspendOnEndCall()
|
suspendOnEndCall()
|
||||||
|
|||||||
@@ -99,12 +99,12 @@ struct ChatInfoView: View {
|
|||||||
@Binding var connectionCode: String?
|
@Binding var connectionCode: String?
|
||||||
@FocusState private var aliasTextFieldFocused: Bool
|
@FocusState private var aliasTextFieldFocused: Bool
|
||||||
@State private var alert: ChatInfoViewAlert? = nil
|
@State private var alert: ChatInfoViewAlert? = nil
|
||||||
|
@State private var showDeleteContactActionSheet = false
|
||||||
@State private var sendReceipts = SendReceipts.userDefault(true)
|
@State private var sendReceipts = SendReceipts.userDefault(true)
|
||||||
@State private var sendReceiptsUserDefault = true
|
@State private var sendReceiptsUserDefault = true
|
||||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||||
|
|
||||||
enum ChatInfoViewAlert: Identifiable {
|
enum ChatInfoViewAlert: Identifiable {
|
||||||
case deleteContactAlert
|
|
||||||
case clearChatAlert
|
case clearChatAlert
|
||||||
case networkStatusAlert
|
case networkStatusAlert
|
||||||
case switchAddressAlert
|
case switchAddressAlert
|
||||||
@@ -114,7 +114,6 @@ struct ChatInfoView: View {
|
|||||||
|
|
||||||
var id: String {
|
var id: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .deleteContactAlert: return "deleteContactAlert"
|
|
||||||
case .clearChatAlert: return "clearChatAlert"
|
case .clearChatAlert: return "clearChatAlert"
|
||||||
case .networkStatusAlert: return "networkStatusAlert"
|
case .networkStatusAlert: return "networkStatusAlert"
|
||||||
case .switchAddressAlert: return "switchAddressAlert"
|
case .switchAddressAlert: return "switchAddressAlert"
|
||||||
@@ -164,13 +163,13 @@ struct ChatInfoView: View {
|
|||||||
// synchronizeConnectionButtonForce()
|
// synchronizeConnectionButtonForce()
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
.disabled(!contact.ready)
|
.disabled(!contact.ready || !contact.active)
|
||||||
|
|
||||||
if let contactLink = contact.contactLink {
|
if let contactLink = contact.contactLink {
|
||||||
Section {
|
Section {
|
||||||
QRCode(uri: contactLink)
|
SimpleXLinkQRCode(uri: contactLink)
|
||||||
Button {
|
Button {
|
||||||
showShareSheet(items: [contactLink])
|
showShareSheet(items: [simplexChatLink(contactLink)])
|
||||||
} label: {
|
} label: {
|
||||||
Label("Share address", systemImage: "square.and.arrow.up")
|
Label("Share address", systemImage: "square.and.arrow.up")
|
||||||
}
|
}
|
||||||
@@ -181,7 +180,7 @@ struct ChatInfoView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if contact.ready {
|
if contact.ready && contact.active {
|
||||||
Section("Servers") {
|
Section("Servers") {
|
||||||
networkStatusRow()
|
networkStatusRow()
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
@@ -192,8 +191,7 @@ struct ChatInfoView: View {
|
|||||||
alert = .switchAddressAlert
|
alert = .switchAddressAlert
|
||||||
}
|
}
|
||||||
.disabled(
|
.disabled(
|
||||||
!contact.ready
|
connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
|
||||||
|| connStats.rcvQueuesInfo.contains { $0.rcvSwitchStatus != nil }
|
|
||||||
|| connStats.ratchetSyncSendProhibited
|
|| connStats.ratchetSyncSendProhibited
|
||||||
)
|
)
|
||||||
if connStats.rcvQueuesInfo.contains(where: { $0.rcvSwitchStatus != nil }) {
|
if connStats.rcvQueuesInfo.contains(where: { $0.rcvSwitchStatus != nil }) {
|
||||||
@@ -234,7 +232,6 @@ struct ChatInfoView: View {
|
|||||||
}
|
}
|
||||||
.alert(item: $alert) { alertItem in
|
.alert(item: $alert) { alertItem in
|
||||||
switch(alertItem) {
|
switch(alertItem) {
|
||||||
case .deleteContactAlert: return deleteContactAlert()
|
|
||||||
case .clearChatAlert: return clearChatAlert()
|
case .clearChatAlert: return clearChatAlert()
|
||||||
case .networkStatusAlert: return networkStatusAlert()
|
case .networkStatusAlert: return networkStatusAlert()
|
||||||
case .switchAddressAlert: return switchAddressAlert(switchContactAddress)
|
case .switchAddressAlert: return switchAddressAlert(switchContactAddress)
|
||||||
@@ -243,6 +240,26 @@ struct ChatInfoView: View {
|
|||||||
case let .error(title, error): return mkAlert(title: title, message: error)
|
case let .error(title, error): return mkAlert(title: title, message: error)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.actionSheet(isPresented: $showDeleteContactActionSheet) {
|
||||||
|
if contact.ready && contact.active {
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text("Delete contact?\nThis cannot be undone!"),
|
||||||
|
buttons: [
|
||||||
|
.destructive(Text("Delete and notify contact")) { deleteContact(notify: true) },
|
||||||
|
.destructive(Text("Delete")) { deleteContact(notify: false) },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text("Delete contact?\nThis cannot be undone!"),
|
||||||
|
buttons: [
|
||||||
|
.destructive(Text("Delete")) { deleteContact() },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func contactInfoHeader() -> some View {
|
private func contactInfoHeader() -> some View {
|
||||||
@@ -321,7 +338,7 @@ struct ChatInfoView: View {
|
|||||||
verify: { code in
|
verify: { code in
|
||||||
if let r = apiVerifyContact(chat.chatInfo.apiId, connectionCode: code) {
|
if let r = apiVerifyContact(chat.chatInfo.apiId, connectionCode: code) {
|
||||||
let (verified, existingCode) = r
|
let (verified, existingCode) = r
|
||||||
contact.activeConn.connectionCode = verified ? SecurityCode(securityCode: existingCode, verifiedAt: .now) : nil
|
contact.activeConn?.connectionCode = verified ? SecurityCode(securityCode: existingCode, verifiedAt: .now) : nil
|
||||||
connectionCode = existingCode
|
connectionCode = existingCode
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
chat.chatInfo = .direct(contact: contact)
|
chat.chatInfo = .direct(contact: contact)
|
||||||
@@ -415,7 +432,7 @@ struct ChatInfoView: View {
|
|||||||
|
|
||||||
private func deleteContactButton() -> some View {
|
private func deleteContactButton() -> some View {
|
||||||
Button(role: .destructive) {
|
Button(role: .destructive) {
|
||||||
alert = .deleteContactAlert
|
showDeleteContactActionSheet = true
|
||||||
} label: {
|
} label: {
|
||||||
Label("Delete contact", systemImage: "trash")
|
Label("Delete contact", systemImage: "trash")
|
||||||
.foregroundColor(Color.red)
|
.foregroundColor(Color.red)
|
||||||
@@ -431,30 +448,23 @@ struct ChatInfoView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func deleteContactAlert() -> Alert {
|
private func deleteContact(notify: Bool? = nil) {
|
||||||
Alert(
|
Task {
|
||||||
title: Text("Delete contact?"),
|
do {
|
||||||
message: Text("Contact and all messages will be deleted - this cannot be undone!"),
|
try await apiDeleteChat(type: chat.chatInfo.chatType, id: chat.chatInfo.apiId, notify: notify)
|
||||||
primaryButton: .destructive(Text("Delete")) {
|
await MainActor.run {
|
||||||
Task {
|
dismiss()
|
||||||
do {
|
chatModel.chatId = nil
|
||||||
try await apiDeleteChat(type: chat.chatInfo.chatType, id: chat.chatInfo.apiId)
|
chatModel.removeChat(chat.chatInfo.id)
|
||||||
await MainActor.run {
|
|
||||||
dismiss()
|
|
||||||
chatModel.chatId = nil
|
|
||||||
chatModel.removeChat(chat.chatInfo.id)
|
|
||||||
}
|
|
||||||
} catch let error {
|
|
||||||
logger.error("deleteContactAlert apiDeleteChat error: \(responseError(error))")
|
|
||||||
let a = getErrorAlert(error, "Error deleting contact")
|
|
||||||
await MainActor.run {
|
|
||||||
alert = .error(title: a.title, error: a.message)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
},
|
} catch let error {
|
||||||
secondaryButton: .cancel()
|
logger.error("deleteContactAlert apiDeleteChat error: \(responseError(error))")
|
||||||
)
|
let a = getErrorAlert(error, "Error deleting contact")
|
||||||
|
await MainActor.run {
|
||||||
|
alert = .error(title: a.title, error: a.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func clearChatAlert() -> Alert {
|
private func clearChatAlert() -> Alert {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import SimpleXChat
|
|||||||
|
|
||||||
struct CICallItemView: View {
|
struct CICallItemView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
var chatInfo: ChatInfo
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var status: CICallStatus
|
var status: CICallStatus
|
||||||
var duration: Int
|
var duration: Int
|
||||||
@@ -60,7 +60,7 @@ struct CICallItemView: View {
|
|||||||
|
|
||||||
|
|
||||||
@ViewBuilder private func acceptCallButton() -> some View {
|
@ViewBuilder private func acceptCallButton() -> some View {
|
||||||
if case let .direct(contact) = chatInfo {
|
if case let .direct(contact) = chat.chatInfo {
|
||||||
Button {
|
Button {
|
||||||
if let invitation = m.callInvitations[contact.id] {
|
if let invitation = m.callInvitations[contact.id] {
|
||||||
CallController.shared.answerCall(invitation: invitation)
|
CallController.shared.answerCall(invitation: invitation)
|
||||||
|
|||||||
@@ -10,20 +10,92 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct CIChatFeatureView: View {
|
struct CIChatFeatureView: View {
|
||||||
|
@EnvironmentObject var m: ChatModel
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
|
@Binding var revealed: Bool
|
||||||
var feature: Feature
|
var feature: Feature
|
||||||
var icon: String? = nil
|
var icon: String? = nil
|
||||||
var iconColor: Color
|
var iconColor: Color
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
if !revealed, let fs = mergedFeautures() {
|
||||||
|
HStack {
|
||||||
|
ForEach(fs, content: featureIconView)
|
||||||
|
}
|
||||||
|
.padding(.horizontal, 6)
|
||||||
|
.padding(.vertical, 6)
|
||||||
|
} else {
|
||||||
|
fullFeatureView
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct FeatureInfo: Identifiable {
|
||||||
|
var icon: String
|
||||||
|
var scale: CGFloat
|
||||||
|
var color: Color
|
||||||
|
var param: String?
|
||||||
|
|
||||||
|
init(_ f: Feature, _ color: Color, _ param: Int?) {
|
||||||
|
self.icon = f.iconFilled
|
||||||
|
self.scale = f.iconScale
|
||||||
|
self.color = color
|
||||||
|
self.param = f.hasParam && param != nil ? timeText(param) : nil
|
||||||
|
}
|
||||||
|
|
||||||
|
var id: String {
|
||||||
|
"\(icon) \(color) \(param ?? "")"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func mergedFeautures() -> [FeatureInfo]? {
|
||||||
|
var fs: [FeatureInfo] = []
|
||||||
|
var icons: Set<String> = []
|
||||||
|
if var i = m.getChatItemIndex(chatItem) {
|
||||||
|
while i < m.reversedChatItems.count,
|
||||||
|
let f = featureInfo(m.reversedChatItems[i]) {
|
||||||
|
if !icons.contains(f.icon) {
|
||||||
|
fs.insert(f, at: 0)
|
||||||
|
icons.insert(f.icon)
|
||||||
|
}
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return fs.count > 1 ? fs : nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private func featureInfo(_ ci: ChatItem) -> FeatureInfo? {
|
||||||
|
switch ci.content {
|
||||||
|
case let .rcvChatFeature(feature, enabled, param): FeatureInfo(feature, enabled.iconColor, param)
|
||||||
|
case let .sndChatFeature(feature, enabled, param): FeatureInfo(feature, enabled.iconColor, param)
|
||||||
|
case let .rcvGroupFeature(feature, preference, param): FeatureInfo(feature, preference.enable.iconColor, param)
|
||||||
|
case let .sndGroupFeature(feature, preference, param): FeatureInfo(feature, preference.enable.iconColor, param)
|
||||||
|
default: nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewBuilder private func featureIconView(_ f: FeatureInfo) -> some View {
|
||||||
|
let i = Image(systemName: f.icon)
|
||||||
|
.foregroundColor(f.color)
|
||||||
|
.scaleEffect(f.scale)
|
||||||
|
if let param = f.param {
|
||||||
|
HStack {
|
||||||
|
i
|
||||||
|
chatEventText(Text(param)).lineLimit(1)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var fullFeatureView: some View {
|
||||||
HStack(alignment: .bottom, spacing: 4) {
|
HStack(alignment: .bottom, spacing: 4) {
|
||||||
Image(systemName: icon ?? feature.iconFilled)
|
Image(systemName: icon ?? feature.iconFilled)
|
||||||
.foregroundColor(iconColor)
|
.foregroundColor(iconColor)
|
||||||
.scaleEffect(feature.iconScale)
|
.scaleEffect(feature.iconScale)
|
||||||
chatEventText(chatItem)
|
chatEventText(chatItem)
|
||||||
}
|
}
|
||||||
.padding(.leading, 6)
|
.padding(.horizontal, 6)
|
||||||
.padding(.bottom, 6)
|
.padding(.vertical, 4)
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,6 +103,6 @@ struct CIChatFeatureView: View {
|
|||||||
struct CIChatFeatureView_Previews: PreviewProvider {
|
struct CIChatFeatureView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let enabled = FeatureEnabled(forUser: false, forContact: false)
|
let enabled = FeatureEnabled(forUser: false, forContact: false)
|
||||||
CIChatFeatureView(chatItem: ChatItem.getChatFeatureSample(.fullDelete, enabled), feature: ChatFeature.fullDelete, iconColor: enabled.iconColor)
|
CIChatFeatureView(chatItem: ChatItem.getChatFeatureSample(.fullDelete, enabled), revealed: Binding.constant(true), feature: ChatFeature.fullDelete, iconColor: enabled.iconColor)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,11 +13,9 @@ struct CIEventView: View {
|
|||||||
var eventText: Text
|
var eventText: Text
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack(alignment: .bottom, spacing: 0) {
|
eventText
|
||||||
eventText
|
.padding(.horizontal, 6)
|
||||||
}
|
.padding(.vertical, 4)
|
||||||
.padding(.leading, 6)
|
|
||||||
.padding(.bottom, 6)
|
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct CIFeaturePreferenceView: View {
|
struct CIFeaturePreferenceView: View {
|
||||||
@EnvironmentObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var feature: ChatFeature
|
var feature: ChatFeature
|
||||||
var allowed: FeatureAllowed
|
var allowed: FeatureAllowed
|
||||||
@@ -80,7 +80,6 @@ struct CIFeaturePreferenceView_Previews: PreviewProvider {
|
|||||||
quotedItem: nil,
|
quotedItem: nil,
|
||||||
file: nil
|
file: nil
|
||||||
)
|
)
|
||||||
CIFeaturePreferenceView(chatItem: chatItem, feature: ChatFeature.timedMessages, allowed: .yes, param: 30)
|
CIFeaturePreferenceView(chat: Chat.sampleData, chatItem: chatItem, feature: ChatFeature.timedMessages, allowed: .yes, param: 30)
|
||||||
.environmentObject(Chat.sampleData)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct CIFileView: View {
|
struct CIFileView: View {
|
||||||
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
let file: CIFile?
|
let file: CIFile?
|
||||||
let edited: Bool
|
let edited: Bool
|
||||||
@@ -83,7 +84,7 @@ struct CIFileView: View {
|
|||||||
if fileSizeValid() {
|
if fileSizeValid() {
|
||||||
Task {
|
Task {
|
||||||
logger.debug("CIFileView fileAction - in .rcvInvitation, in Task")
|
logger.debug("CIFileView fileAction - in .rcvInvitation, in Task")
|
||||||
if let user = ChatModel.shared.currentUser {
|
if let user = m.currentUser {
|
||||||
let encrypted = privacyEncryptLocalFilesGroupDefault.get()
|
let encrypted = privacyEncryptLocalFilesGroupDefault.get()
|
||||||
await receiveFile(user: user, fileId: file.fileId, encrypted: encrypted)
|
await receiveFile(user: user, fileId: file.fileId, encrypted: encrypted)
|
||||||
}
|
}
|
||||||
@@ -234,18 +235,17 @@ struct CIFileView_Previews: PreviewProvider {
|
|||||||
file: nil
|
file: nil
|
||||||
)
|
)
|
||||||
Group {
|
Group {
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: sentFile, revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: sentFile, revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(fileName: "some_long_file_name_here", fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileName: "some_long_file_name_here", fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvAccepted), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvAccepted), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvCancelled), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileStatus: .rcvCancelled), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(fileSize: 1_000_000_000, fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(fileSize: 1_000_000_000, fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(text: "Hello there", fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(text: "Hello there", fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getFileMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getFileMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.", fileStatus: .rcvInvitation), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: fileChatItemWtFile, revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: fileChatItemWtFile, revealed: Binding.constant(false))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 360))
|
.previewLayout(.fixed(width: 360, height: 360))
|
||||||
.environmentObject(Chat.sampleData)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,34 +17,45 @@ struct CIGroupInvitationView: View {
|
|||||||
var memberRole: GroupMemberRole
|
var memberRole: GroupMemberRole
|
||||||
var chatIncognito: Bool = false
|
var chatIncognito: Bool = false
|
||||||
@State private var frameWidth: CGFloat = 0
|
@State private var frameWidth: CGFloat = 0
|
||||||
|
@State private var inProgress = false
|
||||||
|
@State private var progressByTimeout = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let action = !chatItem.chatDir.sent && groupInvitation.status == .pending
|
let action = !chatItem.chatDir.sent && groupInvitation.status == .pending
|
||||||
let v = ZStack(alignment: .bottomTrailing) {
|
let v = ZStack(alignment: .bottomTrailing) {
|
||||||
VStack(alignment: .leading) {
|
ZStack {
|
||||||
groupInfoView(action)
|
VStack(alignment: .leading) {
|
||||||
.padding(.horizontal, 2)
|
groupInfoView(action)
|
||||||
.padding(.top, 8)
|
.padding(.horizontal, 2)
|
||||||
.padding(.bottom, 6)
|
.padding(.top, 8)
|
||||||
.overlay(DetermineWidth())
|
.padding(.bottom, 6)
|
||||||
|
.overlay(DetermineWidth())
|
||||||
|
|
||||||
Divider().frame(width: frameWidth)
|
Divider().frame(width: frameWidth)
|
||||||
|
|
||||||
if action {
|
if action {
|
||||||
groupInvitationText()
|
VStack(alignment: .leading, spacing: 2) {
|
||||||
.overlay(DetermineWidth())
|
groupInvitationText()
|
||||||
Text(chatIncognito ? "Tap to join incognito" : "Tap to join")
|
.overlay(DetermineWidth())
|
||||||
.foregroundColor(chatIncognito ? .indigo : .accentColor)
|
Text(chatIncognito ? "Tap to join incognito" : "Tap to join")
|
||||||
.font(.callout)
|
.foregroundColor(inProgress ? .secondary : chatIncognito ? .indigo : .accentColor)
|
||||||
.padding(.trailing, 60)
|
.font(.callout)
|
||||||
.overlay(DetermineWidth())
|
.padding(.trailing, 60)
|
||||||
} else {
|
.overlay(DetermineWidth())
|
||||||
groupInvitationText()
|
}
|
||||||
.padding(.trailing, 60)
|
} else {
|
||||||
.overlay(DetermineWidth())
|
groupInvitationText()
|
||||||
|
.padding(.trailing, 60)
|
||||||
|
.overlay(DetermineWidth())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.bottom, 2)
|
||||||
|
|
||||||
|
if progressByTimeout {
|
||||||
|
ProgressView().scaleEffect(2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.bottom, 2)
|
|
||||||
chatItem.timestampText
|
chatItem.timestampText
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
@@ -55,11 +66,24 @@ struct CIGroupInvitationView: View {
|
|||||||
.cornerRadius(18)
|
.cornerRadius(18)
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
.onPreferenceChange(DetermineWidth.Key.self) { frameWidth = $0 }
|
.onPreferenceChange(DetermineWidth.Key.self) { frameWidth = $0 }
|
||||||
|
.onChange(of: inProgress) { inProgress in
|
||||||
|
if inProgress {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||||
|
progressByTimeout = inProgress
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
progressByTimeout = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if action {
|
if action {
|
||||||
v.onTapGesture {
|
v.onTapGesture {
|
||||||
joinGroup(groupInvitation.groupId)
|
inProgress = true
|
||||||
|
joinGroup(groupInvitation.groupId) {
|
||||||
|
await MainActor.run { inProgress = false }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
.disabled(inProgress)
|
||||||
} else {
|
} else {
|
||||||
v
|
v
|
||||||
}
|
}
|
||||||
@@ -67,7 +91,7 @@ struct CIGroupInvitationView: View {
|
|||||||
|
|
||||||
private func groupInfoView(_ action: Bool) -> some View {
|
private func groupInfoView(_ action: Bool) -> some View {
|
||||||
var color: Color
|
var color: Color
|
||||||
if action {
|
if action && !inProgress {
|
||||||
color = chatIncognito ? .indigo : .accentColor
|
color = chatIncognito ? .indigo : .accentColor
|
||||||
} else {
|
} else {
|
||||||
color = Color(uiColor: .tertiaryLabel)
|
color = Color(uiColor: .tertiaryLabel)
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct CIImageView: View {
|
struct CIImageView: View {
|
||||||
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
let chatItem: ChatItem
|
let chatItem: ChatItem
|
||||||
let image: String
|
let image: String
|
||||||
@@ -36,7 +37,7 @@ struct CIImageView: View {
|
|||||||
switch file.fileStatus {
|
switch file.fileStatus {
|
||||||
case .rcvInvitation:
|
case .rcvInvitation:
|
||||||
Task {
|
Task {
|
||||||
if let user = ChatModel.shared.currentUser {
|
if let user = m.currentUser {
|
||||||
await receiveFile(user: user, fileId: file.fileId, encrypted: chatItem.encryptLocalFile)
|
await receiveFile(user: user, fileId: file.fileId, encrypted: chatItem.encryptLocalFile)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct CIMemberCreatedContactView: View {
|
struct CIMemberCreatedContactView: View {
|
||||||
|
@EnvironmentObject var m: ChatModel
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -21,7 +22,7 @@ struct CIMemberCreatedContactView: View {
|
|||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
dismissAllSheets(animated: true)
|
dismissAllSheets(animated: true)
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
ChatModel.shared.chatId = "@\(contactId)"
|
m.chatId = "@\(contactId)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct CIMetaView: View {
|
struct CIMetaView: View {
|
||||||
@EnvironmentObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var metaColor = Color.secondary
|
var metaColor = Color.secondary
|
||||||
var paleMetaColor = Color(UIColor.tertiaryLabel)
|
var paleMetaColor = Color(UIColor.tertiaryLabel)
|
||||||
@@ -95,15 +95,14 @@ private func statusIconText(_ icon: String, _ color: Color) -> Text {
|
|||||||
struct CIMetaView_Previews: PreviewProvider {
|
struct CIMetaView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
Group {
|
Group {
|
||||||
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete)))
|
CIMetaView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete)))
|
||||||
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .partial)))
|
CIMetaView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .partial)))
|
||||||
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .ok, sndProgress: .complete)))
|
CIMetaView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .ok, sndProgress: .complete)))
|
||||||
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .ok, sndProgress: .partial)))
|
CIMetaView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .ok, sndProgress: .partial)))
|
||||||
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .badMsgHash, sndProgress: .complete)))
|
CIMetaView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndRcvd(msgRcptStatus: .badMsgHash, sndProgress: .complete)))
|
||||||
CIMetaView(chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete), itemEdited: true))
|
CIMetaView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directSnd, .now, "https://simplex.chat", .sndSent(sndProgress: .complete), itemEdited: true))
|
||||||
CIMetaView(chatItem: ChatItem.getDeletedContentSample())
|
CIMetaView(chat: Chat.sampleData, chatItem: ChatItem.getDeletedContentSample())
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 100))
|
.previewLayout(.fixed(width: 360, height: 100))
|
||||||
.environmentObject(Chat.sampleData)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ import SimpleXChat
|
|||||||
let decryptErrorReason: LocalizedStringKey = "It can happen when you or your connection used the old database backup."
|
let decryptErrorReason: LocalizedStringKey = "It can happen when you or your connection used the old database backup."
|
||||||
|
|
||||||
struct CIRcvDecryptionError: View {
|
struct CIRcvDecryptionError: View {
|
||||||
@EnvironmentObject var chat: Chat
|
@EnvironmentObject var m: ChatModel
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
var msgDecryptError: MsgDecryptError
|
var msgDecryptError: MsgDecryptError
|
||||||
var msgCount: UInt32
|
var msgCount: UInt32
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
@@ -45,7 +46,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
do {
|
do {
|
||||||
let (member, stats) = try apiGroupMemberInfo(groupInfo.apiId, groupMember.groupMemberId)
|
let (member, stats) = try apiGroupMemberInfo(groupInfo.apiId, groupMember.groupMemberId)
|
||||||
if let s = stats {
|
if let s = stats {
|
||||||
ChatModel.shared.updateGroupMemberConnectionStats(groupInfo, member, s)
|
m.updateGroupMemberConnectionStats(groupInfo, member, s)
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("apiGroupMemberInfo error: \(responseError(error))")
|
logger.error("apiGroupMemberInfo error: \(responseError(error))")
|
||||||
@@ -65,7 +66,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
|
|
||||||
@ViewBuilder private func viewBody() -> some View {
|
@ViewBuilder private func viewBody() -> some View {
|
||||||
if case let .direct(contact) = chat.chatInfo,
|
if case let .direct(contact) = chat.chatInfo,
|
||||||
let contactStats = contact.activeConn.connectionStats {
|
let contactStats = contact.activeConn?.connectionStats {
|
||||||
if contactStats.ratchetSyncAllowed {
|
if contactStats.ratchetSyncAllowed {
|
||||||
decryptionErrorItemFixButton(syncSupported: true) {
|
decryptionErrorItemFixButton(syncSupported: true) {
|
||||||
alert = .syncAllowedAlert { syncContactConnection(contact) }
|
alert = .syncAllowedAlert { syncContactConnection(contact) }
|
||||||
@@ -79,8 +80,8 @@ struct CIRcvDecryptionError: View {
|
|||||||
}
|
}
|
||||||
} else if case let .group(groupInfo) = chat.chatInfo,
|
} else if case let .group(groupInfo) = chat.chatInfo,
|
||||||
case let .groupRcv(groupMember) = chatItem.chatDir,
|
case let .groupRcv(groupMember) = chatItem.chatDir,
|
||||||
let modelMember = ChatModel.shared.groupMembers.first(where: { $0.id == groupMember.id }),
|
let mem = m.getGroupMember(groupMember.groupMemberId),
|
||||||
let memberStats = modelMember.activeConn?.connectionStats {
|
let memberStats = mem.wrapped.activeConn?.connectionStats {
|
||||||
if memberStats.ratchetSyncAllowed {
|
if memberStats.ratchetSyncAllowed {
|
||||||
decryptionErrorItemFixButton(syncSupported: true) {
|
decryptionErrorItemFixButton(syncSupported: true) {
|
||||||
alert = .syncAllowedAlert { syncMemberConnection(groupInfo, groupMember) }
|
alert = .syncAllowedAlert { syncMemberConnection(groupInfo, groupMember) }
|
||||||
@@ -122,7 +123,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
CIMetaView(chatItem: chatItem)
|
CIMetaView(chat: chat, chatItem: chatItem)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
}
|
}
|
||||||
.onTapGesture(perform: { onClick() })
|
.onTapGesture(perform: { onClick() })
|
||||||
@@ -142,7 +143,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true)
|
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true)
|
||||||
}
|
}
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
CIMetaView(chatItem: chatItem)
|
CIMetaView(chat: chat, chatItem: chatItem)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
}
|
}
|
||||||
.onTapGesture(perform: { onClick() })
|
.onTapGesture(perform: { onClick() })
|
||||||
@@ -164,6 +165,8 @@ struct CIRcvDecryptionError: View {
|
|||||||
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why
|
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why
|
||||||
case .other:
|
case .other:
|
||||||
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why
|
message = Text("\(msgCount) messages failed to decrypt.") + Text("\n") + why
|
||||||
|
case .ratchetSync:
|
||||||
|
message = Text("Encryption re-negotiation failed.")
|
||||||
}
|
}
|
||||||
return message
|
return message
|
||||||
}
|
}
|
||||||
@@ -173,7 +176,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
do {
|
do {
|
||||||
let (mem, stats) = try apiSyncGroupMemberRatchet(groupInfo.apiId, member.groupMemberId, false)
|
let (mem, stats) = try apiSyncGroupMemberRatchet(groupInfo.apiId, member.groupMemberId, false)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
ChatModel.shared.updateGroupMemberConnectionStats(groupInfo, mem, stats)
|
m.updateGroupMemberConnectionStats(groupInfo, mem, stats)
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("syncMemberConnection apiSyncGroupMemberRatchet error: \(responseError(error))")
|
logger.error("syncMemberConnection apiSyncGroupMemberRatchet error: \(responseError(error))")
|
||||||
@@ -190,7 +193,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
do {
|
do {
|
||||||
let stats = try apiSyncContactRatchet(contact.apiId, false)
|
let stats = try apiSyncContactRatchet(contact.apiId, false)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
ChatModel.shared.updateContactConnectionStats(contact, stats)
|
m.updateContactConnectionStats(contact, stats)
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("syncContactConnection apiSyncContactRatchet error: \(responseError(error))")
|
logger.error("syncContactConnection apiSyncContactRatchet error: \(responseError(error))")
|
||||||
|
|||||||
@@ -9,8 +9,10 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import AVKit
|
import AVKit
|
||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
import Combine
|
||||||
|
|
||||||
struct CIVideoView: View {
|
struct CIVideoView: View {
|
||||||
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
private let chatItem: ChatItem
|
private let chatItem: ChatItem
|
||||||
private let image: String
|
private let image: String
|
||||||
@@ -27,6 +29,7 @@ struct CIVideoView: View {
|
|||||||
@State private var showFullScreenPlayer = false
|
@State private var showFullScreenPlayer = false
|
||||||
@State private var timeObserver: Any? = nil
|
@State private var timeObserver: Any? = nil
|
||||||
@State private var fullScreenTimeObserver: Any? = nil
|
@State private var fullScreenTimeObserver: Any? = nil
|
||||||
|
@State private var publisher: AnyCancellable? = nil
|
||||||
|
|
||||||
init(chatItem: ChatItem, image: String, duration: Int, maxWidth: CGFloat, videoWidth: Binding<CGFloat?>, scrollProxy: ScrollViewProxy?) {
|
init(chatItem: ChatItem, image: String, duration: Int, maxWidth: CGFloat, videoWidth: Binding<CGFloat?>, scrollProxy: ScrollViewProxy?) {
|
||||||
self.chatItem = chatItem
|
self.chatItem = chatItem
|
||||||
@@ -101,7 +104,7 @@ struct CIVideoView: View {
|
|||||||
let canBePlayed = !chatItem.chatDir.sent || file.fileStatus == CIFileStatus.sndComplete
|
let canBePlayed = !chatItem.chatDir.sent || file.fileStatus == CIFileStatus.sndComplete
|
||||||
VideoPlayerView(player: player, url: url, showControls: false)
|
VideoPlayerView(player: player, url: url, showControls: false)
|
||||||
.frame(width: w, height: w * preview.size.height / preview.size.width)
|
.frame(width: w, height: w * preview.size.height / preview.size.width)
|
||||||
.onChange(of: ChatModel.shared.stopPreviousRecPlay) { playingUrl in
|
.onChange(of: m.stopPreviousRecPlay) { playingUrl in
|
||||||
if playingUrl != url {
|
if playingUrl != url {
|
||||||
player.pause()
|
player.pause()
|
||||||
videoPlaying = false
|
videoPlaying = false
|
||||||
@@ -124,7 +127,7 @@ struct CIVideoView: View {
|
|||||||
}
|
}
|
||||||
if !videoPlaying {
|
if !videoPlaying {
|
||||||
Button {
|
Button {
|
||||||
ChatModel.shared.stopPreviousRecPlay = url
|
m.stopPreviousRecPlay = url
|
||||||
player.play()
|
player.play()
|
||||||
} label: {
|
} label: {
|
||||||
playPauseIcon(canBePlayed ? "play.fill" : "play.slash")
|
playPauseIcon(canBePlayed ? "play.fill" : "play.slash")
|
||||||
@@ -256,7 +259,7 @@ struct CIVideoView: View {
|
|||||||
// TODO encrypt: where file size is checked?
|
// TODO encrypt: where file size is checked?
|
||||||
private func receiveFileIfValidSize(file: CIFile, encrypted: Bool, receiveFile: @escaping (User, Int64, Bool, Bool) async -> Void) {
|
private func receiveFileIfValidSize(file: CIFile, encrypted: Bool, receiveFile: @escaping (User, Int64, Bool, Bool) async -> Void) {
|
||||||
Task {
|
Task {
|
||||||
if let user = ChatModel.shared.currentUser {
|
if let user = m.currentUser {
|
||||||
await receiveFile(user, file.fileId, encrypted, false)
|
await receiveFile(user, file.fileId, encrypted, false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -290,9 +293,17 @@ struct CIVideoView: View {
|
|||||||
)
|
)
|
||||||
.onAppear {
|
.onAppear {
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now()) {
|
DispatchQueue.main.asyncAfter(deadline: .now()) {
|
||||||
ChatModel.shared.stopPreviousRecPlay = url
|
m.stopPreviousRecPlay = url
|
||||||
if let player = fullPlayer {
|
if let player = fullPlayer {
|
||||||
player.play()
|
player.play()
|
||||||
|
var played = false
|
||||||
|
publisher = player.publisher(for: \.timeControlStatus).sink { status in
|
||||||
|
if played || status == .playing {
|
||||||
|
AppDelegate.keepScreenOn(status == .playing)
|
||||||
|
AudioPlayer.changeAudioSession(status == .playing)
|
||||||
|
}
|
||||||
|
played = status == .playing
|
||||||
|
}
|
||||||
fullScreenTimeObserver = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { _ in
|
fullScreenTimeObserver = NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: player.currentItem, queue: .main) { _ in
|
||||||
player.seek(to: CMTime.zero)
|
player.seek(to: CMTime.zero)
|
||||||
player.play()
|
player.play()
|
||||||
@@ -307,6 +318,7 @@ struct CIVideoView: View {
|
|||||||
fullScreenTimeObserver = nil
|
fullScreenTimeObserver = nil
|
||||||
fullPlayer?.pause()
|
fullPlayer?.pause()
|
||||||
fullPlayer?.seek(to: CMTime.zero)
|
fullPlayer?.seek(to: CMTime.zero)
|
||||||
|
publisher?.cancel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct CIVoiceView: View {
|
struct CIVoiceView: View {
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
let recordingFile: CIFile?
|
let recordingFile: CIFile?
|
||||||
let duration: Int
|
let duration: Int
|
||||||
@@ -91,7 +92,7 @@ struct CIVoiceView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func metaView() -> some View {
|
private func metaView() -> some View {
|
||||||
CIMetaView(chatItem: chatItem)
|
CIMetaView(chat: chat, chatItem: chatItem)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -219,7 +220,7 @@ struct VoiceMessagePlayer: View {
|
|||||||
private func downloadButton(_ recordingFile: CIFile) -> some View {
|
private func downloadButton(_ recordingFile: CIFile) -> some View {
|
||||||
Button {
|
Button {
|
||||||
Task {
|
Task {
|
||||||
if let user = ChatModel.shared.currentUser {
|
if let user = chatModel.currentUser {
|
||||||
await receiveFile(user: user, fileId: recordingFile.fileId, encrypted: privacyEncryptLocalFilesGroupDefault.get())
|
await receiveFile(user: user, fileId: recordingFile.fileId, encrypted: privacyEncryptLocalFilesGroupDefault.get())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -284,6 +285,7 @@ struct CIVoiceView_Previews: PreviewProvider {
|
|||||||
)
|
)
|
||||||
Group {
|
Group {
|
||||||
CIVoiceView(
|
CIVoiceView(
|
||||||
|
chat: Chat.sampleData,
|
||||||
chatItem: ChatItem.getVoiceMsgContentSample(),
|
chatItem: ChatItem.getVoiceMsgContentSample(),
|
||||||
recordingFile: CIFile.getSample(fileName: "voice.m4a", fileSize: 65536, fileStatus: .rcvComplete),
|
recordingFile: CIFile.getSample(fileName: "voice.m4a", fileSize: 65536, fileStatus: .rcvComplete),
|
||||||
duration: 30,
|
duration: 30,
|
||||||
@@ -292,12 +294,11 @@ struct CIVoiceView_Previews: PreviewProvider {
|
|||||||
playbackTime: .constant(TimeInterval(20)),
|
playbackTime: .constant(TimeInterval(20)),
|
||||||
allowMenu: Binding.constant(true)
|
allowMenu: Binding.constant(true)
|
||||||
)
|
)
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: sentVoiceMessage, revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
ChatItemView(chat: Chat.sampleData, chatItem: sentVoiceMessage, revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getVoiceMsgContentSample(), revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(), revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getVoiceMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: voiceMessageWtFile, revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
ChatItemView(chat: Chat.sampleData, chatItem: voiceMessageWtFile, revealed: Binding.constant(false), allowMenu: .constant(true), playbackState: .constant(.noPlayback), playbackTime: .constant(nil))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 360))
|
.previewLayout(.fixed(width: 360, height: 360))
|
||||||
.environmentObject(Chat.sampleData)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import SimpleXChat
|
|||||||
|
|
||||||
struct DeletedItemView: View {
|
struct DeletedItemView: View {
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -18,7 +19,7 @@ struct DeletedItemView: View {
|
|||||||
Text(chatItem.content.text)
|
Text(chatItem.content.text)
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
.italic()
|
.italic()
|
||||||
CIMetaView(chatItem: chatItem)
|
CIMetaView(chat: chat, chatItem: chatItem)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
}
|
}
|
||||||
.padding(.leading, 12)
|
.padding(.leading, 12)
|
||||||
@@ -32,8 +33,8 @@ struct DeletedItemView: View {
|
|||||||
struct DeletedItemView_Previews: PreviewProvider {
|
struct DeletedItemView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
Group {
|
Group {
|
||||||
DeletedItemView(chatItem: ChatItem.getDeletedContentSample())
|
DeletedItemView(chat: Chat.sampleData, chatItem: ChatItem.getDeletedContentSample())
|
||||||
DeletedItemView(chatItem: ChatItem.getDeletedContentSample(dir: .groupRcv(groupMember: GroupMember.sampleData)))
|
DeletedItemView(chat: Chat.sampleData, chatItem: ChatItem.getDeletedContentSample(dir: .groupRcv(groupMember: GroupMember.sampleData)))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 200))
|
.previewLayout(.fixed(width: 360, height: 200))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct EmojiItemView: View {
|
struct EmojiItemView: View {
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -17,7 +18,7 @@ struct EmojiItemView: View {
|
|||||||
emojiText(chatItem.content.text)
|
emojiText(chatItem.content.text)
|
||||||
.padding(.top, 8)
|
.padding(.top, 8)
|
||||||
.padding(.horizontal, 6)
|
.padding(.horizontal, 6)
|
||||||
CIMetaView(chatItem: chatItem)
|
CIMetaView(chat: chat, chatItem: chatItem)
|
||||||
.padding(.bottom, 8)
|
.padding(.bottom, 8)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
}
|
}
|
||||||
@@ -32,8 +33,8 @@ func emojiText(_ text: String) -> Text {
|
|||||||
struct EmojiItemView_Previews: PreviewProvider {
|
struct EmojiItemView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
Group{
|
Group{
|
||||||
EmojiItemView(chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete)))
|
EmojiItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete)))
|
||||||
EmojiItemView(chatItem: ChatItem.getSample(2, .directRcv, .now, "👍"))
|
EmojiItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directRcv, .now, "👍"))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 70))
|
.previewLayout(.fixed(width: 360, height: 70))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -88,13 +88,12 @@ struct FramedCIVoiceView_Previews: PreviewProvider {
|
|||||||
file: CIFile.getSample(fileStatus: .sndComplete)
|
file: CIFile.getSample(fileStatus: .sndComplete)
|
||||||
)
|
)
|
||||||
Group {
|
Group {
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: sentVoiceMessage, revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: sentVoiceMessage, revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there"), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there"), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there", fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(text: "Hello there", fileStatus: .rcvTransfer(rcvProgress: 7, rcvTotal: 10)), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getVoiceMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getVoiceMsgContentSample(text: "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: voiceMessageWithQuote, revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: voiceMessageWithQuote, revealed: Binding.constant(false))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 360))
|
.previewLayout(.fixed(width: 360, height: 360))
|
||||||
.environmentObject(Chat.sampleData)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -150,7 +150,7 @@ struct FullScreenMediaView: View {
|
|||||||
|
|
||||||
private func startPlayerAndNotify() {
|
private func startPlayerAndNotify() {
|
||||||
if let player = player {
|
if let player = player {
|
||||||
ChatModel.shared.stopPreviousRecPlay = url
|
m.stopPreviousRecPlay = url
|
||||||
player.play()
|
player.play()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,11 +10,12 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct IntegrityErrorItemView: View {
|
struct IntegrityErrorItemView: View {
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
var msgError: MsgErrorType
|
var msgError: MsgErrorType
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
CIMsgError(chatItem: chatItem) {
|
CIMsgError(chat: chat, chatItem: chatItem) {
|
||||||
switch msgError {
|
switch msgError {
|
||||||
case .msgSkipped:
|
case .msgSkipped:
|
||||||
AlertManager.shared.showAlertMsg(
|
AlertManager.shared.showAlertMsg(
|
||||||
@@ -52,6 +53,7 @@ struct IntegrityErrorItemView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct CIMsgError: View {
|
struct CIMsgError: View {
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var onTap: () -> Void
|
var onTap: () -> Void
|
||||||
|
|
||||||
@@ -60,7 +62,7 @@ struct CIMsgError: View {
|
|||||||
Text(chatItem.content.text)
|
Text(chatItem.content.text)
|
||||||
.foregroundColor(.red)
|
.foregroundColor(.red)
|
||||||
.italic()
|
.italic()
|
||||||
CIMetaView(chatItem: chatItem)
|
CIMetaView(chat: chat, chatItem: chatItem)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
}
|
}
|
||||||
.padding(.leading, 12)
|
.padding(.leading, 12)
|
||||||
@@ -74,6 +76,6 @@ struct CIMsgError: View {
|
|||||||
|
|
||||||
struct IntegrityErrorItemView_Previews: PreviewProvider {
|
struct IntegrityErrorItemView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
IntegrityErrorItemView(msgError: .msgBadHash, chatItem: ChatItem.getIntegrityErrorSample())
|
IntegrityErrorItemView(chat: Chat.sampleData, msgError: .msgBadHash, chatItem: ChatItem.getIntegrityErrorSample())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,39 +10,70 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct MarkedDeletedItemView: View {
|
struct MarkedDeletedItemView: View {
|
||||||
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
|
@Binding var revealed: Bool
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
HStack(alignment: .bottom, spacing: 0) {
|
(Text(mergedMarkedDeletedText).italic() + Text(" ") + chatItem.timestampText)
|
||||||
if case let .moderated(_, byGroupMember) = chatItem.meta.itemDeleted {
|
.font(.caption)
|
||||||
markedDeletedText("moderated by \(byGroupMember.chatViewName)")
|
.foregroundColor(.secondary)
|
||||||
} else {
|
.padding(.horizontal, 12)
|
||||||
markedDeletedText("marked deleted")
|
|
||||||
}
|
|
||||||
CIMetaView(chatItem: chatItem)
|
|
||||||
.padding(.horizontal, 12)
|
|
||||||
}
|
|
||||||
.padding(.leading, 12)
|
|
||||||
.padding(.vertical, 6)
|
.padding(.vertical, 6)
|
||||||
.background(chatItemFrameColor(chatItem, colorScheme))
|
.background(chatItemFrameColor(chatItem, colorScheme))
|
||||||
.cornerRadius(18)
|
.cornerRadius(18)
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
func markedDeletedText(_ s: LocalizedStringKey) -> some View {
|
var mergedMarkedDeletedText: LocalizedStringKey {
|
||||||
Text(s)
|
if !revealed,
|
||||||
.font(.caption)
|
let ciCategory = chatItem.mergeCategory,
|
||||||
.foregroundColor(.secondary)
|
var i = m.getChatItemIndex(chatItem) {
|
||||||
.italic()
|
var moderated = 0
|
||||||
.lineLimit(1)
|
var blocked = 0
|
||||||
|
var deleted = 0
|
||||||
|
var moderatedBy: Set<String> = []
|
||||||
|
while i < m.reversedChatItems.count,
|
||||||
|
let ci = .some(m.reversedChatItems[i]),
|
||||||
|
ci.mergeCategory == ciCategory,
|
||||||
|
let itemDeleted = ci.meta.itemDeleted {
|
||||||
|
switch itemDeleted {
|
||||||
|
case let .moderated(_, byGroupMember):
|
||||||
|
moderated += 1
|
||||||
|
moderatedBy.insert(byGroupMember.displayName)
|
||||||
|
case .blocked: blocked += 1
|
||||||
|
case .deleted: deleted += 1
|
||||||
|
}
|
||||||
|
i += 1
|
||||||
|
}
|
||||||
|
let total = moderated + blocked + deleted
|
||||||
|
return total <= 1
|
||||||
|
? markedDeletedText
|
||||||
|
: total == moderated
|
||||||
|
? "\(total) messages moderated by \(moderatedBy.joined(separator: ", "))"
|
||||||
|
: total == blocked
|
||||||
|
? "\(total) messages blocked"
|
||||||
|
: "\(total) messages marked deleted"
|
||||||
|
} else {
|
||||||
|
return markedDeletedText
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var markedDeletedText: LocalizedStringKey {
|
||||||
|
switch chatItem.meta.itemDeleted {
|
||||||
|
case let .moderated(_, byGroupMember): "moderated by \(byGroupMember.displayName)"
|
||||||
|
case .blocked: "blocked"
|
||||||
|
default: "marked deleted"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct MarkedDeletedItemView_Previews: PreviewProvider {
|
struct MarkedDeletedItemView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
Group {
|
Group {
|
||||||
MarkedDeletedItemView(chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)))
|
MarkedDeletedItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)), revealed: Binding.constant(true))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 200))
|
.previewLayout(.fixed(width: 360, height: 200))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,7 +25,7 @@ private func typing(_ w: Font.Weight = .light) -> Text {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct MsgContentView: View {
|
struct MsgContentView: View {
|
||||||
@EnvironmentObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
var text: String
|
var text: String
|
||||||
var formattedText: [FormattedText]? = nil
|
var formattedText: [FormattedText]? = nil
|
||||||
var sender: String? = nil
|
var sender: String? = nil
|
||||||
@@ -121,13 +121,11 @@ private func formatText(_ ft: FormattedText, _ preview: Bool) -> Text {
|
|||||||
case .secret: return Text(t).foregroundColor(.clear).underline(color: .primary)
|
case .secret: return Text(t).foregroundColor(.clear).underline(color: .primary)
|
||||||
case let .colored(color): return Text(t).foregroundColor(color.uiColor)
|
case let .colored(color): return Text(t).foregroundColor(color.uiColor)
|
||||||
case .uri: return linkText(t, t, preview, prefix: "")
|
case .uri: return linkText(t, t, preview, prefix: "")
|
||||||
case let .simplexLink(linkType, simplexUri, trustedUri, smpHosts):
|
case let .simplexLink(linkType, simplexUri, smpHosts):
|
||||||
switch privacySimplexLinkModeDefault.get() {
|
switch privacySimplexLinkModeDefault.get() {
|
||||||
case .description: return linkText(simplexLinkText(linkType, smpHosts), simplexUri, preview, prefix: "")
|
case .description: return linkText(simplexLinkText(linkType, smpHosts), simplexUri, preview, prefix: "")
|
||||||
case .full: return linkText(t, simplexUri, preview, prefix: "")
|
case .full: return linkText(t, simplexUri, preview, prefix: "")
|
||||||
case .browser: return trustedUri
|
case .browser: return linkText(t, simplexUri, preview, prefix: "")
|
||||||
? linkText(t, t, preview, prefix: "")
|
|
||||||
: linkText(t, t, preview, prefix: "", color: .red, uiColor: .red)
|
|
||||||
}
|
}
|
||||||
case .email: return linkText(t, t, preview, prefix: "mailto:")
|
case .email: return linkText(t, t, preview, prefix: "mailto:")
|
||||||
case .phone: return linkText(t, t.replacingOccurrences(of: " ", with: ""), preview, prefix: "tel:")
|
case .phone: return linkText(t, t.replacingOccurrences(of: " ", with: ""), preview, prefix: "tel:")
|
||||||
@@ -154,6 +152,7 @@ struct MsgContentView_Previews: PreviewProvider {
|
|||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let chatItem = ChatItem.getSample(1, .directSnd, .now, "hello")
|
let chatItem = ChatItem.getSample(1, .directSnd, .now, "hello")
|
||||||
return MsgContentView(
|
return MsgContentView(
|
||||||
|
chat: Chat.sampleData,
|
||||||
text: chatItem.text,
|
text: chatItem.text,
|
||||||
formattedText: chatItem.formattedText,
|
formattedText: chatItem.formattedText,
|
||||||
sender: chatItem.memberDisplayName,
|
sender: chatItem.memberDisplayName,
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct ChatItemInfoView: View {
|
struct ChatItemInfoView: View {
|
||||||
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
var ci: ChatItem
|
var ci: ChatItem
|
||||||
@Binding var chatItemInfo: ChatItemInfo?
|
@Binding var chatItemInfo: ChatItemInfo?
|
||||||
@@ -290,8 +291,8 @@ struct ChatItemInfoView: View {
|
|||||||
|
|
||||||
private func membersStatuses(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> [(GroupMember, CIStatus)] {
|
private func membersStatuses(_ memberDeliveryStatuses: [MemberDeliveryStatus]) -> [(GroupMember, CIStatus)] {
|
||||||
memberDeliveryStatuses.compactMap({ mds in
|
memberDeliveryStatuses.compactMap({ mds in
|
||||||
if let mem = ChatModel.shared.groupMembers.first(where: { $0.groupMemberId == mds.groupMemberId }) {
|
if let mem = chatModel.getGroupMember(mds.groupMemberId) {
|
||||||
return (mem, mds.memberDeliveryStatus)
|
return (mem.wrapped, mds.memberDeliveryStatus)
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import SwiftUI
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
struct ChatItemView: View {
|
struct ChatItemView: View {
|
||||||
var chatInfo: ChatInfo
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var maxWidth: CGFloat = .infinity
|
var maxWidth: CGFloat = .infinity
|
||||||
@State var scrollProxy: ScrollViewProxy? = nil
|
@State var scrollProxy: ScrollViewProxy? = nil
|
||||||
@@ -19,8 +19,19 @@ struct ChatItemView: View {
|
|||||||
@Binding var audioPlayer: AudioPlayer?
|
@Binding var audioPlayer: AudioPlayer?
|
||||||
@Binding var playbackState: VoiceMessagePlaybackState
|
@Binding var playbackState: VoiceMessagePlaybackState
|
||||||
@Binding var playbackTime: TimeInterval?
|
@Binding var playbackTime: TimeInterval?
|
||||||
init(chatInfo: ChatInfo, chatItem: ChatItem, showMember: Bool = false, maxWidth: CGFloat = .infinity, scrollProxy: ScrollViewProxy? = nil, revealed: Binding<Bool>, allowMenu: Binding<Bool> = .constant(false), audioPlayer: Binding<AudioPlayer?> = .constant(nil), playbackState: Binding<VoiceMessagePlaybackState> = .constant(.noPlayback), playbackTime: Binding<TimeInterval?> = .constant(nil)) {
|
init(
|
||||||
self.chatInfo = chatInfo
|
chat: Chat,
|
||||||
|
chatItem: ChatItem,
|
||||||
|
showMember: Bool = false,
|
||||||
|
maxWidth: CGFloat = .infinity,
|
||||||
|
scrollProxy: ScrollViewProxy? = nil,
|
||||||
|
revealed: Binding<Bool>,
|
||||||
|
allowMenu: Binding<Bool> = .constant(false),
|
||||||
|
audioPlayer: Binding<AudioPlayer?> = .constant(nil),
|
||||||
|
playbackState: Binding<VoiceMessagePlaybackState> = .constant(.noPlayback),
|
||||||
|
playbackTime: Binding<TimeInterval?> = .constant(nil)
|
||||||
|
) {
|
||||||
|
self.chat = chat
|
||||||
self.chatItem = chatItem
|
self.chatItem = chatItem
|
||||||
self.maxWidth = maxWidth
|
self.maxWidth = maxWidth
|
||||||
_scrollProxy = .init(initialValue: scrollProxy)
|
_scrollProxy = .init(initialValue: scrollProxy)
|
||||||
@@ -33,15 +44,15 @@ struct ChatItemView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let ci = chatItem
|
let ci = chatItem
|
||||||
if chatItem.meta.itemDeleted != nil && !revealed {
|
if chatItem.meta.itemDeleted != nil && (!revealed || chatItem.isDeletedContent) {
|
||||||
MarkedDeletedItemView(chatItem: chatItem)
|
MarkedDeletedItemView(chat: chat, chatItem: chatItem, revealed: $revealed)
|
||||||
} else if ci.quotedItem == nil && ci.meta.itemDeleted == nil && !ci.meta.isLive {
|
} else if ci.quotedItem == nil && ci.meta.itemDeleted == nil && !ci.meta.isLive {
|
||||||
if let mc = ci.content.msgContent, mc.isText && isShortEmoji(ci.content.text) {
|
if let mc = ci.content.msgContent, mc.isText && isShortEmoji(ci.content.text) {
|
||||||
EmojiItemView(chatItem: ci)
|
EmojiItemView(chat: chat, chatItem: ci)
|
||||||
} else if ci.content.text.isEmpty, case let .voice(_, duration) = ci.content.msgContent {
|
} else if ci.content.text.isEmpty, case let .voice(_, duration) = ci.content.msgContent {
|
||||||
CIVoiceView(chatItem: ci, recordingFile: ci.file, duration: duration, audioPlayer: $audioPlayer, playbackState: $playbackState, playbackTime: $playbackTime, allowMenu: $allowMenu)
|
CIVoiceView(chat: chat, chatItem: ci, recordingFile: ci.file, duration: duration, audioPlayer: $audioPlayer, playbackState: $playbackState, playbackTime: $playbackTime, allowMenu: $allowMenu)
|
||||||
} else if ci.content.msgContent == nil {
|
} else if ci.content.msgContent == nil {
|
||||||
ChatItemContentView(chatInfo: chatInfo, chatItem: chatItem, msgContentView: { Text(ci.text) }) // msgContent is unreachable branch in this case
|
ChatItemContentView(chat: chat, chatItem: chatItem, revealed: $revealed, msgContentView: { Text(ci.text) }) // msgContent is unreachable branch in this case
|
||||||
} else {
|
} else {
|
||||||
framedItemView()
|
framedItemView()
|
||||||
}
|
}
|
||||||
@@ -51,15 +62,17 @@ struct ChatItemView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func framedItemView() -> some View {
|
private func framedItemView() -> some View {
|
||||||
FramedItemView(chatInfo: chatInfo, chatItem: chatItem, maxWidth: maxWidth, scrollProxy: scrollProxy, allowMenu: $allowMenu, audioPlayer: $audioPlayer, playbackState: $playbackState, playbackTime: $playbackTime)
|
FramedItemView(chat: chat, chatItem: chatItem, revealed: $revealed, maxWidth: maxWidth, scrollProxy: scrollProxy, allowMenu: $allowMenu, audioPlayer: $audioPlayer, playbackState: $playbackState, playbackTime: $playbackTime)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ChatItemContentView<Content: View>: View {
|
struct ChatItemContentView<Content: View>: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
var chatInfo: ChatInfo
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
|
@Binding var revealed: Bool
|
||||||
var msgContentView: () -> Content
|
var msgContentView: () -> Content
|
||||||
|
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
switch chatItem.content {
|
switch chatItem.content {
|
||||||
@@ -69,11 +82,16 @@ struct ChatItemContentView<Content: View>: View {
|
|||||||
case .rcvDeleted: deletedItemView()
|
case .rcvDeleted: deletedItemView()
|
||||||
case let .sndCall(status, duration): callItemView(status, duration)
|
case let .sndCall(status, duration): callItemView(status, duration)
|
||||||
case let .rcvCall(status, duration): callItemView(status, duration)
|
case let .rcvCall(status, duration): callItemView(status, duration)
|
||||||
case let .rcvIntegrityError(msgError): IntegrityErrorItemView(msgError: msgError, chatItem: chatItem)
|
case let .rcvIntegrityError(msgError):
|
||||||
case let .rcvDecryptionError(msgDecryptError, msgCount): CIRcvDecryptionError(msgDecryptError: msgDecryptError, msgCount: msgCount, chatItem: chatItem)
|
if developerTools {
|
||||||
|
IntegrityErrorItemView(chat: chat, msgError: msgError, chatItem: chatItem)
|
||||||
|
} else {
|
||||||
|
ZStack {}
|
||||||
|
}
|
||||||
|
case let .rcvDecryptionError(msgDecryptError, msgCount): CIRcvDecryptionError(chat: chat, msgDecryptError: msgDecryptError, msgCount: msgCount, chatItem: chatItem)
|
||||||
case let .rcvGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole)
|
case let .rcvGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole)
|
||||||
case let .sndGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole)
|
case let .sndGroupInvitation(groupInvitation, memberRole): groupInvitationItemView(groupInvitation, memberRole)
|
||||||
case .rcvGroupEvent(.memberConnected): CIEventView(eventText: membersConnectedItemText)
|
case .rcvDirectEvent: eventItemView()
|
||||||
case .rcvGroupEvent(.memberCreatedContact): CIMemberCreatedContactView(chatItem: chatItem)
|
case .rcvGroupEvent(.memberCreatedContact): CIMemberCreatedContactView(chatItem: chatItem)
|
||||||
case .rcvGroupEvent: eventItemView()
|
case .rcvGroupEvent: eventItemView()
|
||||||
case .sndGroupEvent: eventItemView()
|
case .sndGroupEvent: eventItemView()
|
||||||
@@ -82,9 +100,9 @@ struct ChatItemContentView<Content: View>: View {
|
|||||||
case let .rcvChatFeature(feature, enabled, _): chatFeatureView(feature, enabled.iconColor)
|
case let .rcvChatFeature(feature, enabled, _): chatFeatureView(feature, enabled.iconColor)
|
||||||
case let .sndChatFeature(feature, enabled, _): chatFeatureView(feature, enabled.iconColor)
|
case let .sndChatFeature(feature, enabled, _): chatFeatureView(feature, enabled.iconColor)
|
||||||
case let .rcvChatPreference(feature, allowed, param):
|
case let .rcvChatPreference(feature, allowed, param):
|
||||||
CIFeaturePreferenceView(chatItem: chatItem, feature: feature, allowed: allowed, param: param)
|
CIFeaturePreferenceView(chat: chat, chatItem: chatItem, feature: feature, allowed: allowed, param: param)
|
||||||
case let .sndChatPreference(feature, _, _):
|
case let .sndChatPreference(feature, _, _):
|
||||||
CIChatFeatureView(chatItem: chatItem, feature: feature, icon: feature.icon, iconColor: .secondary)
|
CIChatFeatureView(chatItem: chatItem, revealed: $revealed, feature: feature, icon: feature.icon, iconColor: .secondary)
|
||||||
case let .rcvGroupFeature(feature, preference, _): chatFeatureView(feature, preference.enable.iconColor)
|
case let .rcvGroupFeature(feature, preference, _): chatFeatureView(feature, preference.enable.iconColor)
|
||||||
case let .sndGroupFeature(feature, preference, _): chatFeatureView(feature, preference.enable.iconColor)
|
case let .sndGroupFeature(feature, preference, _): chatFeatureView(feature, preference.enable.iconColor)
|
||||||
case let .rcvChatFeatureRejected(feature): chatFeatureView(feature, .red)
|
case let .rcvChatFeatureRejected(feature): chatFeatureView(feature, .red)
|
||||||
@@ -96,15 +114,15 @@ struct ChatItemContentView<Content: View>: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func deletedItemView() -> some View {
|
private func deletedItemView() -> some View {
|
||||||
DeletedItemView(chatItem: chatItem)
|
DeletedItemView(chat: chat, chatItem: chatItem)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func callItemView(_ status: CICallStatus, _ duration: Int) -> some View {
|
private func callItemView(_ status: CICallStatus, _ duration: Int) -> some View {
|
||||||
CICallItemView(chatInfo: chatInfo, chatItem: chatItem, status: status, duration: duration)
|
CICallItemView(chat: chat, chatItem: chatItem, status: status, duration: duration)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func groupInvitationItemView(_ groupInvitation: CIGroupInvitation, _ memberRole: GroupMemberRole) -> some View {
|
private func groupInvitationItemView(_ groupInvitation: CIGroupInvitation, _ memberRole: GroupMemberRole) -> some View {
|
||||||
CIGroupInvitationView(chatItem: chatItem, groupInvitation: groupInvitation, memberRole: memberRole, chatIncognito: chatInfo.incognito)
|
CIGroupInvitationView(chatItem: chatItem, groupInvitation: groupInvitation, memberRole: memberRole, chatIncognito: chat.chatInfo.incognito)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func eventItemView() -> some View {
|
private func eventItemView() -> some View {
|
||||||
@@ -112,7 +130,9 @@ struct ChatItemContentView<Content: View>: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func eventItemViewText() -> Text {
|
private func eventItemViewText() -> Text {
|
||||||
if let member = chatItem.memberDisplayName {
|
if !revealed, let t = mergedGroupEventText {
|
||||||
|
return chatEventText(t + Text(" ") + chatItem.timestampText)
|
||||||
|
} else if let member = chatItem.memberDisplayName {
|
||||||
return Text(member + " ")
|
return Text(member + " ")
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
@@ -124,36 +144,44 @@ struct ChatItemContentView<Content: View>: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func chatFeatureView(_ feature: Feature, _ iconColor: Color) -> some View {
|
private func chatFeatureView(_ feature: Feature, _ iconColor: Color) -> some View {
|
||||||
CIChatFeatureView(chatItem: chatItem, feature: feature, iconColor: iconColor)
|
CIChatFeatureView(chatItem: chatItem, revealed: $revealed, feature: feature, iconColor: iconColor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private var membersConnectedItemText: Text {
|
private var mergedGroupEventText: Text? {
|
||||||
if let t = membersConnectedText {
|
let (count, ns) = chatModel.getConnectedMemberNames(chatItem)
|
||||||
return chatEventText(t, chatItem.timestampText)
|
let members: LocalizedStringKey =
|
||||||
|
switch ns.count {
|
||||||
|
case 1: "\(ns[0]) connected"
|
||||||
|
case 2: "\(ns[0]) and \(ns[1]) connected"
|
||||||
|
case 3: "\(ns[0] + ", " + ns[1]) and \(ns[2]) connected"
|
||||||
|
default:
|
||||||
|
ns.count > 3
|
||||||
|
? "\(ns[0]), \(ns[1]) and \(ns.count - 2) other members connected"
|
||||||
|
: ""
|
||||||
|
}
|
||||||
|
return if count <= 1 {
|
||||||
|
nil
|
||||||
|
} else if ns.count == 0 {
|
||||||
|
Text("\(count) group events")
|
||||||
|
} else if count > ns.count {
|
||||||
|
Text(members) + Text(" ") + Text("and \(count - ns.count) other events")
|
||||||
} else {
|
} else {
|
||||||
return eventItemViewText()
|
Text(members)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var membersConnectedText: LocalizedStringKey? {
|
|
||||||
let ns = chatModel.getConnectedMemberNames(chatItem)
|
|
||||||
return ns.count > 3
|
|
||||||
? "\(ns[0]), \(ns[1]) and \(ns.count - 2) other members connected"
|
|
||||||
: ns.count == 3
|
|
||||||
? "\(ns[0] + ", " + ns[1]) and \(ns[2]) connected"
|
|
||||||
: ns.count == 2
|
|
||||||
? "\(ns[0]) and \(ns[1]) connected"
|
|
||||||
: nil
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func chatEventText(_ eventText: LocalizedStringKey, _ ts: Text) -> Text {
|
func chatEventText(_ text: Text) -> Text {
|
||||||
(Text(eventText) + Text(" ") + ts)
|
text
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
.fontWeight(.light)
|
.fontWeight(.light)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func chatEventText(_ eventText: LocalizedStringKey, _ ts: Text) -> Text {
|
||||||
|
chatEventText(Text(eventText) + Text(" ") + ts)
|
||||||
|
}
|
||||||
|
|
||||||
func chatEventText(_ ci: ChatItem) -> Text {
|
func chatEventText(_ ci: ChatItem) -> Text {
|
||||||
chatEventText("\(ci.content.text)", ci.timestampText)
|
chatEventText("\(ci.content.text)", ci.timestampText)
|
||||||
}
|
}
|
||||||
@@ -161,15 +189,15 @@ func chatEventText(_ ci: ChatItem) -> Text {
|
|||||||
struct ChatItemView_Previews: PreviewProvider {
|
struct ChatItemView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
Group{
|
Group{
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello"), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello"), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too"), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directRcv, .now, "hello there too"), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂"), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂"), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂"), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂"), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂🙂"), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(2, .directRcv, .now, "🙂🙂🙂🙂🙂🙂"), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getDeletedContentSample(), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getDeletedContentSample(), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)), revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now)), revealed: Binding.constant(false))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete), itemLive: true), revealed: Binding.constant(true))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "🙂", .sndSent(sndProgress: .complete), itemLive: true), revealed: Binding.constant(true))
|
||||||
ChatItemView(chatInfo: ChatInfo.sampleData.direct, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemLive: true), revealed: Binding.constant(true))
|
ChatItemView(chat: Chat.sampleData, chatItem: ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemLive: true), revealed: Binding.constant(true))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 70))
|
.previewLayout(.fixed(width: 360, height: 70))
|
||||||
.environmentObject(Chat.sampleData)
|
.environmentObject(Chat.sampleData)
|
||||||
@@ -181,7 +209,7 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
|
|||||||
let ciFeatureContent = CIContent.rcvChatFeature(feature: .fullDelete, enabled: FeatureEnabled(forUser: false, forContact: false), param: nil)
|
let ciFeatureContent = CIContent.rcvChatFeature(feature: .fullDelete, enabled: FeatureEnabled(forUser: false, forContact: false), param: nil)
|
||||||
Group{
|
Group{
|
||||||
ChatItemView(
|
ChatItemView(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chat: Chat.sampleData,
|
||||||
chatItem: ChatItem(
|
chatItem: ChatItem(
|
||||||
chatDir: .directRcv,
|
chatDir: .directRcv,
|
||||||
meta: CIMeta.getSample(1, .now, "1 skipped message", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
meta: CIMeta.getSample(1, .now, "1 skipped message", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
||||||
@@ -192,7 +220,7 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
|
|||||||
revealed: Binding.constant(true)
|
revealed: Binding.constant(true)
|
||||||
)
|
)
|
||||||
ChatItemView(
|
ChatItemView(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chat: Chat.sampleData,
|
||||||
chatItem: ChatItem(
|
chatItem: ChatItem(
|
||||||
chatDir: .directRcv,
|
chatDir: .directRcv,
|
||||||
meta: CIMeta.getSample(1, .now, "1 skipped message", .rcvRead),
|
meta: CIMeta.getSample(1, .now, "1 skipped message", .rcvRead),
|
||||||
@@ -203,7 +231,7 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
|
|||||||
revealed: Binding.constant(true)
|
revealed: Binding.constant(true)
|
||||||
)
|
)
|
||||||
ChatItemView(
|
ChatItemView(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chat: Chat.sampleData,
|
||||||
chatItem: ChatItem(
|
chatItem: ChatItem(
|
||||||
chatDir: .directRcv,
|
chatDir: .directRcv,
|
||||||
meta: CIMeta.getSample(1, .now, "received invitation to join group team as admin", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
meta: CIMeta.getSample(1, .now, "received invitation to join group team as admin", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
||||||
@@ -214,7 +242,7 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
|
|||||||
revealed: Binding.constant(true)
|
revealed: Binding.constant(true)
|
||||||
)
|
)
|
||||||
ChatItemView(
|
ChatItemView(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chat: Chat.sampleData,
|
||||||
chatItem: ChatItem(
|
chatItem: ChatItem(
|
||||||
chatDir: .directRcv,
|
chatDir: .directRcv,
|
||||||
meta: CIMeta.getSample(1, .now, "group event text", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
meta: CIMeta.getSample(1, .now, "group event text", .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
||||||
@@ -225,7 +253,7 @@ struct ChatItemView_NonMsgContentDeleted_Previews: PreviewProvider {
|
|||||||
revealed: Binding.constant(true)
|
revealed: Binding.constant(true)
|
||||||
)
|
)
|
||||||
ChatItemView(
|
ChatItemView(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chat: Chat.sampleData,
|
||||||
chatItem: ChatItem(
|
chatItem: ChatItem(
|
||||||
chatDir: .directRcv,
|
chatDir: .directRcv,
|
||||||
meta: CIMeta.getSample(1, .now, ciFeatureContent.text, .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
meta: CIMeta.getSample(1, .now, ciFeatureContent.text, .rcvRead, itemDeleted: .deleted(deletedTs: .now)),
|
||||||
|
|||||||
@@ -21,9 +21,7 @@ struct ChatView: View {
|
|||||||
@State private var showChatInfoSheet: Bool = false
|
@State private var showChatInfoSheet: Bool = false
|
||||||
@State private var showAddMembersSheet: Bool = false
|
@State private var showAddMembersSheet: Bool = false
|
||||||
@State private var composeState = ComposeState()
|
@State private var composeState = ComposeState()
|
||||||
@State private var deletingItem: ChatItem? = nil
|
|
||||||
@State private var keyboardVisible = false
|
@State private var keyboardVisible = false
|
||||||
@State private var showDeleteMessage = false
|
|
||||||
@State private var connectionStats: ConnectionStats?
|
@State private var connectionStats: ConnectionStats?
|
||||||
@State private var customUserProfile: Profile?
|
@State private var customUserProfile: Profile?
|
||||||
@State private var connectionCode: String?
|
@State private var connectionCode: String?
|
||||||
@@ -36,7 +34,12 @@ struct ChatView: View {
|
|||||||
@State private var searchText: String = ""
|
@State private var searchText: String = ""
|
||||||
@FocusState private var searchFocussed
|
@FocusState private var searchFocussed
|
||||||
// opening GroupMemberInfoView on member icon
|
// opening GroupMemberInfoView on member icon
|
||||||
@State private var selectedMember: GroupMember? = nil
|
@State private var membersLoaded = false
|
||||||
|
@State private var selectedMember: GMember? = nil
|
||||||
|
// opening GroupLinkView on link button (incognito)
|
||||||
|
@State private var showGroupLinkSheet: Bool = false
|
||||||
|
@State private var groupLink: String?
|
||||||
|
@State private var groupLinkMemberRole: GroupMemberRole = .member
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
if #available(iOS 16.0, *) {
|
if #available(iOS 16.0, *) {
|
||||||
@@ -91,7 +94,10 @@ struct ChatView: View {
|
|||||||
chatModel.chatId = nil
|
chatModel.chatId = nil
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) {
|
||||||
if chatModel.chatId == nil {
|
if chatModel.chatId == nil {
|
||||||
|
chatModel.chatItemStatuses = [:]
|
||||||
chatModel.reversedChatItems = []
|
chatModel.reversedChatItems = []
|
||||||
|
chatModel.groupMembers = []
|
||||||
|
membersLoaded = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -108,7 +114,7 @@ struct ChatView: View {
|
|||||||
connectionStats = stats
|
connectionStats = stats
|
||||||
customUserProfile = profile
|
customUserProfile = profile
|
||||||
connectionCode = code
|
connectionCode = code
|
||||||
if contact.activeConn.connectionCode != ct.activeConn.connectionCode {
|
if contact.activeConn?.connectionCode != ct.activeConn?.connectionCode {
|
||||||
chat.chatInfo = .direct(contact: ct)
|
chat.chatInfo = .direct(contact: ct)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -129,18 +135,21 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
} else if case let .group(groupInfo) = cInfo {
|
} else if case let .group(groupInfo) = cInfo {
|
||||||
Button {
|
Button {
|
||||||
Task {
|
Task { await loadGroupMembers(groupInfo) { showChatInfoSheet = true } }
|
||||||
let groupMembers = await apiListMembers(groupInfo.groupId)
|
|
||||||
await MainActor.run {
|
|
||||||
ChatModel.shared.groupMembers = groupMembers
|
|
||||||
showChatInfoSheet = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} label: {
|
} label: {
|
||||||
ChatInfoToolbar(chat: chat)
|
ChatInfoToolbar(chat: chat)
|
||||||
}
|
}
|
||||||
.appSheet(isPresented: $showChatInfoSheet) {
|
.appSheet(isPresented: $showChatInfoSheet) {
|
||||||
GroupChatInfoView(chat: chat, groupInfo: groupInfo)
|
GroupChatInfoView(
|
||||||
|
chat: chat,
|
||||||
|
groupInfo: Binding(
|
||||||
|
get: { groupInfo },
|
||||||
|
set: { gInfo in
|
||||||
|
chat.chatInfo = .group(groupInfo: gInfo)
|
||||||
|
chat.created = Date.now
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -150,7 +159,7 @@ struct ChatView: View {
|
|||||||
HStack {
|
HStack {
|
||||||
if contact.allowsFeature(.calls) {
|
if contact.allowsFeature(.calls) {
|
||||||
callButton(contact, .audio, imageName: "phone")
|
callButton(contact, .audio, imageName: "phone")
|
||||||
.disabled(!contact.ready)
|
.disabled(!contact.ready || !contact.active)
|
||||||
}
|
}
|
||||||
Menu {
|
Menu {
|
||||||
if contact.allowsFeature(.calls) {
|
if contact.allowsFeature(.calls) {
|
||||||
@@ -159,11 +168,11 @@ struct ChatView: View {
|
|||||||
} label: {
|
} label: {
|
||||||
Label("Video call", systemImage: "video")
|
Label("Video call", systemImage: "video")
|
||||||
}
|
}
|
||||||
.disabled(!contact.ready)
|
.disabled(!contact.ready || !contact.active)
|
||||||
}
|
}
|
||||||
searchButton()
|
searchButton()
|
||||||
toggleNtfsButton(chat)
|
toggleNtfsButton(chat)
|
||||||
.disabled(!contact.ready)
|
.disabled(!contact.ready || !contact.active)
|
||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "ellipsis")
|
Image(systemName: "ellipsis")
|
||||||
}
|
}
|
||||||
@@ -172,9 +181,16 @@ struct ChatView: View {
|
|||||||
HStack {
|
HStack {
|
||||||
if groupInfo.canAddMembers {
|
if groupInfo.canAddMembers {
|
||||||
if (chat.chatInfo.incognito) {
|
if (chat.chatInfo.incognito) {
|
||||||
Image(systemName: "person.crop.circle.badge.plus")
|
groupLinkButton()
|
||||||
.foregroundColor(Color(uiColor: .tertiaryLabel))
|
.appSheet(isPresented: $showGroupLinkSheet) {
|
||||||
.onTapGesture { AlertManager.shared.showAlert(cantInviteIncognitoAlert()) }
|
GroupLinkView(
|
||||||
|
groupId: groupInfo.groupId,
|
||||||
|
groupLink: $groupLink,
|
||||||
|
groupLinkMemberRole: $groupLinkMemberRole,
|
||||||
|
showTitle: true,
|
||||||
|
creatingGroup: false
|
||||||
|
)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
addMembersButton()
|
addMembersButton()
|
||||||
.appSheet(isPresented: $showAddMembersSheet) {
|
.appSheet(isPresented: $showAddMembersSheet) {
|
||||||
@@ -196,6 +212,17 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func loadGroupMembers(_ groupInfo: GroupInfo, updateView: @escaping () -> Void = {}) async {
|
||||||
|
let groupMembers = await apiListMembers(groupInfo.groupId)
|
||||||
|
await MainActor.run {
|
||||||
|
if chatModel.chatId == groupInfo.id {
|
||||||
|
chatModel.groupMembers = groupMembers.map { GMember.init($0) }
|
||||||
|
membersLoaded = true
|
||||||
|
updateView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func initChatView() {
|
private func initChatView() {
|
||||||
let cInfo = chat.chatInfo
|
let cInfo = chat.chatInfo
|
||||||
if case let .direct(contact) = cInfo {
|
if case let .direct(contact) = cInfo {
|
||||||
@@ -321,6 +348,7 @@ struct ChatView: View {
|
|||||||
@ViewBuilder private func connectingText() -> some View {
|
@ViewBuilder private func connectingText() -> some View {
|
||||||
if case let .direct(contact) = chat.chatInfo,
|
if case let .direct(contact) = chat.chatInfo,
|
||||||
!contact.ready,
|
!contact.ready,
|
||||||
|
contact.active,
|
||||||
!contact.nextSendGrpInv {
|
!contact.nextSendGrpInv {
|
||||||
Text("connecting…")
|
Text("connecting…")
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
@@ -403,19 +431,32 @@ struct ChatView: View {
|
|||||||
private func addMembersButton() -> some View {
|
private func addMembersButton() -> some View {
|
||||||
Button {
|
Button {
|
||||||
if case let .group(gInfo) = chat.chatInfo {
|
if case let .group(gInfo) = chat.chatInfo {
|
||||||
Task {
|
Task { await loadGroupMembers(gInfo) { showAddMembersSheet = true } }
|
||||||
let groupMembers = await apiListMembers(gInfo.groupId)
|
|
||||||
await MainActor.run {
|
|
||||||
ChatModel.shared.groupMembers = groupMembers
|
|
||||||
showAddMembersSheet = true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "person.crop.circle.badge.plus")
|
Image(systemName: "person.crop.circle.badge.plus")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func groupLinkButton() -> some View {
|
||||||
|
Button {
|
||||||
|
if case let .group(gInfo) = chat.chatInfo {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
if let link = try apiGetGroupLink(gInfo.groupId) {
|
||||||
|
(groupLink, groupLinkMemberRole) = link
|
||||||
|
}
|
||||||
|
} catch let error {
|
||||||
|
logger.error("ChatView apiGetGroupLink: \(responseError(error))")
|
||||||
|
}
|
||||||
|
showGroupLinkSheet = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Image(systemName: "link.badge.plus")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func loadChatItems(_ cInfo: ChatInfo, _ ci: ChatItem, _ proxy: ScrollViewProxy) {
|
private func loadChatItems(_ cInfo: ChatInfo, _ ci: ChatItem, _ proxy: ScrollViewProxy) {
|
||||||
if let firstItem = chatModel.reversedChatItems.last, firstItem.id == ci.id {
|
if let firstItem = chatModel.reversedChatItems.last, firstItem.id == ci.id {
|
||||||
if loadingItems || firstPage { return }
|
if loadingItems || firstPage { return }
|
||||||
@@ -445,73 +486,30 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func chatItemView(_ ci: ChatItem, _ maxWidth: CGFloat) -> some View {
|
@ViewBuilder private func chatItemView(_ ci: ChatItem, _ maxWidth: CGFloat) -> some View {
|
||||||
if case let .groupRcv(member) = ci.chatDir,
|
|
||||||
case let .group(groupInfo) = chat.chatInfo {
|
|
||||||
let (prevItem, nextItem) = chatModel.getChatItemNeighbors(ci)
|
|
||||||
if ci.memberConnected != nil && nextItem?.memberConnected != nil {
|
|
||||||
// memberConnected events are aggregated at the last chat item in a row of such events, see ChatItemView
|
|
||||||
ZStack {} // scroll doesn't work if it's EmptyView()
|
|
||||||
} else {
|
|
||||||
if prevItem == nil || showMemberImage(member, prevItem) {
|
|
||||||
VStack(alignment: .leading, spacing: 4) {
|
|
||||||
if ci.content.showMemberName {
|
|
||||||
Text(member.displayName)
|
|
||||||
.font(.caption)
|
|
||||||
.foregroundStyle(.secondary)
|
|
||||||
.padding(.leading, memberImageSize + 14)
|
|
||||||
.padding(.top, 7)
|
|
||||||
}
|
|
||||||
HStack(alignment: .top, spacing: 8) {
|
|
||||||
ProfileImage(imageStr: member.memberProfile.image)
|
|
||||||
.frame(width: memberImageSize, height: memberImageSize)
|
|
||||||
.onTapGesture { selectedMember = member }
|
|
||||||
.appSheet(item: $selectedMember) { member in
|
|
||||||
GroupMemberInfoView(groupInfo: groupInfo, member: member, navigation: true)
|
|
||||||
}
|
|
||||||
chatItemWithMenu(ci, maxWidth)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.padding(.top, 5)
|
|
||||||
.padding(.trailing)
|
|
||||||
.padding(.leading, 12)
|
|
||||||
} else {
|
|
||||||
chatItemWithMenu(ci, maxWidth)
|
|
||||||
.padding(.top, 5)
|
|
||||||
.padding(.trailing)
|
|
||||||
.padding(.leading, memberImageSize + 8 + 12)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
chatItemWithMenu(ci, maxWidth)
|
|
||||||
.padding(.horizontal)
|
|
||||||
.padding(.top, 5)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func chatItemWithMenu(_ ci: ChatItem, _ maxWidth: CGFloat) -> some View {
|
|
||||||
ChatItemWithMenu(
|
ChatItemWithMenu(
|
||||||
ci: ci,
|
chat: chat,
|
||||||
|
chatItem: ci,
|
||||||
maxWidth: maxWidth,
|
maxWidth: maxWidth,
|
||||||
scrollProxy: scrollProxy,
|
|
||||||
deleteMessage: deleteMessage,
|
|
||||||
deletingItem: $deletingItem,
|
|
||||||
composeState: $composeState,
|
composeState: $composeState,
|
||||||
showDeleteMessage: $showDeleteMessage
|
selectedMember: $selectedMember,
|
||||||
|
chatView: self
|
||||||
)
|
)
|
||||||
.environmentObject(chat)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private struct ChatItemWithMenu: View {
|
private struct ChatItemWithMenu: View {
|
||||||
@EnvironmentObject var chat: Chat
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
var ci: ChatItem
|
@ObservedObject var chat: Chat
|
||||||
|
var chatItem: ChatItem
|
||||||
var maxWidth: CGFloat
|
var maxWidth: CGFloat
|
||||||
var scrollProxy: ScrollViewProxy?
|
|
||||||
var deleteMessage: (CIDeleteMode) -> Void
|
|
||||||
@Binding var deletingItem: ChatItem?
|
|
||||||
@Binding var composeState: ComposeState
|
@Binding var composeState: ComposeState
|
||||||
@Binding var showDeleteMessage: Bool
|
@Binding var selectedMember: GMember?
|
||||||
|
var chatView: ChatView
|
||||||
|
|
||||||
|
@State private var deletingItem: ChatItem? = nil
|
||||||
|
@State private var showDeleteMessage = false
|
||||||
|
@State private var deletingItems: [Int64] = []
|
||||||
|
@State private var showDeleteMessages = false
|
||||||
@State private var revealed = false
|
@State private var revealed = false
|
||||||
@State private var showChatItemInfoSheet: Bool = false
|
@State private var showChatItemInfoSheet: Bool = false
|
||||||
@State private var chatItemInfo: ChatItemInfo?
|
@State private var chatItemInfo: ChatItemInfo?
|
||||||
@@ -523,18 +521,114 @@ struct ChatView: View {
|
|||||||
@State private var playbackTime: TimeInterval?
|
@State private var playbackTime: TimeInterval?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
let (currIndex, nextItem) = m.getNextChatItem(chatItem)
|
||||||
|
let ciCategory = chatItem.mergeCategory
|
||||||
|
if (ciCategory != nil && ciCategory == nextItem?.mergeCategory) {
|
||||||
|
// memberConnected events and deleted items are aggregated at the last chat item in a row, see ChatItemView
|
||||||
|
ZStack {} // scroll doesn't work if it's EmptyView()
|
||||||
|
} else {
|
||||||
|
let (prevHidden, prevItem) = m.getPrevShownChatItem(currIndex, ciCategory)
|
||||||
|
let range = itemsRange(currIndex, prevHidden)
|
||||||
|
if revealed, let range = range {
|
||||||
|
let items = Array(zip(Array(range), m.reversedChatItems[range]))
|
||||||
|
ForEach(items, id: \.1.viewId) { (i, ci) in
|
||||||
|
let prev = i == prevHidden ? prevItem : m.reversedChatItems[i + 1]
|
||||||
|
chatItemView(ci, nil, prev)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
chatItemView(chatItem, range, prevItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewBuilder func chatItemView(_ ci: ChatItem, _ range: ClosedRange<Int>?, _ prevItem: ChatItem?) -> some View {
|
||||||
|
if case let .groupRcv(member) = ci.chatDir,
|
||||||
|
case let .group(groupInfo) = chat.chatInfo {
|
||||||
|
let (prevMember, memCount): (GroupMember?, Int) =
|
||||||
|
if let range = range {
|
||||||
|
m.getPrevHiddenMember(member, range)
|
||||||
|
} else {
|
||||||
|
(nil, 1)
|
||||||
|
}
|
||||||
|
if prevItem == nil || showMemberImage(member, prevItem) || prevMember != nil {
|
||||||
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
|
if ci.content.showMemberName {
|
||||||
|
Text(memberNames(member, prevMember, memCount))
|
||||||
|
.font(.caption)
|
||||||
|
.foregroundStyle(.secondary)
|
||||||
|
.padding(.leading, memberImageSize + 14)
|
||||||
|
.padding(.top, 7)
|
||||||
|
}
|
||||||
|
HStack(alignment: .top, spacing: 8) {
|
||||||
|
ProfileImage(imageStr: member.memberProfile.image)
|
||||||
|
.frame(width: memberImageSize, height: memberImageSize)
|
||||||
|
.onTapGesture {
|
||||||
|
if chatView.membersLoaded {
|
||||||
|
selectedMember = m.getGroupMember(member.groupMemberId)
|
||||||
|
} else {
|
||||||
|
Task {
|
||||||
|
await chatView.loadGroupMembers(groupInfo) {
|
||||||
|
selectedMember = m.getGroupMember(member.groupMemberId)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.appSheet(item: $selectedMember) { member in
|
||||||
|
GroupMemberInfoView(groupInfo: groupInfo, groupMember: member, navigation: true)
|
||||||
|
}
|
||||||
|
chatItemWithMenu(ci, range, maxWidth)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.top, 5)
|
||||||
|
.padding(.trailing)
|
||||||
|
.padding(.leading, 12)
|
||||||
|
} else {
|
||||||
|
chatItemWithMenu(ci, range, maxWidth)
|
||||||
|
.padding(.top, 5)
|
||||||
|
.padding(.trailing)
|
||||||
|
.padding(.leading, memberImageSize + 8 + 12)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
chatItemWithMenu(ci, range, maxWidth)
|
||||||
|
.padding(.horizontal)
|
||||||
|
.padding(.top, 5)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func memberNames(_ member: GroupMember, _ prevMember: GroupMember?, _ memCount: Int) -> LocalizedStringKey {
|
||||||
|
let name = member.displayName
|
||||||
|
return if let prevName = prevMember?.displayName {
|
||||||
|
memCount > 2
|
||||||
|
? "\(name), \(prevName) and \(memCount - 2) members"
|
||||||
|
: "\(name) and \(prevName)"
|
||||||
|
} else {
|
||||||
|
"\(name)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewBuilder func chatItemWithMenu(_ ci: ChatItem, _ range: ClosedRange<Int>?, _ maxWidth: CGFloat) -> some View {
|
||||||
let alignment: Alignment = ci.chatDir.sent ? .trailing : .leading
|
let alignment: Alignment = ci.chatDir.sent ? .trailing : .leading
|
||||||
let uiMenu: Binding<UIMenu> = Binding(
|
let uiMenu: Binding<UIMenu> = Binding(
|
||||||
get: { UIMenu(title: "", children: menu(live: composeState.liveMessage != nil)) },
|
get: { UIMenu(title: "", children: menu(ci, range, live: composeState.liveMessage != nil)) },
|
||||||
set: { _ in }
|
set: { _ in }
|
||||||
)
|
)
|
||||||
|
|
||||||
VStack(alignment: alignment.horizontal, spacing: 3) {
|
VStack(alignment: alignment.horizontal, spacing: 3) {
|
||||||
ChatItemView(chatInfo: chat.chatInfo, chatItem: ci, maxWidth: maxWidth, scrollProxy: scrollProxy, revealed: $revealed, allowMenu: $allowMenu, audioPlayer: $audioPlayer, playbackState: $playbackState, playbackTime: $playbackTime)
|
ChatItemView(
|
||||||
.uiKitContextMenu(menu: uiMenu, allowMenu: $allowMenu)
|
chat: chat,
|
||||||
.accessibilityLabel("")
|
chatItem: ci,
|
||||||
|
maxWidth: maxWidth,
|
||||||
|
scrollProxy: chatView.scrollProxy,
|
||||||
|
revealed: $revealed,
|
||||||
|
allowMenu: $allowMenu,
|
||||||
|
audioPlayer: $audioPlayer,
|
||||||
|
playbackState: $playbackState,
|
||||||
|
playbackTime: $playbackTime
|
||||||
|
)
|
||||||
|
.uiKitContextMenu(menu: uiMenu, allowMenu: $allowMenu)
|
||||||
|
.accessibilityLabel("")
|
||||||
if ci.content.msgContent != nil && (ci.meta.itemDeleted == nil || revealed) && ci.reactions.count > 0 {
|
if ci.content.msgContent != nil && (ci.meta.itemDeleted == nil || revealed) && ci.reactions.count > 0 {
|
||||||
chatItemReactions()
|
chatItemReactions(ci)
|
||||||
.padding(.bottom, 4)
|
.padding(.bottom, 4)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -548,6 +642,11 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.confirmationDialog(deleteMessagesTitle, isPresented: $showDeleteMessages, titleVisibility: .visible) {
|
||||||
|
Button("Delete for me", role: .destructive) {
|
||||||
|
deleteMessages()
|
||||||
|
}
|
||||||
|
}
|
||||||
.frame(maxWidth: maxWidth, maxHeight: .infinity, alignment: alignment)
|
.frame(maxWidth: maxWidth, maxHeight: .infinity, alignment: alignment)
|
||||||
.frame(minWidth: 0, maxWidth: .infinity, alignment: alignment)
|
.frame(minWidth: 0, maxWidth: .infinity, alignment: alignment)
|
||||||
.onDisappear {
|
.onDisappear {
|
||||||
@@ -565,7 +664,15 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func chatItemReactions() -> some View {
|
private func showMemberImage(_ member: GroupMember, _ prevItem: ChatItem?) -> Bool {
|
||||||
|
switch (prevItem?.chatDir) {
|
||||||
|
case .groupSnd: return true
|
||||||
|
case let .groupRcv(prevMember): return prevMember.groupMemberId != member.groupMemberId
|
||||||
|
default: return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func chatItemReactions(_ ci: ChatItem) -> some View {
|
||||||
HStack(spacing: 4) {
|
HStack(spacing: 4) {
|
||||||
ForEach(ci.reactions, id: \.reaction) { r in
|
ForEach(ci.reactions, id: \.reaction) { r in
|
||||||
let v = HStack(spacing: 4) {
|
let v = HStack(spacing: 4) {
|
||||||
@@ -585,7 +692,7 @@ struct ChatView: View {
|
|||||||
|
|
||||||
if chat.chatInfo.featureEnabled(.reactions) && (ci.allowAddReaction || r.userReacted) {
|
if chat.chatInfo.featureEnabled(.reactions) && (ci.allowAddReaction || r.userReacted) {
|
||||||
v.onTapGesture {
|
v.onTapGesture {
|
||||||
setReaction(add: !r.userReacted, reaction: r.reaction)
|
setReaction(ci, add: !r.userReacted, reaction: r.reaction)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
v
|
v
|
||||||
@@ -594,10 +701,10 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func menu(live: Bool) -> [UIMenuElement] {
|
private func menu(_ ci: ChatItem, _ range: ClosedRange<Int>?, live: Bool) -> [UIMenuElement] {
|
||||||
var menu: [UIMenuElement] = []
|
var menu: [UIMenuElement] = []
|
||||||
if let mc = ci.content.msgContent, ci.meta.itemDeleted == nil || revealed {
|
if let mc = ci.content.msgContent, ci.meta.itemDeleted == nil || revealed {
|
||||||
let rs = allReactions()
|
let rs = allReactions(ci)
|
||||||
if chat.chatInfo.featureEnabled(.reactions) && ci.allowAddReaction,
|
if chat.chatInfo.featureEnabled(.reactions) && ci.allowAddReaction,
|
||||||
rs.count > 0 {
|
rs.count > 0 {
|
||||||
var rm: UIMenu
|
var rm: UIMenu
|
||||||
@@ -614,10 +721,10 @@ struct ChatView: View {
|
|||||||
menu.append(rm)
|
menu.append(rm)
|
||||||
}
|
}
|
||||||
if ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live {
|
if ci.meta.itemDeleted == nil && !ci.isLiveDummy && !live {
|
||||||
menu.append(replyUIAction())
|
menu.append(replyUIAction(ci))
|
||||||
}
|
}
|
||||||
menu.append(shareUIAction())
|
menu.append(shareUIAction(ci))
|
||||||
menu.append(copyUIAction())
|
menu.append(copyUIAction(ci))
|
||||||
if let fileSource = getLoadedFileSource(ci.file) {
|
if let fileSource = getLoadedFileSource(ci.file) {
|
||||||
if case .image = ci.content.msgContent, let image = getLoadedImage(ci.file) {
|
if case .image = ci.content.msgContent, let image = getLoadedImage(ci.file) {
|
||||||
if image.imageData != nil {
|
if image.imageData != nil {
|
||||||
@@ -630,9 +737,9 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if ci.meta.editable && !mc.isVoice && !live {
|
if ci.meta.editable && !mc.isVoice && !live {
|
||||||
menu.append(editAction())
|
menu.append(editAction(ci))
|
||||||
}
|
}
|
||||||
menu.append(viewInfoUIAction())
|
menu.append(viewInfoUIAction(ci))
|
||||||
if revealed {
|
if revealed {
|
||||||
menu.append(hideUIAction())
|
menu.append(hideUIAction())
|
||||||
}
|
}
|
||||||
@@ -642,25 +749,31 @@ struct ChatView: View {
|
|||||||
menu.append(cancelFileUIAction(file.fileId, cancelAction))
|
menu.append(cancelFileUIAction(file.fileId, cancelAction))
|
||||||
}
|
}
|
||||||
if !live || !ci.meta.isLive {
|
if !live || !ci.meta.isLive {
|
||||||
menu.append(deleteUIAction())
|
menu.append(deleteUIAction(ci))
|
||||||
}
|
}
|
||||||
if let (groupInfo, _) = ci.memberToModerate(chat.chatInfo) {
|
if let (groupInfo, _) = ci.memberToModerate(chat.chatInfo) {
|
||||||
menu.append(moderateUIAction(groupInfo))
|
menu.append(moderateUIAction(ci, groupInfo))
|
||||||
}
|
}
|
||||||
} else if ci.meta.itemDeleted != nil {
|
} else if ci.meta.itemDeleted != nil {
|
||||||
if !ci.isDeletedContent {
|
if revealed {
|
||||||
|
menu.append(hideUIAction())
|
||||||
|
} else if !ci.isDeletedContent {
|
||||||
menu.append(revealUIAction())
|
menu.append(revealUIAction())
|
||||||
|
} else if range != nil {
|
||||||
|
menu.append(expandUIAction())
|
||||||
}
|
}
|
||||||
menu.append(viewInfoUIAction())
|
menu.append(viewInfoUIAction(ci))
|
||||||
menu.append(deleteUIAction())
|
menu.append(deleteUIAction(ci))
|
||||||
} else if ci.isDeletedContent {
|
} else if ci.isDeletedContent {
|
||||||
menu.append(viewInfoUIAction())
|
menu.append(viewInfoUIAction(ci))
|
||||||
menu.append(deleteUIAction())
|
menu.append(deleteUIAction(ci))
|
||||||
|
} else if ci.mergeCategory != nil && ((range?.count ?? 0) > 1 || revealed) {
|
||||||
|
menu.append(revealed ? shrinkUIAction() : expandUIAction())
|
||||||
}
|
}
|
||||||
return menu
|
return menu
|
||||||
}
|
}
|
||||||
|
|
||||||
private func replyUIAction() -> UIAction {
|
private func replyUIAction(_ ci: ChatItem) -> UIAction {
|
||||||
UIAction(
|
UIAction(
|
||||||
title: NSLocalizedString("Reply", comment: "chat item action"),
|
title: NSLocalizedString("Reply", comment: "chat item action"),
|
||||||
image: UIImage(systemName: "arrowshape.turn.up.left")
|
image: UIImage(systemName: "arrowshape.turn.up.left")
|
||||||
@@ -695,11 +808,11 @@ struct ChatView: View {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func allReactions() -> [UIAction] {
|
private func allReactions(_ ci: ChatItem) -> [UIAction] {
|
||||||
MsgReaction.values.compactMap { r in
|
MsgReaction.values.compactMap { r in
|
||||||
ci.reactions.contains(where: { $0.userReacted && $0.reaction == r })
|
ci.reactions.contains(where: { $0.userReacted && $0.reaction == r })
|
||||||
? nil
|
? nil
|
||||||
: UIAction(title: r.text) { _ in setReaction(add: true, reaction: r) }
|
: UIAction(title: r.text) { _ in setReaction(ci, add: true, reaction: r) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -707,7 +820,7 @@ struct ChatView: View {
|
|||||||
rs.count > 4 ? 3 : 4
|
rs.count > 4 ? 3 : 4
|
||||||
}
|
}
|
||||||
|
|
||||||
private func setReaction(add: Bool, reaction: MsgReaction) {
|
private func setReaction(_ ci: ChatItem, add: Bool, reaction: MsgReaction) {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
let cInfo = chat.chatInfo
|
let cInfo = chat.chatInfo
|
||||||
@@ -719,7 +832,7 @@ struct ChatView: View {
|
|||||||
reaction: reaction
|
reaction: reaction
|
||||||
)
|
)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
ChatModel.shared.updateChatItem(chat.chatInfo, chatItem)
|
m.updateChatItem(chat.chatInfo, chatItem)
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("apiChatItemReaction error: \(responseError(error))")
|
logger.error("apiChatItemReaction error: \(responseError(error))")
|
||||||
@@ -727,7 +840,7 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func shareUIAction() -> UIAction {
|
private func shareUIAction(_ ci: ChatItem) -> UIAction {
|
||||||
UIAction(
|
UIAction(
|
||||||
title: NSLocalizedString("Share", comment: "chat item action"),
|
title: NSLocalizedString("Share", comment: "chat item action"),
|
||||||
image: UIImage(systemName: "square.and.arrow.up")
|
image: UIImage(systemName: "square.and.arrow.up")
|
||||||
@@ -740,7 +853,7 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func copyUIAction() -> UIAction {
|
private func copyUIAction(_ ci: ChatItem) -> UIAction {
|
||||||
UIAction(
|
UIAction(
|
||||||
title: NSLocalizedString("Copy", comment: "chat item action"),
|
title: NSLocalizedString("Copy", comment: "chat item action"),
|
||||||
image: UIImage(systemName: "doc.on.doc")
|
image: UIImage(systemName: "doc.on.doc")
|
||||||
@@ -773,7 +886,7 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func editAction() -> UIAction {
|
private func editAction(_ ci: ChatItem) -> UIAction {
|
||||||
UIAction(
|
UIAction(
|
||||||
title: NSLocalizedString("Edit", comment: "chat item action"),
|
title: NSLocalizedString("Edit", comment: "chat item action"),
|
||||||
image: UIImage(systemName: "square.and.pencil")
|
image: UIImage(systemName: "square.and.pencil")
|
||||||
@@ -784,7 +897,7 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func viewInfoUIAction() -> UIAction {
|
private func viewInfoUIAction(_ ci: ChatItem) -> UIAction {
|
||||||
UIAction(
|
UIAction(
|
||||||
title: NSLocalizedString("Info", comment: "chat item action"),
|
title: NSLocalizedString("Info", comment: "chat item action"),
|
||||||
image: UIImage(systemName: "info.circle")
|
image: UIImage(systemName: "info.circle")
|
||||||
@@ -797,10 +910,7 @@ struct ChatView: View {
|
|||||||
chatItemInfo = ciInfo
|
chatItemInfo = ciInfo
|
||||||
}
|
}
|
||||||
if case let .group(gInfo) = chat.chatInfo {
|
if case let .group(gInfo) = chat.chatInfo {
|
||||||
let groupMembers = await apiListMembers(gInfo.groupId)
|
await chatView.loadGroupMembers(gInfo)
|
||||||
await MainActor.run {
|
|
||||||
ChatModel.shared.groupMembers = groupMembers
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("apiGetChatItemInfo error: \(responseError(error))")
|
logger.error("apiGetChatItemInfo error: \(responseError(error))")
|
||||||
@@ -821,7 +931,7 @@ struct ChatView: View {
|
|||||||
message: Text(cancelAction.alert.message),
|
message: Text(cancelAction.alert.message),
|
||||||
primaryButton: .destructive(Text(cancelAction.alert.confirm)) {
|
primaryButton: .destructive(Text(cancelAction.alert.confirm)) {
|
||||||
Task {
|
Task {
|
||||||
if let user = ChatModel.shared.currentUser {
|
if let user = m.currentUser {
|
||||||
await cancelFile(user: user, fileId: fileId)
|
await cancelFile(user: user, fileId: fileId)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -842,18 +952,45 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func deleteUIAction() -> UIAction {
|
private func deleteUIAction(_ ci: ChatItem) -> UIAction {
|
||||||
UIAction(
|
UIAction(
|
||||||
title: NSLocalizedString("Delete", comment: "chat item action"),
|
title: NSLocalizedString("Delete", comment: "chat item action"),
|
||||||
image: UIImage(systemName: "trash"),
|
image: UIImage(systemName: "trash"),
|
||||||
attributes: [.destructive]
|
attributes: [.destructive]
|
||||||
) { _ in
|
) { _ in
|
||||||
showDeleteMessage = true
|
if !revealed && ci.meta.itemDeleted != nil,
|
||||||
deletingItem = ci
|
let currIndex = m.getChatItemIndex(ci),
|
||||||
|
let ciCategory = ci.mergeCategory {
|
||||||
|
let (prevHidden, _) = m.getPrevShownChatItem(currIndex, ciCategory)
|
||||||
|
if let range = itemsRange(currIndex, prevHidden) {
|
||||||
|
var itemIds: [Int64] = []
|
||||||
|
for i in range {
|
||||||
|
itemIds.append(m.reversedChatItems[i].id)
|
||||||
|
}
|
||||||
|
showDeleteMessages = true
|
||||||
|
deletingItems = itemIds
|
||||||
|
} else {
|
||||||
|
showDeleteMessage = true
|
||||||
|
deletingItem = ci
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
showDeleteMessage = true
|
||||||
|
deletingItem = ci
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func moderateUIAction(_ groupInfo: GroupInfo) -> UIAction {
|
private func itemsRange(_ currIndex: Int?, _ prevHidden: Int?) -> ClosedRange<Int>? {
|
||||||
|
if let currIndex = currIndex,
|
||||||
|
let prevHidden = prevHidden,
|
||||||
|
prevHidden > currIndex {
|
||||||
|
currIndex...prevHidden
|
||||||
|
} else {
|
||||||
|
nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func moderateUIAction(_ ci: ChatItem, _ groupInfo: GroupInfo) -> UIAction {
|
||||||
UIAction(
|
UIAction(
|
||||||
title: NSLocalizedString("Moderate", comment: "chat item action"),
|
title: NSLocalizedString("Moderate", comment: "chat item action"),
|
||||||
image: UIImage(systemName: "flag"),
|
image: UIImage(systemName: "flag"),
|
||||||
@@ -886,16 +1023,101 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func expandUIAction() -> UIAction {
|
||||||
|
UIAction(
|
||||||
|
title: NSLocalizedString("Expand", comment: "chat item action"),
|
||||||
|
image: UIImage(systemName: "arrow.up.and.line.horizontal.and.arrow.down")
|
||||||
|
) { _ in
|
||||||
|
withAnimation {
|
||||||
|
revealed = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func shrinkUIAction() -> UIAction {
|
||||||
|
UIAction(
|
||||||
|
title: NSLocalizedString("Hide", comment: "chat item action"),
|
||||||
|
image: UIImage(systemName: "arrow.down.and.line.horizontal.and.arrow.up")
|
||||||
|
) { _ in
|
||||||
|
withAnimation {
|
||||||
|
revealed = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private var broadcastDeleteButtonText: LocalizedStringKey {
|
private var broadcastDeleteButtonText: LocalizedStringKey {
|
||||||
chat.chatInfo.featureEnabled(.fullDelete) ? "Delete for everyone" : "Mark deleted for everyone"
|
chat.chatInfo.featureEnabled(.fullDelete) ? "Delete for everyone" : "Mark deleted for everyone"
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
private func showMemberImage(_ member: GroupMember, _ prevItem: ChatItem?) -> Bool {
|
var deleteMessagesTitle: LocalizedStringKey {
|
||||||
switch (prevItem?.chatDir) {
|
let n = deletingItems.count
|
||||||
case .groupSnd: return true
|
return n == 1 ? "Delete message?" : "Delete \(n) messages?"
|
||||||
case let .groupRcv(prevMember): return prevMember.groupMemberId != member.groupMemberId
|
}
|
||||||
default: return false
|
|
||||||
|
private func deleteMessages() {
|
||||||
|
let itemIds = deletingItems
|
||||||
|
if itemIds.count > 0 {
|
||||||
|
let chatInfo = chat.chatInfo
|
||||||
|
Task {
|
||||||
|
var deletedItems: [ChatItem] = []
|
||||||
|
for itemId in itemIds {
|
||||||
|
do {
|
||||||
|
let (di, _) = try await apiDeleteChatItem(
|
||||||
|
type: chatInfo.chatType,
|
||||||
|
id: chatInfo.apiId,
|
||||||
|
itemId: itemId,
|
||||||
|
mode: .cidmInternal
|
||||||
|
)
|
||||||
|
deletedItems.append(di)
|
||||||
|
} catch {
|
||||||
|
logger.error("ChatView.deleteMessage error: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
await MainActor.run {
|
||||||
|
for di in deletedItems {
|
||||||
|
m.removeChatItem(chatInfo, di)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func deleteMessage(_ mode: CIDeleteMode) {
|
||||||
|
logger.debug("ChatView deleteMessage")
|
||||||
|
Task {
|
||||||
|
logger.debug("ChatView deleteMessage: in Task")
|
||||||
|
do {
|
||||||
|
if let di = deletingItem {
|
||||||
|
var deletedItem: ChatItem
|
||||||
|
var toItem: ChatItem?
|
||||||
|
if case .cidmBroadcast = mode,
|
||||||
|
let (groupInfo, groupMember) = di.memberToModerate(chat.chatInfo) {
|
||||||
|
(deletedItem, toItem) = try await apiDeleteMemberChatItem(
|
||||||
|
groupId: groupInfo.apiId,
|
||||||
|
groupMemberId: groupMember.groupMemberId,
|
||||||
|
itemId: di.id
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
(deletedItem, toItem) = try await apiDeleteChatItem(
|
||||||
|
type: chat.chatInfo.chatType,
|
||||||
|
id: chat.chatInfo.apiId,
|
||||||
|
itemId: di.id,
|
||||||
|
mode: mode
|
||||||
|
)
|
||||||
|
}
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
deletingItem = nil
|
||||||
|
if let toItem = toItem {
|
||||||
|
_ = m.upsertChatItem(chat.chatInfo, toItem)
|
||||||
|
} else {
|
||||||
|
m.removeChatItem(chat.chatInfo, deletedItem)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
logger.error("ChatView.deleteMessage error: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -910,44 +1132,6 @@ struct ChatView: View {
|
|||||||
withAnimation { proxy.scrollTo(ci.viewId, anchor: .top) }
|
withAnimation { proxy.scrollTo(ci.viewId, anchor: .top) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func deleteMessage(_ mode: CIDeleteMode) {
|
|
||||||
logger.debug("ChatView deleteMessage")
|
|
||||||
Task {
|
|
||||||
logger.debug("ChatView deleteMessage: in Task")
|
|
||||||
do {
|
|
||||||
if let di = deletingItem {
|
|
||||||
var deletedItem: ChatItem
|
|
||||||
var toItem: ChatItem?
|
|
||||||
if case .cidmBroadcast = mode,
|
|
||||||
let (groupInfo, groupMember) = di.memberToModerate(chat.chatInfo) {
|
|
||||||
(deletedItem, toItem) = try await apiDeleteMemberChatItem(
|
|
||||||
groupId: groupInfo.apiId,
|
|
||||||
groupMemberId: groupMember.groupMemberId,
|
|
||||||
itemId: di.id
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
(deletedItem, toItem) = try await apiDeleteChatItem(
|
|
||||||
type: chat.chatInfo.chatType,
|
|
||||||
id: chat.chatInfo.apiId,
|
|
||||||
itemId: di.id,
|
|
||||||
mode: mode
|
|
||||||
)
|
|
||||||
}
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
deletingItem = nil
|
|
||||||
if let toItem = toItem {
|
|
||||||
_ = chatModel.upsertChatItem(chat.chatInfo, toItem)
|
|
||||||
} else {
|
|
||||||
chatModel.removeChatItem(chat.chatInfo, deletedItem)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
logger.error("ChatView.deleteMessage error: \(error.localizedDescription)")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder func toggleNtfsButton(_ chat: Chat) -> some View {
|
@ViewBuilder func toggleNtfsButton(_ chat: Chat) -> some View {
|
||||||
@@ -964,7 +1148,7 @@ struct ChatView: View {
|
|||||||
|
|
||||||
func toggleNotifications(_ chat: Chat, enableNtfs: Bool) {
|
func toggleNotifications(_ chat: Chat, enableNtfs: Bool) {
|
||||||
var chatSettings = chat.chatInfo.chatSettings ?? ChatSettings.defaults
|
var chatSettings = chat.chatInfo.chatSettings ?? ChatSettings.defaults
|
||||||
chatSettings.enableNtfs = enableNtfs
|
chatSettings.enableNtfs = enableNtfs ? .all : .none
|
||||||
updateChatSettings(chat, chatSettings: chatSettings)
|
updateChatSettings(chat, chatSettings: chatSettings)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -592,12 +592,14 @@ struct ComposeView: View {
|
|||||||
EmptyView()
|
EmptyView()
|
||||||
case let .quotedItem(chatItem: quotedItem):
|
case let .quotedItem(chatItem: quotedItem):
|
||||||
ContextItemView(
|
ContextItemView(
|
||||||
|
chat: chat,
|
||||||
contextItem: quotedItem,
|
contextItem: quotedItem,
|
||||||
contextIcon: "arrowshape.turn.up.left",
|
contextIcon: "arrowshape.turn.up.left",
|
||||||
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
|
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
|
||||||
)
|
)
|
||||||
case let .editingItem(chatItem: editingItem):
|
case let .editingItem(chatItem: editingItem):
|
||||||
ContextItemView(
|
ContextItemView(
|
||||||
|
chat: chat,
|
||||||
contextItem: editingItem,
|
contextItem: editingItem,
|
||||||
contextIcon: "pencil",
|
contextIcon: "pencil",
|
||||||
cancelContextItem: { clearState() }
|
cancelContextItem: { clearState() }
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ import SimpleXChat
|
|||||||
|
|
||||||
struct ContextItemView: View {
|
struct ContextItemView: View {
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
|
@ObservedObject var chat: Chat
|
||||||
let contextItem: ChatItem
|
let contextItem: ChatItem
|
||||||
let contextIcon: String
|
let contextIcon: String
|
||||||
let cancelContextItem: () -> Void
|
let cancelContextItem: () -> Void
|
||||||
@@ -48,6 +49,7 @@ struct ContextItemView: View {
|
|||||||
|
|
||||||
private func msgContentView(lines: Int) -> some View {
|
private func msgContentView(lines: Int) -> some View {
|
||||||
MsgContentView(
|
MsgContentView(
|
||||||
|
chat: chat,
|
||||||
text: contextItem.text,
|
text: contextItem.text,
|
||||||
formattedText: contextItem.formattedText
|
formattedText: contextItem.formattedText
|
||||||
)
|
)
|
||||||
@@ -59,6 +61,6 @@ struct ContextItemView: View {
|
|||||||
struct ContextItemView_Previews: PreviewProvider {
|
struct ContextItemView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let contextItem: ChatItem = ChatItem.getSample(1, .directSnd, .now, "hello")
|
let contextItem: ChatItem = ChatItem.getSample(1, .directSnd, .now, "hello")
|
||||||
return ContextItemView(contextItem: contextItem, contextIcon: "pencil.circle", cancelContextItem: {})
|
return ContextItemView(chat: Chat.sampleData, contextItem: contextItem, contextIcon: "pencil.circle", cancelContextItem: {})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,20 +14,28 @@ import PhotosUI
|
|||||||
struct NativeTextEditor: UIViewRepresentable {
|
struct NativeTextEditor: UIViewRepresentable {
|
||||||
@Binding var text: String
|
@Binding var text: String
|
||||||
@Binding var disableEditing: Bool
|
@Binding var disableEditing: Bool
|
||||||
let height: CGFloat
|
@Binding var height: CGFloat
|
||||||
let font: UIFont
|
|
||||||
@Binding var focused: Bool
|
@Binding var focused: Bool
|
||||||
let alignment: TextAlignment
|
let alignment: TextAlignment
|
||||||
let onImagesAdded: ([UploadContent]) -> Void
|
let onImagesAdded: ([UploadContent]) -> Void
|
||||||
|
|
||||||
|
private let minHeight: CGFloat = 37
|
||||||
|
|
||||||
|
private let defaultHeight: CGFloat = {
|
||||||
|
let field = CustomUITextField(height: Binding.constant(0))
|
||||||
|
field.textContainerInset = UIEdgeInsets(top: 8, left: 5, bottom: 6, right: 4)
|
||||||
|
return min(max(field.sizeThatFits(CGSizeMake(field.frame.size.width, CGFloat.greatestFiniteMagnitude)).height, 37), 360).rounded(.down)
|
||||||
|
}()
|
||||||
|
|
||||||
func makeUIView(context: Context) -> UITextView {
|
func makeUIView(context: Context) -> UITextView {
|
||||||
let field = CustomUITextField()
|
let field = CustomUITextField(height: _height)
|
||||||
field.text = text
|
field.text = text
|
||||||
field.font = font
|
|
||||||
field.textAlignment = alignment == .leading ? .left : .right
|
field.textAlignment = alignment == .leading ? .left : .right
|
||||||
field.autocapitalizationType = .sentences
|
field.autocapitalizationType = .sentences
|
||||||
field.setOnTextChangedListener { newText, images in
|
field.setOnTextChangedListener { newText, images in
|
||||||
if !disableEditing {
|
if !disableEditing {
|
||||||
|
// Speed up the process of updating layout, reduce jumping content on screen
|
||||||
|
if !isShortEmoji(newText) { updateHeight(field) }
|
||||||
text = newText
|
text = newText
|
||||||
} else {
|
} else {
|
||||||
field.text = text
|
field.text = text
|
||||||
@@ -39,20 +47,68 @@ struct NativeTextEditor: UIViewRepresentable {
|
|||||||
field.setOnFocusChangedListener { focused = $0 }
|
field.setOnFocusChangedListener { focused = $0 }
|
||||||
field.delegate = field
|
field.delegate = field
|
||||||
field.textContainerInset = UIEdgeInsets(top: 8, left: 5, bottom: 6, right: 4)
|
field.textContainerInset = UIEdgeInsets(top: 8, left: 5, bottom: 6, right: 4)
|
||||||
|
updateFont(field)
|
||||||
|
updateHeight(field)
|
||||||
return field
|
return field
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateUIView(_ field: UITextView, context: Context) {
|
func updateUIView(_ field: UITextView, context: Context) {
|
||||||
field.text = text
|
field.text = text
|
||||||
field.font = font
|
|
||||||
field.textAlignment = alignment == .leading ? .left : .right
|
field.textAlignment = alignment == .leading ? .left : .right
|
||||||
|
updateFont(field)
|
||||||
|
updateHeight(field)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateHeight(_ field: UITextView) {
|
||||||
|
let maxHeight = min(360, field.font!.lineHeight * 12)
|
||||||
|
// When having emoji in text view and then removing it, sizeThatFits shows previous size (too big for empty text view), so using work around with default size
|
||||||
|
let newHeight = field.text == ""
|
||||||
|
? defaultHeight
|
||||||
|
: min(max(field.sizeThatFits(CGSizeMake(field.frame.size.width, CGFloat.greatestFiniteMagnitude)).height, minHeight), maxHeight).rounded(.down)
|
||||||
|
|
||||||
|
if field.frame.size.height != newHeight {
|
||||||
|
field.frame.size = CGSizeMake(field.frame.size.width, newHeight)
|
||||||
|
(field as! CustomUITextField).invalidateIntrinsicContentHeight(newHeight)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateFont(_ field: UITextView) {
|
||||||
|
field.font = isShortEmoji(field.text)
|
||||||
|
? (field.text.count < 4 ? largeEmojiUIFont : mediumEmojiUIFont)
|
||||||
|
: UIFont.preferredFont(forTextStyle: .body)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private class CustomUITextField: UITextView, UITextViewDelegate {
|
private class CustomUITextField: UITextView, UITextViewDelegate {
|
||||||
|
var height: Binding<CGFloat>
|
||||||
|
var newHeight: CGFloat = 0
|
||||||
var onTextChanged: (String, [UploadContent]) -> Void = { newText, image in }
|
var onTextChanged: (String, [UploadContent]) -> Void = { newText, image in }
|
||||||
var onFocusChanged: (Bool) -> Void = { focused in }
|
var onFocusChanged: (Bool) -> Void = { focused in }
|
||||||
|
|
||||||
|
init(height: Binding<CGFloat>) {
|
||||||
|
self.height = height
|
||||||
|
super.init(frame: .zero, textContainer: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
required init?(coder: NSCoder) {
|
||||||
|
fatalError("Not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
// This func here needed because using frame.size.height in intrinsicContentSize while loading a screen with text (for example. when you have a draft),
|
||||||
|
// produces incorrect height because at that point intrinsicContentSize has old value of frame.size.height even if it was set to new value right before the call
|
||||||
|
// (who knows why...)
|
||||||
|
func invalidateIntrinsicContentHeight(_ newHeight: CGFloat) {
|
||||||
|
self.newHeight = newHeight
|
||||||
|
invalidateIntrinsicContentSize()
|
||||||
|
}
|
||||||
|
|
||||||
|
override var intrinsicContentSize: CGSize {
|
||||||
|
if height.wrappedValue != newHeight {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now(), execute: { self.height.wrappedValue = self.newHeight })
|
||||||
|
}
|
||||||
|
return CGSizeMake(0, newHeight)
|
||||||
|
}
|
||||||
|
|
||||||
func setOnTextChangedListener(onTextChanged: @escaping (String, [UploadContent]) -> Void) {
|
func setOnTextChangedListener(onTextChanged: @escaping (String, [UploadContent]) -> Void) {
|
||||||
self.onTextChanged = onTextChanged
|
self.onTextChanged = onTextChanged
|
||||||
}
|
}
|
||||||
@@ -144,14 +200,14 @@ private class CustomUITextField: UITextView, UITextViewDelegate {
|
|||||||
|
|
||||||
struct NativeTextEditor_Previews: PreviewProvider{
|
struct NativeTextEditor_Previews: PreviewProvider{
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
return NativeTextEditor(
|
NativeTextEditor(
|
||||||
text: Binding.constant("Hello, world!"),
|
text: Binding.constant("Hello, world!"),
|
||||||
disableEditing: Binding.constant(false),
|
disableEditing: Binding.constant(false),
|
||||||
height: 100,
|
height: Binding.constant(100),
|
||||||
font: UIFont.preferredFont(forTextStyle: .body),
|
|
||||||
focused: Binding.constant(false),
|
focused: Binding.constant(false),
|
||||||
alignment: TextAlignment.leading,
|
alignment: TextAlignment.leading,
|
||||||
onImagesAdded: { _ in }
|
onImagesAdded: { _ in }
|
||||||
)
|
)
|
||||||
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,15 +32,12 @@ struct SendMessageView: View {
|
|||||||
var sendButtonColor = Color.accentColor
|
var sendButtonColor = Color.accentColor
|
||||||
@State private var teHeight: CGFloat = 42
|
@State private var teHeight: CGFloat = 42
|
||||||
@State private var teFont: Font = .body
|
@State private var teFont: Font = .body
|
||||||
@State private var teUiFont: UIFont = UIFont.preferredFont(forTextStyle: .body)
|
|
||||||
@State private var sendButtonSize: CGFloat = 29
|
@State private var sendButtonSize: CGFloat = 29
|
||||||
@State private var sendButtonOpacity: CGFloat = 1
|
@State private var sendButtonOpacity: CGFloat = 1
|
||||||
@State private var showCustomDisappearingMessageDialogue = false
|
@State private var showCustomDisappearingMessageDialogue = false
|
||||||
@State private var showCustomTimePicker = false
|
@State private var showCustomTimePicker = false
|
||||||
@State private var selectedDisappearingMessageTime: Int? = customDisappearingMessageTimeDefault.get()
|
@State private var selectedDisappearingMessageTime: Int? = customDisappearingMessageTimeDefault.get()
|
||||||
@State private var progressByTimeout = false
|
@State private var progressByTimeout = false
|
||||||
var maxHeight: CGFloat = 360
|
|
||||||
var minHeight: CGFloat = 37
|
|
||||||
@AppStorage(DEFAULT_LIVE_MESSAGE_ALERT_SHOWN) private var liveMessageAlertShown = false
|
@AppStorage(DEFAULT_LIVE_MESSAGE_ALERT_SHOWN) private var liveMessageAlertShown = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -57,30 +54,16 @@ struct SendMessageView: View {
|
|||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
} else {
|
} else {
|
||||||
let alignment: TextAlignment = isRightToLeft(composeState.message) ? .trailing : .leading
|
let alignment: TextAlignment = isRightToLeft(composeState.message) ? .trailing : .leading
|
||||||
Text(composeState.message)
|
|
||||||
.lineLimit(10)
|
|
||||||
.font(teFont)
|
|
||||||
.multilineTextAlignment(alignment)
|
|
||||||
// put text on top (after NativeTextEditor) and set color to precisely align it on changes
|
|
||||||
// .foregroundColor(.red)
|
|
||||||
.foregroundColor(.clear)
|
|
||||||
.padding(.horizontal, 10)
|
|
||||||
.padding(.top, 8)
|
|
||||||
.padding(.bottom, 6)
|
|
||||||
.matchedGeometryEffect(id: "te", in: namespace)
|
|
||||||
.background(GeometryReader(content: updateHeight))
|
|
||||||
|
|
||||||
NativeTextEditor(
|
NativeTextEditor(
|
||||||
text: $composeState.message,
|
text: $composeState.message,
|
||||||
disableEditing: $composeState.inProgress,
|
disableEditing: $composeState.inProgress,
|
||||||
height: teHeight,
|
height: $teHeight,
|
||||||
font: teUiFont,
|
|
||||||
focused: $keyboardVisible,
|
focused: $keyboardVisible,
|
||||||
alignment: alignment,
|
alignment: alignment,
|
||||||
onImagesAdded: onMediaAdded
|
onImagesAdded: onMediaAdded
|
||||||
)
|
)
|
||||||
.allowsTightening(false)
|
.allowsTightening(false)
|
||||||
.frame(height: teHeight)
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,11 +83,13 @@ struct SendMessageView: View {
|
|||||||
.frame(height: teHeight, alignment: .bottom)
|
.frame(height: teHeight, alignment: .bottom)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.padding(.vertical, 1)
|
||||||
|
.overlay(
|
||||||
RoundedRectangle(cornerSize: CGSize(width: 20, height: 20))
|
RoundedRectangle(cornerSize: CGSize(width: 20, height: 20))
|
||||||
.strokeBorder(.secondary, lineWidth: 0.3, antialiased: true)
|
.strokeBorder(.secondary, lineWidth: 0.3, antialiased: true)
|
||||||
.frame(height: teHeight)
|
)
|
||||||
}
|
}
|
||||||
|
.onChange(of: composeState.message, perform: { text in updateFont(text) })
|
||||||
.onChange(of: composeState.inProgress) { inProgress in
|
.onChange(of: composeState.inProgress) { inProgress in
|
||||||
if inProgress {
|
if inProgress {
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
|
DispatchQueue.main.asyncAfter(deadline: .now() + 3) {
|
||||||
@@ -415,16 +400,12 @@ struct SendMessageView: View {
|
|||||||
.padding([.bottom, .trailing], 4)
|
.padding([.bottom, .trailing], 4)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateHeight(_ g: GeometryProxy) -> Color {
|
private func updateFont(_ text: String) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
teHeight = min(max(g.frame(in: .local).size.height, minHeight), maxHeight)
|
teFont = isShortEmoji(text)
|
||||||
(teFont, teUiFont) = isShortEmoji(composeState.message)
|
? (text.count < 4 ? largeEmojiFont : mediumEmojiFont)
|
||||||
? composeState.message.count < 4
|
: .body
|
||||||
? (largeEmojiFont, largeEmojiUIFont)
|
|
||||||
: (mediumEmojiFont, mediumEmojiUIFont)
|
|
||||||
: (.body, UIFont.preferredFont(forTextStyle: .body))
|
|
||||||
}
|
}
|
||||||
return Color.clear
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -144,7 +144,7 @@ struct AddGroupMembersViewCommon: View {
|
|||||||
do {
|
do {
|
||||||
for contactId in selectedContacts {
|
for contactId in selectedContacts {
|
||||||
let member = try await apiAddMember(groupInfo.groupId, contactId, selectedRole)
|
let member = try await apiAddMember(groupInfo.groupId, contactId, selectedRole)
|
||||||
await MainActor.run { _ = ChatModel.shared.upsertGroupMember(groupInfo, member) }
|
await MainActor.run { _ = chatModel.upsertGroupMember(groupInfo, member) }
|
||||||
}
|
}
|
||||||
addedMembersCb(selectedContacts)
|
addedMembersCb(selectedContacts)
|
||||||
} catch {
|
} catch {
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ struct GroupChatInfoView: View {
|
|||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
@State var groupInfo: GroupInfo
|
@Binding var groupInfo: GroupInfo
|
||||||
@ObservedObject private var alertManager = AlertManager.shared
|
@ObservedObject private var alertManager = AlertManager.shared
|
||||||
@State private var alert: GroupChatInfoViewAlert? = nil
|
@State private var alert: GroupChatInfoViewAlert? = nil
|
||||||
@State private var groupLink: String?
|
@State private var groupLink: String?
|
||||||
@@ -35,14 +35,30 @@ struct GroupChatInfoView: View {
|
|||||||
case leaveGroupAlert
|
case leaveGroupAlert
|
||||||
case cantInviteIncognitoAlert
|
case cantInviteIncognitoAlert
|
||||||
case largeGroupReceiptsDisabled
|
case largeGroupReceiptsDisabled
|
||||||
|
case blockMemberAlert(mem: GroupMember)
|
||||||
|
case unblockMemberAlert(mem: GroupMember)
|
||||||
|
case removeMemberAlert(mem: GroupMember)
|
||||||
|
case error(title: LocalizedStringKey, error: LocalizedStringKey)
|
||||||
|
|
||||||
var id: GroupChatInfoViewAlert { get { self } }
|
var id: String {
|
||||||
|
switch self {
|
||||||
|
case .deleteGroupAlert: return "deleteGroupAlert"
|
||||||
|
case .clearChatAlert: return "clearChatAlert"
|
||||||
|
case .leaveGroupAlert: return "leaveGroupAlert"
|
||||||
|
case .cantInviteIncognitoAlert: return "cantInviteIncognitoAlert"
|
||||||
|
case .largeGroupReceiptsDisabled: return "largeGroupReceiptsDisabled"
|
||||||
|
case let .blockMemberAlert(mem): return "blockMemberAlert \(mem.groupMemberId)"
|
||||||
|
case let .unblockMemberAlert(mem): return "unblockMemberAlert \(mem.groupMemberId)"
|
||||||
|
case let .removeMemberAlert(mem): return "removeMemberAlert \(mem.groupMemberId)"
|
||||||
|
case let .error(title, _): return "error \(title)"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
NavigationView {
|
NavigationView {
|
||||||
let members = chatModel.groupMembers
|
let members = chatModel.groupMembers
|
||||||
.filter { $0.memberStatus != .memLeft && $0.memberStatus != .memRemoved }
|
.filter { m in let status = m.wrapped.memberStatus; return status != .memLeft && status != .memRemoved }
|
||||||
.sorted { $0.displayName.lowercased() < $1.displayName.lowercased() }
|
.sorted { $0.displayName.lowercased() < $1.displayName.lowercased() }
|
||||||
|
|
||||||
List {
|
List {
|
||||||
@@ -57,7 +73,7 @@ struct GroupChatInfoView: View {
|
|||||||
addOrEditWelcomeMessage()
|
addOrEditWelcomeMessage()
|
||||||
}
|
}
|
||||||
groupPreferencesButton($groupInfo)
|
groupPreferencesButton($groupInfo)
|
||||||
if members.filter({ $0.memberCurrent }).count <= SMALL_GROUPS_RCPS_MEM_LIMIT {
|
if members.filter({ $0.wrapped.memberCurrent }).count <= SMALL_GROUPS_RCPS_MEM_LIMIT {
|
||||||
sendReceiptsOption()
|
sendReceiptsOption()
|
||||||
} else {
|
} else {
|
||||||
sendReceiptsOptionDisabled()
|
sendReceiptsOptionDisabled()
|
||||||
@@ -84,17 +100,17 @@ struct GroupChatInfoView: View {
|
|||||||
.padding(.leading, 8)
|
.padding(.leading, 8)
|
||||||
}
|
}
|
||||||
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
|
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
|
||||||
let filteredMembers = s == "" ? members : members.filter { $0.chatViewName.localizedLowercase.contains(s) }
|
let filteredMembers = s == "" ? members : members.filter { $0.wrapped.chatViewName.localizedLowercase.contains(s) }
|
||||||
memberView(groupInfo.membership, user: true)
|
MemberRowView(groupInfo: groupInfo, groupMember: GMember(groupInfo.membership), user: true, alert: $alert)
|
||||||
ForEach(filteredMembers) { member in
|
ForEach(filteredMembers) { member in
|
||||||
ZStack {
|
ZStack {
|
||||||
NavigationLink {
|
NavigationLink {
|
||||||
memberInfoView(member.groupMemberId)
|
memberInfoView(member)
|
||||||
} label: {
|
} label: {
|
||||||
EmptyView()
|
EmptyView()
|
||||||
}
|
}
|
||||||
.opacity(0)
|
.opacity(0)
|
||||||
memberView(member)
|
MemberRowView(groupInfo: groupInfo, groupMember: member, alert: $alert)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -126,6 +142,10 @@ struct GroupChatInfoView: View {
|
|||||||
case .leaveGroupAlert: return leaveGroupAlert()
|
case .leaveGroupAlert: return leaveGroupAlert()
|
||||||
case .cantInviteIncognitoAlert: return cantInviteIncognitoAlert()
|
case .cantInviteIncognitoAlert: return cantInviteIncognitoAlert()
|
||||||
case .largeGroupReceiptsDisabled: return largeGroupReceiptsDisabledAlert()
|
case .largeGroupReceiptsDisabled: return largeGroupReceiptsDisabledAlert()
|
||||||
|
case let .blockMemberAlert(mem): return blockMemberAlert(groupInfo, mem)
|
||||||
|
case let .unblockMemberAlert(mem): return unblockMemberAlert(groupInfo, mem)
|
||||||
|
case let .removeMemberAlert(mem): return removeMemberAlert(mem)
|
||||||
|
case let .error(title, error): return Alert(title: Text(title), message: Text(error))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onAppear {
|
.onAppear {
|
||||||
@@ -174,7 +194,7 @@ struct GroupChatInfoView: View {
|
|||||||
Task {
|
Task {
|
||||||
let groupMembers = await apiListMembers(groupInfo.groupId)
|
let groupMembers = await apiListMembers(groupInfo.groupId)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
ChatModel.shared.groupMembers = groupMembers
|
chatModel.groupMembers = groupMembers.map { GMember.init($0) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -183,51 +203,92 @@ struct GroupChatInfoView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func memberView(_ member: GroupMember, user: Bool = false) -> some View {
|
private struct MemberRowView: View {
|
||||||
HStack{
|
var groupInfo: GroupInfo
|
||||||
ProfileImage(imageStr: member.image)
|
@ObservedObject var groupMember: GMember
|
||||||
.frame(width: 38, height: 38)
|
var user: Bool = false
|
||||||
.padding(.trailing, 2)
|
@Binding var alert: GroupChatInfoViewAlert?
|
||||||
// TODO server connection status
|
|
||||||
VStack(alignment: .leading) {
|
var body: some View {
|
||||||
let t = Text(member.chatViewName).foregroundColor(member.memberIncognito ? .indigo : .primary)
|
let member = groupMember.wrapped
|
||||||
(member.verified ? memberVerifiedShield + t : t)
|
let v = HStack{
|
||||||
.lineLimit(1)
|
ProfileImage(imageStr: member.image)
|
||||||
let s = Text(member.memberStatus.shortText)
|
.frame(width: 38, height: 38)
|
||||||
(user ? Text ("you: ") + s : s)
|
.padding(.trailing, 2)
|
||||||
.lineLimit(1)
|
// TODO server connection status
|
||||||
.font(.caption)
|
VStack(alignment: .leading) {
|
||||||
.foregroundColor(.secondary)
|
let t = Text(member.chatViewName).foregroundColor(member.memberIncognito ? .indigo : .primary)
|
||||||
|
(member.verified ? memberVerifiedShield + t : t)
|
||||||
|
.lineLimit(1)
|
||||||
|
let s = Text(member.memberStatus.shortText)
|
||||||
|
(user ? Text ("you: ") + s : s)
|
||||||
|
.lineLimit(1)
|
||||||
|
.font(.caption)
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
}
|
||||||
|
Spacer()
|
||||||
|
let role = member.memberRole
|
||||||
|
if role == .owner || role == .admin {
|
||||||
|
Text(member.memberRole.text)
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Spacer()
|
|
||||||
let role = member.memberRole
|
if user {
|
||||||
if role == .owner || role == .admin {
|
v
|
||||||
Text(member.memberRole.text)
|
} else if member.canBeRemoved(groupInfo: groupInfo) {
|
||||||
.foregroundColor(.secondary)
|
removeSwipe(member, blockSwipe(member, v))
|
||||||
|
} else {
|
||||||
|
blockSwipe(member, v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func blockSwipe<V: View>(_ member: GroupMember, _ v: V) -> some View {
|
||||||
|
v.swipeActions(edge: .leading) {
|
||||||
|
if member.memberSettings.showMessages {
|
||||||
|
Button {
|
||||||
|
alert = .blockMemberAlert(mem: member)
|
||||||
|
} label: {
|
||||||
|
Label("Block member", systemImage: "hand.raised").foregroundColor(.secondary)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Button {
|
||||||
|
alert = .unblockMemberAlert(mem: member)
|
||||||
|
} label: {
|
||||||
|
Label("Unblock member", systemImage: "hand.raised.slash").foregroundColor(.accentColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func removeSwipe<V: View>(_ member: GroupMember, _ v: V) -> some View {
|
||||||
|
v.swipeActions(edge: .trailing) {
|
||||||
|
Button(role: .destructive) {
|
||||||
|
alert = .removeMemberAlert(mem: member)
|
||||||
|
} label: {
|
||||||
|
Label("Remove member", systemImage: "trash")
|
||||||
|
.foregroundColor(Color.red)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private var memberVerifiedShield: Text {
|
private func memberInfoView(_ groupMember: GMember) -> some View {
|
||||||
(Text(Image(systemName: "checkmark.shield")) + Text(" "))
|
GroupMemberInfoView(groupInfo: groupInfo, groupMember: groupMember)
|
||||||
.font(.caption)
|
.navigationBarHidden(false)
|
||||||
.baselineOffset(2)
|
|
||||||
.kerning(-2)
|
|
||||||
.foregroundColor(.secondary)
|
|
||||||
}
|
|
||||||
|
|
||||||
@ViewBuilder private func memberInfoView(_ groupMemberId: Int64?) -> some View {
|
|
||||||
if let mId = groupMemberId, let member = chatModel.groupMembers.first(where: { $0.groupMemberId == mId }) {
|
|
||||||
GroupMemberInfoView(groupInfo: groupInfo, member: member)
|
|
||||||
.navigationBarHidden(false)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func groupLinkButton() -> some View {
|
private func groupLinkButton() -> some View {
|
||||||
NavigationLink {
|
NavigationLink {
|
||||||
GroupLinkView(groupId: groupInfo.groupId, groupLink: $groupLink, groupLinkMemberRole: $groupLinkMemberRole)
|
GroupLinkView(
|
||||||
.navigationBarTitle("Group link")
|
groupId: groupInfo.groupId,
|
||||||
.navigationBarTitleDisplayMode(.large)
|
groupLink: $groupLink,
|
||||||
|
groupLinkMemberRole: $groupLinkMemberRole,
|
||||||
|
showTitle: false,
|
||||||
|
creatingGroup: false
|
||||||
|
)
|
||||||
|
.navigationBarTitle("Group link")
|
||||||
|
.navigationBarTitleDisplayMode(.large)
|
||||||
} label: {
|
} label: {
|
||||||
if groupLink == nil {
|
if groupLink == nil {
|
||||||
Label("Create group link", systemImage: "link.badge.plus")
|
Label("Create group link", systemImage: "link.badge.plus")
|
||||||
@@ -375,6 +436,28 @@ struct GroupChatInfoView: View {
|
|||||||
alert = .largeGroupReceiptsDisabled
|
alert = .largeGroupReceiptsDisabled
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func removeMemberAlert(_ mem: GroupMember) -> Alert {
|
||||||
|
Alert(
|
||||||
|
title: Text("Remove member?"),
|
||||||
|
message: Text("Member will be removed from group - this cannot be undone!"),
|
||||||
|
primaryButton: .destructive(Text("Remove")) {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
let updatedMember = try await apiRemoveMember(groupInfo.groupId, mem.groupMemberId)
|
||||||
|
await MainActor.run {
|
||||||
|
_ = chatModel.upsertGroupMember(groupInfo, updatedMember)
|
||||||
|
}
|
||||||
|
} catch let error {
|
||||||
|
logger.error("apiRemoveMember error: \(responseError(error))")
|
||||||
|
let a = getErrorAlert(error, "Error removing member")
|
||||||
|
alert = .error(title: a.title, error: a.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupPreferencesButton(_ groupInfo: Binding<GroupInfo>, _ creatingGroup: Bool = false) -> some View {
|
func groupPreferencesButton(_ groupInfo: Binding<GroupInfo>, _ creatingGroup: Bool = false) -> some View {
|
||||||
@@ -396,6 +479,14 @@ func groupPreferencesButton(_ groupInfo: Binding<GroupInfo>, _ creatingGroup: Bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private var memberVerifiedShield: Text {
|
||||||
|
(Text(Image(systemName: "checkmark.shield")) + Text(" "))
|
||||||
|
.font(.caption)
|
||||||
|
.baselineOffset(2)
|
||||||
|
.kerning(-2)
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
}
|
||||||
|
|
||||||
func cantInviteIncognitoAlert() -> Alert {
|
func cantInviteIncognitoAlert() -> Alert {
|
||||||
Alert(
|
Alert(
|
||||||
title: Text("Can't invite contacts!"),
|
title: Text("Can't invite contacts!"),
|
||||||
@@ -412,6 +503,9 @@ func largeGroupReceiptsDisabledAlert() -> Alert {
|
|||||||
|
|
||||||
struct GroupChatInfoView_Previews: PreviewProvider {
|
struct GroupChatInfoView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
GroupChatInfoView(chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []), groupInfo: GroupInfo.sampleData)
|
GroupChatInfoView(
|
||||||
|
chat: Chat(chatInfo: ChatInfo.sampleData.group, chatItems: []),
|
||||||
|
groupInfo: Binding.constant(GroupInfo.sampleData)
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,9 @@ struct GroupLinkView: View {
|
|||||||
var groupId: Int64
|
var groupId: Int64
|
||||||
@Binding var groupLink: String?
|
@Binding var groupLink: String?
|
||||||
@Binding var groupLinkMemberRole: GroupMemberRole
|
@Binding var groupLinkMemberRole: GroupMemberRole
|
||||||
|
var showTitle: Bool = false
|
||||||
|
var creatingGroup: Bool = false
|
||||||
|
var linkCreatedCb: (() -> Void)? = nil
|
||||||
@State private var creatingLink = false
|
@State private var creatingLink = false
|
||||||
@State private var alert: GroupLinkAlert?
|
@State private var alert: GroupLinkAlert?
|
||||||
|
|
||||||
@@ -29,10 +32,35 @@ struct GroupLinkView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
|
if creatingGroup {
|
||||||
|
NavigationView {
|
||||||
|
groupLinkView()
|
||||||
|
.toolbar {
|
||||||
|
ToolbarItem(placement: .navigationBarTrailing) {
|
||||||
|
Button ("Continue") { linkCreatedCb?() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
groupLinkView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func groupLinkView() -> some View {
|
||||||
List {
|
List {
|
||||||
Text("You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it.")
|
Group {
|
||||||
.listRowBackground(Color.clear)
|
if showTitle {
|
||||||
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
|
Text("Group link")
|
||||||
|
.font(.largeTitle)
|
||||||
|
.bold()
|
||||||
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
|
}
|
||||||
|
Text("You can share a link or a QR code - anybody will be able to join the group. You won't lose members of the group if you later delete it.")
|
||||||
|
}
|
||||||
|
.listRowBackground(Color.clear)
|
||||||
|
.listRowSeparator(.hidden)
|
||||||
|
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
if let groupLink = groupLink {
|
if let groupLink = groupLink {
|
||||||
Picker("Initial role", selection: $groupLinkMemberRole) {
|
Picker("Initial role", selection: $groupLinkMemberRole) {
|
||||||
@@ -41,15 +69,17 @@ struct GroupLinkView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(height: 36)
|
.frame(height: 36)
|
||||||
QRCode(uri: groupLink)
|
SimpleXLinkQRCode(uri: groupLink)
|
||||||
Button {
|
Button {
|
||||||
showShareSheet(items: [groupLink])
|
showShareSheet(items: [simplexChatLink(groupLink)])
|
||||||
} label: {
|
} label: {
|
||||||
Label("Share link", systemImage: "square.and.arrow.up")
|
Label("Share link", systemImage: "square.and.arrow.up")
|
||||||
}
|
}
|
||||||
|
|
||||||
Button(role: .destructive) { alert = .deleteLink } label: {
|
if !creatingGroup {
|
||||||
Label("Delete link", systemImage: "trash")
|
Button(role: .destructive) { alert = .deleteLink } label: {
|
||||||
|
Label("Delete link", systemImage: "trash")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Button(action: createGroupLink) {
|
Button(action: createGroupLink) {
|
||||||
|
|||||||
@@ -12,38 +12,40 @@ import SimpleXChat
|
|||||||
struct GroupMemberInfoView: View {
|
struct GroupMemberInfoView: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
var groupInfo: GroupInfo
|
@State var groupInfo: GroupInfo
|
||||||
@State var member: GroupMember
|
@ObservedObject var groupMember: GMember
|
||||||
var navigation: Bool = false
|
var navigation: Bool = false
|
||||||
@State private var connectionStats: ConnectionStats? = nil
|
@State private var connectionStats: ConnectionStats? = nil
|
||||||
@State private var connectionCode: String? = nil
|
@State private var connectionCode: String? = nil
|
||||||
@State private var newRole: GroupMemberRole = .member
|
@State private var newRole: GroupMemberRole = .member
|
||||||
@State private var alert: GroupMemberInfoViewAlert?
|
@State private var alert: GroupMemberInfoViewAlert?
|
||||||
@State private var connectToMemberDialog: Bool = false
|
@State private var sheet: PlanAndConnectActionSheet?
|
||||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||||
@State private var justOpened = true
|
@State private var justOpened = true
|
||||||
@State private var progressIndicator = false
|
@State private var progressIndicator = false
|
||||||
|
|
||||||
enum GroupMemberInfoViewAlert: Identifiable {
|
enum GroupMemberInfoViewAlert: Identifiable {
|
||||||
|
case blockMemberAlert(mem: GroupMember)
|
||||||
|
case unblockMemberAlert(mem: GroupMember)
|
||||||
case removeMemberAlert(mem: GroupMember)
|
case removeMemberAlert(mem: GroupMember)
|
||||||
case changeMemberRoleAlert(mem: GroupMember, role: GroupMemberRole)
|
case changeMemberRoleAlert(mem: GroupMember, role: GroupMemberRole)
|
||||||
case switchAddressAlert
|
case switchAddressAlert
|
||||||
case abortSwitchAddressAlert
|
case abortSwitchAddressAlert
|
||||||
case syncConnectionForceAlert
|
case syncConnectionForceAlert
|
||||||
case connRequestSentAlert(type: ConnReqType)
|
case planAndConnectAlert(alert: PlanAndConnectAlert)
|
||||||
case error(title: LocalizedStringKey, error: LocalizedStringKey)
|
case error(title: LocalizedStringKey, error: LocalizedStringKey)
|
||||||
case other(alert: Alert)
|
|
||||||
|
|
||||||
var id: String {
|
var id: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .removeMemberAlert: return "removeMemberAlert"
|
case let .blockMemberAlert(mem): return "blockMemberAlert \(mem.groupMemberId)"
|
||||||
case let .changeMemberRoleAlert(_, role): return "changeMemberRoleAlert \(role.rawValue)"
|
case let .unblockMemberAlert(mem): return "unblockMemberAlert \(mem.groupMemberId)"
|
||||||
|
case let .removeMemberAlert(mem): return "removeMemberAlert \(mem.groupMemberId)"
|
||||||
|
case let .changeMemberRoleAlert(mem, role): return "changeMemberRoleAlert \(mem.groupMemberId) \(role.rawValue)"
|
||||||
case .switchAddressAlert: return "switchAddressAlert"
|
case .switchAddressAlert: return "switchAddressAlert"
|
||||||
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
|
case .abortSwitchAddressAlert: return "abortSwitchAddressAlert"
|
||||||
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
|
case .syncConnectionForceAlert: return "syncConnectionForceAlert"
|
||||||
case .connRequestSentAlert: return "connRequestSentAlert"
|
case let .planAndConnectAlert(alert): return "planAndConnectAlert \(alert.id)"
|
||||||
case let .error(title, _): return "error \(title)"
|
case let .error(title, _): return "error \(title)"
|
||||||
case let .other(alert): return "other \(alert)"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -68,6 +70,7 @@ struct GroupMemberInfoView: View {
|
|||||||
private func groupMemberInfoView() -> some View {
|
private func groupMemberInfoView() -> some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
VStack {
|
VStack {
|
||||||
|
let member = groupMember.wrapped
|
||||||
List {
|
List {
|
||||||
groupMemberInfoHeader(member)
|
groupMemberInfoHeader(member)
|
||||||
.listRowBackground(Color.clear)
|
.listRowBackground(Color.clear)
|
||||||
@@ -96,9 +99,9 @@ struct GroupMemberInfoView: View {
|
|||||||
|
|
||||||
if let contactLink = member.contactLink {
|
if let contactLink = member.contactLink {
|
||||||
Section {
|
Section {
|
||||||
QRCode(uri: contactLink)
|
SimpleXLinkQRCode(uri: contactLink)
|
||||||
Button {
|
Button {
|
||||||
showShareSheet(items: [contactLink])
|
showShareSheet(items: [simplexChatLink(contactLink)])
|
||||||
} label: {
|
} label: {
|
||||||
Label("Share address", systemImage: "square.and.arrow.up")
|
Label("Share address", systemImage: "square.and.arrow.up")
|
||||||
}
|
}
|
||||||
@@ -161,9 +164,14 @@ struct GroupMemberInfoView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if member.canBeRemoved(groupInfo: groupInfo) {
|
Section {
|
||||||
Section {
|
if member.memberSettings.showMessages {
|
||||||
removeMemberButton(member)
|
blockMemberButton(member)
|
||||||
|
} else {
|
||||||
|
unblockMemberButton(member)
|
||||||
|
}
|
||||||
|
if member.canBeRemoved(groupInfo: groupInfo) {
|
||||||
|
removeMemberButton(member)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -184,7 +192,7 @@ struct GroupMemberInfoView: View {
|
|||||||
do {
|
do {
|
||||||
let (_, stats) = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
|
let (_, stats) = try apiGroupMemberInfo(groupInfo.apiId, member.groupMemberId)
|
||||||
let (mem, code) = member.memberActive ? try apiGetGroupMemberCode(groupInfo.apiId, member.groupMemberId) : (member, nil)
|
let (mem, code) = member.memberActive ? try apiGetGroupMemberCode(groupInfo.apiId, member.groupMemberId) : (member, nil)
|
||||||
member = mem
|
_ = chatModel.upsertGroupMember(groupInfo, mem)
|
||||||
connectionStats = stats
|
connectionStats = stats
|
||||||
connectionCode = code
|
connectionCode = code
|
||||||
} catch let error {
|
} catch let error {
|
||||||
@@ -192,25 +200,30 @@ struct GroupMemberInfoView: View {
|
|||||||
}
|
}
|
||||||
justOpened = false
|
justOpened = false
|
||||||
}
|
}
|
||||||
.onChange(of: newRole) { _ in
|
.onChange(of: newRole) { newRole in
|
||||||
if newRole != member.memberRole {
|
if newRole != member.memberRole {
|
||||||
alert = .changeMemberRoleAlert(mem: member, role: newRole)
|
alert = .changeMemberRoleAlert(mem: member, role: newRole)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.onChange(of: member.memberRole) { role in
|
||||||
|
newRole = role
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
||||||
.alert(item: $alert) { alertItem in
|
.alert(item: $alert) { alertItem in
|
||||||
switch(alertItem) {
|
switch(alertItem) {
|
||||||
|
case let .blockMemberAlert(mem): return blockMemberAlert(groupInfo, mem)
|
||||||
|
case let .unblockMemberAlert(mem): return unblockMemberAlert(groupInfo, mem)
|
||||||
case let .removeMemberAlert(mem): return removeMemberAlert(mem)
|
case let .removeMemberAlert(mem): return removeMemberAlert(mem)
|
||||||
case let .changeMemberRoleAlert(mem, _): return changeMemberRoleAlert(mem)
|
case let .changeMemberRoleAlert(mem, _): return changeMemberRoleAlert(mem)
|
||||||
case .switchAddressAlert: return switchAddressAlert(switchMemberAddress)
|
case .switchAddressAlert: return switchAddressAlert(switchMemberAddress)
|
||||||
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchMemberAddress)
|
case .abortSwitchAddressAlert: return abortSwitchAddressAlert(abortSwitchMemberAddress)
|
||||||
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncMemberConnection(force: true) })
|
case .syncConnectionForceAlert: return syncConnectionForceAlert({ syncMemberConnection(force: true) })
|
||||||
case let .connRequestSentAlert(type): return connReqSentAlert(type)
|
case let .planAndConnectAlert(alert): return planAndConnectAlert(alert, dismiss: true)
|
||||||
case let .error(title, error): return Alert(title: Text(title), message: Text(error))
|
case let .error(title, error): return Alert(title: Text(title), message: Text(error))
|
||||||
case let .other(alert): return alert
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.actionSheet(item: $sheet) { s in planAndConnectActionSheet(s, dismiss: true) }
|
||||||
|
|
||||||
if progressIndicator {
|
if progressIndicator {
|
||||||
ProgressView().scaleEffect(2)
|
ProgressView().scaleEffect(2)
|
||||||
@@ -220,25 +233,16 @@ struct GroupMemberInfoView: View {
|
|||||||
|
|
||||||
func connectViaAddressButton(_ contactLink: String) -> some View {
|
func connectViaAddressButton(_ contactLink: String) -> some View {
|
||||||
Button {
|
Button {
|
||||||
connectToMemberDialog = true
|
planAndConnect(
|
||||||
|
contactLink,
|
||||||
|
showAlert: { alert = .planAndConnectAlert(alert: $0) },
|
||||||
|
showActionSheet: { sheet = $0 },
|
||||||
|
dismiss: true,
|
||||||
|
incognito: nil
|
||||||
|
)
|
||||||
} label: {
|
} label: {
|
||||||
Label("Connect", systemImage: "link")
|
Label("Connect", systemImage: "link")
|
||||||
}
|
}
|
||||||
.confirmationDialog("Connect directly", isPresented: $connectToMemberDialog, titleVisibility: .visible) {
|
|
||||||
Button("Use current profile") { connectViaAddress(incognito: false, contactLink: contactLink) }
|
|
||||||
Button("Use new incognito profile") { connectViaAddress(incognito: true, contactLink: contactLink) }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func connectViaAddress(incognito: Bool, contactLink: String) {
|
|
||||||
Task {
|
|
||||||
let (connReqType, connectAlert) = await apiConnect_(incognito: incognito, connReq: contactLink)
|
|
||||||
if let connReqType = connReqType {
|
|
||||||
alert = .connRequestSentAlert(type: connReqType)
|
|
||||||
} else if let connectAlert = connectAlert {
|
|
||||||
alert = .other(alert: connectAlert)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func knownDirectChatButton(_ chat: Chat) -> some View {
|
func knownDirectChatButton(_ chat: Chat) -> some View {
|
||||||
@@ -274,7 +278,7 @@ struct GroupMemberInfoView: View {
|
|||||||
progressIndicator = true
|
progressIndicator = true
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
let memberContact = try await apiCreateMemberContact(groupInfo.apiId, member.groupMemberId)
|
let memberContact = try await apiCreateMemberContact(groupInfo.apiId, groupMember.groupMemberId)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
progressIndicator = false
|
progressIndicator = false
|
||||||
chatModel.addChat(Chat(chatInfo: .direct(contact: memberContact)))
|
chatModel.addChat(Chat(chatInfo: .direct(contact: memberContact)))
|
||||||
@@ -332,20 +336,20 @@ struct GroupMemberInfoView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func verifyCodeButton(_ code: String) -> some View {
|
private func verifyCodeButton(_ code: String) -> some View {
|
||||||
NavigationLink {
|
let member = groupMember.wrapped
|
||||||
|
return NavigationLink {
|
||||||
VerifyCodeView(
|
VerifyCodeView(
|
||||||
displayName: member.displayName,
|
displayName: member.displayName,
|
||||||
connectionCode: code,
|
connectionCode: code,
|
||||||
connectionVerified: member.verified,
|
connectionVerified: member.verified,
|
||||||
verify: { code in
|
verify: { code in
|
||||||
|
var member = groupMember.wrapped
|
||||||
if let r = apiVerifyGroupMember(member.groupId, member.groupMemberId, connectionCode: code) {
|
if let r = apiVerifyGroupMember(member.groupId, member.groupMemberId, connectionCode: code) {
|
||||||
let (verified, existingCode) = r
|
let (verified, existingCode) = r
|
||||||
let connCode = verified ? SecurityCode(securityCode: existingCode, verifiedAt: .now) : nil
|
let connCode = verified ? SecurityCode(securityCode: existingCode, verifiedAt: .now) : nil
|
||||||
connectionCode = existingCode
|
connectionCode = existingCode
|
||||||
member.activeConn?.connectionCode = connCode
|
member.activeConn?.connectionCode = connCode
|
||||||
if let i = chatModel.groupMembers.firstIndex(where: { $0.groupMemberId == member.groupMemberId }) {
|
_ = chatModel.upsertGroupMember(groupInfo, member)
|
||||||
chatModel.groupMembers[i].activeConn?.connectionCode = connCode
|
|
||||||
}
|
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -379,12 +383,29 @@ struct GroupMemberInfoView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func blockMemberButton(_ mem: GroupMember) -> some View {
|
||||||
|
Button(role: .destructive) {
|
||||||
|
alert = .blockMemberAlert(mem: mem)
|
||||||
|
} label: {
|
||||||
|
Label("Block member", systemImage: "hand.raised")
|
||||||
|
.foregroundColor(.red)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func unblockMemberButton(_ mem: GroupMember) -> some View {
|
||||||
|
Button {
|
||||||
|
alert = .unblockMemberAlert(mem: mem)
|
||||||
|
} label: {
|
||||||
|
Label("Unblock member", systemImage: "hand.raised.slash")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func removeMemberButton(_ mem: GroupMember) -> some View {
|
private func removeMemberButton(_ mem: GroupMember) -> some View {
|
||||||
Button(role: .destructive) {
|
Button(role: .destructive) {
|
||||||
alert = .removeMemberAlert(mem: mem)
|
alert = .removeMemberAlert(mem: mem)
|
||||||
} label: {
|
} label: {
|
||||||
Label("Remove member", systemImage: "trash")
|
Label("Remove member", systemImage: "trash")
|
||||||
.foregroundColor(Color.red)
|
.foregroundColor(.red)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -420,7 +441,6 @@ struct GroupMemberInfoView: View {
|
|||||||
do {
|
do {
|
||||||
let updatedMember = try await apiMemberRole(groupInfo.groupId, mem.groupMemberId, newRole)
|
let updatedMember = try await apiMemberRole(groupInfo.groupId, mem.groupMemberId, newRole)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
member = updatedMember
|
|
||||||
_ = chatModel.upsertGroupMember(groupInfo, updatedMember)
|
_ = chatModel.upsertGroupMember(groupInfo, updatedMember)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -441,10 +461,10 @@ struct GroupMemberInfoView: View {
|
|||||||
private func switchMemberAddress() {
|
private func switchMemberAddress() {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
let stats = try apiSwitchGroupMember(groupInfo.apiId, member.groupMemberId)
|
let stats = try apiSwitchGroupMember(groupInfo.apiId, groupMember.groupMemberId)
|
||||||
connectionStats = stats
|
connectionStats = stats
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
chatModel.updateGroupMemberConnectionStats(groupInfo, member, stats)
|
chatModel.updateGroupMemberConnectionStats(groupInfo, groupMember.wrapped, stats)
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
@@ -460,10 +480,10 @@ struct GroupMemberInfoView: View {
|
|||||||
private func abortSwitchMemberAddress() {
|
private func abortSwitchMemberAddress() {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
let stats = try apiAbortSwitchGroupMember(groupInfo.apiId, member.groupMemberId)
|
let stats = try apiAbortSwitchGroupMember(groupInfo.apiId, groupMember.groupMemberId)
|
||||||
connectionStats = stats
|
connectionStats = stats
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
chatModel.updateGroupMemberConnectionStats(groupInfo, member, stats)
|
chatModel.updateGroupMemberConnectionStats(groupInfo, groupMember.wrapped, stats)
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("abortSwitchMemberAddress apiAbortSwitchGroupMember error: \(responseError(error))")
|
logger.error("abortSwitchMemberAddress apiAbortSwitchGroupMember error: \(responseError(error))")
|
||||||
@@ -478,7 +498,7 @@ struct GroupMemberInfoView: View {
|
|||||||
private func syncMemberConnection(force: Bool) {
|
private func syncMemberConnection(force: Bool) {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
let (mem, stats) = try apiSyncGroupMemberRatchet(groupInfo.apiId, member.groupMemberId, force)
|
let (mem, stats) = try apiSyncGroupMemberRatchet(groupInfo.apiId, groupMember.groupMemberId, force)
|
||||||
connectionStats = stats
|
connectionStats = stats
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
chatModel.updateGroupMemberConnectionStats(groupInfo, mem, stats)
|
chatModel.updateGroupMemberConnectionStats(groupInfo, mem, stats)
|
||||||
@@ -495,11 +515,54 @@ struct GroupMemberInfoView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func blockMemberAlert(_ gInfo: GroupInfo, _ mem: GroupMember) -> Alert {
|
||||||
|
Alert(
|
||||||
|
title: Text("Block member?"),
|
||||||
|
message: Text("All new messages from \(mem.chatViewName) will be hidden!"),
|
||||||
|
primaryButton: .destructive(Text("Block")) {
|
||||||
|
toggleShowMemberMessages(gInfo, mem, false)
|
||||||
|
},
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func unblockMemberAlert(_ gInfo: GroupInfo, _ mem: GroupMember) -> Alert {
|
||||||
|
Alert(
|
||||||
|
title: Text("Unblock member?"),
|
||||||
|
message: Text("Messages from \(mem.chatViewName) will be shown!"),
|
||||||
|
primaryButton: .default(Text("Unblock")) {
|
||||||
|
toggleShowMemberMessages(gInfo, mem, true)
|
||||||
|
},
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func toggleShowMemberMessages(_ gInfo: GroupInfo, _ member: GroupMember, _ showMessages: Bool) {
|
||||||
|
var memberSettings = member.memberSettings
|
||||||
|
memberSettings.showMessages = showMessages
|
||||||
|
updateMemberSettings(gInfo, member, memberSettings)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateMemberSettings(_ gInfo: GroupInfo, _ member: GroupMember, _ memberSettings: GroupMemberSettings) {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
try await apiSetMemberSettings(gInfo.groupId, member.groupMemberId, memberSettings)
|
||||||
|
await MainActor.run {
|
||||||
|
var mem = member
|
||||||
|
mem.memberSettings = memberSettings
|
||||||
|
_ = ChatModel.shared.upsertGroupMember(gInfo, mem)
|
||||||
|
}
|
||||||
|
} catch let error {
|
||||||
|
logger.error("apiSetMemberSettings error \(responseError(error))")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct GroupMemberInfoView_Previews: PreviewProvider {
|
struct GroupMemberInfoView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
GroupMemberInfoView(
|
GroupMemberInfoView(
|
||||||
groupInfo: GroupInfo.sampleData,
|
groupInfo: GroupInfo.sampleData,
|
||||||
member: GroupMember.sampleData
|
groupMember: GMember.sampleData
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,8 +27,7 @@ struct GroupPreferencesView: View {
|
|||||||
featureSection(.directMessages, $preferences.directMessages.enable)
|
featureSection(.directMessages, $preferences.directMessages.enable)
|
||||||
featureSection(.reactions, $preferences.reactions.enable)
|
featureSection(.reactions, $preferences.reactions.enable)
|
||||||
featureSection(.voice, $preferences.voice.enable)
|
featureSection(.voice, $preferences.voice.enable)
|
||||||
// TODO uncomment in 5.3
|
featureSection(.files, $preferences.files.enable)
|
||||||
// featureSection(.files, $preferences.files.enable)
|
|
||||||
|
|
||||||
if groupInfo.canEdit {
|
if groupInfo.canEdit {
|
||||||
Section {
|
Section {
|
||||||
|
|||||||
@@ -9,6 +9,18 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
|
enum GroupProfileAlert: Identifiable {
|
||||||
|
case saveError(err: String)
|
||||||
|
case invalidName(validName: String)
|
||||||
|
|
||||||
|
var id: String {
|
||||||
|
switch self {
|
||||||
|
case let .saveError(err): return "saveError \(err)"
|
||||||
|
case let .invalidName(validName): return "invalidName \(validName)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct GroupProfileView: View {
|
struct GroupProfileView: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
@@ -18,8 +30,7 @@ struct GroupProfileView: View {
|
|||||||
@State private var showImagePicker = false
|
@State private var showImagePicker = false
|
||||||
@State private var showTakePhoto = false
|
@State private var showTakePhoto = false
|
||||||
@State private var chosenImage: UIImage? = nil
|
@State private var chosenImage: UIImage? = nil
|
||||||
@State private var showSaveErrorAlert = false
|
@State private var alert: GroupProfileAlert?
|
||||||
@State private var saveGroupError: String? = nil
|
|
||||||
@FocusState private var focusDisplayName
|
@FocusState private var focusDisplayName
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -47,20 +58,29 @@ struct GroupProfileView: View {
|
|||||||
.frame(maxWidth: .infinity, alignment: .center)
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
|
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
ZStack(alignment: .leading) {
|
ZStack(alignment: .topLeading) {
|
||||||
if !validDisplayName(groupProfile.displayName) {
|
if !validNewProfileName() {
|
||||||
Image(systemName: "exclamationmark.circle")
|
Button {
|
||||||
.foregroundColor(.red)
|
alert = .invalidName(validName: mkValidName(groupProfile.displayName))
|
||||||
.padding(.bottom, 10)
|
} label: {
|
||||||
|
Image(systemName: "exclamationmark.circle").foregroundColor(.red)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Image(systemName: "exclamationmark.circle").foregroundColor(.clear)
|
||||||
}
|
}
|
||||||
profileNameTextEdit("Group display name", $groupProfile.displayName)
|
profileNameTextEdit("Group display name", $groupProfile.displayName)
|
||||||
.focused($focusDisplayName)
|
.focused($focusDisplayName)
|
||||||
}
|
}
|
||||||
profileNameTextEdit("Group full name (optional)", $groupProfile.fullName)
|
.padding(.bottom)
|
||||||
|
let fullName = groupInfo.groupProfile.fullName
|
||||||
|
if fullName != "" && fullName != groupProfile.displayName {
|
||||||
|
profileNameTextEdit("Group full name (optional)", $groupProfile.fullName)
|
||||||
|
.padding(.bottom)
|
||||||
|
}
|
||||||
HStack(spacing: 20) {
|
HStack(spacing: 20) {
|
||||||
Button("Cancel") { dismiss() }
|
Button("Cancel") { dismiss() }
|
||||||
Button("Save group profile") { saveProfile() }
|
Button("Save group profile") { saveProfile() }
|
||||||
.disabled(groupProfile.displayName == "" || !validDisplayName(groupProfile.displayName))
|
.disabled(!canUpdateProfile())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
|
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
|
||||||
@@ -99,27 +119,39 @@ struct GroupProfileView: View {
|
|||||||
focusDisplayName = true
|
focusDisplayName = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.alert(isPresented: $showSaveErrorAlert) {
|
.alert(item: $alert) { a in
|
||||||
Alert(
|
switch a {
|
||||||
title: Text("Error saving group profile"),
|
case let .saveError(err):
|
||||||
message: Text("\(saveGroupError ?? "Unexpected error")")
|
return Alert(
|
||||||
)
|
title: Text("Error saving group profile"),
|
||||||
|
message: Text(err)
|
||||||
|
)
|
||||||
|
case let .invalidName(name):
|
||||||
|
return createInvalidNameAlert(name, $groupProfile.displayName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.contentShape(Rectangle())
|
.contentShape(Rectangle())
|
||||||
.onTapGesture { hideKeyboard() }
|
.onTapGesture { hideKeyboard() }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func canUpdateProfile() -> Bool {
|
||||||
|
groupProfile.displayName.trimmingCharacters(in: .whitespaces) != "" && validNewProfileName()
|
||||||
|
}
|
||||||
|
|
||||||
|
private func validNewProfileName() -> Bool {
|
||||||
|
groupProfile.displayName == groupInfo.groupProfile.displayName
|
||||||
|
|| validDisplayName(groupProfile.displayName.trimmingCharacters(in: .whitespaces))
|
||||||
|
}
|
||||||
|
|
||||||
func profileNameTextEdit(_ label: LocalizedStringKey, _ name: Binding<String>) -> some View {
|
func profileNameTextEdit(_ label: LocalizedStringKey, _ name: Binding<String>) -> some View {
|
||||||
TextField(label, text: name)
|
TextField(label, text: name)
|
||||||
.textInputAutocapitalization(.never)
|
.padding(.leading, 32)
|
||||||
.disableAutocorrection(true)
|
|
||||||
.padding(.bottom)
|
|
||||||
.padding(.leading, 28)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func saveProfile() {
|
func saveProfile() {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
|
groupProfile.displayName = groupProfile.displayName.trimmingCharacters(in: .whitespaces)
|
||||||
let gInfo = try await apiUpdateGroup(groupInfo.groupId, groupProfile)
|
let gInfo = try await apiUpdateGroup(groupInfo.groupId, groupProfile)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
groupInfo = gInfo
|
groupInfo = gInfo
|
||||||
@@ -128,8 +160,7 @@ struct GroupProfileView: View {
|
|||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
let err = responseError(error)
|
let err = responseError(error)
|
||||||
saveGroupError = err
|
alert = .saveError(err: err)
|
||||||
showSaveErrorAlert = true
|
|
||||||
logger.error("GroupProfile apiUpdateGroup error: \(err)")
|
logger.error("GroupProfile apiUpdateGroup error: \(err)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,55 +32,110 @@ struct ChatListNavLink: View {
|
|||||||
@State private var showJoinGroupDialog = false
|
@State private var showJoinGroupDialog = false
|
||||||
@State private var showContactConnectionInfo = false
|
@State private var showContactConnectionInfo = false
|
||||||
@State private var showInvalidJSON = false
|
@State private var showInvalidJSON = false
|
||||||
|
@State private var showDeleteContactActionSheet = false
|
||||||
|
@State private var showConnectContactViaAddressDialog = false
|
||||||
|
@State private var inProgress = false
|
||||||
|
@State private var progressByTimeout = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
switch chat.chatInfo {
|
Group {
|
||||||
case let .direct(contact):
|
switch chat.chatInfo {
|
||||||
contactNavLink(contact)
|
case let .direct(contact):
|
||||||
case let .group(groupInfo):
|
contactNavLink(contact)
|
||||||
groupNavLink(groupInfo)
|
case let .group(groupInfo):
|
||||||
case let .contactRequest(cReq):
|
groupNavLink(groupInfo)
|
||||||
contactRequestNavLink(cReq)
|
case let .contactRequest(cReq):
|
||||||
case let .contactConnection(cConn):
|
contactRequestNavLink(cReq)
|
||||||
contactConnectionNavLink(cConn)
|
case let .contactConnection(cConn):
|
||||||
case let .invalidJSON(json):
|
contactConnectionNavLink(cConn)
|
||||||
invalidJSONPreview(json)
|
case let .invalidJSON(json):
|
||||||
|
invalidJSONPreview(json)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: inProgress) { inProgress in
|
||||||
|
if inProgress {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||||
|
progressByTimeout = inProgress
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
progressByTimeout = false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func contactNavLink(_ contact: Contact) -> some View {
|
@ViewBuilder private func contactNavLink(_ contact: Contact) -> some View {
|
||||||
NavLinkPlain(
|
Group {
|
||||||
tag: chat.chatInfo.id,
|
if contact.activeConn == nil && contact.profile.contactLink != nil {
|
||||||
selection: $chatModel.chatId,
|
ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false))
|
||||||
label: { ChatPreviewView(chat: chat) }
|
.frame(height: rowHeights[dynamicTypeSize])
|
||||||
)
|
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
|
||||||
.swipeActions(edge: .leading, allowsFullSwipe: true) {
|
Button {
|
||||||
markReadButton()
|
showDeleteContactActionSheet = true
|
||||||
toggleFavoriteButton()
|
} label: {
|
||||||
toggleNtfsButton(chat)
|
Label("Delete", systemImage: "trash")
|
||||||
}
|
}
|
||||||
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
|
.tint(.red)
|
||||||
if !chat.chatItems.isEmpty {
|
}
|
||||||
clearChatButton()
|
.onTapGesture { showConnectContactViaAddressDialog = true }
|
||||||
}
|
.confirmationDialog("Connect with \(contact.chatViewName)", isPresented: $showConnectContactViaAddressDialog, titleVisibility: .visible) {
|
||||||
Button {
|
Button("Use current profile") { connectContactViaAddress_(contact, false) }
|
||||||
AlertManager.shared.showAlert(
|
Button("Use new incognito profile") { connectContactViaAddress_(contact, true) }
|
||||||
contact.ready
|
}
|
||||||
? deleteContactAlert(chat.chatInfo)
|
} else {
|
||||||
: deletePendingContactAlert(chat, contact)
|
NavLinkPlain(
|
||||||
|
tag: chat.chatInfo.id,
|
||||||
|
selection: $chatModel.chatId,
|
||||||
|
label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) }
|
||||||
|
)
|
||||||
|
.swipeActions(edge: .leading, allowsFullSwipe: true) {
|
||||||
|
markReadButton()
|
||||||
|
toggleFavoriteButton()
|
||||||
|
toggleNtfsButton(chat)
|
||||||
|
}
|
||||||
|
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
|
||||||
|
if !chat.chatItems.isEmpty {
|
||||||
|
clearChatButton()
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
if contact.ready || !contact.active {
|
||||||
|
showDeleteContactActionSheet = true
|
||||||
|
} else {
|
||||||
|
AlertManager.shared.showAlert(deletePendingContactAlert(chat, contact))
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Label("Delete", systemImage: "trash")
|
||||||
|
}
|
||||||
|
.tint(.red)
|
||||||
|
}
|
||||||
|
.frame(height: rowHeights[dynamicTypeSize])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.actionSheet(isPresented: $showDeleteContactActionSheet) {
|
||||||
|
if contact.ready && contact.active {
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text("Delete contact?\nThis cannot be undone!"),
|
||||||
|
buttons: [
|
||||||
|
.destructive(Text("Delete and notify contact")) { Task { await deleteChat(chat, notify: true) } },
|
||||||
|
.destructive(Text("Delete")) { Task { await deleteChat(chat, notify: false) } },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text("Delete contact?\nThis cannot be undone!"),
|
||||||
|
buttons: [
|
||||||
|
.destructive(Text("Delete")) { Task { await deleteChat(chat) } },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
)
|
)
|
||||||
} label: {
|
|
||||||
Label("Delete", systemImage: "trash")
|
|
||||||
}
|
}
|
||||||
.tint(.red)
|
|
||||||
}
|
}
|
||||||
.frame(height: rowHeights[dynamicTypeSize])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func groupNavLink(_ groupInfo: GroupInfo) -> some View {
|
@ViewBuilder private func groupNavLink(_ groupInfo: GroupInfo) -> some View {
|
||||||
switch (groupInfo.membership.memberStatus) {
|
switch (groupInfo.membership.memberStatus) {
|
||||||
case .memInvited:
|
case .memInvited:
|
||||||
ChatPreviewView(chat: chat)
|
ChatPreviewView(chat: chat, progressByTimeout: $progressByTimeout)
|
||||||
.frame(height: rowHeights[dynamicTypeSize])
|
.frame(height: rowHeights[dynamicTypeSize])
|
||||||
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
|
.swipeActions(edge: .trailing, allowsFullSwipe: true) {
|
||||||
joinGroupButton()
|
joinGroupButton()
|
||||||
@@ -91,12 +146,16 @@ struct ChatListNavLink: View {
|
|||||||
.onTapGesture { showJoinGroupDialog = true }
|
.onTapGesture { showJoinGroupDialog = true }
|
||||||
.confirmationDialog("Group invitation", isPresented: $showJoinGroupDialog, titleVisibility: .visible) {
|
.confirmationDialog("Group invitation", isPresented: $showJoinGroupDialog, titleVisibility: .visible) {
|
||||||
Button(chat.chatInfo.incognito ? "Join incognito" : "Join group") {
|
Button(chat.chatInfo.incognito ? "Join incognito" : "Join group") {
|
||||||
joinGroup(groupInfo.groupId)
|
inProgress = true
|
||||||
|
joinGroup(groupInfo.groupId) {
|
||||||
|
await MainActor.run { inProgress = false }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Button("Delete invitation", role: .destructive) { Task { await deleteChat(chat) } }
|
Button("Delete invitation", role: .destructive) { Task { await deleteChat(chat) } }
|
||||||
}
|
}
|
||||||
|
.disabled(inProgress)
|
||||||
case .memAccepted:
|
case .memAccepted:
|
||||||
ChatPreviewView(chat: chat)
|
ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false))
|
||||||
.frame(height: rowHeights[dynamicTypeSize])
|
.frame(height: rowHeights[dynamicTypeSize])
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
AlertManager.shared.showAlert(groupInvitationAcceptedAlert())
|
AlertManager.shared.showAlert(groupInvitationAcceptedAlert())
|
||||||
@@ -113,7 +172,7 @@ struct ChatListNavLink: View {
|
|||||||
NavLinkPlain(
|
NavLinkPlain(
|
||||||
tag: chat.chatInfo.id,
|
tag: chat.chatInfo.id,
|
||||||
selection: $chatModel.chatId,
|
selection: $chatModel.chatId,
|
||||||
label: { ChatPreviewView(chat: chat) },
|
label: { ChatPreviewView(chat: chat, progressByTimeout: Binding.constant(false)) },
|
||||||
disabled: !groupInfo.ready
|
disabled: !groupInfo.ready
|
||||||
)
|
)
|
||||||
.frame(height: rowHeights[dynamicTypeSize])
|
.frame(height: rowHeights[dynamicTypeSize])
|
||||||
@@ -138,7 +197,10 @@ struct ChatListNavLink: View {
|
|||||||
|
|
||||||
private func joinGroupButton() -> some View {
|
private func joinGroupButton() -> some View {
|
||||||
Button {
|
Button {
|
||||||
joinGroup(chat.chatInfo.apiId)
|
inProgress = true
|
||||||
|
joinGroup(chat.chatInfo.apiId) {
|
||||||
|
await MainActor.run { inProgress = false }
|
||||||
|
}
|
||||||
} label: {
|
} label: {
|
||||||
Label("Join", systemImage: chat.chatInfo.incognito ? "theatermasks" : "ipad.and.arrow.forward")
|
Label("Join", systemImage: chat.chatInfo.incognito ? "theatermasks" : "ipad.and.arrow.forward")
|
||||||
}
|
}
|
||||||
@@ -269,17 +331,6 @@ struct ChatListNavLink: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func deleteContactAlert(_ chatInfo: ChatInfo) -> Alert {
|
|
||||||
Alert(
|
|
||||||
title: Text("Delete contact?"),
|
|
||||||
message: Text("Contact and all messages will be deleted - this cannot be undone!"),
|
|
||||||
primaryButton: .destructive(Text("Delete")) {
|
|
||||||
Task { await deleteChat(chat) }
|
|
||||||
},
|
|
||||||
secondaryButton: .cancel()
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func deleteGroupAlert(_ groupInfo: GroupInfo) -> Alert {
|
private func deleteGroupAlert(_ groupInfo: GroupInfo) -> Alert {
|
||||||
Alert(
|
Alert(
|
||||||
title: Text("Delete group?"),
|
title: Text("Delete group?"),
|
||||||
@@ -381,6 +432,17 @@ struct ChatListNavLink: View {
|
|||||||
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
|
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func connectContactViaAddress_(_ contact: Contact, _ incognito: Bool) {
|
||||||
|
Task {
|
||||||
|
let ok = await connectContactViaAddress(contact.contactId, incognito)
|
||||||
|
if ok {
|
||||||
|
await MainActor.run {
|
||||||
|
chatModel.chatId = contact.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func deleteContactConnectionAlert(_ contactConnection: PendingContactConnection, showError: @escaping (ErrorAlert) -> Void, success: @escaping () -> Void = {}) -> Alert {
|
func deleteContactConnectionAlert(_ contactConnection: PendingContactConnection, showError: @escaping (ErrorAlert) -> Void, success: @escaping () -> Void = {}) -> Alert {
|
||||||
@@ -409,7 +471,22 @@ func deleteContactConnectionAlert(_ contactConnection: PendingContactConnection,
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func joinGroup(_ groupId: Int64) {
|
func connectContactViaAddress(_ contactId: Int64, _ incognito: Bool) async -> Bool {
|
||||||
|
let (contact, alert) = await apiConnectContactViaAddress(incognito: incognito, contactId: contactId)
|
||||||
|
if let alert = alert {
|
||||||
|
AlertManager.shared.showAlert(alert)
|
||||||
|
return false
|
||||||
|
} else if let contact = contact {
|
||||||
|
await MainActor.run {
|
||||||
|
ChatModel.shared.updateContact(contact)
|
||||||
|
AlertManager.shared.showAlert(connReqSentAlert(.contact))
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func joinGroup(_ groupId: Int64, _ onComplete: @escaping () async -> Void) {
|
||||||
Task {
|
Task {
|
||||||
logger.debug("joinGroup")
|
logger.debug("joinGroup")
|
||||||
do {
|
do {
|
||||||
@@ -424,7 +501,9 @@ func joinGroup(_ groupId: Int64) {
|
|||||||
AlertManager.shared.showAlertMsg(title: "No group!", message: "This group no longer exists.")
|
AlertManager.shared.showAlertMsg(title: "No group!", message: "This group no longer exists.")
|
||||||
await deleteGroup()
|
await deleteGroup()
|
||||||
}
|
}
|
||||||
|
await onComplete()
|
||||||
} catch let error {
|
} catch let error {
|
||||||
|
await onComplete()
|
||||||
let a = getErrorAlert(error, "Error joining group")
|
let a = getErrorAlert(error, "Error joining group")
|
||||||
AlertManager.shared.showAlertMsg(title: a.title, message: a.message)
|
AlertManager.shared.showAlertMsg(title: a.title, message: a.message)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ struct ChatListView: View {
|
|||||||
@State private var searchText = ""
|
@State private var searchText = ""
|
||||||
@State private var showAddChat = false
|
@State private var showAddChat = false
|
||||||
@State private var userPickerVisible = false
|
@State private var userPickerVisible = false
|
||||||
|
@State private var showConnectDesktop = false
|
||||||
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
|
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -29,7 +30,7 @@ struct ChatListView: View {
|
|||||||
ZStack(alignment: .topLeading) {
|
ZStack(alignment: .topLeading) {
|
||||||
NavStackCompat(
|
NavStackCompat(
|
||||||
isActive: Binding(
|
isActive: Binding(
|
||||||
get: { ChatModel.shared.chatId != nil },
|
get: { chatModel.chatId != nil },
|
||||||
set: { _ in }
|
set: { _ in }
|
||||||
),
|
),
|
||||||
destination: chatView
|
destination: chatView
|
||||||
@@ -48,7 +49,14 @@ struct ChatListView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UserPicker(showSettings: $showSettings, userPickerVisible: $userPickerVisible)
|
UserPicker(
|
||||||
|
showSettings: $showSettings,
|
||||||
|
showConnectDesktop: $showConnectDesktop,
|
||||||
|
userPickerVisible: $userPickerVisible
|
||||||
|
)
|
||||||
|
}
|
||||||
|
.sheet(isPresented: $showConnectDesktop) {
|
||||||
|
ConnectDesktopView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -177,13 +185,6 @@ struct ChatListView: View {
|
|||||||
showAddChat = true
|
showAddChat = true
|
||||||
}
|
}
|
||||||
|
|
||||||
connectButton("or chat with the developers") {
|
|
||||||
DispatchQueue.main.async {
|
|
||||||
UIApplication.shared.open(simplexTeamURL)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.padding(.top, 10)
|
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
Text("You have no chats")
|
Text("You have no chats")
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import SimpleXChat
|
|||||||
struct ChatPreviewView: View {
|
struct ChatPreviewView: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
|
@Binding var progressByTimeout: Bool
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
var darkGreen = Color(red: 0, green: 0.5, blue: 0)
|
var darkGreen = Color(red: 0, green: 0.5, blue: 0)
|
||||||
|
|
||||||
@@ -57,19 +58,26 @@ struct ChatPreviewView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func chatPreviewImageOverlayIcon() -> some View {
|
@ViewBuilder private func chatPreviewImageOverlayIcon() -> some View {
|
||||||
if case let .group(groupInfo) = chat.chatInfo {
|
switch chat.chatInfo {
|
||||||
|
case let .direct(contact):
|
||||||
|
if !contact.active {
|
||||||
|
inactiveIcon()
|
||||||
|
} else {
|
||||||
|
EmptyView()
|
||||||
|
}
|
||||||
|
case let .group(groupInfo):
|
||||||
switch (groupInfo.membership.memberStatus) {
|
switch (groupInfo.membership.memberStatus) {
|
||||||
case .memLeft: groupInactiveIcon()
|
case .memLeft: inactiveIcon()
|
||||||
case .memRemoved: groupInactiveIcon()
|
case .memRemoved: inactiveIcon()
|
||||||
case .memGroupDeleted: groupInactiveIcon()
|
case .memGroupDeleted: inactiveIcon()
|
||||||
default: EmptyView()
|
default: EmptyView()
|
||||||
}
|
}
|
||||||
} else {
|
default:
|
||||||
EmptyView()
|
EmptyView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func groupInactiveIcon() -> some View {
|
@ViewBuilder private func inactiveIcon() -> some View {
|
||||||
Image(systemName: "multiply.circle.fill")
|
Image(systemName: "multiply.circle.fill")
|
||||||
.foregroundColor(.secondary.opacity(0.65))
|
.foregroundColor(.secondary.opacity(0.65))
|
||||||
.background(Circle().foregroundColor(Color(uiColor: .systemBackground)))
|
.background(Circle().foregroundColor(Color(uiColor: .systemBackground)))
|
||||||
@@ -80,7 +88,6 @@ struct ChatPreviewView: View {
|
|||||||
switch chat.chatInfo {
|
switch chat.chatInfo {
|
||||||
case let .direct(contact):
|
case let .direct(contact):
|
||||||
previewTitle(contact.verified == true ? verifiedIcon + t : t)
|
previewTitle(contact.verified == true ? verifiedIcon + t : t)
|
||||||
.foregroundColor(chat.chatInfo.ready ? .primary : .secondary)
|
|
||||||
case let .group(groupInfo):
|
case let .group(groupInfo):
|
||||||
let v = previewTitle(t)
|
let v = previewTitle(t)
|
||||||
switch (groupInfo.membership.memberStatus) {
|
switch (groupInfo.membership.memberStatus) {
|
||||||
@@ -105,14 +112,17 @@ struct ChatPreviewView: View {
|
|||||||
|
|
||||||
private func chatPreviewLayout(_ text: Text, draft: Bool = false) -> some View {
|
private func chatPreviewLayout(_ text: Text, draft: Bool = false) -> some View {
|
||||||
ZStack(alignment: .topTrailing) {
|
ZStack(alignment: .topTrailing) {
|
||||||
text
|
let t = text
|
||||||
.lineLimit(2)
|
.lineLimit(2)
|
||||||
.multilineTextAlignment(.leading)
|
.multilineTextAlignment(.leading)
|
||||||
.frame(maxWidth: .infinity, alignment: .topLeading)
|
.frame(maxWidth: .infinity, alignment: .topLeading)
|
||||||
.padding(.leading, 8)
|
.padding(.leading, 8)
|
||||||
.padding(.trailing, 36)
|
.padding(.trailing, 36)
|
||||||
.privacySensitive(!showChatPreviews && !draft)
|
if !showChatPreviews && !draft {
|
||||||
.redacted(reason: .privacy)
|
t.privacySensitive(true).redacted(reason: .privacy)
|
||||||
|
} else {
|
||||||
|
t
|
||||||
|
}
|
||||||
let s = chat.chatStats
|
let s = chat.chatStats
|
||||||
if s.unreadCount > 0 || s.unreadChat {
|
if s.unreadCount > 0 || s.unreadChat {
|
||||||
unreadCountText(s.unreadCount)
|
unreadCountText(s.unreadCount)
|
||||||
@@ -180,10 +190,13 @@ struct ChatPreviewView: View {
|
|||||||
} else {
|
} else {
|
||||||
switch (chat.chatInfo) {
|
switch (chat.chatInfo) {
|
||||||
case let .direct(contact):
|
case let .direct(contact):
|
||||||
if !contact.ready {
|
if contact.activeConn == nil && contact.profile.contactLink != nil {
|
||||||
|
chatPreviewInfoText("Tap to Connect")
|
||||||
|
.foregroundColor(.accentColor)
|
||||||
|
} else if !contact.ready && contact.activeConn != nil {
|
||||||
if contact.nextSendGrpInv {
|
if contact.nextSendGrpInv {
|
||||||
chatPreviewInfoText("send direct message")
|
chatPreviewInfoText("send direct message")
|
||||||
} else {
|
} else if contact.active {
|
||||||
chatPreviewInfoText("connecting…")
|
chatPreviewInfoText("connecting…")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -228,16 +241,26 @@ struct ChatPreviewView: View {
|
|||||||
@ViewBuilder private func chatStatusImage() -> some View {
|
@ViewBuilder private func chatStatusImage() -> some View {
|
||||||
switch chat.chatInfo {
|
switch chat.chatInfo {
|
||||||
case let .direct(contact):
|
case let .direct(contact):
|
||||||
switch (chatModel.contactNetworkStatus(contact)) {
|
if contact.active && contact.activeConn != nil {
|
||||||
case .connected: incognitoIcon(chat.chatInfo.incognito)
|
switch (chatModel.contactNetworkStatus(contact)) {
|
||||||
case .error:
|
case .connected: incognitoIcon(chat.chatInfo.incognito)
|
||||||
Image(systemName: "exclamationmark.circle")
|
case .error:
|
||||||
.resizable()
|
Image(systemName: "exclamationmark.circle")
|
||||||
.scaledToFit()
|
.resizable()
|
||||||
.frame(width: 17, height: 17)
|
.scaledToFit()
|
||||||
.foregroundColor(.secondary)
|
.frame(width: 17, height: 17)
|
||||||
default:
|
.foregroundColor(.secondary)
|
||||||
|
default:
|
||||||
|
ProgressView()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
incognitoIcon(chat.chatInfo.incognito)
|
||||||
|
}
|
||||||
|
case .group:
|
||||||
|
if progressByTimeout {
|
||||||
ProgressView()
|
ProgressView()
|
||||||
|
} else {
|
||||||
|
incognitoIcon(chat.chatInfo.incognito)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
incognitoIcon(chat.chatInfo.incognito)
|
incognitoIcon(chat.chatInfo.incognito)
|
||||||
@@ -267,30 +290,30 @@ struct ChatPreviewView_Previews: PreviewProvider {
|
|||||||
ChatPreviewView(chat: Chat(
|
ChatPreviewView(chat: Chat(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chatInfo: ChatInfo.sampleData.direct,
|
||||||
chatItems: []
|
chatItems: []
|
||||||
))
|
), progressByTimeout: Binding.constant(false))
|
||||||
ChatPreviewView(chat: Chat(
|
ChatPreviewView(chat: Chat(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chatInfo: ChatInfo.sampleData.direct,
|
||||||
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))]
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))]
|
||||||
))
|
), progressByTimeout: Binding.constant(false))
|
||||||
ChatPreviewView(chat: Chat(
|
ChatPreviewView(chat: Chat(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chatInfo: ChatInfo.sampleData.direct,
|
||||||
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))],
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))],
|
||||||
chatStats: ChatStats(unreadCount: 11, minUnreadItemId: 0)
|
chatStats: ChatStats(unreadCount: 11, minUnreadItemId: 0)
|
||||||
))
|
), progressByTimeout: Binding.constant(false))
|
||||||
ChatPreviewView(chat: Chat(
|
ChatPreviewView(chat: Chat(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chatInfo: ChatInfo.sampleData.direct,
|
||||||
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now))]
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete), itemDeleted: .deleted(deletedTs: .now))]
|
||||||
))
|
), progressByTimeout: Binding.constant(false))
|
||||||
ChatPreviewView(chat: Chat(
|
ChatPreviewView(chat: Chat(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chatInfo: ChatInfo.sampleData.direct,
|
||||||
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))],
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello", .sndSent(sndProgress: .complete))],
|
||||||
chatStats: ChatStats(unreadCount: 3, minUnreadItemId: 0)
|
chatStats: ChatStats(unreadCount: 3, minUnreadItemId: 0)
|
||||||
))
|
), progressByTimeout: Binding.constant(false))
|
||||||
ChatPreviewView(chat: Chat(
|
ChatPreviewView(chat: Chat(
|
||||||
chatInfo: ChatInfo.sampleData.group,
|
chatInfo: ChatInfo.sampleData.group,
|
||||||
chatItems: [ChatItem.getSample(1, .directSnd, .now, "Lorem ipsum dolor sit amet, d. consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")],
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "Lorem ipsum dolor sit amet, d. consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.")],
|
||||||
chatStats: ChatStats(unreadCount: 11, minUnreadItemId: 0)
|
chatStats: ChatStats(unreadCount: 11, minUnreadItemId: 0)
|
||||||
))
|
), progressByTimeout: Binding.constant(false))
|
||||||
}
|
}
|
||||||
.previewLayout(.fixed(width: 360, height: 78))
|
.previewLayout(.fixed(width: 360, height: 78))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ struct ContactConnectionInfo: View {
|
|||||||
|
|
||||||
if contactConnection.initiated,
|
if contactConnection.initiated,
|
||||||
let connReqInv = contactConnection.connReqInv {
|
let connReqInv = contactConnection.connReqInv {
|
||||||
QRCode(uri: connReqInv)
|
SimpleXLinkQRCode(uri: simplexChatLink(connReqInv))
|
||||||
incognitoEnabled()
|
incognitoEnabled()
|
||||||
shareLinkButton(connReqInv)
|
shareLinkButton(connReqInv)
|
||||||
oneTimeLinkLearnMoreButton()
|
oneTimeLinkLearnMoreButton()
|
||||||
@@ -119,7 +119,7 @@ struct ContactConnectionInfo: View {
|
|||||||
if let conn = try await apiSetConnectionAlias(connId: contactConnection.pccConnId, localAlias: localAlias) {
|
if let conn = try await apiSetConnectionAlias(connId: contactConnection.pccConnId, localAlias: localAlias) {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
contactConnection = conn
|
contactConnection = conn
|
||||||
ChatModel.shared.updateContactConnection(conn)
|
m.updateContactConnection(conn)
|
||||||
dismiss()
|
dismiss()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ struct UserPicker: View {
|
|||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
@Binding var showSettings: Bool
|
@Binding var showSettings: Bool
|
||||||
|
@Binding var showConnectDesktop: Bool
|
||||||
@Binding var userPickerVisible: Bool
|
@Binding var userPickerVisible: Bool
|
||||||
@State var scrollViewContentSize: CGSize = .zero
|
@State var scrollViewContentSize: CGSize = .zero
|
||||||
@State var disableScrolling: Bool = true
|
@State var disableScrolling: Bool = true
|
||||||
@@ -62,6 +63,13 @@ struct UserPicker: View {
|
|||||||
.simultaneousGesture(DragGesture(minimumDistance: disableScrolling ? 0 : 10000000))
|
.simultaneousGesture(DragGesture(minimumDistance: disableScrolling ? 0 : 10000000))
|
||||||
.frame(maxHeight: scrollViewContentSize.height)
|
.frame(maxHeight: scrollViewContentSize.height)
|
||||||
|
|
||||||
|
menuButton("Use from desktop", icon: "desktopcomputer") {
|
||||||
|
showConnectDesktop = true
|
||||||
|
withAnimation {
|
||||||
|
userPickerVisible.toggle()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Divider()
|
||||||
menuButton("Settings", icon: "gearshape") {
|
menuButton("Settings", icon: "gearshape") {
|
||||||
showSettings = true
|
showSettings = true
|
||||||
withAnimation {
|
withAnimation {
|
||||||
@@ -85,7 +93,7 @@ struct UserPicker: View {
|
|||||||
do {
|
do {
|
||||||
m.users = try listUsers()
|
m.users = try listUsers()
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("Error updating users \(responseError(error))")
|
logger.error("Error loading users \(responseError(error))")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -144,7 +152,8 @@ struct UserPicker: View {
|
|||||||
.overlay(DetermineWidth())
|
.overlay(DetermineWidth())
|
||||||
Spacer()
|
Spacer()
|
||||||
Image(systemName: icon)
|
Image(systemName: icon)
|
||||||
// .frame(width: 24, alignment: .center)
|
.symbolRenderingMode(.monochrome)
|
||||||
|
.foregroundColor(.secondary)
|
||||||
}
|
}
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
.padding(.vertical, 22)
|
.padding(.vertical, 22)
|
||||||
@@ -170,6 +179,7 @@ struct UserPicker_Previews: PreviewProvider {
|
|||||||
m.users = [UserInfo.sampleData, UserInfo.sampleData]
|
m.users = [UserInfo.sampleData, UserInfo.sampleData]
|
||||||
return UserPicker(
|
return UserPicker(
|
||||||
showSettings: Binding.constant(false),
|
showSettings: Binding.constant(false),
|
||||||
|
showConnectDesktop: Binding.constant(false),
|
||||||
userPickerVisible: Binding.constant(true)
|
userPickerVisible: Binding.constant(true)
|
||||||
)
|
)
|
||||||
.environmentObject(m)
|
.environmentObject(m)
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import AVKit
|
import AVKit
|
||||||
|
import Combine
|
||||||
|
|
||||||
struct VideoPlayerView: UIViewRepresentable {
|
struct VideoPlayerView: UIViewRepresentable {
|
||||||
|
|
||||||
@@ -37,6 +38,14 @@ struct VideoPlayerView: UIViewRepresentable {
|
|||||||
player.seek(to: CMTime.zero)
|
player.seek(to: CMTime.zero)
|
||||||
player.play()
|
player.play()
|
||||||
}
|
}
|
||||||
|
var played = false
|
||||||
|
context.coordinator.publisher = player.publisher(for: \.timeControlStatus).sink { status in
|
||||||
|
if played || status == .playing {
|
||||||
|
AppDelegate.keepScreenOn(status == .playing)
|
||||||
|
AudioPlayer.changeAudioSession(status == .playing)
|
||||||
|
}
|
||||||
|
played = status == .playing
|
||||||
|
}
|
||||||
return controller.view
|
return controller.view
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -50,12 +59,13 @@ struct VideoPlayerView: UIViewRepresentable {
|
|||||||
class Coordinator: NSObject {
|
class Coordinator: NSObject {
|
||||||
var controller: AVPlayerViewController?
|
var controller: AVPlayerViewController?
|
||||||
var timeObserver: Any? = nil
|
var timeObserver: Any? = nil
|
||||||
|
var publisher: AnyCancellable? = nil
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
print("deinit coordinator of VideoPlayer")
|
|
||||||
if let timeObserver = timeObserver {
|
if let timeObserver = timeObserver {
|
||||||
NotificationCenter.default.removeObserver(timeObserver)
|
NotificationCenter.default.removeObserver(timeObserver)
|
||||||
}
|
}
|
||||||
|
publisher?.cancel()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ struct AddContactView: View {
|
|||||||
List {
|
List {
|
||||||
Section {
|
Section {
|
||||||
if connReqInvitation != "" {
|
if connReqInvitation != "" {
|
||||||
QRCode(uri: connReqInvitation)
|
SimpleXLinkQRCode(uri: connReqInvitation)
|
||||||
} else {
|
} else {
|
||||||
ProgressView()
|
ProgressView()
|
||||||
.progressViewStyle(.circular)
|
.progressViewStyle(.circular)
|
||||||
@@ -48,7 +48,7 @@ struct AddContactView: View {
|
|||||||
let conn = try await apiSetConnectionIncognito(connId: contactConn.pccConnId, incognito: incognito) {
|
let conn = try await apiSetConnectionIncognito(connId: contactConn.pccConnId, incognito: incognito) {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
contactConnection = conn
|
contactConnection = conn
|
||||||
ChatModel.shared.updateContactConnection(conn)
|
chatModel.updateContactConnection(conn)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@@ -99,7 +99,7 @@ func sharedProfileInfo(_ incognito: Bool) -> Text {
|
|||||||
|
|
||||||
func shareLinkButton(_ connReqInvitation: String) -> some View {
|
func shareLinkButton(_ connReqInvitation: String) -> some View {
|
||||||
Button {
|
Button {
|
||||||
showShareSheet(items: [connReqInvitation])
|
showShareSheet(items: [simplexChatLink(connReqInvitation)])
|
||||||
} label: {
|
} label: {
|
||||||
settingsRow("square.and.arrow.up") {
|
settingsRow("square.and.arrow.up") {
|
||||||
Text("Share 1-time link")
|
Text("Share 1-time link")
|
||||||
|
|||||||
@@ -12,27 +12,45 @@ import SimpleXChat
|
|||||||
struct AddGroupView: View {
|
struct AddGroupView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
|
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
||||||
@State private var chat: Chat?
|
@State private var chat: Chat?
|
||||||
@State private var groupInfo: GroupInfo?
|
@State private var groupInfo: GroupInfo?
|
||||||
@State private var profile = GroupProfile(displayName: "", fullName: "")
|
@State private var profile = GroupProfile(displayName: "", fullName: "")
|
||||||
@FocusState private var focusDisplayName
|
@FocusState private var focusDisplayName
|
||||||
@FocusState private var focusFullName
|
|
||||||
@State private var showChooseSource = false
|
@State private var showChooseSource = false
|
||||||
@State private var showImagePicker = false
|
@State private var showImagePicker = false
|
||||||
@State private var showTakePhoto = false
|
@State private var showTakePhoto = false
|
||||||
@State private var chosenImage: UIImage? = nil
|
@State private var chosenImage: UIImage? = nil
|
||||||
|
@State private var showInvalidNameAlert = false
|
||||||
|
@State private var groupLink: String?
|
||||||
|
@State private var groupLinkMemberRole: GroupMemberRole = .member
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
if let chat = chat, let groupInfo = groupInfo {
|
if let chat = chat, let groupInfo = groupInfo {
|
||||||
AddGroupMembersViewCommon(
|
if !groupInfo.membership.memberIncognito {
|
||||||
chat: chat,
|
AddGroupMembersViewCommon(
|
||||||
groupInfo: groupInfo,
|
chat: chat,
|
||||||
creatingGroup: true,
|
groupInfo: groupInfo,
|
||||||
showFooterCounter: false
|
creatingGroup: true,
|
||||||
) { _ in
|
showFooterCounter: false
|
||||||
dismiss()
|
) { _ in
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
dismiss()
|
||||||
m.chatId = groupInfo.id
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||||
|
m.chatId = groupInfo.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
GroupLinkView(
|
||||||
|
groupId: groupInfo.groupId,
|
||||||
|
groupLink: $groupLink,
|
||||||
|
groupLinkMemberRole: $groupLinkMemberRole,
|
||||||
|
showTitle: true,
|
||||||
|
creatingGroup: true
|
||||||
|
) {
|
||||||
|
dismiss()
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||||
|
m.chatId = groupInfo.id
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -41,79 +59,62 @@ struct AddGroupView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func createGroupView() -> some View {
|
func createGroupView() -> some View {
|
||||||
VStack(alignment: .leading) {
|
List {
|
||||||
Text("Create secret group")
|
Group {
|
||||||
.font(.largeTitle)
|
Text("Create secret group")
|
||||||
.padding(.vertical, 4)
|
.font(.largeTitle)
|
||||||
Text("The group is fully decentralized – it is visible only to the members.")
|
.bold()
|
||||||
.padding(.bottom, 4)
|
.fixedSize(horizontal: false, vertical: true)
|
||||||
|
.padding(.bottom, 24)
|
||||||
|
.onTapGesture(perform: hideKeyboard)
|
||||||
|
|
||||||
HStack {
|
ZStack(alignment: .center) {
|
||||||
Image(systemName: "info.circle").foregroundColor(.secondary).font(.footnote)
|
ZStack(alignment: .topTrailing) {
|
||||||
Spacer().frame(width: 8)
|
ProfileImage(imageStr: profile.image, color: Color(uiColor: .secondarySystemGroupedBackground))
|
||||||
Text("Your chat profile will be sent to group members").font(.footnote)
|
.aspectRatio(1, contentMode: .fit)
|
||||||
}
|
.frame(maxWidth: 128, maxHeight: 128)
|
||||||
.padding(.bottom)
|
if profile.image != nil {
|
||||||
|
Button {
|
||||||
ZStack(alignment: .center) {
|
profile.image = nil
|
||||||
ZStack(alignment: .topTrailing) {
|
} label: {
|
||||||
profileImageView(profile.image)
|
Image(systemName: "multiply")
|
||||||
if profile.image != nil {
|
.resizable()
|
||||||
Button {
|
.aspectRatio(contentMode: .fit)
|
||||||
profile.image = nil
|
.frame(width: 12)
|
||||||
} label: {
|
}
|
||||||
Image(systemName: "multiply")
|
|
||||||
.resizable()
|
|
||||||
.aspectRatio(contentMode: .fit)
|
|
||||||
.frame(width: 12)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
editImageButton { showChooseSource = true }
|
||||||
|
.buttonStyle(BorderlessButtonStyle()) // otherwise whole "list row" is clickable
|
||||||
}
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
editImageButton { showChooseSource = true }
|
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, alignment: .center)
|
.listRowBackground(Color.clear)
|
||||||
.padding(.bottom, 4)
|
.listRowSeparator(.hidden)
|
||||||
|
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
|
||||||
|
|
||||||
ZStack(alignment: .topLeading) {
|
Section {
|
||||||
if !validDisplayName(profile.displayName) {
|
groupNameTextField()
|
||||||
Image(systemName: "exclamationmark.circle")
|
Button(action: createGroup) {
|
||||||
.foregroundColor(.red)
|
settingsRow("checkmark", color: .accentColor) { Text("Create group") }
|
||||||
.padding(.top, 4)
|
|
||||||
}
|
}
|
||||||
textField("Group display name", text: $profile.displayName)
|
.disabled(!canCreateProfile())
|
||||||
.focused($focusDisplayName)
|
IncognitoToggle(incognitoEnabled: $incognitoDefault)
|
||||||
.submitLabel(.next)
|
} footer: {
|
||||||
.onSubmit {
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
if canCreateProfile() { focusFullName = true }
|
sharedGroupProfileInfo(incognitoDefault)
|
||||||
else { focusDisplayName = true }
|
Text("Fully decentralized – visible only to members.")
|
||||||
}
|
|
||||||
}
|
|
||||||
textField("Group full name (optional)", text: $profile.fullName)
|
|
||||||
.focused($focusFullName)
|
|
||||||
.submitLabel(.go)
|
|
||||||
.onSubmit {
|
|
||||||
if canCreateProfile() { createGroup() }
|
|
||||||
else { focusFullName = true }
|
|
||||||
}
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
Spacer()
|
.onTapGesture(perform: hideKeyboard)
|
||||||
|
|
||||||
Button {
|
|
||||||
createGroup()
|
|
||||||
} label: {
|
|
||||||
Text("Create")
|
|
||||||
Image(systemName: "greaterthan")
|
|
||||||
}
|
}
|
||||||
.disabled(!canCreateProfile())
|
|
||||||
.frame(maxWidth: .infinity, alignment: .trailing)
|
|
||||||
}
|
}
|
||||||
.onAppear() {
|
.onAppear() {
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||||
focusDisplayName = true
|
focusDisplayName = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding()
|
|
||||||
.confirmationDialog("Group image", isPresented: $showChooseSource, titleVisibility: .visible) {
|
.confirmationDialog("Group image", isPresented: $showChooseSource, titleVisibility: .visible) {
|
||||||
Button("Take picture") {
|
Button("Take picture") {
|
||||||
showTakePhoto = true
|
showTakePhoto = true
|
||||||
@@ -133,6 +134,9 @@ struct AddGroupView: View {
|
|||||||
didSelectItem in showImagePicker = false
|
didSelectItem in showImagePicker = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.alert(isPresented: $showInvalidNameAlert) {
|
||||||
|
createInvalidNameAlert(mkValidName(profile.displayName), $profile.displayName)
|
||||||
|
}
|
||||||
.onChange(of: chosenImage) { image in
|
.onChange(of: chosenImage) { image in
|
||||||
if let image = image {
|
if let image = image {
|
||||||
profile.image = resizeImageToStrSize(cropToSquare(image), maxDataSize: 12500)
|
profile.image = resizeImageToStrSize(cropToSquare(image), maxDataSize: 12500)
|
||||||
@@ -140,26 +144,52 @@ struct AddGroupView: View {
|
|||||||
profile.image = nil
|
profile.image = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.contentShape(Rectangle())
|
}
|
||||||
.onTapGesture { hideKeyboard() }
|
|
||||||
|
func groupNameTextField() -> some View {
|
||||||
|
ZStack(alignment: .leading) {
|
||||||
|
let name = profile.displayName.trimmingCharacters(in: .whitespaces)
|
||||||
|
if name != mkValidName(name) {
|
||||||
|
Button {
|
||||||
|
showInvalidNameAlert = true
|
||||||
|
} label: {
|
||||||
|
Image(systemName: "exclamationmark.circle").foregroundColor(.red)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Image(systemName: "pencil").foregroundColor(.secondary)
|
||||||
|
}
|
||||||
|
textField("Enter group name…", text: $profile.displayName)
|
||||||
|
.focused($focusDisplayName)
|
||||||
|
.submitLabel(.continue)
|
||||||
|
.onSubmit {
|
||||||
|
if canCreateProfile() { createGroup() }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func textField(_ placeholder: LocalizedStringKey, text: Binding<String>) -> some View {
|
func textField(_ placeholder: LocalizedStringKey, text: Binding<String>) -> some View {
|
||||||
TextField(placeholder, text: text)
|
TextField(placeholder, text: text)
|
||||||
.textInputAutocapitalization(.never)
|
.padding(.leading, 36)
|
||||||
.disableAutocorrection(true)
|
}
|
||||||
.padding(.leading, 28)
|
|
||||||
.padding(.bottom)
|
func sharedGroupProfileInfo(_ incognito: Bool) -> Text {
|
||||||
|
let name = ChatModel.shared.currentUser?.displayName ?? ""
|
||||||
|
return Text(
|
||||||
|
incognito
|
||||||
|
? "A new random profile will be shared."
|
||||||
|
: "Your profile **\(name)** will be shared."
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func createGroup() {
|
func createGroup() {
|
||||||
hideKeyboard()
|
hideKeyboard()
|
||||||
do {
|
do {
|
||||||
let gInfo = try apiNewGroup(profile)
|
profile.displayName = profile.displayName.trimmingCharacters(in: .whitespaces)
|
||||||
|
let gInfo = try apiNewGroup(incognito: incognitoDefault, groupProfile: profile)
|
||||||
Task {
|
Task {
|
||||||
let groupMembers = await apiListMembers(gInfo.groupId)
|
let groupMembers = await apiListMembers(gInfo.groupId)
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
ChatModel.shared.groupMembers = groupMembers
|
m.groupMembers = groupMembers.map { GMember.init($0) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let c = Chat(chatInfo: .group(groupInfo: gInfo), chatItems: [])
|
let c = Chat(chatInfo: .group(groupInfo: gInfo), chatItems: [])
|
||||||
@@ -180,7 +210,8 @@ struct AddGroupView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func canCreateProfile() -> Bool {
|
func canCreateProfile() -> Bool {
|
||||||
profile.displayName != "" && validDisplayName(profile.displayName)
|
let name = profile.displayName.trimmingCharacters(in: .whitespaces)
|
||||||
|
return name != "" && validDisplayName(name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -58,65 +58,398 @@ struct NewChatButton: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum ConnReqType: Equatable {
|
enum PlanAndConnectAlert: Identifiable {
|
||||||
case contact
|
case ownInvitationLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool)
|
||||||
case invitation
|
case invitationLinkConnecting(connectionLink: String)
|
||||||
|
case ownContactAddressConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool)
|
||||||
|
case contactAddressConnectingConfirmReconnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool)
|
||||||
|
case groupLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool)
|
||||||
|
case groupLinkConnectingConfirmReconnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool)
|
||||||
|
case groupLinkConnecting(connectionLink: String, groupInfo: GroupInfo?)
|
||||||
|
|
||||||
|
var id: String {
|
||||||
|
switch self {
|
||||||
|
case let .ownInvitationLinkConfirmConnect(connectionLink, _, _): return "ownInvitationLinkConfirmConnect \(connectionLink)"
|
||||||
|
case let .invitationLinkConnecting(connectionLink): return "invitationLinkConnecting \(connectionLink)"
|
||||||
|
case let .ownContactAddressConfirmConnect(connectionLink, _, _): return "ownContactAddressConfirmConnect \(connectionLink)"
|
||||||
|
case let .contactAddressConnectingConfirmReconnect(connectionLink, _, _): return "contactAddressConnectingConfirmReconnect \(connectionLink)"
|
||||||
|
case let .groupLinkConfirmConnect(connectionLink, _, _): return "groupLinkConfirmConnect \(connectionLink)"
|
||||||
|
case let .groupLinkConnectingConfirmReconnect(connectionLink, _, _): return "groupLinkConnectingConfirmReconnect \(connectionLink)"
|
||||||
|
case let .groupLinkConnecting(connectionLink, _): return "groupLinkConnecting \(connectionLink)"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func connectViaLink(_ connectionLink: String, dismiss: DismissAction? = nil, incognito: Bool) {
|
func planAndConnectAlert(_ alert: PlanAndConnectAlert, dismiss: Bool) -> Alert {
|
||||||
Task {
|
switch alert {
|
||||||
if let connReqType = await apiConnect(incognito: incognito, connReq: connectionLink) {
|
case let .ownInvitationLinkConfirmConnect(connectionLink, connectionPlan, incognito):
|
||||||
DispatchQueue.main.async {
|
return Alert(
|
||||||
dismiss?()
|
title: Text("Connect to yourself?"),
|
||||||
AlertManager.shared.showAlert(connReqSentAlert(connReqType))
|
message: Text("This is your own one-time link!"),
|
||||||
}
|
primaryButton: .destructive(
|
||||||
|
Text(incognito ? "Connect incognito" : "Connect"),
|
||||||
|
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) }
|
||||||
|
),
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
case .invitationLinkConnecting:
|
||||||
|
return Alert(
|
||||||
|
title: Text("Already connecting!"),
|
||||||
|
message: Text("You are already connecting via this one-time link!")
|
||||||
|
)
|
||||||
|
case let .ownContactAddressConfirmConnect(connectionLink, connectionPlan, incognito):
|
||||||
|
return Alert(
|
||||||
|
title: Text("Connect to yourself?"),
|
||||||
|
message: Text("This is your own SimpleX address!"),
|
||||||
|
primaryButton: .destructive(
|
||||||
|
Text(incognito ? "Connect incognito" : "Connect"),
|
||||||
|
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) }
|
||||||
|
),
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
case let .contactAddressConnectingConfirmReconnect(connectionLink, connectionPlan, incognito):
|
||||||
|
return Alert(
|
||||||
|
title: Text("Repeat connection request?"),
|
||||||
|
message: Text("You have already requested connection via this address!"),
|
||||||
|
primaryButton: .destructive(
|
||||||
|
Text(incognito ? "Connect incognito" : "Connect"),
|
||||||
|
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) }
|
||||||
|
),
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
case let .groupLinkConfirmConnect(connectionLink, connectionPlan, incognito):
|
||||||
|
return Alert(
|
||||||
|
title: Text("Join group?"),
|
||||||
|
message: Text("You will connect to all group members."),
|
||||||
|
primaryButton: .default(
|
||||||
|
Text(incognito ? "Join incognito" : "Join"),
|
||||||
|
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) }
|
||||||
|
),
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
case let .groupLinkConnectingConfirmReconnect(connectionLink, connectionPlan, incognito):
|
||||||
|
return Alert(
|
||||||
|
title: Text("Repeat join request?"),
|
||||||
|
message: Text("You are already joining the group via this link!"),
|
||||||
|
primaryButton: .destructive(
|
||||||
|
Text(incognito ? "Join incognito" : "Join"),
|
||||||
|
action: { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) }
|
||||||
|
),
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
case let .groupLinkConnecting(_, groupInfo):
|
||||||
|
if let groupInfo = groupInfo {
|
||||||
|
return Alert(
|
||||||
|
title: Text("Group already exists!"),
|
||||||
|
message: Text("You are already joining the group \(groupInfo.displayName).")
|
||||||
|
)
|
||||||
} else {
|
} else {
|
||||||
DispatchQueue.main.async {
|
return Alert(
|
||||||
dismiss?()
|
title: Text("Already joining the group!"),
|
||||||
|
message: Text("You are already joining the group via this link.")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
enum PlanAndConnectActionSheet: Identifiable {
|
||||||
|
case askCurrentOrIncognitoProfile(connectionLink: String, connectionPlan: ConnectionPlan?, title: LocalizedStringKey)
|
||||||
|
case askCurrentOrIncognitoProfileDestructive(connectionLink: String, connectionPlan: ConnectionPlan, title: LocalizedStringKey)
|
||||||
|
case askCurrentOrIncognitoProfileConnectContactViaAddress(contact: Contact)
|
||||||
|
case ownGroupLinkConfirmConnect(connectionLink: String, connectionPlan: ConnectionPlan, incognito: Bool?, groupInfo: GroupInfo)
|
||||||
|
|
||||||
|
var id: String {
|
||||||
|
switch self {
|
||||||
|
case let .askCurrentOrIncognitoProfile(connectionLink, _, _): return "askCurrentOrIncognitoProfile \(connectionLink)"
|
||||||
|
case let .askCurrentOrIncognitoProfileDestructive(connectionLink, _, _): return "askCurrentOrIncognitoProfileDestructive \(connectionLink)"
|
||||||
|
case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact): return "askCurrentOrIncognitoProfileConnectContactViaAddress \(contact.contactId)"
|
||||||
|
case let .ownGroupLinkConfirmConnect(connectionLink, _, _, _): return "ownGroupLinkConfirmConnect \(connectionLink)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func planAndConnectActionSheet(_ sheet: PlanAndConnectActionSheet, dismiss: Bool) -> ActionSheet {
|
||||||
|
switch sheet {
|
||||||
|
case let .askCurrentOrIncognitoProfile(connectionLink, connectionPlan, title):
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text(title),
|
||||||
|
buttons: [
|
||||||
|
.default(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false) },
|
||||||
|
.default(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true) },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
case let .askCurrentOrIncognitoProfileDestructive(connectionLink, connectionPlan, title):
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text(title),
|
||||||
|
buttons: [
|
||||||
|
.destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false) },
|
||||||
|
.destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true) },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
case let .askCurrentOrIncognitoProfileConnectContactViaAddress(contact):
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text("Connect with \(contact.chatViewName)"),
|
||||||
|
buttons: [
|
||||||
|
.default(Text("Use current profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: false) },
|
||||||
|
.default(Text("Use new incognito profile")) { connectContactViaAddress_(contact, dismiss: dismiss, incognito: true) },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
case let .ownGroupLinkConfirmConnect(connectionLink, connectionPlan, incognito, groupInfo):
|
||||||
|
if let incognito = incognito {
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"),
|
||||||
|
buttons: [
|
||||||
|
.default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) },
|
||||||
|
.destructive(Text(incognito ? "Join incognito" : "Join with current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito) },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return ActionSheet(
|
||||||
|
title: Text("Join your group?\nThis is your link for group \(groupInfo.displayName)!"),
|
||||||
|
buttons: [
|
||||||
|
.default(Text("Open group")) { openKnownGroup(groupInfo, dismiss: dismiss, showAlreadyExistsAlert: nil) },
|
||||||
|
.destructive(Text("Use current profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: false) },
|
||||||
|
.destructive(Text("Use new incognito profile")) { connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: true) },
|
||||||
|
.cancel()
|
||||||
|
]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func planAndConnect(
|
||||||
|
_ connectionLink: String,
|
||||||
|
showAlert: @escaping (PlanAndConnectAlert) -> Void,
|
||||||
|
showActionSheet: @escaping (PlanAndConnectActionSheet) -> Void,
|
||||||
|
dismiss: Bool,
|
||||||
|
incognito: Bool?
|
||||||
|
) {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
let connectionPlan = try await apiConnectPlan(connReq: connectionLink)
|
||||||
|
switch connectionPlan {
|
||||||
|
case let .invitationLink(ilp):
|
||||||
|
switch ilp {
|
||||||
|
case .ok:
|
||||||
|
logger.debug("planAndConnect, .invitationLink, .ok, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let incognito = incognito {
|
||||||
|
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito)
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via one-time link"))
|
||||||
|
}
|
||||||
|
case .ownLink:
|
||||||
|
logger.debug("planAndConnect, .invitationLink, .ownLink, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let incognito = incognito {
|
||||||
|
showAlert(.ownInvitationLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own one-time link!"))
|
||||||
|
}
|
||||||
|
case let .connecting(contact_):
|
||||||
|
logger.debug("planAndConnect, .invitationLink, .connecting, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let contact = contact_ {
|
||||||
|
openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyConnectingAlert(contact)) }
|
||||||
|
} else {
|
||||||
|
showAlert(.invitationLinkConnecting(connectionLink: connectionLink))
|
||||||
|
}
|
||||||
|
case let .known(contact):
|
||||||
|
logger.debug("planAndConnect, .invitationLink, .known, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyExistsAlert(contact)) }
|
||||||
|
}
|
||||||
|
case let .contactAddress(cap):
|
||||||
|
switch cap {
|
||||||
|
case .ok:
|
||||||
|
logger.debug("planAndConnect, .contactAddress, .ok, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let incognito = incognito {
|
||||||
|
connectViaLink(connectionLink, connectionPlan: connectionPlan, dismiss: dismiss, incognito: incognito)
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect via contact address"))
|
||||||
|
}
|
||||||
|
case .ownLink:
|
||||||
|
logger.debug("planAndConnect, .contactAddress, .ownLink, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let incognito = incognito {
|
||||||
|
showAlert(.ownContactAddressConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Connect to yourself?\nThis is your own SimpleX address!"))
|
||||||
|
}
|
||||||
|
case .connectingConfirmReconnect:
|
||||||
|
logger.debug("planAndConnect, .contactAddress, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let incognito = incognito {
|
||||||
|
showAlert(.contactAddressConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You have already requested connection!\nRepeat connection request?"))
|
||||||
|
}
|
||||||
|
case let .connectingProhibit(contact):
|
||||||
|
logger.debug("planAndConnect, .contactAddress, .connectingProhibit, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyConnectingAlert(contact)) }
|
||||||
|
case let .known(contact):
|
||||||
|
logger.debug("planAndConnect, .contactAddress, .known, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
openKnownContact(contact, dismiss: dismiss) { AlertManager.shared.showAlert(contactAlreadyExistsAlert(contact)) }
|
||||||
|
case let .contactViaAddress(contact):
|
||||||
|
logger.debug("planAndConnect, .contactAddress, .contactViaAddress, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let incognito = incognito {
|
||||||
|
connectContactViaAddress_(contact, dismiss: dismiss, incognito: incognito)
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfileConnectContactViaAddress(contact: contact))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case let .groupLink(glp):
|
||||||
|
switch glp {
|
||||||
|
case .ok:
|
||||||
|
if let incognito = incognito {
|
||||||
|
showAlert(.groupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "Join group"))
|
||||||
|
}
|
||||||
|
case let .ownLink(groupInfo):
|
||||||
|
logger.debug("planAndConnect, .groupLink, .ownLink, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
showActionSheet(.ownGroupLinkConfirmConnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito, groupInfo: groupInfo))
|
||||||
|
case .connectingConfirmReconnect:
|
||||||
|
logger.debug("planAndConnect, .groupLink, .connectingConfirmReconnect, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
if let incognito = incognito {
|
||||||
|
showAlert(.groupLinkConnectingConfirmReconnect(connectionLink: connectionLink, connectionPlan: connectionPlan, incognito: incognito))
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfileDestructive(connectionLink: connectionLink, connectionPlan: connectionPlan, title: "You are already joining the group!\nRepeat join request?"))
|
||||||
|
}
|
||||||
|
case let .connectingProhibit(groupInfo_):
|
||||||
|
logger.debug("planAndConnect, .groupLink, .connectingProhibit, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
showAlert(.groupLinkConnecting(connectionLink: connectionLink, groupInfo: groupInfo_))
|
||||||
|
case let .known(groupInfo):
|
||||||
|
logger.debug("planAndConnect, .groupLink, .known, incognito=\(incognito?.description ?? "nil")")
|
||||||
|
openKnownGroup(groupInfo, dismiss: dismiss) { AlertManager.shared.showAlert(groupAlreadyExistsAlert(groupInfo)) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
logger.debug("planAndConnect, plan error")
|
||||||
|
if let incognito = incognito {
|
||||||
|
connectViaLink(connectionLink, connectionPlan: nil, dismiss: dismiss, incognito: incognito)
|
||||||
|
} else {
|
||||||
|
showActionSheet(.askCurrentOrIncognitoProfile(connectionLink: connectionLink, connectionPlan: nil, title: "Connect via link"))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CReqClientData: Decodable {
|
private func connectContactViaAddress_(_ contact: Contact, dismiss: Bool, incognito: Bool) {
|
||||||
var type: String
|
Task {
|
||||||
var groupLinkId: String?
|
if dismiss {
|
||||||
}
|
DispatchQueue.main.async {
|
||||||
|
dismissAllSheets(animated: true)
|
||||||
func parseLinkQueryData(_ connectionLink: String) -> CReqClientData? {
|
}
|
||||||
if let hashIndex = connectionLink.firstIndex(of: "#"),
|
}
|
||||||
let urlQuery = URL(string: String(connectionLink[connectionLink.index(after: hashIndex)...])),
|
_ = await connectContactViaAddress(contact.contactId, incognito)
|
||||||
let components = URLComponents(url: urlQuery, resolvingAgainstBaseURL: false),
|
|
||||||
let data = components.queryItems?.first(where: { $0.name == "data" })?.value,
|
|
||||||
let d = data.data(using: .utf8),
|
|
||||||
let crData = try? getJSONDecoder().decode(CReqClientData.self, from: d) {
|
|
||||||
return crData
|
|
||||||
} else {
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkCRDataGroup(_ crData: CReqClientData) -> Bool {
|
private func connectViaLink(_ connectionLink: String, connectionPlan: ConnectionPlan?, dismiss: Bool, incognito: Bool) {
|
||||||
return crData.type == "group" && crData.groupLinkId != nil
|
Task {
|
||||||
|
if let connReqType = await apiConnect(incognito: incognito, connReq: connectionLink) {
|
||||||
|
let crt: ConnReqType
|
||||||
|
if let plan = connectionPlan {
|
||||||
|
crt = planToConnReqType(plan)
|
||||||
|
} else {
|
||||||
|
crt = connReqType
|
||||||
|
}
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if dismiss {
|
||||||
|
dismissAllSheets(animated: true) {
|
||||||
|
AlertManager.shared.showAlert(connReqSentAlert(crt))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
AlertManager.shared.showAlert(connReqSentAlert(crt))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if dismiss {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
dismissAllSheets(animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func groupLinkAlert(_ connectionLink: String, incognito: Bool) -> Alert {
|
func openKnownContact(_ contact: Contact, dismiss: Bool, showAlreadyExistsAlert: (() -> Void)?) {
|
||||||
return Alert(
|
Task {
|
||||||
title: Text("Connect via group link?"),
|
let m = ChatModel.shared
|
||||||
message: Text("You will join a group this link refers to and connect to its group members."),
|
if let c = m.getContactChat(contact.contactId) {
|
||||||
primaryButton: .default(Text(incognito ? "Connect incognito" : "Connect")) {
|
DispatchQueue.main.async {
|
||||||
connectViaLink(connectionLink, incognito: incognito)
|
if dismiss {
|
||||||
},
|
dismissAllSheets(animated: true) {
|
||||||
secondaryButton: .cancel()
|
m.chatId = c.id
|
||||||
|
showAlreadyExistsAlert?()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m.chatId = c.id
|
||||||
|
showAlreadyExistsAlert?()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func openKnownGroup(_ groupInfo: GroupInfo, dismiss: Bool, showAlreadyExistsAlert: (() -> Void)?) {
|
||||||
|
Task {
|
||||||
|
let m = ChatModel.shared
|
||||||
|
if let g = m.getGroupChat(groupInfo.groupId) {
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
if dismiss {
|
||||||
|
dismissAllSheets(animated: true) {
|
||||||
|
m.chatId = g.id
|
||||||
|
showAlreadyExistsAlert?()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
m.chatId = g.id
|
||||||
|
showAlreadyExistsAlert?()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func contactAlreadyConnectingAlert(_ contact: Contact) -> Alert {
|
||||||
|
mkAlert(
|
||||||
|
title: "Contact already exists",
|
||||||
|
message: "You are already connecting to \(contact.displayName)."
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func groupAlreadyExistsAlert(_ groupInfo: GroupInfo) -> Alert {
|
||||||
|
mkAlert(
|
||||||
|
title: "Group already exists",
|
||||||
|
message: "You are already in group \(groupInfo.displayName)."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
enum ConnReqType: Equatable {
|
||||||
|
case invitation
|
||||||
|
case contact
|
||||||
|
case groupLink
|
||||||
|
|
||||||
|
var connReqSentText: LocalizedStringKey {
|
||||||
|
switch self {
|
||||||
|
case .invitation: return "You will be connected when your contact's device is online, please wait or check later!"
|
||||||
|
case .contact: return "You will be connected when your connection request is accepted, please wait or check later!"
|
||||||
|
case .groupLink: return "You will be connected when group link host's device is online, please wait or check later!"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func planToConnReqType(_ connectionPlan: ConnectionPlan) -> ConnReqType {
|
||||||
|
switch connectionPlan {
|
||||||
|
case .invitationLink: return .invitation
|
||||||
|
case .contactAddress: return .contact
|
||||||
|
case .groupLink: return .groupLink
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func connReqSentAlert(_ type: ConnReqType) -> Alert {
|
func connReqSentAlert(_ type: ConnReqType) -> Alert {
|
||||||
return mkAlert(
|
return mkAlert(
|
||||||
title: "Connection request sent!",
|
title: "Connection request sent!",
|
||||||
message: type == .contact
|
message: type.connReqSentText
|
||||||
? "You will be connected when your connection request is accepted, please wait or check later!"
|
|
||||||
: "You will be connected when your contact's device is online, please wait or check later!"
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ struct PasteToConnectView: View {
|
|||||||
@State private var connectionLink: String = ""
|
@State private var connectionLink: String = ""
|
||||||
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
||||||
@FocusState private var linkEditorFocused: Bool
|
@FocusState private var linkEditorFocused: Bool
|
||||||
|
@State private var alert: PlanAndConnectAlert?
|
||||||
|
@State private var sheet: PlanAndConnectActionSheet?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
List {
|
List {
|
||||||
@@ -52,11 +54,15 @@ struct PasteToConnectView: View {
|
|||||||
|
|
||||||
IncognitoToggle(incognitoEnabled: $incognitoDefault)
|
IncognitoToggle(incognitoEnabled: $incognitoDefault)
|
||||||
} footer: {
|
} footer: {
|
||||||
sharedProfileInfo(incognitoDefault)
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
+ Text(String("\n\n"))
|
sharedProfileInfo(incognitoDefault)
|
||||||
+ Text("You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button.")
|
Text("You can also connect by clicking the link. If it opens in the browser, click **Open in mobile app** button.")
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.alert(item: $alert) { a in planAndConnectAlert(a, dismiss: true) }
|
||||||
|
.actionSheet(item: $sheet) { s in planAndConnectActionSheet(s, dismiss: true) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private func linkEditor() -> some View {
|
private func linkEditor() -> some View {
|
||||||
@@ -83,13 +89,13 @@ struct PasteToConnectView: View {
|
|||||||
|
|
||||||
private func connect() {
|
private func connect() {
|
||||||
let link = connectionLink.trimmingCharacters(in: .whitespaces)
|
let link = connectionLink.trimmingCharacters(in: .whitespaces)
|
||||||
if let crData = parseLinkQueryData(link),
|
planAndConnect(
|
||||||
checkCRDataGroup(crData) {
|
link,
|
||||||
dismiss()
|
showAlert: { alert = $0 },
|
||||||
AlertManager.shared.showAlert(groupLinkAlert(link, incognito: incognitoDefault))
|
showActionSheet: { sheet = $0 },
|
||||||
} else {
|
dismiss: true,
|
||||||
connectViaLink(link, dismiss: dismiss, incognito: incognitoDefault)
|
incognito: incognitoDefault
|
||||||
}
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,6 +28,22 @@ struct MutableQRCode: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct SimpleXLinkQRCode: View {
|
||||||
|
let uri: String
|
||||||
|
var withLogo: Bool = true
|
||||||
|
var tintColor = UIColor(red: 0.023, green: 0.176, blue: 0.337, alpha: 1)
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
QRCode(uri: simplexChatLink(uri), withLogo: withLogo, tintColor: tintColor)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func simplexChatLink(_ uri: String) -> String {
|
||||||
|
uri.starts(with: "simplex:/")
|
||||||
|
? uri.replacingOccurrences(of: "simplex:/", with: "https://simplex.chat/")
|
||||||
|
: uri
|
||||||
|
}
|
||||||
|
|
||||||
struct QRCode: View {
|
struct QRCode: View {
|
||||||
let uri: String
|
let uri: String
|
||||||
var withLogo: Bool = true
|
var withLogo: Bool = true
|
||||||
|
|||||||
@@ -13,6 +13,8 @@ import CodeScanner
|
|||||||
struct ScanToConnectView: View {
|
struct ScanToConnectView: View {
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
||||||
|
@State private var alert: PlanAndConnectAlert?
|
||||||
|
@State private var sheet: PlanAndConnectActionSheet?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView {
|
ScrollView {
|
||||||
@@ -36,11 +38,11 @@ struct ScanToConnectView: View {
|
|||||||
)
|
)
|
||||||
.padding(.top)
|
.padding(.top)
|
||||||
|
|
||||||
Group {
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
sharedProfileInfo(incognitoDefault)
|
sharedProfileInfo(incognitoDefault)
|
||||||
+ Text(String("\n\n"))
|
Text("If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link.")
|
||||||
+ Text("If you cannot meet in person, you can **scan QR code in the video call**, or your contact can share an invitation link.")
|
|
||||||
}
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.font(.footnote)
|
.font(.footnote)
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
@@ -49,18 +51,20 @@ struct ScanToConnectView: View {
|
|||||||
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .top)
|
||||||
}
|
}
|
||||||
.background(Color(.systemGroupedBackground))
|
.background(Color(.systemGroupedBackground))
|
||||||
|
.alert(item: $alert) { a in planAndConnectAlert(a, dismiss: true) }
|
||||||
|
.actionSheet(item: $sheet) { s in planAndConnectActionSheet(s, dismiss: true) }
|
||||||
}
|
}
|
||||||
|
|
||||||
func processQRCode(_ resp: Result<ScanResult, ScanError>) {
|
func processQRCode(_ resp: Result<ScanResult, ScanError>) {
|
||||||
switch resp {
|
switch resp {
|
||||||
case let .success(r):
|
case let .success(r):
|
||||||
if let crData = parseLinkQueryData(r.string),
|
planAndConnect(
|
||||||
checkCRDataGroup(crData) {
|
r.string,
|
||||||
dismiss()
|
showAlert: { alert = $0 },
|
||||||
AlertManager.shared.showAlert(groupLinkAlert(r.string, incognito: incognitoDefault))
|
showActionSheet: { sheet = $0 },
|
||||||
} else {
|
dismiss: true,
|
||||||
Task { connectViaLink(r.string, dismiss: dismiss, incognito: incognitoDefault) }
|
incognito: incognitoDefault
|
||||||
}
|
)
|
||||||
case let .failure(e):
|
case let .failure(e):
|
||||||
logger.error("ConnectContactView.processQRCode QR code error: \(e.localizedDescription)")
|
logger.error("ConnectContactView.processQRCode QR code error: \(e.localizedDescription)")
|
||||||
dismiss()
|
dismiss()
|
||||||
|
|||||||
@@ -9,175 +9,244 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
|
enum UserProfileAlert: Identifiable {
|
||||||
|
case duplicateUserError
|
||||||
|
case createUserError(error: LocalizedStringKey)
|
||||||
|
case invalidNameError(validName: String)
|
||||||
|
|
||||||
|
var id: String {
|
||||||
|
switch self {
|
||||||
|
case .duplicateUserError: return "duplicateUserError"
|
||||||
|
case .createUserError: return "createUserError"
|
||||||
|
case let .invalidNameError(validName): return "invalidNameError \(validName)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct CreateProfile: View {
|
struct CreateProfile: View {
|
||||||
|
@Environment(\.dismiss) var dismiss
|
||||||
|
@State private var displayName: String = ""
|
||||||
|
@FocusState private var focusDisplayName
|
||||||
|
@State private var alert: UserProfileAlert?
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
List {
|
||||||
|
Section {
|
||||||
|
TextField("Enter your name…", text: $displayName)
|
||||||
|
.focused($focusDisplayName)
|
||||||
|
Button {
|
||||||
|
createProfile(displayName, showAlert: { alert = $0 }, dismiss: dismiss)
|
||||||
|
} label: {
|
||||||
|
Label("Create profile", systemImage: "checkmark")
|
||||||
|
}
|
||||||
|
.disabled(!canCreateProfile(displayName))
|
||||||
|
} header: {
|
||||||
|
HStack {
|
||||||
|
Text("Your profile")
|
||||||
|
let name = displayName.trimmingCharacters(in: .whitespaces)
|
||||||
|
let validName = mkValidName(name)
|
||||||
|
if name != validName {
|
||||||
|
Spacer()
|
||||||
|
Image(systemName: "exclamationmark.circle")
|
||||||
|
.foregroundColor(.red)
|
||||||
|
.onTapGesture {
|
||||||
|
alert = .invalidNameError(validName: validName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(height: 20)
|
||||||
|
} footer: {
|
||||||
|
VStack(alignment: .leading, spacing: 8) {
|
||||||
|
Text("Your profile, contacts and delivered messages are stored on your device.")
|
||||||
|
Text("The profile is only shared with your contacts.")
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Create your profile")
|
||||||
|
.alert(item: $alert) { a in userProfileAlert(a, $displayName) }
|
||||||
|
.onAppear() {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||||
|
focusDisplayName = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.keyboardPadding()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct CreateFirstProfile: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.dismiss) var dismiss
|
@Environment(\.dismiss) var dismiss
|
||||||
@State private var displayName: String = ""
|
@State private var displayName: String = ""
|
||||||
@State private var fullName: String = ""
|
|
||||||
@FocusState private var focusDisplayName
|
@FocusState private var focusDisplayName
|
||||||
@FocusState private var focusFullName
|
|
||||||
@State private var alert: CreateProfileAlert?
|
|
||||||
|
|
||||||
private enum CreateProfileAlert: Identifiable {
|
|
||||||
case duplicateUserError
|
|
||||||
case createUserError(error: LocalizedStringKey)
|
|
||||||
|
|
||||||
var id: String {
|
|
||||||
switch self {
|
|
||||||
case .duplicateUserError: return "duplicateUserError"
|
|
||||||
case .createUserError: return "createUserError"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
Text("Create your profile")
|
Group {
|
||||||
.font(.largeTitle)
|
Text("Create your profile")
|
||||||
.bold()
|
.font(.largeTitle)
|
||||||
.padding(.bottom, 4)
|
.bold()
|
||||||
.frame(maxWidth: .infinity)
|
Text("Your profile, contacts and delivered messages are stored on your device.")
|
||||||
Text("Your profile, contacts and delivered messages are stored on your device.")
|
.foregroundColor(.secondary)
|
||||||
.padding(.bottom, 4)
|
Text("The profile is only shared with your contacts.")
|
||||||
Text("The profile is only shared with your contacts.")
|
.foregroundColor(.secondary)
|
||||||
.padding(.bottom)
|
.padding(.bottom)
|
||||||
|
}
|
||||||
|
.padding(.bottom)
|
||||||
|
|
||||||
ZStack(alignment: .topLeading) {
|
ZStack(alignment: .topLeading) {
|
||||||
if !validDisplayName(displayName) {
|
let name = displayName.trimmingCharacters(in: .whitespaces)
|
||||||
Image(systemName: "exclamationmark.circle")
|
let validName = mkValidName(name)
|
||||||
.foregroundColor(.red)
|
if name != validName {
|
||||||
.padding(.top, 4)
|
Button {
|
||||||
|
showAlert(.invalidNameError(validName: validName))
|
||||||
|
} label: {
|
||||||
|
Image(systemName: "exclamationmark.circle").foregroundColor(.red)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Image(systemName: "exclamationmark.circle").foregroundColor(.clear)
|
||||||
}
|
}
|
||||||
textField("Display name", text: $displayName)
|
TextField("Enter your name…", text: $displayName)
|
||||||
.focused($focusDisplayName)
|
.focused($focusDisplayName)
|
||||||
.submitLabel(.next)
|
.padding(.leading, 32)
|
||||||
.onSubmit {
|
|
||||||
if canCreateProfile() { focusFullName = true }
|
|
||||||
else { focusDisplayName = true }
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
textField("Full name (optional)", text: $fullName)
|
.padding(.bottom)
|
||||||
.focused($focusFullName)
|
|
||||||
.submitLabel(.go)
|
|
||||||
.onSubmit {
|
|
||||||
if canCreateProfile() { createProfile() }
|
|
||||||
else { focusFullName = true }
|
|
||||||
}
|
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
|
onboardingButtons()
|
||||||
HStack {
|
|
||||||
if m.users.isEmpty {
|
|
||||||
Button {
|
|
||||||
hideKeyboard()
|
|
||||||
withAnimation {
|
|
||||||
m.onboardingStage = .step1_SimpleXInfo
|
|
||||||
}
|
|
||||||
} label: {
|
|
||||||
HStack {
|
|
||||||
Image(systemName: "lessthan")
|
|
||||||
Text("About SimpleX")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Spacer()
|
|
||||||
|
|
||||||
HStack {
|
|
||||||
Button {
|
|
||||||
createProfile()
|
|
||||||
} label: {
|
|
||||||
Text("Create")
|
|
||||||
Image(systemName: "greaterthan")
|
|
||||||
}
|
|
||||||
.disabled(!canCreateProfile())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.onAppear() {
|
.onAppear() {
|
||||||
focusDisplayName = true
|
focusDisplayName = true
|
||||||
setLastVersionDefault()
|
setLastVersionDefault()
|
||||||
}
|
}
|
||||||
.alert(item: $alert) { a in
|
|
||||||
switch a {
|
|
||||||
case .duplicateUserError: return duplicateUserAlert
|
|
||||||
case let .createUserError(err): return creatUserErrorAlert(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.padding()
|
.padding()
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.keyboardPadding()
|
.keyboardPadding()
|
||||||
}
|
}
|
||||||
|
|
||||||
func textField(_ placeholder: LocalizedStringKey, text: Binding<String>) -> some View {
|
func onboardingButtons() -> some View {
|
||||||
TextField(placeholder, text: text)
|
HStack {
|
||||||
.textInputAutocapitalization(.never)
|
Button {
|
||||||
.disableAutocorrection(true)
|
hideKeyboard()
|
||||||
.padding(.leading, 28)
|
|
||||||
.padding(.bottom)
|
|
||||||
}
|
|
||||||
|
|
||||||
func createProfile() {
|
|
||||||
hideKeyboard()
|
|
||||||
let profile = Profile(
|
|
||||||
displayName: displayName,
|
|
||||||
fullName: fullName
|
|
||||||
)
|
|
||||||
do {
|
|
||||||
m.currentUser = try apiCreateActiveUser(profile)
|
|
||||||
if m.users.isEmpty {
|
|
||||||
try startChat()
|
|
||||||
withAnimation {
|
withAnimation {
|
||||||
onboardingStageDefault.set(.step3_CreateSimpleXAddress)
|
m.onboardingStage = .step1_SimpleXInfo
|
||||||
m.onboardingStage = .step3_CreateSimpleXAddress
|
|
||||||
}
|
}
|
||||||
} else {
|
} label: {
|
||||||
onboardingStageDefault.set(.onboardingComplete)
|
HStack {
|
||||||
m.onboardingStage = .onboardingComplete
|
Image(systemName: "lessthan")
|
||||||
dismiss()
|
Text("About SimpleX")
|
||||||
m.users = try listUsers()
|
|
||||||
try getUserChatData()
|
|
||||||
}
|
|
||||||
} catch let error {
|
|
||||||
switch error as? ChatResponse {
|
|
||||||
case .chatCmdError(_, .errorStore(.duplicateName)),
|
|
||||||
.chatCmdError(_, .error(.userExists)):
|
|
||||||
if m.currentUser == nil {
|
|
||||||
AlertManager.shared.showAlert(duplicateUserAlert)
|
|
||||||
} else {
|
|
||||||
alert = .duplicateUserError
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
let err: LocalizedStringKey = "Error: \(responseError(error))"
|
|
||||||
if m.currentUser == nil {
|
|
||||||
AlertManager.shared.showAlert(creatUserErrorAlert(err))
|
|
||||||
} else {
|
|
||||||
alert = .createUserError(error: err)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
logger.error("Failed to create user or start chat: \(responseError(error))")
|
|
||||||
|
Spacer()
|
||||||
|
|
||||||
|
Button {
|
||||||
|
createProfile(displayName, showAlert: showAlert, dismiss: dismiss)
|
||||||
|
} label: {
|
||||||
|
HStack {
|
||||||
|
Text("Create")
|
||||||
|
Image(systemName: "greaterthan")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.disabled(!canCreateProfile(displayName))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func canCreateProfile() -> Bool {
|
private func showAlert(_ alert: UserProfileAlert) {
|
||||||
displayName != "" && validDisplayName(displayName)
|
AlertManager.shared.showAlert(userProfileAlert(alert, $displayName))
|
||||||
}
|
|
||||||
|
|
||||||
private var duplicateUserAlert: Alert {
|
|
||||||
Alert(
|
|
||||||
title: Text("Duplicate display name!"),
|
|
||||||
message: Text("You already have a chat profile with the same display name. Please choose another name.")
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func creatUserErrorAlert(_ err: LocalizedStringKey) -> Alert {
|
|
||||||
Alert(
|
|
||||||
title: Text("Error creating profile!"),
|
|
||||||
message: Text(err)
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func createProfile(_ displayName: String, showAlert: (UserProfileAlert) -> Void, dismiss: DismissAction) {
|
||||||
|
hideKeyboard()
|
||||||
|
let profile = Profile(
|
||||||
|
displayName: displayName.trimmingCharacters(in: .whitespaces),
|
||||||
|
fullName: ""
|
||||||
|
)
|
||||||
|
let m = ChatModel.shared
|
||||||
|
do {
|
||||||
|
m.currentUser = try apiCreateActiveUser(profile)
|
||||||
|
if m.users.isEmpty {
|
||||||
|
try startChat()
|
||||||
|
withAnimation {
|
||||||
|
onboardingStageDefault.set(.step3_CreateSimpleXAddress)
|
||||||
|
m.onboardingStage = .step3_CreateSimpleXAddress
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
onboardingStageDefault.set(.onboardingComplete)
|
||||||
|
m.onboardingStage = .onboardingComplete
|
||||||
|
dismiss()
|
||||||
|
m.users = try listUsers()
|
||||||
|
try getUserChatData()
|
||||||
|
}
|
||||||
|
} catch let error {
|
||||||
|
switch error as? ChatResponse {
|
||||||
|
case .chatCmdError(_, .errorStore(.duplicateName)),
|
||||||
|
.chatCmdError(_, .error(.userExists)):
|
||||||
|
if m.currentUser == nil {
|
||||||
|
AlertManager.shared.showAlert(duplicateUserAlert)
|
||||||
|
} else {
|
||||||
|
showAlert(.duplicateUserError)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
let err: LocalizedStringKey = "Error: \(responseError(error))"
|
||||||
|
if m.currentUser == nil {
|
||||||
|
AlertManager.shared.showAlert(creatUserErrorAlert(err))
|
||||||
|
} else {
|
||||||
|
showAlert(.createUserError(error: err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.error("Failed to create user or start chat: \(responseError(error))")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func canCreateProfile(_ displayName: String) -> Bool {
|
||||||
|
let name = displayName.trimmingCharacters(in: .whitespaces)
|
||||||
|
return name != "" && mkValidName(name) == name
|
||||||
|
}
|
||||||
|
|
||||||
|
func userProfileAlert(_ alert: UserProfileAlert, _ displayName: Binding<String>) -> Alert {
|
||||||
|
switch alert {
|
||||||
|
case .duplicateUserError: return duplicateUserAlert
|
||||||
|
case let .createUserError(err): return creatUserErrorAlert(err)
|
||||||
|
case let .invalidNameError(name): return createInvalidNameAlert(name, displayName)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private var duplicateUserAlert: Alert {
|
||||||
|
Alert(
|
||||||
|
title: Text("Duplicate display name!"),
|
||||||
|
message: Text("You already have a chat profile with the same display name. Please choose another name.")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func creatUserErrorAlert(_ err: LocalizedStringKey) -> Alert {
|
||||||
|
Alert(
|
||||||
|
title: Text("Error creating profile!"),
|
||||||
|
message: Text(err)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func createInvalidNameAlert(_ name: String, _ displayName: Binding<String>) -> Alert {
|
||||||
|
name == ""
|
||||||
|
? Alert(title: Text("Invalid name!"))
|
||||||
|
: Alert(
|
||||||
|
title: Text("Invalid name!"),
|
||||||
|
message: Text("Correct name to \(name)?"),
|
||||||
|
primaryButton: .default(
|
||||||
|
Text("Ok"),
|
||||||
|
action: { displayName.wrappedValue = name }
|
||||||
|
),
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
func validDisplayName(_ name: String) -> Bool {
|
func validDisplayName(_ name: String) -> Bool {
|
||||||
name.firstIndex(of: " ") == nil && name.first != "@" && name.first != "#"
|
mkValidName(name.trimmingCharacters(in: .whitespaces)) == name
|
||||||
|
}
|
||||||
|
|
||||||
|
func mkValidName(_ s: String) -> String {
|
||||||
|
var c = s.cString(using: .utf8)!
|
||||||
|
return fromCString(chat_valid_name(&c)!)
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CreateProfile_Previews: PreviewProvider {
|
struct CreateProfile_Previews: PreviewProvider {
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ struct CreateSimpleXAddress: View {
|
|||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
if let userAddress = m.userAddress {
|
if let userAddress = m.userAddress {
|
||||||
QRCode(uri: userAddress.connReqContact)
|
SimpleXLinkQRCode(uri: userAddress.connReqContact)
|
||||||
.frame(maxHeight: g.size.width)
|
.frame(maxHeight: g.size.width)
|
||||||
shareQRCodeButton(userAddress)
|
shareQRCodeButton(userAddress)
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
@@ -126,7 +126,7 @@ struct CreateSimpleXAddress: View {
|
|||||||
|
|
||||||
private func shareQRCodeButton(_ userAddress: UserContactLink) -> some View {
|
private func shareQRCodeButton(_ userAddress: UserContactLink) -> some View {
|
||||||
Button {
|
Button {
|
||||||
showShareSheet(items: [userAddress.connReqContact])
|
showShareSheet(items: [simplexChatLink(userAddress.connReqContact)])
|
||||||
} label: {
|
} label: {
|
||||||
Label("Share", systemImage: "square.and.arrow.up")
|
Label("Share", systemImage: "square.and.arrow.up")
|
||||||
}
|
}
|
||||||
@@ -194,7 +194,7 @@ struct SendAddressMailView: View {
|
|||||||
let messageBody = String(format: NSLocalizedString("""
|
let messageBody = String(format: NSLocalizedString("""
|
||||||
<p>Hi!</p>
|
<p>Hi!</p>
|
||||||
<p><a href="%@">Connect to me via SimpleX Chat</a></p>
|
<p><a href="%@">Connect to me via SimpleX Chat</a></p>
|
||||||
""", comment: "email text"), userAddress.connReqContact)
|
""", comment: "email text"), simplexChatLink(userAddress.connReqContact))
|
||||||
MailView(
|
MailView(
|
||||||
isShowing: self.$showMailView,
|
isShowing: self.$showMailView,
|
||||||
result: $mailViewResult,
|
result: $mailViewResult,
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ struct OnboardingView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
switch onboarding {
|
switch onboarding {
|
||||||
case .step1_SimpleXInfo: SimpleXInfo(onboarding: true)
|
case .step1_SimpleXInfo: SimpleXInfo(onboarding: true)
|
||||||
case .step2_CreateProfile: CreateProfile()
|
case .step2_CreateProfile: CreateFirstProfile()
|
||||||
case .step3_CreateSimpleXAddress: CreateSimpleXAddress()
|
case .step3_CreateSimpleXAddress: CreateSimpleXAddress()
|
||||||
case .step4_SetNotificationsMode: SetNotificationsMode()
|
case .step4_SetNotificationsMode: SetNotificationsMode()
|
||||||
case .onboardingComplete: EmptyView()
|
case .onboardingComplete: EmptyView()
|
||||||
|
|||||||
@@ -0,0 +1,434 @@
|
|||||||
|
//
|
||||||
|
// ConnectDesktopView.swift
|
||||||
|
// SimpleX (iOS)
|
||||||
|
//
|
||||||
|
// Created by Evgeny on 13/10/2023.
|
||||||
|
// Copyright © 2023 SimpleX Chat. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
import SimpleXChat
|
||||||
|
import CodeScanner
|
||||||
|
|
||||||
|
struct ConnectDesktopView: View {
|
||||||
|
@EnvironmentObject var m: ChatModel
|
||||||
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
|
var viaSettings = false
|
||||||
|
@AppStorage(DEFAULT_DEVICE_NAME_FOR_REMOTE_ACCESS) private var deviceName = UIDevice.current.name
|
||||||
|
@AppStorage(DEFAULT_CONFIRM_REMOTE_SESSIONS) private var confirmRemoteSessions = false
|
||||||
|
@AppStorage(DEFAULT_CONNECT_REMOTE_VIA_MULTICAST) private var connectRemoteViaMulticast = false
|
||||||
|
@AppStorage(DEFAULT_OFFER_REMOTE_MULTICAST) private var offerRemoteMulticast = true
|
||||||
|
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
||||||
|
@State private var sessionAddress: String = ""
|
||||||
|
@State private var remoteCtrls: [RemoteCtrlInfo] = []
|
||||||
|
@State private var alert: ConnectDesktopAlert?
|
||||||
|
|
||||||
|
private enum ConnectDesktopAlert: Identifiable {
|
||||||
|
case unlinkDesktop(rc: RemoteCtrlInfo)
|
||||||
|
case disconnectDesktop(action: UserDisconnectAction)
|
||||||
|
case badInvitationError
|
||||||
|
case badVersionError(version: String?)
|
||||||
|
case desktopDisconnectedError
|
||||||
|
case error(title: LocalizedStringKey, error: LocalizedStringKey = "")
|
||||||
|
|
||||||
|
var id: String {
|
||||||
|
switch self {
|
||||||
|
case let .unlinkDesktop(rc): "unlinkDesktop \(rc.remoteCtrlId)"
|
||||||
|
case let .disconnectDesktop(action): "disconnectDecktop \(action)"
|
||||||
|
case .badInvitationError: "badInvitationError"
|
||||||
|
case let .badVersionError(v): "badVersionError \(v ?? "")"
|
||||||
|
case .desktopDisconnectedError: "desktopDisconnectedError"
|
||||||
|
case let .error(title, _): "error \(title)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private enum UserDisconnectAction: String {
|
||||||
|
case back
|
||||||
|
case dismiss // TODO dismiss settings after confirmation
|
||||||
|
}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
if viaSettings {
|
||||||
|
viewBody
|
||||||
|
.modifier(BackButton(label: "Back") {
|
||||||
|
if m.activeRemoteCtrl {
|
||||||
|
alert = .disconnectDesktop(action: .back)
|
||||||
|
} else {
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
NavigationView {
|
||||||
|
viewBody
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var viewBody: some View {
|
||||||
|
Group {
|
||||||
|
if let session = m.remoteCtrlSession {
|
||||||
|
switch session.sessionState {
|
||||||
|
case .starting: connectingDesktopView(session, nil)
|
||||||
|
case let .connecting(rc_): connectingDesktopView(session, rc_)
|
||||||
|
case let .pendingConfirmation(rc_, sessCode):
|
||||||
|
if confirmRemoteSessions || rc_ == nil {
|
||||||
|
verifySessionView(session, rc_, sessCode)
|
||||||
|
} else {
|
||||||
|
connectingDesktopView(session, rc_).onAppear {
|
||||||
|
verifyDesktopSessionCode(sessCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
case let .connected(rc, _): activeSessionView(session, rc)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
connectDesktopView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onAppear {
|
||||||
|
setDeviceName(deviceName)
|
||||||
|
updateRemoteCtrls()
|
||||||
|
}
|
||||||
|
.onDisappear {
|
||||||
|
if m.remoteCtrlSession != nil {
|
||||||
|
disconnectDesktop()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: deviceName) {
|
||||||
|
setDeviceName($0)
|
||||||
|
}
|
||||||
|
.onChange(of: m.activeRemoteCtrl) {
|
||||||
|
UIApplication.shared.isIdleTimerDisabled = $0
|
||||||
|
}
|
||||||
|
.alert(item: $alert) { a in
|
||||||
|
switch a {
|
||||||
|
case let .unlinkDesktop(rc):
|
||||||
|
Alert(
|
||||||
|
title: Text("Unlink desktop?"),
|
||||||
|
primaryButton: .destructive(Text("Unlink")) {
|
||||||
|
unlinkDesktop(rc)
|
||||||
|
},
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
case let .disconnectDesktop(action):
|
||||||
|
Alert(
|
||||||
|
title: Text("Disconnect desktop?"),
|
||||||
|
primaryButton: .destructive(Text("Disconnect")) {
|
||||||
|
disconnectDesktop(action)
|
||||||
|
},
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
|
case .badInvitationError:
|
||||||
|
Alert(title: Text("Bad desktop address"))
|
||||||
|
case let .badVersionError(v):
|
||||||
|
Alert(
|
||||||
|
title: Text("Incompatible version"),
|
||||||
|
message: Text("Desktop app version \(v ?? "") is not compatible with this app.")
|
||||||
|
)
|
||||||
|
case .desktopDisconnectedError:
|
||||||
|
Alert(title: Text("Connection terminated"))
|
||||||
|
case let .error(title, error):
|
||||||
|
Alert(title: Text(title), message: Text(error))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.interactiveDismissDisabled(m.activeRemoteCtrl)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func connectDesktopView() -> some View {
|
||||||
|
List {
|
||||||
|
Section("This device name") {
|
||||||
|
devicesView()
|
||||||
|
}
|
||||||
|
scanDesctopAddressView()
|
||||||
|
if developerTools {
|
||||||
|
desktopAddressView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Connect to desktop")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func connectingDesktopView(_ session: RemoteCtrlSession, _ rc: RemoteCtrlInfo?) -> some View {
|
||||||
|
List {
|
||||||
|
Section("Connecting to desktop") {
|
||||||
|
ctrlDeviceNameText(session, rc)
|
||||||
|
ctrlDeviceVersionText(session)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let sessCode = session.sessionCode {
|
||||||
|
Section("Session code") {
|
||||||
|
sessionCodeText(sessCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
disconnectButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Connecting to desktop")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func verifySessionView(_ session: RemoteCtrlSession, _ rc: RemoteCtrlInfo?, _ sessCode: String) -> some View {
|
||||||
|
List {
|
||||||
|
Section("Connected to desktop") {
|
||||||
|
ctrlDeviceNameText(session, rc)
|
||||||
|
ctrlDeviceVersionText(session)
|
||||||
|
}
|
||||||
|
|
||||||
|
Section("Verify code with desktop") {
|
||||||
|
sessionCodeText(sessCode)
|
||||||
|
Button {
|
||||||
|
verifyDesktopSessionCode(sessCode)
|
||||||
|
} label: {
|
||||||
|
Label("Confirm", systemImage: "checkmark")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
disconnectButton()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Verify connection")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func ctrlDeviceNameText(_ session: RemoteCtrlSession, _ rc: RemoteCtrlInfo?) -> Text {
|
||||||
|
var t = Text(rc?.deviceViewName ?? session.ctrlAppInfo.deviceName)
|
||||||
|
if (rc == nil) {
|
||||||
|
t = t + Text(" ") + Text("(new)").italic()
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
private func ctrlDeviceVersionText(_ session: RemoteCtrlSession) -> Text {
|
||||||
|
let v = session.ctrlAppInfo.appVersionRange.maxVersion
|
||||||
|
var t = Text("v\(v)")
|
||||||
|
if v != session.appVersion {
|
||||||
|
t = t + Text(" ") + Text("(this device v\(session.appVersion))").italic()
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
private func activeSessionView(_ session: RemoteCtrlSession, _ rc: RemoteCtrlInfo) -> some View {
|
||||||
|
List {
|
||||||
|
Section("Connected desktop") {
|
||||||
|
Text(rc.deviceViewName)
|
||||||
|
ctrlDeviceVersionText(session)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let sessCode = session.sessionCode {
|
||||||
|
Section("Session code") {
|
||||||
|
sessionCodeText(sessCode)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
disconnectButton()
|
||||||
|
} footer: {
|
||||||
|
// This is specific to iOS
|
||||||
|
Text("Keep the app open to use it from desktop")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Connected to desktop")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func sessionCodeText(_ code: String) -> some View {
|
||||||
|
Text(code.prefix(23))
|
||||||
|
}
|
||||||
|
|
||||||
|
private func devicesView() -> some View {
|
||||||
|
Group {
|
||||||
|
TextField("Enter this device name…", text: $deviceName)
|
||||||
|
if !remoteCtrls.isEmpty {
|
||||||
|
NavigationLink {
|
||||||
|
linkedDesktopsView()
|
||||||
|
} label: {
|
||||||
|
Text("Linked desktops")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func scanDesctopAddressView() -> some View {
|
||||||
|
Section("Scan QR code from desktop") {
|
||||||
|
CodeScannerView(codeTypes: [.qr], completion: processDesktopQRCode)
|
||||||
|
.aspectRatio(1, contentMode: .fit)
|
||||||
|
.cornerRadius(12)
|
||||||
|
.listRowBackground(Color.clear)
|
||||||
|
.listRowSeparator(.hidden)
|
||||||
|
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
|
||||||
|
.padding(.horizontal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func desktopAddressView() -> some View {
|
||||||
|
Section("Desktop address") {
|
||||||
|
if sessionAddress.isEmpty {
|
||||||
|
Button {
|
||||||
|
sessionAddress = UIPasteboard.general.string ?? ""
|
||||||
|
} label: {
|
||||||
|
Label("Paste desktop address", systemImage: "doc.plaintext")
|
||||||
|
}
|
||||||
|
.disabled(!UIPasteboard.general.hasStrings)
|
||||||
|
} else {
|
||||||
|
HStack {
|
||||||
|
Text(sessionAddress).lineLimit(1)
|
||||||
|
Spacer()
|
||||||
|
Image(systemName: "multiply.circle.fill")
|
||||||
|
.foregroundColor(.secondary)
|
||||||
|
.onTapGesture { sessionAddress = "" }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Button {
|
||||||
|
connectDesktopAddress(sessionAddress)
|
||||||
|
} label: {
|
||||||
|
Label("Connect to desktop", systemImage: "rectangle.connected.to.line.below")
|
||||||
|
}
|
||||||
|
.disabled(sessionAddress.isEmpty)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func linkedDesktopsView() -> some View {
|
||||||
|
List {
|
||||||
|
Section("Desktop devices") {
|
||||||
|
ForEach(remoteCtrls, id: \.remoteCtrlId) { rc in
|
||||||
|
remoteCtrlView(rc)
|
||||||
|
}
|
||||||
|
.onDelete { indexSet in
|
||||||
|
if let i = indexSet.first, i < remoteCtrls.count {
|
||||||
|
alert = .unlinkDesktop(rc: remoteCtrls[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Section("Linked desktop options") {
|
||||||
|
Toggle("Verify connections", isOn: $confirmRemoteSessions)
|
||||||
|
Toggle("Discover on network", isOn: $connectRemoteViaMulticast).disabled(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.navigationTitle("Linked desktops")
|
||||||
|
}
|
||||||
|
|
||||||
|
private func remoteCtrlView(_ rc: RemoteCtrlInfo) -> some View {
|
||||||
|
Text(rc.deviceViewName)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private func setDeviceName(_ name: String) {
|
||||||
|
do {
|
||||||
|
try setLocalDeviceName(deviceName)
|
||||||
|
} catch let e {
|
||||||
|
errorAlert(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func updateRemoteCtrls() {
|
||||||
|
do {
|
||||||
|
remoteCtrls = try listRemoteCtrls()
|
||||||
|
} catch let e {
|
||||||
|
errorAlert(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func processDesktopQRCode(_ resp: Result<ScanResult, ScanError>) {
|
||||||
|
switch resp {
|
||||||
|
case let .success(r): connectDesktopAddress(r.string)
|
||||||
|
case let .failure(e): errorAlert(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func connectDesktopAddress(_ addr: String) {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
let (rc_, ctrlAppInfo, v) = try await connectRemoteCtrl(desktopAddress: addr)
|
||||||
|
await MainActor.run {
|
||||||
|
sessionAddress = ""
|
||||||
|
m.remoteCtrlSession = RemoteCtrlSession(
|
||||||
|
ctrlAppInfo: ctrlAppInfo,
|
||||||
|
appVersion: v,
|
||||||
|
sessionState: .connecting(remoteCtrl_: rc_)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} catch let e {
|
||||||
|
await MainActor.run {
|
||||||
|
switch e as? ChatResponse {
|
||||||
|
case .chatCmdError(_, .errorRemoteCtrl(.badInvitation)): alert = .badInvitationError
|
||||||
|
case .chatCmdError(_, .error(.commandError)): alert = .badInvitationError
|
||||||
|
case let .chatCmdError(_, .errorRemoteCtrl(.badVersion(v))): alert = .badVersionError(version: v)
|
||||||
|
case .chatCmdError(_, .errorAgent(.RCP(.version))): alert = .badVersionError(version: nil)
|
||||||
|
case .chatCmdError(_, .errorAgent(.RCP(.ctrlAuth))): alert = .desktopDisconnectedError
|
||||||
|
default: errorAlert(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func verifyDesktopSessionCode(_ sessCode: String) {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
let rc = try await verifyRemoteCtrlSession(sessCode)
|
||||||
|
await MainActor.run {
|
||||||
|
m.remoteCtrlSession = m.remoteCtrlSession?.updateState(.connected(remoteCtrl: rc, sessionCode: sessCode))
|
||||||
|
}
|
||||||
|
await MainActor.run {
|
||||||
|
updateRemoteCtrls()
|
||||||
|
}
|
||||||
|
} catch let error {
|
||||||
|
await MainActor.run {
|
||||||
|
errorAlert(error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func disconnectButton() -> some View {
|
||||||
|
Button {
|
||||||
|
disconnectDesktop()
|
||||||
|
} label: {
|
||||||
|
Label("Disconnect", systemImage: "multiply")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func disconnectDesktop(_ action: UserDisconnectAction? = nil) {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
try await stopRemoteCtrl()
|
||||||
|
await MainActor.run {
|
||||||
|
switchToLocalSession()
|
||||||
|
switch action {
|
||||||
|
case .back: dismiss()
|
||||||
|
case .dismiss: dismiss()
|
||||||
|
case .none: ()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch let e {
|
||||||
|
await MainActor.run {
|
||||||
|
errorAlert(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func unlinkDesktop(_ rc: RemoteCtrlInfo) {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
try await deleteRemoteCtrl(rc.remoteCtrlId)
|
||||||
|
await MainActor.run {
|
||||||
|
remoteCtrls.removeAll(where: { $0.remoteCtrlId == rc.remoteCtrlId })
|
||||||
|
}
|
||||||
|
} catch let e {
|
||||||
|
await MainActor.run {
|
||||||
|
errorAlert(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func errorAlert(_ error: Error) {
|
||||||
|
let a = getErrorAlert(error, "Error")
|
||||||
|
alert = .error(title: a.title, error: a.message)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#Preview {
|
||||||
|
ConnectDesktopView()
|
||||||
|
}
|
||||||
@@ -66,6 +66,9 @@ struct PrivacySettings: View {
|
|||||||
Section {
|
Section {
|
||||||
settingsRow("lock.doc") {
|
settingsRow("lock.doc") {
|
||||||
Toggle("Encrypt local files", isOn: $encryptLocalFiles)
|
Toggle("Encrypt local files", isOn: $encryptLocalFiles)
|
||||||
|
.onChange(of: encryptLocalFiles) {
|
||||||
|
setEncryptLocalFiles($0)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
settingsRow("photo") {
|
settingsRow("photo") {
|
||||||
Toggle("Auto-accept images", isOn: $autoAcceptImages)
|
Toggle("Auto-accept images", isOn: $autoAcceptImages)
|
||||||
@@ -90,7 +93,9 @@ struct PrivacySettings: View {
|
|||||||
}
|
}
|
||||||
settingsRow("link") {
|
settingsRow("link") {
|
||||||
Picker("SimpleX links", selection: $simplexLinkMode) {
|
Picker("SimpleX links", selection: $simplexLinkMode) {
|
||||||
ForEach(SimpleXLinkMode.values) { mode in
|
ForEach(
|
||||||
|
SimpleXLinkMode.values + (SimpleXLinkMode.values.contains(simplexLinkMode) ? [] : [simplexLinkMode])
|
||||||
|
) { mode in
|
||||||
Text(mode.text)
|
Text(mode.text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -101,10 +106,6 @@ struct PrivacySettings: View {
|
|||||||
}
|
}
|
||||||
} header: {
|
} header: {
|
||||||
Text("Chats")
|
Text("Chats")
|
||||||
} footer: {
|
|
||||||
if case .browser = simplexLinkMode {
|
|
||||||
Text("Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.")
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
@@ -118,7 +119,7 @@ struct PrivacySettings: View {
|
|||||||
Text("Send delivery receipts to")
|
Text("Send delivery receipts to")
|
||||||
} footer: {
|
} footer: {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
Text("These settings are for your current profile **\(ChatModel.shared.currentUser?.displayName ?? "")**.")
|
Text("These settings are for your current profile **\(m.currentUser?.displayName ?? "")**.")
|
||||||
Text("They can be overridden in contact and group settings.")
|
Text("They can be overridden in contact and group settings.")
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, alignment: .leading)
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
@@ -183,6 +184,16 @@ struct PrivacySettings: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func setEncryptLocalFiles(_ enable: Bool) {
|
||||||
|
do {
|
||||||
|
try apiSetEncryptLocalFiles(enable)
|
||||||
|
} catch let error {
|
||||||
|
let err = responseError(error)
|
||||||
|
logger.error("apiSetEncryptLocalFiles \(err)")
|
||||||
|
alert = .error(title: "Error", error: "\(err)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func setOrAskSendReceiptsContacts(_ enable: Bool) {
|
private func setOrAskSendReceiptsContacts(_ enable: Bool) {
|
||||||
contactReceiptsOverrides = m.chats.reduce(0) { count, chat in
|
contactReceiptsOverrides = m.chats.reduce(0) { count, chat in
|
||||||
let sendRcpts = chat.chatInfo.contact?.chatSettings.sendRcpts
|
let sendRcpts = chat.chatInfo.contact?.chatSettings.sendRcpts
|
||||||
@@ -345,7 +356,7 @@ struct SimplexLockView: View {
|
|||||||
var id: Self { self }
|
var id: Self { self }
|
||||||
}
|
}
|
||||||
|
|
||||||
let laDelays: [Int] = [10, 30, 60, 180, 0]
|
let laDelays: [Int] = [10, 30, 60, 180, 600, 0]
|
||||||
|
|
||||||
func laDelayText(_ t: Int) -> LocalizedStringKey {
|
func laDelayText(_ t: Int) -> LocalizedStringKey {
|
||||||
let m = t / 60
|
let m = t / 60
|
||||||
@@ -367,6 +378,7 @@ struct SimplexLockView: View {
|
|||||||
Text(mode.text)
|
Text(mode.text)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.frame(height: 36)
|
||||||
if performLA {
|
if performLA {
|
||||||
Picker("Lock after", selection: $laLockDelay) {
|
Picker("Lock after", selection: $laLockDelay) {
|
||||||
let delays = laDelays.contains(laLockDelay) ? laDelays : [laLockDelay] + laDelays
|
let delays = laDelays.contains(laLockDelay) ? laDelays : [laLockDelay] + laDelays
|
||||||
@@ -374,6 +386,7 @@ struct SimplexLockView: View {
|
|||||||
Text(laDelayText(t))
|
Text(laDelayText(t))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.frame(height: 36)
|
||||||
if showChangePassword && laMode == .passcode {
|
if showChangePassword && laMode == .passcode {
|
||||||
Button("Change passcode") {
|
Button("Change passcode") {
|
||||||
changeLAPassword()
|
changeLAPassword()
|
||||||
|
|||||||
@@ -53,6 +53,10 @@ let DEFAULT_WHATS_NEW_VERSION = "defaultWhatsNewVersion"
|
|||||||
let DEFAULT_ONBOARDING_STAGE = "onboardingStage"
|
let DEFAULT_ONBOARDING_STAGE = "onboardingStage"
|
||||||
let DEFAULT_CUSTOM_DISAPPEARING_MESSAGE_TIME = "customDisappearingMessageTime"
|
let DEFAULT_CUSTOM_DISAPPEARING_MESSAGE_TIME = "customDisappearingMessageTime"
|
||||||
let DEFAULT_SHOW_UNREAD_AND_FAVORITES = "showUnreadAndFavorites"
|
let DEFAULT_SHOW_UNREAD_AND_FAVORITES = "showUnreadAndFavorites"
|
||||||
|
let DEFAULT_DEVICE_NAME_FOR_REMOTE_ACCESS = "deviceNameForRemoteAccess"
|
||||||
|
let DEFAULT_CONFIRM_REMOTE_SESSIONS = "confirmRemoteSessions"
|
||||||
|
let DEFAULT_CONNECT_REMOTE_VIA_MULTICAST = "connectRemoteViaMulticast"
|
||||||
|
let DEFAULT_OFFER_REMOTE_MULTICAST = "offerRemoteMulticast"
|
||||||
|
|
||||||
let appDefaults: [String: Any] = [
|
let appDefaults: [String: Any] = [
|
||||||
DEFAULT_SHOW_LA_NOTICE: false,
|
DEFAULT_SHOW_LA_NOTICE: false,
|
||||||
@@ -85,7 +89,10 @@ let appDefaults: [String: Any] = [
|
|||||||
DEFAULT_SHOW_MUTE_PROFILE_ALERT: true,
|
DEFAULT_SHOW_MUTE_PROFILE_ALERT: true,
|
||||||
DEFAULT_ONBOARDING_STAGE: OnboardingStage.onboardingComplete.rawValue,
|
DEFAULT_ONBOARDING_STAGE: OnboardingStage.onboardingComplete.rawValue,
|
||||||
DEFAULT_CUSTOM_DISAPPEARING_MESSAGE_TIME: 300,
|
DEFAULT_CUSTOM_DISAPPEARING_MESSAGE_TIME: 300,
|
||||||
DEFAULT_SHOW_UNREAD_AND_FAVORITES: false
|
DEFAULT_SHOW_UNREAD_AND_FAVORITES: false,
|
||||||
|
DEFAULT_CONFIRM_REMOTE_SESSIONS: false,
|
||||||
|
DEFAULT_CONNECT_REMOTE_VIA_MULTICAST: false,
|
||||||
|
DEFAULT_OFFER_REMOTE_MULTICAST: true
|
||||||
]
|
]
|
||||||
|
|
||||||
enum SimpleXLinkMode: String, Identifiable {
|
enum SimpleXLinkMode: String, Identifiable {
|
||||||
@@ -93,7 +100,7 @@ enum SimpleXLinkMode: String, Identifiable {
|
|||||||
case full
|
case full
|
||||||
case browser
|
case browser
|
||||||
|
|
||||||
static var values: [SimpleXLinkMode] = [.description, .full, .browser]
|
static var values: [SimpleXLinkMode] = [.description, .full]
|
||||||
|
|
||||||
public var id: Self { self }
|
public var id: Self { self }
|
||||||
|
|
||||||
@@ -178,6 +185,12 @@ struct SettingsView: View {
|
|||||||
} label: {
|
} label: {
|
||||||
settingsRow("switch.2") { Text("Chat preferences") }
|
settingsRow("switch.2") { Text("Chat preferences") }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NavigationLink {
|
||||||
|
ConnectDesktopView(viaSettings: true)
|
||||||
|
} label: {
|
||||||
|
settingsRow("desktopcomputer") { Text("Use from desktop") }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
.disabled(chatModel.chatRunning != true)
|
.disabled(chatModel.chatRunning != true)
|
||||||
|
|
||||||
@@ -362,7 +375,9 @@ struct SettingsView: View {
|
|||||||
|
|
||||||
func settingsRow<Content : View>(_ icon: String, color: Color = .secondary, content: @escaping () -> Content) -> some View {
|
func settingsRow<Content : View>(_ icon: String, color: Color = .secondary, content: @escaping () -> Content) -> some View {
|
||||||
ZStack(alignment: .leading) {
|
ZStack(alignment: .leading) {
|
||||||
Image(systemName: icon).frame(maxWidth: 24, maxHeight: 24, alignment: .center).foregroundColor(color)
|
Image(systemName: icon).frame(maxWidth: 24, maxHeight: 24, alignment: .center)
|
||||||
|
.symbolRenderingMode(.monochrome)
|
||||||
|
.foregroundColor(color)
|
||||||
content().padding(.leading, indent)
|
content().padding(.leading, indent)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -381,7 +396,9 @@ struct ProfilePreview: View {
|
|||||||
Text(profileOf.displayName)
|
Text(profileOf.displayName)
|
||||||
.fontWeight(.bold)
|
.fontWeight(.bold)
|
||||||
.font(.title2)
|
.font(.title2)
|
||||||
Text(profileOf.fullName)
|
if profileOf.fullName != "" && profileOf.fullName != profileOf.displayName {
|
||||||
|
Text(profileOf.fullName)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -190,7 +190,7 @@ struct UserAddressView: View {
|
|||||||
|
|
||||||
@ViewBuilder private func existingAddressView(_ userAddress: UserContactLink) -> some View {
|
@ViewBuilder private func existingAddressView(_ userAddress: UserContactLink) -> some View {
|
||||||
Section {
|
Section {
|
||||||
MutableQRCode(uri: Binding.constant(userAddress.connReqContact))
|
MutableQRCode(uri: Binding.constant(simplexChatLink(userAddress.connReqContact)))
|
||||||
shareQRCodeButton(userAddress)
|
shareQRCodeButton(userAddress)
|
||||||
if MFMailComposeViewController.canSendMail() {
|
if MFMailComposeViewController.canSendMail() {
|
||||||
shareViaEmailButton(userAddress)
|
shareViaEmailButton(userAddress)
|
||||||
@@ -248,7 +248,7 @@ struct UserAddressView: View {
|
|||||||
|
|
||||||
private func shareQRCodeButton(_ userAddress: UserContactLink) -> some View {
|
private func shareQRCodeButton(_ userAddress: UserContactLink) -> some View {
|
||||||
Button {
|
Button {
|
||||||
showShareSheet(items: [userAddress.connReqContact])
|
showShareSheet(items: [simplexChatLink(userAddress.connReqContact)])
|
||||||
} label: {
|
} label: {
|
||||||
settingsRow("square.and.arrow.up") {
|
settingsRow("square.and.arrow.up") {
|
||||||
Text("Share address")
|
Text("Share address")
|
||||||
|
|||||||
@@ -17,6 +17,8 @@ struct UserProfile: View {
|
|||||||
@State private var showImagePicker = false
|
@State private var showImagePicker = false
|
||||||
@State private var showTakePhoto = false
|
@State private var showTakePhoto = false
|
||||||
@State private var chosenImage: UIImage? = nil
|
@State private var chosenImage: UIImage? = nil
|
||||||
|
@State private var alert: UserProfileAlert?
|
||||||
|
@FocusState private var focusDisplayName
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let user: User = chatModel.currentUser!
|
let user: User = chatModel.currentUser!
|
||||||
@@ -47,18 +49,27 @@ struct UserProfile: View {
|
|||||||
|
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
ZStack(alignment: .leading) {
|
ZStack(alignment: .leading) {
|
||||||
if !validDisplayName(profile.displayName) {
|
if !validNewProfileName(user) {
|
||||||
Image(systemName: "exclamationmark.circle")
|
Button {
|
||||||
.foregroundColor(.red)
|
alert = .invalidNameError(validName: mkValidName(profile.displayName))
|
||||||
.padding(.bottom, 10)
|
} label: {
|
||||||
|
Image(systemName: "exclamationmark.circle").foregroundColor(.red)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Image(systemName: "exclamationmark.circle").foregroundColor(.clear)
|
||||||
}
|
}
|
||||||
profileNameTextEdit("Display name", $profile.displayName)
|
profileNameTextEdit("Profile name", $profile.displayName)
|
||||||
|
.focused($focusDisplayName)
|
||||||
|
}
|
||||||
|
.padding(.bottom)
|
||||||
|
if showFullName(user) {
|
||||||
|
profileNameTextEdit("Full name (optional)", $profile.fullName)
|
||||||
|
.padding(.bottom)
|
||||||
}
|
}
|
||||||
profileNameTextEdit("Full name (optional)", $profile.fullName)
|
|
||||||
HStack(spacing: 20) {
|
HStack(spacing: 20) {
|
||||||
Button("Cancel") { editProfile = false }
|
Button("Cancel") { editProfile = false }
|
||||||
Button("Save (and notify contacts)") { saveProfile() }
|
Button("Save (and notify contacts)") { saveProfile() }
|
||||||
.disabled(profile.displayName == "" || !validDisplayName(profile.displayName))
|
.disabled(!canSaveProfile(user))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
|
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
|
||||||
@@ -74,11 +85,14 @@ struct UserProfile: View {
|
|||||||
.frame(maxWidth: .infinity, alignment: .center)
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
|
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
profileNameView("Display name:", user.profile.displayName)
|
profileNameView("Profile name:", user.profile.displayName)
|
||||||
profileNameView("Full name:", user.profile.fullName)
|
if showFullName(user) {
|
||||||
|
profileNameView("Full name:", user.profile.fullName)
|
||||||
|
}
|
||||||
Button("Edit") {
|
Button("Edit") {
|
||||||
profile = fromLocalProfile(user.profile)
|
profile = fromLocalProfile(user.profile)
|
||||||
editProfile = true
|
editProfile = true
|
||||||
|
focusDisplayName = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
|
.frame(maxWidth: .infinity, minHeight: 120, alignment: .leading)
|
||||||
@@ -117,14 +131,12 @@ struct UserProfile: View {
|
|||||||
profile.image = nil
|
profile.image = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.alert(item: $alert) { a in userProfileAlert(a, $profile.displayName) }
|
||||||
}
|
}
|
||||||
|
|
||||||
func profileNameTextEdit(_ label: LocalizedStringKey, _ name: Binding<String>) -> some View {
|
func profileNameTextEdit(_ label: LocalizedStringKey, _ name: Binding<String>) -> some View {
|
||||||
TextField(label, text: name)
|
TextField(label, text: name)
|
||||||
.textInputAutocapitalization(.never)
|
.padding(.leading, 32)
|
||||||
.disableAutocorrection(true)
|
|
||||||
.padding(.bottom)
|
|
||||||
.padding(.leading, 28)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func profileNameView(_ label: LocalizedStringKey, _ name: String) -> some View {
|
func profileNameView(_ label: LocalizedStringKey, _ name: String) -> some View {
|
||||||
@@ -141,19 +153,34 @@ struct UserProfile: View {
|
|||||||
showChooseSource = true
|
showChooseSource = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func validNewProfileName(_ user: User) -> Bool {
|
||||||
|
profile.displayName == user.profile.displayName || validDisplayName(profile.displayName.trimmingCharacters(in: .whitespaces))
|
||||||
|
}
|
||||||
|
|
||||||
|
private func showFullName(_ user: User) -> Bool {
|
||||||
|
user.profile.fullName != "" && user.profile.fullName != user.profile.displayName
|
||||||
|
}
|
||||||
|
|
||||||
|
private func canSaveProfile(_ user: User) -> Bool {
|
||||||
|
profile.displayName.trimmingCharacters(in: .whitespaces) != "" && validNewProfileName(user)
|
||||||
|
}
|
||||||
|
|
||||||
func saveProfile() {
|
func saveProfile() {
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
|
profile.displayName = profile.displayName.trimmingCharacters(in: .whitespaces)
|
||||||
if let (newProfile, _) = try await apiUpdateProfile(profile: profile) {
|
if let (newProfile, _) = try await apiUpdateProfile(profile: profile) {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
chatModel.updateCurrentUser(newProfile)
|
chatModel.updateCurrentUser(newProfile)
|
||||||
profile = newProfile
|
profile = newProfile
|
||||||
}
|
}
|
||||||
|
editProfile = false
|
||||||
|
} else {
|
||||||
|
alert = .duplicateUserError
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
logger.error("UserProfile apiUpdateProfile error: \(responseError(error))")
|
logger.error("UserProfile apiUpdateProfile error: \(responseError(error))")
|
||||||
}
|
}
|
||||||
editProfile = false
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,5 +18,9 @@
|
|||||||
<array>
|
<array>
|
||||||
<string>$(AppIdentifierPrefix)chat.simplex.app</string>
|
<string>$(AppIdentifierPrefix)chat.simplex.app</string>
|
||||||
</array>
|
</array>
|
||||||
|
<key>com.apple.developer.networking.multicast</key>
|
||||||
|
<true/>
|
||||||
|
<key>com.apple.developer.device-information.user-assigned-device-name</key>
|
||||||
|
<true/>
|
||||||
</dict>
|
</dict>
|
||||||
</plist>
|
</plist>
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ и %@ са свързани</target>
|
<target>%@ и %@ са свързани</target>
|
||||||
@@ -97,6 +101,10 @@
|
|||||||
<target>%1$@ в %2$@:</target>
|
<target>%1$@ в %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ е свързан!</target>
|
<target>%@ е свързан!</target>
|
||||||
@@ -122,6 +130,10 @@
|
|||||||
<target>%@ иска да се свърже!</target>
|
<target>%@ иска да се свърже!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ и %lld други членове са свързани</target>
|
<target>%@, %@ и %lld други членове са свързани</target>
|
||||||
@@ -187,11 +199,27 @@
|
|||||||
<target>%lld файл(а) с общ размер от %@</target>
|
<target>%lld файл(а) с общ размер от %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld членове</target>
|
<target>%lld членове</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld минути</target>
|
<target>%lld минути</target>
|
||||||
@@ -262,6 +290,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -364,6 +400,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -589,6 +629,10 @@
|
|||||||
<target>Всички съобщения ще бъдат изтрити - това не може да бъде отменено! Съобщенията ще бъдат изтрити САМО за вас.</target>
|
<target>Всички съобщения ще бъдат изтрити - това не може да бъде отменено! Съобщенията ще бъдат изтрити САМО за вас.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Всички ваши контакти ще останат свързани.</target>
|
<target>Всички ваши контакти ще останат свързани.</target>
|
||||||
@@ -694,6 +738,14 @@
|
|||||||
<target>Вече сте свързани?</target>
|
<target>Вече сте свързани?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Винаги използвай реле</target>
|
<target>Винаги използвай реле</target>
|
||||||
@@ -814,6 +866,10 @@
|
|||||||
<target>Назад</target>
|
<target>Назад</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>Лошо ID на съобщението</target>
|
<target>Лошо ID на съобщението</target>
|
||||||
@@ -829,6 +885,18 @@
|
|||||||
<target>По-добри съобщения</target>
|
<target>По-добри съобщения</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>И вие, и вашият контакт можете да добавяте реакции към съобщението.</target>
|
<target>И вие, и вашият контакт можете да добавяте реакции към съобщението.</target>
|
||||||
@@ -1090,24 +1158,31 @@
|
|||||||
<target>Свързване</target>
|
<target>Свързване</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Свързване директно</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Свързване инкогнито</target>
|
<target>Свързване инкогнито</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Свързване чрез линк на контакта</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Свързване чрез групов линк?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1125,6 +1200,18 @@
|
|||||||
<target>Свързване чрез еднократен линк за връзка</target>
|
<target>Свързване чрез еднократен линк за връзка</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Свързване със сървъра…</target>
|
<target>Свързване със сървъра…</target>
|
||||||
@@ -1135,6 +1222,10 @@
|
|||||||
<target>Свързване със сървър…(грешка: %@)</target>
|
<target>Свързване със сървър…(грешка: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Връзка</target>
|
<target>Връзка</target>
|
||||||
@@ -1155,6 +1246,10 @@
|
|||||||
<target>Заявката за връзка е изпратена!</target>
|
<target>Заявката за връзка е изпратена!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Времето на изчакване за установяване на връзката изтече</target>
|
<target>Времето на изчакване за установяване на връзката изтече</target>
|
||||||
@@ -1170,11 +1265,6 @@
|
|||||||
<target>Контактът вече съществува</target>
|
<target>Контактът вече съществува</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Контактът и всички съобщения ще бъдат изтрити - това не може да бъде отменено!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Контактът е скрит:</target>
|
<target>Контактът е скрит:</target>
|
||||||
@@ -1225,6 +1315,10 @@
|
|||||||
<target>Версия на ядрото: v%@</target>
|
<target>Версия на ядрото: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Създай</target>
|
<target>Създай</target>
|
||||||
@@ -1245,6 +1339,10 @@
|
|||||||
<target>Създай файл</target>
|
<target>Създай файл</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Създай групов линк</target>
|
<target>Създай групов линк</target>
|
||||||
@@ -1265,6 +1363,10 @@
|
|||||||
<target>Създай линк за еднократна покана</target>
|
<target>Създай линк за еднократна покана</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Създай опашка</target>
|
<target>Създай опашка</target>
|
||||||
@@ -1423,6 +1525,10 @@
|
|||||||
<target>Изтрий</target>
|
<target>Изтрий</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Изтрий контакт</target>
|
<target>Изтрий контакт</target>
|
||||||
@@ -1448,6 +1554,10 @@
|
|||||||
<target>Изтрий всички файлове</target>
|
<target>Изтрий всички файлове</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Изтрий архив</target>
|
<target>Изтрий архив</target>
|
||||||
@@ -1478,9 +1588,9 @@
|
|||||||
<target>Изтрий контакт</target>
|
<target>Изтрий контакт</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Изтрий контакт?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1623,6 +1733,18 @@
|
|||||||
<target>Описание</target>
|
<target>Описание</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Разработване</target>
|
<target>Разработване</target>
|
||||||
@@ -1713,19 +1835,17 @@
|
|||||||
<target>Прекъсни връзката</target>
|
<target>Прекъсни връзката</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<target>Открийте и се присъединете към групи</target>
|
<target>Открийте и се присъединете към групи</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Показвано Име</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Показвано име:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1898,6 +2018,14 @@
|
|||||||
<target>Криптирано съобщение: неочаквана грешка</target>
|
<target>Криптирано съобщение: неочаквана грешка</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Въведете kодa за достъп</target>
|
<target>Въведете kодa за достъп</target>
|
||||||
@@ -1908,6 +2036,10 @@
|
|||||||
<target>Въведи правилна парола.</target>
|
<target>Въведи правилна парола.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Въведи парола…</target>
|
<target>Въведи парола…</target>
|
||||||
@@ -1923,6 +2055,10 @@
|
|||||||
<target>Въведи сървъра ръчно</target>
|
<target>Въведи сървъра ръчно</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Въведи съобщение при посрещане…</target>
|
<target>Въведи съобщение при посрещане…</target>
|
||||||
@@ -1933,6 +2069,10 @@
|
|||||||
<target>Въведи съобщение при посрещане…(незадължително)</target>
|
<target>Въведи съобщение при посрещане…(незадължително)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Грешка при свързване със сървъра</target>
|
<target>Грешка при свързване със сървъра</target>
|
||||||
@@ -1990,6 +2130,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating member contact" xml:space="preserve">
|
<trans-unit id="Error creating member contact" xml:space="preserve">
|
||||||
<source>Error creating member contact</source>
|
<source>Error creating member contact</source>
|
||||||
|
<target>Грешка при създаване на контакт с член</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating profile!" xml:space="preserve">
|
<trans-unit id="Error creating profile!" xml:space="preserve">
|
||||||
@@ -2124,6 +2265,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
||||||
<source>Error sending member contact invitation</source>
|
<source>Error sending member contact invitation</source>
|
||||||
|
<target>Грешка при изпращане на съобщение за покана за контакт</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending message" xml:space="preserve">
|
<trans-unit id="Error sending message" xml:space="preserve">
|
||||||
@@ -2206,6 +2348,10 @@
|
|||||||
<target>Изход без запазване</target>
|
<target>Изход без запазване</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Експортирай база данни</target>
|
<target>Експортирай база данни</target>
|
||||||
@@ -2351,6 +2497,10 @@
|
|||||||
<target>Пълно име:</target>
|
<target>Пълно име:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Напълно преработено - работи във фонов режим!</target>
|
<target>Напълно преработено - работи във фонов режим!</target>
|
||||||
@@ -2371,6 +2521,14 @@
|
|||||||
<target>Група</target>
|
<target>Група</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Показвано име на групата</target>
|
<target>Показвано име на групата</target>
|
||||||
@@ -2671,6 +2829,10 @@
|
|||||||
<target>Несъвместима версия на базата данни</target>
|
<target>Несъвместима версия на базата данни</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Неправилен kод за достъп</target>
|
<target>Неправилен kод за достъп</target>
|
||||||
@@ -2718,6 +2880,10 @@
|
|||||||
<target>Невалиден линк за връзка</target>
|
<target>Невалиден линк за връзка</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Невалиден адрес на сървъра!</target>
|
<target>Невалиден адрес на сървъра!</target>
|
||||||
@@ -2809,16 +2975,33 @@
|
|||||||
<target>Влез в групата</target>
|
<target>Влез в групата</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Влез инкогнито</target>
|
<target>Влез инкогнито</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Присъединяване към групата</target>
|
<target>Присъединяване към групата</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Запазете връзките си</target>
|
<target>Запазете връзките си</target>
|
||||||
@@ -2879,6 +3062,14 @@
|
|||||||
<target>Ограничения</target>
|
<target>Ограничения</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Съобщение на живо!</target>
|
<target>Съобщение на живо!</target>
|
||||||
@@ -3029,6 +3220,10 @@
|
|||||||
<target>Съобщения и файлове</target>
|
<target>Съобщения и файлове</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Архивът на базата данни се мигрира…</target>
|
<target>Архивът на базата данни се мигрира…</target>
|
||||||
@@ -3360,6 +3555,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open" xml:space="preserve">
|
<trans-unit id="Open" xml:space="preserve">
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
|
<target>Отвори</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open Settings" xml:space="preserve">
|
<trans-unit id="Open Settings" xml:space="preserve">
|
||||||
@@ -3377,6 +3573,10 @@
|
|||||||
<target>Отвори конзолата</target>
|
<target>Отвори конзолата</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Отвори потребителските профили</target>
|
<target>Отвори потребителските профили</target>
|
||||||
@@ -3392,11 +3592,6 @@
|
|||||||
<target>Отваряне на база данни…</target>
|
<target>Отваряне на база данни…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Отварянето на линка в браузъра може да намали поверителността и сигурността на връзката. Несигурните SimpleX линкове ще бъдат червени.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>PING бройка</target>
|
<target>PING бройка</target>
|
||||||
@@ -3442,6 +3637,10 @@
|
|||||||
<target>Постави</target>
|
<target>Постави</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Постави изображение</target>
|
<target>Постави изображение</target>
|
||||||
@@ -3587,6 +3786,14 @@
|
|||||||
<target>Профилно изображение</target>
|
<target>Профилно изображение</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Профилна парола</target>
|
<target>Профилна парола</target>
|
||||||
@@ -3832,6 +4039,14 @@
|
|||||||
<target>Предоговори криптирането?</target>
|
<target>Предоговори криптирането?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Отговори</target>
|
<target>Отговори</target>
|
||||||
@@ -4017,6 +4232,10 @@
|
|||||||
<target>Сканирай QR код</target>
|
<target>Сканирай QR код</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Сканирай код</target>
|
<target>Сканирай код</target>
|
||||||
@@ -4099,6 +4318,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
||||||
<source>Send direct message to connect</source>
|
<source>Send direct message to connect</source>
|
||||||
|
<target>Изпрати лично съобщение за свързване</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send disappearing message" xml:space="preserve">
|
<trans-unit id="Send disappearing message" xml:space="preserve">
|
||||||
@@ -4236,6 +4456,10 @@
|
|||||||
<target>Сървъри</target>
|
<target>Сървъри</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Задай 1 ден</target>
|
<target>Задай 1 ден</target>
|
||||||
@@ -4546,6 +4770,10 @@
|
|||||||
<target>Докосни бутона </target>
|
<target>Докосни бутона </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Докосни за активиране на профил.</target>
|
<target>Докосни за активиране на профил.</target>
|
||||||
@@ -4643,11 +4871,6 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Криптирането работи и новото споразумение за криптиране не е необходимо. Това може да доведе до грешки при свързване!</target>
|
<target>Криптирането работи и новото споразумение за криптиране не е необходимо. Това може да доведе до грешки при свързване!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>Групата е напълно децентрализирана – видима е само за членовете.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>Хешът на предишното съобщение е различен.</target>
|
<target>Хешът на предишното съобщение е различен.</target>
|
||||||
@@ -4733,6 +4956,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Това действие не може да бъде отменено - вашият профил, контакти, съобщения и файлове ще бъдат безвъзвратно загубени.</target>
|
<target>Това действие не може да бъде отменено - вашият профил, контакти, съобщения и файлове ще бъдат безвъзвратно загубени.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>Тази група има над %lld членове, потвърждения за доставка не се изпращат.</target>
|
<target>Тази група има над %lld членове, потвърждения за доставка не се изпращат.</target>
|
||||||
@@ -4743,6 +4970,14 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Тази група вече не съществува.</target>
|
<target>Тази група вече не съществува.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>Тази настройка се прилага за съобщения в текущия ви профил **%@**.</target>
|
<target>Тази настройка се прилага за съобщения в текущия ви профил **%@**.</target>
|
||||||
@@ -4840,6 +5075,18 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<target>Не може да се запише гласово съобщение</target>
|
<target>Не може да се запише гласово съобщение</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Неочаквана грешка: %@</target>
|
<target>Неочаквана грешка: %@</target>
|
||||||
@@ -4902,6 +5149,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
За да се свържете, моля, помолете вашия контакт да създаде друг линк за връзка и проверете дали имате стабилна мрежова връзка.</target>
|
За да се свържете, моля, помолете вашия контакт да създаде друг линк за връзка и проверете дали имате стабилна мрежова връзка.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Отключи</target>
|
<target>Отключи</target>
|
||||||
@@ -4992,6 +5247,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Използвай за нови връзки</target>
|
<target>Използвай за нови връзки</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Използвай интерфейса за повикване на iOS</target>
|
<target>Използвай интерфейса за повикване на iOS</target>
|
||||||
@@ -5022,11 +5281,23 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Използват се сървърите на SimpleX Chat.</target>
|
<target>Използват се сървърите на SimpleX Chat.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Потвръди сигурността на връзката</target>
|
<target>Потвръди сигурността на връзката</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Потвръди кода за сигурност</target>
|
<target>Потвръди кода за сигурност</target>
|
||||||
@@ -5187,6 +5458,35 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Вече сте вече свързани с %@.</target>
|
<target>Вече сте вече свързани с %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Вие сте свързани към сървъра, използван за получаване на съобщения от този контакт.</target>
|
<target>Вие сте свързани към сървъра, използван за получаване на съобщения от този контакт.</target>
|
||||||
@@ -5282,6 +5582,15 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Не можахте да бъдете потвърдени; Моля, опитайте отново.</target>
|
<target>Не можахте да бъдете потвърдени; Моля, опитайте отново.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>Нямате чатове</target>
|
<target>Нямате чатове</target>
|
||||||
@@ -5332,6 +5641,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Ще бъдете свързани с групата, когато устройството на домакина на групата е онлайн, моля, изчакайте или проверете по-късно!</target>
|
<target>Ще бъдете свързани с групата, когато устройството на домакина на групата е онлайн, моля, изчакайте или проверете по-късно!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Ще бъдете свързани, когато заявката ви за връзка бъде приета, моля, изчакайте или проверете по-късно!</target>
|
<target>Ще бъдете свързани, когато заявката ви за връзка бъде приета, моля, изчакайте или проверете по-късно!</target>
|
||||||
@@ -5347,9 +5660,8 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Ще трябва да се идентифицирате, когато стартирате или възобновите приложението след 30 секунди във фонов режим.</target>
|
<target>Ще трябва да се идентифицирате, когато стартирате или възобновите приложението след 30 секунди във фонов режим.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Ще се присъедините към групата, към която този линк препраща, и ще се свържете с нейните членове.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5417,11 +5729,6 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Вашата чат база данни не е криптирана - задайте парола, за да я криптирате.</target>
|
<target>Вашата чат база данни не е криптирана - задайте парола, за да я криптирате.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Вашият чат профил ще бъде изпратен на членовете на групата</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Вашите чат профили</target>
|
<target>Вашите чат профили</target>
|
||||||
@@ -5476,6 +5783,10 @@ You can change it in Settings.</source>
|
|||||||
<target>Вашата поверителност</target>
|
<target>Вашата поверителност</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Вашият профил **%@** ще бъде споделен.</target>
|
<target>Вашият профил **%@** ще бъде споделен.</target>
|
||||||
@@ -5568,6 +5879,10 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
<target>винаги</target>
|
<target>винаги</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>аудио разговор (не е e2e криптиран)</target>
|
<target>аудио разговор (не е e2e криптиран)</target>
|
||||||
@@ -5583,6 +5898,10 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
<target>лош хеш на съобщението</target>
|
<target>лош хеш на съобщението</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>удебелен</target>
|
<target>удебелен</target>
|
||||||
@@ -5655,6 +5974,7 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connected directly" xml:space="preserve">
|
<trans-unit id="connected directly" xml:space="preserve">
|
||||||
<source>connected directly</source>
|
<source>connected directly</source>
|
||||||
|
<target>свързан директно</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connecting" xml:space="preserve">
|
<trans-unit id="connecting" xml:space="preserve">
|
||||||
@@ -5752,6 +6072,10 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
<target>изтрит</target>
|
<target>изтрит</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>групата изтрита</target>
|
<target>групата изтрита</target>
|
||||||
@@ -6036,7 +6360,8 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>изключено</target>
|
<target>изключено</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6053,11 +6378,6 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
<target>включено</target>
|
<target>включено</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>или пишете на разработчиците</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>собственик</target>
|
<target>собственик</target>
|
||||||
@@ -6120,6 +6440,7 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="send direct message" xml:space="preserve">
|
<trans-unit id="send direct message" xml:space="preserve">
|
||||||
<source>send direct message</source>
|
<source>send direct message</source>
|
||||||
|
<target>изпрати лично съобщение</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="starting…" xml:space="preserve">
|
<trans-unit id="starting…" xml:space="preserve">
|
||||||
@@ -6147,6 +6468,10 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
<target>актуализиран профил на групата</target>
|
<target>актуализиран профил на групата</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6284,6 +6609,10 @@ SimpleX сървърите не могат да видят вашия профи
|
|||||||
<target>SimpleX използва Face ID за локалнa идентификация</target>
|
<target>SimpleX използва Face ID за локалнa идентификация</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX се нуждае от достъп до микрофона за аудио и видео разговори и за запис на гласови съобщения.</target>
|
<target>SimpleX се нуждае от достъп до микрофона за аудио и видео разговори и за запис на гласови съобщения.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,11 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<target>%@ and %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ and %@ connected</target>
|
<target>%@ and %@ connected</target>
|
||||||
@@ -97,6 +102,11 @@
|
|||||||
<target>%1$@ at %2$@:</target>
|
<target>%1$@ at %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<target>%@ connected</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ is connected!</target>
|
<target>%@ is connected!</target>
|
||||||
@@ -122,6 +132,11 @@
|
|||||||
<target>%@ wants to connect!</target>
|
<target>%@ wants to connect!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<target>%@, %@ and %lld members</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ and %lld other members connected</target>
|
<target>%@, %@ and %lld other members connected</target>
|
||||||
@@ -187,11 +202,31 @@
|
|||||||
<target>%lld file(s) with total size of %@</target>
|
<target>%lld file(s) with total size of %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<target>%lld group events</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld members</target>
|
<target>%lld members</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<target>%lld messages blocked</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<target>%lld messages marked deleted</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<target>%lld messages moderated by %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld minutes</target>
|
<target>%lld minutes</target>
|
||||||
@@ -262,6 +297,16 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<target>(new)</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<target>(this device v%@)</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -364,6 +409,11 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<target>0 sec</target>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -589,6 +639,11 @@
|
|||||||
<target>All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.</target>
|
<target>All messages will be deleted - this cannot be undone! The messages will be deleted ONLY for you.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<target>All new messages from %@ will be hidden!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>All your contacts will remain connected.</target>
|
<target>All your contacts will remain connected.</target>
|
||||||
@@ -694,6 +749,16 @@
|
|||||||
<target>Already connected?</target>
|
<target>Already connected?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<target>Already connecting!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<target>Already joining the group!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Always use relay</target>
|
<target>Always use relay</target>
|
||||||
@@ -814,6 +879,11 @@
|
|||||||
<target>Back</target>
|
<target>Back</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<target>Bad desktop address</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>Bad message ID</target>
|
<target>Bad message ID</target>
|
||||||
@@ -829,6 +899,21 @@
|
|||||||
<target>Better messages</target>
|
<target>Better messages</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<target>Block</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<target>Block member</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<target>Block member?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>Both you and your contact can add message reactions.</target>
|
<target>Both you and your contact can add message reactions.</target>
|
||||||
@@ -1090,24 +1175,38 @@
|
|||||||
<target>Connect</target>
|
<target>Connect</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Connect directly</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Connect incognito</target>
|
<target>Connect incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Connect via contact link</target>
|
<target>Connect to desktop</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Connect via group link?</target>
|
<target>Connect to yourself?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<target>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<target>Connect to yourself?
|
||||||
|
This is your own one-time link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
|
<target>Connect via contact address</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1125,6 +1224,21 @@
|
|||||||
<target>Connect via one-time link</target>
|
<target>Connect via one-time link</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<target>Connect with %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<target>Connected desktop</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<target>Connected to desktop</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Connecting to server…</target>
|
<target>Connecting to server…</target>
|
||||||
@@ -1135,6 +1249,11 @@
|
|||||||
<target>Connecting to server… (error: %@)</target>
|
<target>Connecting to server… (error: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<target>Connecting to desktop</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Connection</target>
|
<target>Connection</target>
|
||||||
@@ -1155,6 +1274,11 @@
|
|||||||
<target>Connection request sent!</target>
|
<target>Connection request sent!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<target>Connection terminated</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Connection timeout</target>
|
<target>Connection timeout</target>
|
||||||
@@ -1170,11 +1294,6 @@
|
|||||||
<target>Contact already exists</target>
|
<target>Contact already exists</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Contact and all messages will be deleted - this cannot be undone!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Contact hidden:</target>
|
<target>Contact hidden:</target>
|
||||||
@@ -1225,6 +1344,11 @@
|
|||||||
<target>Core version: v%@</target>
|
<target>Core version: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<target>Correct name to %@?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Create</target>
|
<target>Create</target>
|
||||||
@@ -1245,6 +1369,11 @@
|
|||||||
<target>Create file</target>
|
<target>Create file</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<target>Create group</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Create group link</target>
|
<target>Create group link</target>
|
||||||
@@ -1265,6 +1394,11 @@
|
|||||||
<target>Create one-time invitation link</target>
|
<target>Create one-time invitation link</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<target>Create profile</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Create queue</target>
|
<target>Create queue</target>
|
||||||
@@ -1423,6 +1557,11 @@
|
|||||||
<target>Delete</target>
|
<target>Delete</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<target>Delete %lld messages?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Delete Contact</target>
|
<target>Delete Contact</target>
|
||||||
@@ -1448,6 +1587,11 @@
|
|||||||
<target>Delete all files</target>
|
<target>Delete all files</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<target>Delete and notify contact</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Delete archive</target>
|
<target>Delete archive</target>
|
||||||
@@ -1478,9 +1622,11 @@
|
|||||||
<target>Delete contact</target>
|
<target>Delete contact</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Delete contact?</target>
|
This cannot be undone!</source>
|
||||||
|
<target>Delete contact?
|
||||||
|
This cannot be undone!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1623,6 +1769,21 @@
|
|||||||
<target>Description</target>
|
<target>Description</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<target>Desktop address</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<target>Desktop app version %@ is not compatible with this app.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<target>Desktop devices</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Develop</target>
|
<target>Develop</target>
|
||||||
@@ -1713,19 +1874,19 @@
|
|||||||
<target>Disconnect</target>
|
<target>Disconnect</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<target>Disconnect desktop?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<target>Discover and join groups</target>
|
<target>Discover and join groups</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Display name</target>
|
<target>Discover on network</target>
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Display name:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1898,6 +2059,16 @@
|
|||||||
<target>Encrypted message: unexpected error</target>
|
<target>Encrypted message: unexpected error</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<target>Encryption re-negotiation error</target>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<target>Encryption re-negotiation failed.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Enter Passcode</target>
|
<target>Enter Passcode</target>
|
||||||
@@ -1908,6 +2079,11 @@
|
|||||||
<target>Enter correct passphrase.</target>
|
<target>Enter correct passphrase.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<target>Enter group name…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Enter passphrase…</target>
|
<target>Enter passphrase…</target>
|
||||||
@@ -1923,6 +2099,11 @@
|
|||||||
<target>Enter server manually</target>
|
<target>Enter server manually</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<target>Enter this device name…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Enter welcome message…</target>
|
<target>Enter welcome message…</target>
|
||||||
@@ -1933,6 +2114,11 @@
|
|||||||
<target>Enter welcome message… (optional)</target>
|
<target>Enter welcome message… (optional)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<target>Enter your name…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Error</target>
|
<target>Error</target>
|
||||||
@@ -2208,6 +2394,11 @@
|
|||||||
<target>Exit without saving</target>
|
<target>Exit without saving</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<target>Expand</target>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Export database</target>
|
<target>Export database</target>
|
||||||
@@ -2353,6 +2544,11 @@
|
|||||||
<target>Full name:</target>
|
<target>Full name:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<target>Fully decentralized – visible only to members.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Fully re-implemented - work in background!</target>
|
<target>Fully re-implemented - work in background!</target>
|
||||||
@@ -2373,6 +2569,16 @@
|
|||||||
<target>Group</target>
|
<target>Group</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<target>Group already exists</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<target>Group already exists!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Group display name</target>
|
<target>Group display name</target>
|
||||||
@@ -2673,6 +2879,11 @@
|
|||||||
<target>Incompatible database version</target>
|
<target>Incompatible database version</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<target>Incompatible version</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Incorrect passcode</target>
|
<target>Incorrect passcode</target>
|
||||||
@@ -2720,6 +2931,11 @@
|
|||||||
<target>Invalid connection link</target>
|
<target>Invalid connection link</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<target>Invalid name!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Invalid server address!</target>
|
<target>Invalid server address!</target>
|
||||||
@@ -2811,16 +3027,38 @@
|
|||||||
<target>Join group</target>
|
<target>Join group</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<target>Join group?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Join incognito</target>
|
<target>Join incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<target>Join with current profile</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<target>Join your group?
|
||||||
|
This is your link for group %@!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Joining group</target>
|
<target>Joining group</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<target>Keep the app open to use it from desktop</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Keep your connections</target>
|
<target>Keep your connections</target>
|
||||||
@@ -2881,6 +3119,16 @@
|
|||||||
<target>Limitations</target>
|
<target>Limitations</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<target>Linked desktop options</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<target>Linked desktops</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Live message!</target>
|
<target>Live message!</target>
|
||||||
@@ -3031,6 +3279,11 @@
|
|||||||
<target>Messages & files</target>
|
<target>Messages & files</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<target>Messages from %@ will be shown!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Migrating database archive…</target>
|
<target>Migrating database archive…</target>
|
||||||
@@ -3380,6 +3633,11 @@
|
|||||||
<target>Open chat console</target>
|
<target>Open chat console</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<target>Open group</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Open user profiles</target>
|
<target>Open user profiles</target>
|
||||||
@@ -3395,11 +3653,6 @@
|
|||||||
<target>Opening database…</target>
|
<target>Opening database…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>PING count</target>
|
<target>PING count</target>
|
||||||
@@ -3445,6 +3698,11 @@
|
|||||||
<target>Paste</target>
|
<target>Paste</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<target>Paste desktop address</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Paste image</target>
|
<target>Paste image</target>
|
||||||
@@ -3590,6 +3848,16 @@
|
|||||||
<target>Profile image</target>
|
<target>Profile image</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<target>Profile name</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<target>Profile name:</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Profile password</target>
|
<target>Profile password</target>
|
||||||
@@ -3835,6 +4103,16 @@
|
|||||||
<target>Renegotiate encryption?</target>
|
<target>Renegotiate encryption?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<target>Repeat connection request?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<target>Repeat join request?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Reply</target>
|
<target>Reply</target>
|
||||||
@@ -4020,6 +4298,11 @@
|
|||||||
<target>Scan QR code</target>
|
<target>Scan QR code</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<target>Scan QR code from desktop</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Scan code</target>
|
<target>Scan code</target>
|
||||||
@@ -4240,6 +4523,11 @@
|
|||||||
<target>Servers</target>
|
<target>Servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<target>Session code</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Set 1 day</target>
|
<target>Set 1 day</target>
|
||||||
@@ -4550,6 +4838,11 @@
|
|||||||
<target>Tap button </target>
|
<target>Tap button </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<target>Tap to Connect</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Tap to activate profile.</target>
|
<target>Tap to activate profile.</target>
|
||||||
@@ -4647,11 +4940,6 @@ It can happen because of some bug or when the connection is compromised.</target
|
|||||||
<target>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</target>
|
<target>The encryption is working and the new encryption agreement is not required. It may result in connection errors!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>The group is fully decentralized – it is visible only to the members.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>The hash of the previous message is different.</target>
|
<target>The hash of the previous message is different.</target>
|
||||||
@@ -4737,6 +5025,11 @@ It can happen because of some bug or when the connection is compromised.</target
|
|||||||
<target>This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost.</target>
|
<target>This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<target>This device name</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>This group has over %lld members, delivery receipts are not sent.</target>
|
<target>This group has over %lld members, delivery receipts are not sent.</target>
|
||||||
@@ -4747,6 +5040,16 @@ It can happen because of some bug or when the connection is compromised.</target
|
|||||||
<target>This group no longer exists.</target>
|
<target>This group no longer exists.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<target>This is your own SimpleX address!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<target>This is your own one-time link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>This setting applies to messages in your current chat profile **%@**.</target>
|
<target>This setting applies to messages in your current chat profile **%@**.</target>
|
||||||
@@ -4844,6 +5147,21 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<target>Unable to record voice message</target>
|
<target>Unable to record voice message</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<target>Unblock</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<target>Unblock member</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<target>Unblock member?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Unexpected error: %@</target>
|
<target>Unexpected error: %@</target>
|
||||||
@@ -4906,6 +5224,16 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
To connect, please ask your contact to create another connection link and check that you have a stable network connection.</target>
|
To connect, please ask your contact to create another connection link and check that you have a stable network connection.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<target>Unlink</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<target>Unlink desktop?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Unlock</target>
|
<target>Unlock</target>
|
||||||
@@ -4996,6 +5324,11 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Use for new connections</target>
|
<target>Use for new connections</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<target>Use from desktop</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Use iOS call interface</target>
|
<target>Use iOS call interface</target>
|
||||||
@@ -5026,11 +5359,26 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Using SimpleX Chat servers.</target>
|
<target>Using SimpleX Chat servers.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<target>Verify code with desktop</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<target>Verify connection</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Verify connection security</target>
|
<target>Verify connection security</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<target>Verify connections</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Verify security code</target>
|
<target>Verify security code</target>
|
||||||
@@ -5191,6 +5539,43 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>You are already connected to %@.</target>
|
<target>You are already connected to %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<target>You are already connecting to %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<target>You are already connecting via this one-time link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<target>You are already in group %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<target>You are already joining the group %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<target>You are already joining the group via this link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<target>You are already joining the group via this link.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<target>You are already joining the group!
|
||||||
|
Repeat join request?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>You are connected to the server used to receive messages from this contact.</target>
|
<target>You are connected to the server used to receive messages from this contact.</target>
|
||||||
@@ -5286,6 +5671,18 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>You could not be verified; please try again.</target>
|
<target>You could not be verified; please try again.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<target>You have already requested connection via this address!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<target>You have already requested connection!
|
||||||
|
Repeat connection request?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>You have no chats</target>
|
<target>You have no chats</target>
|
||||||
@@ -5336,6 +5733,11 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>You will be connected to group when the group host's device is online, please wait or check later!</target>
|
<target>You will be connected to group when the group host's device is online, please wait or check later!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<target>You will be connected when group link host's device is online, please wait or check later!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>You will be connected when your connection request is accepted, please wait or check later!</target>
|
<target>You will be connected when your connection request is accepted, please wait or check later!</target>
|
||||||
@@ -5351,9 +5753,9 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>You will be required to authenticate when you start or resume the app after 30 seconds in background.</target>
|
<target>You will be required to authenticate when you start or resume the app after 30 seconds in background.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>You will join a group this link refers to and connect to its group members.</target>
|
<target>You will connect to all group members.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5421,11 +5823,6 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Your chat database is not encrypted - set passphrase to encrypt it.</target>
|
<target>Your chat database is not encrypted - set passphrase to encrypt it.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Your chat profile will be sent to group members</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Your chat profiles</target>
|
<target>Your chat profiles</target>
|
||||||
@@ -5480,6 +5877,11 @@ You can change it in Settings.</target>
|
|||||||
<target>Your privacy</target>
|
<target>Your privacy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<target>Your profile</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Your profile **%@** will be shared.</target>
|
<target>Your profile **%@** will be shared.</target>
|
||||||
@@ -5572,6 +5974,11 @@ SimpleX servers cannot see your profile.</target>
|
|||||||
<target>always</target>
|
<target>always</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<target>and %lld other events</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>audio call (not e2e encrypted)</target>
|
<target>audio call (not e2e encrypted)</target>
|
||||||
@@ -5587,6 +5994,11 @@ SimpleX servers cannot see your profile.</target>
|
|||||||
<target>bad message hash</target>
|
<target>bad message hash</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<target>blocked</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>bold</target>
|
<target>bold</target>
|
||||||
@@ -5757,6 +6169,11 @@ SimpleX servers cannot see your profile.</target>
|
|||||||
<target>deleted</target>
|
<target>deleted</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<target>deleted contact</target>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>deleted group</target>
|
<target>deleted group</target>
|
||||||
@@ -6041,7 +6458,8 @@ SimpleX servers cannot see your profile.</target>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>off</target>
|
<target>off</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6058,11 +6476,6 @@ SimpleX servers cannot see your profile.</target>
|
|||||||
<target>on</target>
|
<target>on</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>or chat with the developers</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>owner</target>
|
<target>owner</target>
|
||||||
@@ -6153,6 +6566,11 @@ SimpleX servers cannot see your profile.</target>
|
|||||||
<target>updated group profile</target>
|
<target>updated group profile</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<target>v%@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6290,6 +6708,11 @@ SimpleX servers cannot see your profile.</target>
|
|||||||
<target>SimpleX uses Face ID for local authentication</target>
|
<target>SimpleX uses Face ID for local authentication</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<target>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</target>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX needs microphone access for audio and video calls, and to record voice messages.</target>
|
<target>SimpleX needs microphone access for audio and video calls, and to record voice messages.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ y %@ conectados</target>
|
<target>%@ y %@ conectados</target>
|
||||||
@@ -97,6 +101,10 @@
|
|||||||
<target>%1$@ a las %2$@:</target>
|
<target>%1$@ a las %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ ¡está conectado!</target>
|
<target>%@ ¡está conectado!</target>
|
||||||
@@ -122,6 +130,10 @@
|
|||||||
<target>¡ %@ quiere contactar!</target>
|
<target>¡ %@ quiere contactar!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ y %lld miembros más conectados</target>
|
<target>%@, %@ y %lld miembros más conectados</target>
|
||||||
@@ -187,11 +199,27 @@
|
|||||||
<target>%lld archivo(s) con un tamaño total de %@</target>
|
<target>%lld archivo(s) con un tamaño total de %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld miembros</target>
|
<target>%lld miembros</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld minutos</target>
|
<target>%lld minutos</target>
|
||||||
@@ -199,6 +227,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%lld new interface languages" xml:space="preserve">
|
<trans-unit id="%lld new interface languages" xml:space="preserve">
|
||||||
<source>%lld new interface languages</source>
|
<source>%lld new interface languages</source>
|
||||||
|
<target>%lld idiomas de interfaz nuevos</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%lld second(s)" xml:space="preserve">
|
<trans-unit id="%lld second(s)" xml:space="preserve">
|
||||||
@@ -248,12 +277,12 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
|
<trans-unit id="%u messages failed to decrypt." xml:space="preserve">
|
||||||
<source>%u messages failed to decrypt.</source>
|
<source>%u messages failed to decrypt.</source>
|
||||||
<target>%u mensajes no pudieron ser descifrados.</target>
|
<target>%u mensaje(s) no ha(n) podido ser descifrado(s).</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%u messages skipped." xml:space="preserve">
|
<trans-unit id="%u messages skipped." xml:space="preserve">
|
||||||
<source>%u messages skipped.</source>
|
<source>%u messages skipped.</source>
|
||||||
<target>%u mensajes omitidos.</target>
|
<target>%u mensaje(s) omitido(s).</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="(" xml:space="preserve">
|
<trans-unit id="(" xml:space="preserve">
|
||||||
@@ -261,6 +290,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -335,6 +372,9 @@
|
|||||||
<source>- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!
|
<source>- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!
|
||||||
- delivery receipts (up to 20 members).
|
- delivery receipts (up to 20 members).
|
||||||
- faster and more stable.</source>
|
- faster and more stable.</source>
|
||||||
|
<target>- conexión al [servicio de directorio](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!
|
||||||
|
- confirmaciones de entrega (hasta 20 miembros).
|
||||||
|
- mayor rapidez y estabilidad.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="- more stable message delivery. - a bit better groups. - and more!" xml:space="preserve">
|
<trans-unit id="- more stable message delivery. - a bit better groups. - and more!" xml:space="preserve">
|
||||||
@@ -360,6 +400,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -585,6 +629,10 @@
|
|||||||
<target>Se eliminarán todos los mensajes SOLO para tí. ¡No podrá deshacerse!</target>
|
<target>Se eliminarán todos los mensajes SOLO para tí. ¡No podrá deshacerse!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Todos tus contactos permanecerán conectados.</target>
|
<target>Todos tus contactos permanecerán conectados.</target>
|
||||||
@@ -690,6 +738,14 @@
|
|||||||
<target>¿Ya está conectado?</target>
|
<target>¿Ya está conectado?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Usar siempre retransmisor</target>
|
<target>Usar siempre retransmisor</target>
|
||||||
@@ -712,6 +768,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
|
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
|
||||||
<source>App encrypts new local files (except videos).</source>
|
<source>App encrypts new local files (except videos).</source>
|
||||||
|
<target>Cifrado de los nuevos archivos locales (excepto vídeos).</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="App icon" xml:space="preserve">
|
<trans-unit id="App icon" xml:space="preserve">
|
||||||
@@ -809,6 +866,10 @@
|
|||||||
<target>Volver</target>
|
<target>Volver</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>ID de mensaje incorrecto</target>
|
<target>ID de mensaje incorrecto</target>
|
||||||
@@ -824,6 +885,18 @@
|
|||||||
<target>Mensajes mejorados</target>
|
<target>Mensajes mejorados</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>Tanto tú como tu contacto podéis añadir reacciones a los mensajes.</target>
|
<target>Tanto tú como tu contacto podéis añadir reacciones a los mensajes.</target>
|
||||||
@@ -851,6 +924,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" xml:space="preserve">
|
<trans-unit id="Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" xml:space="preserve">
|
||||||
<source>Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</source>
|
<source>Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</source>
|
||||||
|
<target>Búlgaro, Finlandés, Tailandés y Ucraniano - gracias a los usuarios y [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
|
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
|
||||||
@@ -1084,24 +1158,31 @@
|
|||||||
<target>Conectar</target>
|
<target>Conectar</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Conectar directamente</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Conectar incognito</target>
|
<target>Conectar incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Conectar mediante enlace de contacto</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>¿Conectar mediante enlace de grupo?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1119,6 +1200,18 @@
|
|||||||
<target>Conectar mediante enlace de un sólo uso</target>
|
<target>Conectar mediante enlace de un sólo uso</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Conectando con el servidor…</target>
|
<target>Conectando con el servidor…</target>
|
||||||
@@ -1129,6 +1222,10 @@
|
|||||||
<target>Conectando con el servidor... (error: %@)</target>
|
<target>Conectando con el servidor... (error: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Conexión</target>
|
<target>Conexión</target>
|
||||||
@@ -1149,6 +1246,10 @@
|
|||||||
<target>¡Solicitud de conexión enviada!</target>
|
<target>¡Solicitud de conexión enviada!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Tiempo de conexión expirado</target>
|
<target>Tiempo de conexión expirado</target>
|
||||||
@@ -1164,11 +1265,6 @@
|
|||||||
<target>El contácto ya existe</target>
|
<target>El contácto ya existe</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>El contacto y todos los mensajes serán eliminados. ¡No podrá deshacerse!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Contacto oculto:</target>
|
<target>Contacto oculto:</target>
|
||||||
@@ -1219,6 +1315,10 @@
|
|||||||
<target>Versión Core: v%@</target>
|
<target>Versión Core: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Crear</target>
|
<target>Crear</target>
|
||||||
@@ -1239,6 +1339,10 @@
|
|||||||
<target>Crear archivo</target>
|
<target>Crear archivo</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Crear enlace de grupo</target>
|
<target>Crear enlace de grupo</target>
|
||||||
@@ -1251,6 +1355,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
||||||
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
||||||
|
<target>Crea perfil nuevo en la [aplicación para PC](https://simplex.Descargas/de chat/). 💻</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
||||||
@@ -1258,6 +1363,10 @@
|
|||||||
<target>Crea enlace de invitación de un uso</target>
|
<target>Crea enlace de invitación de un uso</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Crear cola</target>
|
<target>Crear cola</target>
|
||||||
@@ -1416,6 +1525,10 @@
|
|||||||
<target>Eliminar</target>
|
<target>Eliminar</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Eliminar contacto</target>
|
<target>Eliminar contacto</target>
|
||||||
@@ -1441,6 +1554,10 @@
|
|||||||
<target>Eliminar todos los archivos</target>
|
<target>Eliminar todos los archivos</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Eliminar archivo</target>
|
<target>Eliminar archivo</target>
|
||||||
@@ -1471,9 +1588,9 @@
|
|||||||
<target>Eliminar contacto</target>
|
<target>Eliminar contacto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Eliminar contacto?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1616,6 +1733,18 @@
|
|||||||
<target>Descripción</target>
|
<target>Descripción</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Desarrollo</target>
|
<target>Desarrollo</target>
|
||||||
@@ -1706,18 +1835,17 @@
|
|||||||
<target>Desconectar</target>
|
<target>Desconectar</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
|
<target>Descubre y únete a grupos</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Nombre mostrado</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Nombre mostrado:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1847,10 +1975,12 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Encrypt local files" xml:space="preserve">
|
<trans-unit id="Encrypt local files" xml:space="preserve">
|
||||||
<source>Encrypt local files</source>
|
<source>Encrypt local files</source>
|
||||||
|
<target>Cifra archivos locales</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Encrypt stored files & media" xml:space="preserve">
|
<trans-unit id="Encrypt stored files & media" xml:space="preserve">
|
||||||
<source>Encrypt stored files & media</source>
|
<source>Encrypt stored files & media</source>
|
||||||
|
<target>Cifra archivos almacenados y multimedia</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Encrypted database" xml:space="preserve">
|
<trans-unit id="Encrypted database" xml:space="preserve">
|
||||||
@@ -1888,6 +2018,14 @@
|
|||||||
<target>Mensaje cifrado: error inesperado</target>
|
<target>Mensaje cifrado: error inesperado</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Introduce Código</target>
|
<target>Introduce Código</target>
|
||||||
@@ -1898,6 +2036,10 @@
|
|||||||
<target>Introduce la contraseña correcta.</target>
|
<target>Introduce la contraseña correcta.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Introduce la contraseña…</target>
|
<target>Introduce la contraseña…</target>
|
||||||
@@ -1913,6 +2055,10 @@
|
|||||||
<target>Introduce el servidor manualmente</target>
|
<target>Introduce el servidor manualmente</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Introduce mensaje de bienvenida…</target>
|
<target>Introduce mensaje de bienvenida…</target>
|
||||||
@@ -1923,6 +2069,10 @@
|
|||||||
<target>Introduce mensaje de bienvenida… (opcional)</target>
|
<target>Introduce mensaje de bienvenida… (opcional)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Error</target>
|
<target>Error</target>
|
||||||
@@ -1980,6 +2130,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating member contact" xml:space="preserve">
|
<trans-unit id="Error creating member contact" xml:space="preserve">
|
||||||
<source>Error creating member contact</source>
|
<source>Error creating member contact</source>
|
||||||
|
<target>Error al establecer contacto con el miembro</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating profile!" xml:space="preserve">
|
<trans-unit id="Error creating profile!" xml:space="preserve">
|
||||||
@@ -1989,6 +2140,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error decrypting file" xml:space="preserve">
|
<trans-unit id="Error decrypting file" xml:space="preserve">
|
||||||
<source>Error decrypting file</source>
|
<source>Error decrypting file</source>
|
||||||
|
<target>Error al descifrar el archivo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error deleting chat database" xml:space="preserve">
|
<trans-unit id="Error deleting chat database" xml:space="preserve">
|
||||||
@@ -2113,6 +2265,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
||||||
<source>Error sending member contact invitation</source>
|
<source>Error sending member contact invitation</source>
|
||||||
|
<target>Error al enviar mensaje de invitación al contacto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending message" xml:space="preserve">
|
<trans-unit id="Error sending message" xml:space="preserve">
|
||||||
@@ -2195,6 +2348,10 @@
|
|||||||
<target>Salir sin guardar</target>
|
<target>Salir sin guardar</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Exportar base de datos</target>
|
<target>Exportar base de datos</target>
|
||||||
@@ -2340,6 +2497,10 @@
|
|||||||
<target>Nombre completo:</target>
|
<target>Nombre completo:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Completamente reimplementado: ¡funciona en segundo plano!</target>
|
<target>Completamente reimplementado: ¡funciona en segundo plano!</target>
|
||||||
@@ -2360,6 +2521,14 @@
|
|||||||
<target>Grupo</target>
|
<target>Grupo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Nombre mostrado del grupo</target>
|
<target>Nombre mostrado del grupo</target>
|
||||||
@@ -2462,12 +2631,12 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Group will be deleted for all members - this cannot be undone!" xml:space="preserve">
|
<trans-unit id="Group will be deleted for all members - this cannot be undone!" xml:space="preserve">
|
||||||
<source>Group will be deleted for all members - this cannot be undone!</source>
|
<source>Group will be deleted for all members - this cannot be undone!</source>
|
||||||
<target>El grupo se eliminará para todos los miembros. ¡No podrá deshacerse!</target>
|
<target>El grupo será eliminado para todos los miembros. ¡No podrá deshacerse!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Group will be deleted for you - this cannot be undone!" xml:space="preserve">
|
<trans-unit id="Group will be deleted for you - this cannot be undone!" xml:space="preserve">
|
||||||
<source>Group will be deleted for you - this cannot be undone!</source>
|
<source>Group will be deleted for you - this cannot be undone!</source>
|
||||||
<target>El grupo se eliminará para tí. ¡No podrá deshacerse!</target>
|
<target>El grupo será eliminado para tí. ¡No podrá deshacerse!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Help" xml:space="preserve">
|
<trans-unit id="Help" xml:space="preserve">
|
||||||
@@ -2660,6 +2829,10 @@
|
|||||||
<target>Versión de base de datos incompatible</target>
|
<target>Versión de base de datos incompatible</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Código de acceso incorrecto</target>
|
<target>Código de acceso incorrecto</target>
|
||||||
@@ -2707,6 +2880,10 @@
|
|||||||
<target>Enlace de conexión no válido</target>
|
<target>Enlace de conexión no válido</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>¡Dirección de servidor no válida!</target>
|
<target>¡Dirección de servidor no válida!</target>
|
||||||
@@ -2798,16 +2975,33 @@
|
|||||||
<target>Únete al grupo</target>
|
<target>Únete al grupo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Únete en modo incógnito</target>
|
<target>Únete en modo incógnito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Entrando al grupo</target>
|
<target>Entrando al grupo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Conserva tus conexiones</target>
|
<target>Conserva tus conexiones</target>
|
||||||
@@ -2868,6 +3062,14 @@
|
|||||||
<target>Limitaciones</target>
|
<target>Limitaciones</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>¡Mensaje en vivo!</target>
|
<target>¡Mensaje en vivo!</target>
|
||||||
@@ -3018,6 +3220,10 @@
|
|||||||
<target>Mensajes</target>
|
<target>Mensajes</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Migrando base de datos…</target>
|
<target>Migrando base de datos…</target>
|
||||||
@@ -3130,6 +3336,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="New desktop app!" xml:space="preserve">
|
<trans-unit id="New desktop app!" xml:space="preserve">
|
||||||
<source>New desktop app!</source>
|
<source>New desktop app!</source>
|
||||||
|
<target>Nueva aplicación para PC!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="New display name" xml:space="preserve">
|
<trans-unit id="New display name" xml:space="preserve">
|
||||||
@@ -3348,6 +3555,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open" xml:space="preserve">
|
<trans-unit id="Open" xml:space="preserve">
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
|
<target>Abrir</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open Settings" xml:space="preserve">
|
<trans-unit id="Open Settings" xml:space="preserve">
|
||||||
@@ -3365,6 +3573,10 @@
|
|||||||
<target>Abrir consola de Chat</target>
|
<target>Abrir consola de Chat</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Abrir perfil de usuario</target>
|
<target>Abrir perfil de usuario</target>
|
||||||
@@ -3380,11 +3592,6 @@
|
|||||||
<target>Abriendo base de datos…</target>
|
<target>Abriendo base de datos…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Abrir el enlace en el navegador puede reducir la privacidad y seguridad de la conexión. Los enlaces SimpleX que no son de confianza aparecerán en rojo.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>Contador PING</target>
|
<target>Contador PING</target>
|
||||||
@@ -3430,6 +3637,10 @@
|
|||||||
<target>Pegar</target>
|
<target>Pegar</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Pegar imagen</target>
|
<target>Pegar imagen</target>
|
||||||
@@ -3575,6 +3786,14 @@
|
|||||||
<target>Imagen del perfil</target>
|
<target>Imagen del perfil</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Contraseña del perfil</target>
|
<target>Contraseña del perfil</target>
|
||||||
@@ -3820,6 +4039,14 @@
|
|||||||
<target>¿Renegociar cifrado?</target>
|
<target>¿Renegociar cifrado?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Responder</target>
|
<target>Responder</target>
|
||||||
@@ -4005,6 +4232,10 @@
|
|||||||
<target>Escanear código QR</target>
|
<target>Escanear código QR</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Escanear código</target>
|
<target>Escanear código</target>
|
||||||
@@ -4087,6 +4318,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
||||||
<source>Send direct message to connect</source>
|
<source>Send direct message to connect</source>
|
||||||
|
<target>Enviar mensaje directo para conectar</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send disappearing message" xml:space="preserve">
|
<trans-unit id="Send disappearing message" xml:space="preserve">
|
||||||
@@ -4224,6 +4456,10 @@
|
|||||||
<target>Servidores</target>
|
<target>Servidores</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Establecer 1 día</target>
|
<target>Establecer 1 día</target>
|
||||||
@@ -4391,6 +4627,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Simplified incognito mode" xml:space="preserve">
|
<trans-unit id="Simplified incognito mode" xml:space="preserve">
|
||||||
<source>Simplified incognito mode</source>
|
<source>Simplified incognito mode</source>
|
||||||
|
<target>Modo incógnito simplificado</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Skip" xml:space="preserve">
|
<trans-unit id="Skip" xml:space="preserve">
|
||||||
@@ -4533,6 +4770,10 @@
|
|||||||
<target>Pulsa el botón </target>
|
<target>Pulsa el botón </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Pulsa sobre un perfil para activarlo.</target>
|
<target>Pulsa sobre un perfil para activarlo.</target>
|
||||||
@@ -4630,11 +4871,6 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
|
|||||||
<target>El cifrado funciona y un cifrado nuevo no es necesario. ¡Podría dar lugar a errores de conexión!</target>
|
<target>El cifrado funciona y un cifrado nuevo no es necesario. ¡Podría dar lugar a errores de conexión!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>El grupo está totalmente descentralizado y sólo es visible para los miembros.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>El hash del mensaje anterior es diferente.</target>
|
<target>El hash del mensaje anterior es diferente.</target>
|
||||||
@@ -4720,6 +4956,10 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
|
|||||||
<target>Esta acción no se puede deshacer. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente.</target>
|
<target>Esta acción no se puede deshacer. Tu perfil, contactos, mensajes y archivos se perderán irreversiblemente.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>Este grupo tiene más de %lld miembros, no se enviarán confirmaciones de entrega.</target>
|
<target>Este grupo tiene más de %lld miembros, no se enviarán confirmaciones de entrega.</target>
|
||||||
@@ -4730,6 +4970,14 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
|
|||||||
<target>Este grupo ya no existe.</target>
|
<target>Este grupo ya no existe.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>Esta configuración se aplica a los mensajes del perfil actual **%@**.</target>
|
<target>Esta configuración se aplica a los mensajes del perfil actual **%@**.</target>
|
||||||
@@ -4789,6 +5037,7 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
|
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
|
||||||
<source>Toggle incognito when connecting.</source>
|
<source>Toggle incognito when connecting.</source>
|
||||||
|
<target>Activa incógnito al conectar.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Transport isolation" xml:space="preserve">
|
<trans-unit id="Transport isolation" xml:space="preserve">
|
||||||
@@ -4826,6 +5075,18 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
|
|||||||
<target>No se puede grabar mensaje de voz</target>
|
<target>No se puede grabar mensaje de voz</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Error inesperado: %@</target>
|
<target>Error inesperado: %@</target>
|
||||||
@@ -4889,6 +5150,14 @@ que este enlace ya se haya usado, podría ser un error. Por favor, notifícalo.
|
|||||||
Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueba que tienes buena conexión de red.</target>
|
Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueba que tienes buena conexión de red.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Desbloquear</target>
|
<target>Desbloquear</target>
|
||||||
@@ -4979,6 +5248,10 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
|||||||
<target>Usar para conexiones nuevas</target>
|
<target>Usar para conexiones nuevas</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Usar interfaz de llamada de iOS</target>
|
<target>Usar interfaz de llamada de iOS</target>
|
||||||
@@ -5009,11 +5282,23 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
|||||||
<target>Usar servidores SimpleX Chat.</target>
|
<target>Usar servidores SimpleX Chat.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Comprobar la seguridad de la conexión</target>
|
<target>Comprobar la seguridad de la conexión</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Comprobar código de seguridad</target>
|
<target>Comprobar código de seguridad</target>
|
||||||
@@ -5174,6 +5459,35 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
|||||||
<target>Ya estás conectado a %@.</target>
|
<target>Ya estás conectado a %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Estás conectado al servidor usado para recibir mensajes de este contacto.</target>
|
<target>Estás conectado al servidor usado para recibir mensajes de este contacto.</target>
|
||||||
@@ -5269,6 +5583,15 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
|||||||
<target>No has podido ser autenticado. Inténtalo de nuevo.</target>
|
<target>No has podido ser autenticado. Inténtalo de nuevo.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>No tienes chats</target>
|
<target>No tienes chats</target>
|
||||||
@@ -5319,6 +5642,10 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
|||||||
<target>Te conectarás al grupo cuando el dispositivo del anfitrión esté en línea, por favor espera o compruébalo más tarde.</target>
|
<target>Te conectarás al grupo cuando el dispositivo del anfitrión esté en línea, por favor espera o compruébalo más tarde.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Te conectarás cuando tu solicitud se acepte, por favor espera o compruébalo más tarde.</target>
|
<target>Te conectarás cuando tu solicitud se acepte, por favor espera o compruébalo más tarde.</target>
|
||||||
@@ -5334,9 +5661,8 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
|||||||
<target>Se te pedirá identificarte cuándo inicies o continues usando la aplicación tras 30 segundos en segundo plano.</target>
|
<target>Se te pedirá identificarte cuándo inicies o continues usando la aplicación tras 30 segundos en segundo plano.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Te unirás al grupo al que hace referencia este enlace y te conectarás con sus miembros.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5404,11 +5730,6 @@ Para conectarte, pide a tu contacto que cree otro enlace de conexión y comprueb
|
|||||||
<target>La base de datos no está cifrada - establece una contraseña para cifrarla.</target>
|
<target>La base de datos no está cifrada - establece una contraseña para cifrarla.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Tu perfil será enviado a los miembros del grupo</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Mis perfiles</target>
|
<target>Mis perfiles</target>
|
||||||
@@ -5463,6 +5784,10 @@ Puedes cambiarlo en Configuración.</target>
|
|||||||
<target>Privacidad</target>
|
<target>Privacidad</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Tu perfil **%@** será compartido.</target>
|
<target>Tu perfil **%@** será compartido.</target>
|
||||||
@@ -5555,6 +5880,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
<target>siempre</target>
|
<target>siempre</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>llamada (sin cifrar)</target>
|
<target>llamada (sin cifrar)</target>
|
||||||
@@ -5570,6 +5899,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
<target>hash de mensaje erróneo</target>
|
<target>hash de mensaje erróneo</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>negrita</target>
|
<target>negrita</target>
|
||||||
@@ -5642,6 +5975,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connected directly" xml:space="preserve">
|
<trans-unit id="connected directly" xml:space="preserve">
|
||||||
<source>connected directly</source>
|
<source>connected directly</source>
|
||||||
|
<target>conectado directamente</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connecting" xml:space="preserve">
|
<trans-unit id="connecting" xml:space="preserve">
|
||||||
@@ -5739,6 +6073,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
<target>eliminado</target>
|
<target>eliminado</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>grupo eliminado</target>
|
<target>grupo eliminado</target>
|
||||||
@@ -6023,7 +6361,8 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>desactivado</target>
|
<target>desactivado</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6040,11 +6379,6 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
<target>Activado</target>
|
<target>Activado</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>o contacta mediante Chat con los desarrolladores</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>propietario</target>
|
<target>propietario</target>
|
||||||
@@ -6107,6 +6441,7 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="send direct message" xml:space="preserve">
|
<trans-unit id="send direct message" xml:space="preserve">
|
||||||
<source>send direct message</source>
|
<source>send direct message</source>
|
||||||
|
<target>Enviar mensaje directo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="starting…" xml:space="preserve">
|
<trans-unit id="starting…" xml:space="preserve">
|
||||||
@@ -6134,6 +6469,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
<target>ha actualizado el perfil del grupo</target>
|
<target>ha actualizado el perfil del grupo</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6271,6 +6610,10 @@ Los servidores de SimpleX no pueden ver tu perfil.</target>
|
|||||||
<target>SimpleX usa reconocimiento facial para la autenticación local</target>
|
<target>SimpleX usa reconocimiento facial para la autenticación local</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX necesita acceso al micrófono para las llamadas de audio, vídeo y para grabar mensajes de voz.</target>
|
<target>SimpleX necesita acceso al micrófono para las llamadas de audio, vídeo y para grabar mensajes de voz.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
<target>%@ / % @</target>
|
<target>%@ / % @</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ ja %@ yhdistetty</target>
|
<target>%@ ja %@ yhdistetty</target>
|
||||||
@@ -97,6 +101,10 @@
|
|||||||
<target>%1$@ klo %2$@:</target>
|
<target>%1$@ klo %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ on yhdistetty!</target>
|
<target>%@ on yhdistetty!</target>
|
||||||
@@ -122,6 +130,10 @@
|
|||||||
<target>%@ haluaa muodostaa yhteyden!</target>
|
<target>%@ haluaa muodostaa yhteyden!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ ja %lld muut jäsenet yhdistetty</target>
|
<target>%@, %@ ja %lld muut jäsenet yhdistetty</target>
|
||||||
@@ -187,11 +199,27 @@
|
|||||||
<target>%lld tiedosto(a), joiden kokonaiskoko on %@</target>
|
<target>%lld tiedosto(a), joiden kokonaiskoko on %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld jäsenet</target>
|
<target>%lld jäsenet</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld minuuttia</target>
|
<target>%lld minuuttia</target>
|
||||||
@@ -199,6 +227,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%lld new interface languages" xml:space="preserve">
|
<trans-unit id="%lld new interface languages" xml:space="preserve">
|
||||||
<source>%lld new interface languages</source>
|
<source>%lld new interface languages</source>
|
||||||
|
<target>%lld uutta käyttöliittymän kieltä</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%lld second(s)" xml:space="preserve">
|
<trans-unit id="%lld second(s)" xml:space="preserve">
|
||||||
@@ -261,6 +290,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -360,6 +397,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -585,6 +626,10 @@
|
|||||||
<target>Kaikki viestit poistetaan - tätä ei voi kumota! Viestit poistuvat VAIN sinulta.</target>
|
<target>Kaikki viestit poistetaan - tätä ei voi kumota! Viestit poistuvat VAIN sinulta.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Kaikki kontaktisi pysyvät yhteydessä.</target>
|
<target>Kaikki kontaktisi pysyvät yhteydessä.</target>
|
||||||
@@ -690,6 +735,14 @@
|
|||||||
<target>Oletko jo muodostanut yhteyden?</target>
|
<target>Oletko jo muodostanut yhteyden?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Käytä aina relettä</target>
|
<target>Käytä aina relettä</target>
|
||||||
@@ -809,6 +862,10 @@
|
|||||||
<target>Takaisin</target>
|
<target>Takaisin</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>Virheellinen viestin tunniste</target>
|
<target>Virheellinen viestin tunniste</target>
|
||||||
@@ -824,6 +881,18 @@
|
|||||||
<target>Parempia viestejä</target>
|
<target>Parempia viestejä</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>Sekä sinä että kontaktisi voivat käyttää viestireaktioita.</target>
|
<target>Sekä sinä että kontaktisi voivat käyttää viestireaktioita.</target>
|
||||||
@@ -1084,24 +1153,31 @@
|
|||||||
<target>Yhdistä</target>
|
<target>Yhdistä</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Yhdistä suoraan</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Yhdistä Incognito</target>
|
<target>Yhdistä Incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Yhdistä kontaktilinkillä</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Yhdistetäänkö ryhmälinkin kautta?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1119,6 +1195,18 @@
|
|||||||
<target>Yhdistä kertalinkillä</target>
|
<target>Yhdistä kertalinkillä</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Yhteyden muodostaminen palvelimeen…</target>
|
<target>Yhteyden muodostaminen palvelimeen…</target>
|
||||||
@@ -1129,6 +1217,10 @@
|
|||||||
<target>Yhteyden muodostaminen palvelimeen... (virhe: %@)</target>
|
<target>Yhteyden muodostaminen palvelimeen... (virhe: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Yhteys</target>
|
<target>Yhteys</target>
|
||||||
@@ -1149,6 +1241,10 @@
|
|||||||
<target>Yhteyspyyntö lähetetty!</target>
|
<target>Yhteyspyyntö lähetetty!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Yhteyden aikakatkaisu</target>
|
<target>Yhteyden aikakatkaisu</target>
|
||||||
@@ -1164,11 +1260,6 @@
|
|||||||
<target>Kontakti on jo olemassa</target>
|
<target>Kontakti on jo olemassa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Kontakti ja kaikki viestit poistetaan - tätä ei voi perua!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Kontakti piilotettu:</target>
|
<target>Kontakti piilotettu:</target>
|
||||||
@@ -1219,6 +1310,10 @@
|
|||||||
<target>Ydinversio: v%@</target>
|
<target>Ydinversio: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Luo</target>
|
<target>Luo</target>
|
||||||
@@ -1239,6 +1334,10 @@
|
|||||||
<target>Luo tiedosto</target>
|
<target>Luo tiedosto</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Luo ryhmälinkki</target>
|
<target>Luo ryhmälinkki</target>
|
||||||
@@ -1251,6 +1350,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
||||||
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
||||||
|
<target>Luo uusi profiili [työpöytäsovelluksessa](https://simplex.chat/downloads/). 💻</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
||||||
@@ -1258,6 +1358,10 @@
|
|||||||
<target>Luo kertakutsulinkki</target>
|
<target>Luo kertakutsulinkki</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Luo jono</target>
|
<target>Luo jono</target>
|
||||||
@@ -1416,6 +1520,10 @@
|
|||||||
<target>Poista</target>
|
<target>Poista</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Poista kontakti</target>
|
<target>Poista kontakti</target>
|
||||||
@@ -1441,6 +1549,10 @@
|
|||||||
<target>Poista kaikki tiedostot</target>
|
<target>Poista kaikki tiedostot</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Poista arkisto</target>
|
<target>Poista arkisto</target>
|
||||||
@@ -1471,9 +1583,9 @@
|
|||||||
<target>Poista kontakti</target>
|
<target>Poista kontakti</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Poista kontakti?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1616,6 +1728,18 @@
|
|||||||
<target>Kuvaus</target>
|
<target>Kuvaus</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Kehitä</target>
|
<target>Kehitä</target>
|
||||||
@@ -1706,18 +1830,17 @@
|
|||||||
<target>Katkaise</target>
|
<target>Katkaise</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
|
<target>Löydä ryhmiä ja liity niihin</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Näyttönimi</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Näyttönimi:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1889,6 +2012,14 @@
|
|||||||
<target>Salattu viesti: odottamaton virhe</target>
|
<target>Salattu viesti: odottamaton virhe</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Syötä pääsykoodi</target>
|
<target>Syötä pääsykoodi</target>
|
||||||
@@ -1899,6 +2030,10 @@
|
|||||||
<target>Anna oikea tunnuslause.</target>
|
<target>Anna oikea tunnuslause.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Syötä tunnuslause…</target>
|
<target>Syötä tunnuslause…</target>
|
||||||
@@ -1914,6 +2049,10 @@
|
|||||||
<target>Syötä palvelin manuaalisesti</target>
|
<target>Syötä palvelin manuaalisesti</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Kirjoita tervetuloviesti…</target>
|
<target>Kirjoita tervetuloviesti…</target>
|
||||||
@@ -1924,6 +2063,10 @@
|
|||||||
<target>Kirjoita tervetuloviesti... (valinnainen)</target>
|
<target>Kirjoita tervetuloviesti... (valinnainen)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Virhe</target>
|
<target>Virhe</target>
|
||||||
@@ -2197,6 +2340,10 @@
|
|||||||
<target>Poistu tallentamatta</target>
|
<target>Poistu tallentamatta</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Vie tietokanta</target>
|
<target>Vie tietokanta</target>
|
||||||
@@ -2342,6 +2489,10 @@
|
|||||||
<target>Koko nimi:</target>
|
<target>Koko nimi:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Täysin uudistettu - toimii taustalla!</target>
|
<target>Täysin uudistettu - toimii taustalla!</target>
|
||||||
@@ -2362,6 +2513,14 @@
|
|||||||
<target>Ryhmä</target>
|
<target>Ryhmä</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Ryhmän näyttönimi</target>
|
<target>Ryhmän näyttönimi</target>
|
||||||
@@ -2662,6 +2821,10 @@
|
|||||||
<target>Yhteensopimaton tietokantaversio</target>
|
<target>Yhteensopimaton tietokantaversio</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Väärä pääsykoodi</target>
|
<target>Väärä pääsykoodi</target>
|
||||||
@@ -2709,6 +2872,10 @@
|
|||||||
<target>Virheellinen yhteyslinkki</target>
|
<target>Virheellinen yhteyslinkki</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Virheellinen palvelinosoite!</target>
|
<target>Virheellinen palvelinosoite!</target>
|
||||||
@@ -2800,16 +2967,33 @@
|
|||||||
<target>Liity ryhmään</target>
|
<target>Liity ryhmään</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Liity incognito-tilassa</target>
|
<target>Liity incognito-tilassa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Liittyy ryhmään</target>
|
<target>Liittyy ryhmään</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Pidä kontaktisi</target>
|
<target>Pidä kontaktisi</target>
|
||||||
@@ -2870,6 +3054,14 @@
|
|||||||
<target>Rajoitukset</target>
|
<target>Rajoitukset</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Live-viesti!</target>
|
<target>Live-viesti!</target>
|
||||||
@@ -3020,6 +3212,10 @@
|
|||||||
<target>Viestit ja tiedostot</target>
|
<target>Viestit ja tiedostot</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Siirretään tietokannan arkistoa…</target>
|
<target>Siirretään tietokannan arkistoa…</target>
|
||||||
@@ -3367,6 +3563,10 @@
|
|||||||
<target>Avaa keskustelukonsoli</target>
|
<target>Avaa keskustelukonsoli</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Avaa käyttäjäprofiilit</target>
|
<target>Avaa käyttäjäprofiilit</target>
|
||||||
@@ -3382,11 +3582,6 @@
|
|||||||
<target>Avataan tietokantaa…</target>
|
<target>Avataan tietokantaa…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Linkin avaaminen selaimessa voi heikentää yhteyden yksityisyyttä ja turvallisuutta. Epäluotetut SimpleX-linkit näkyvät punaisina.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>PING-määrä</target>
|
<target>PING-määrä</target>
|
||||||
@@ -3432,6 +3627,10 @@
|
|||||||
<target>Liitä</target>
|
<target>Liitä</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Liitä kuva</target>
|
<target>Liitä kuva</target>
|
||||||
@@ -3577,6 +3776,14 @@
|
|||||||
<target>Profiilikuva</target>
|
<target>Profiilikuva</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Profiilin salasana</target>
|
<target>Profiilin salasana</target>
|
||||||
@@ -3822,6 +4029,14 @@
|
|||||||
<target>Uudelleenneuvottele salaus?</target>
|
<target>Uudelleenneuvottele salaus?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Vastaa</target>
|
<target>Vastaa</target>
|
||||||
@@ -4007,6 +4222,10 @@
|
|||||||
<target>Skannaa QR-koodi</target>
|
<target>Skannaa QR-koodi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Skannaa koodi</target>
|
<target>Skannaa koodi</target>
|
||||||
@@ -4226,6 +4445,10 @@
|
|||||||
<target>Palvelimet</target>
|
<target>Palvelimet</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Aseta 1 päivä</target>
|
<target>Aseta 1 päivä</target>
|
||||||
@@ -4535,6 +4758,10 @@
|
|||||||
<target>Napauta painiketta </target>
|
<target>Napauta painiketta </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Aktivoi profiili napauttamalla.</target>
|
<target>Aktivoi profiili napauttamalla.</target>
|
||||||
@@ -4632,11 +4859,6 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
|
|||||||
<target>Salaus toimii ja uutta salaussopimusta ei tarvita. Tämä voi johtaa yhteysvirheisiin!</target>
|
<target>Salaus toimii ja uutta salaussopimusta ei tarvita. Tämä voi johtaa yhteysvirheisiin!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>Ryhmä on täysin hajautettu - se näkyy vain jäsenille.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>Edellisen viestin tarkiste on erilainen.</target>
|
<target>Edellisen viestin tarkiste on erilainen.</target>
|
||||||
@@ -4722,6 +4944,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
|
|||||||
<target>Tätä toimintoa ei voi kumota - profiilisi, kontaktisi, viestisi ja tiedostosi poistuvat peruuttamattomasti.</target>
|
<target>Tätä toimintoa ei voi kumota - profiilisi, kontaktisi, viestisi ja tiedostosi poistuvat peruuttamattomasti.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>Tässä ryhmässä on yli %lld jäsentä, lähetyskuittauksia ei lähetetä.</target>
|
<target>Tässä ryhmässä on yli %lld jäsentä, lähetyskuittauksia ei lähetetä.</target>
|
||||||
@@ -4732,6 +4958,14 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
|
|||||||
<target>Tätä ryhmää ei enää ole olemassa.</target>
|
<target>Tätä ryhmää ei enää ole olemassa.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>Tämä asetus koskee nykyisen keskusteluprofiilisi viestejä *%@**.</target>
|
<target>Tämä asetus koskee nykyisen keskusteluprofiilisi viestejä *%@**.</target>
|
||||||
@@ -4828,6 +5062,18 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote
|
|||||||
<target>Ääniviestiä ei voi tallentaa</target>
|
<target>Ääniviestiä ei voi tallentaa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Odottamaton virhe: %@</target>
|
<target>Odottamaton virhe: %@</target>
|
||||||
@@ -4890,6 +5136,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja tarkista, että verkkoyhteytesi on vakaa.</target>
|
Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja tarkista, että verkkoyhteytesi on vakaa.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Avaa</target>
|
<target>Avaa</target>
|
||||||
@@ -4980,6 +5234,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Käytä uusiin yhteyksiin</target>
|
<target>Käytä uusiin yhteyksiin</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Käytä iOS:n puhelujen käyttöliittymää</target>
|
<target>Käytä iOS:n puhelujen käyttöliittymää</target>
|
||||||
@@ -5010,11 +5268,23 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Käyttää SimpleX Chat -palvelimia.</target>
|
<target>Käyttää SimpleX Chat -palvelimia.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Tarkista yhteyden suojaus</target>
|
<target>Tarkista yhteyden suojaus</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Tarkista turvakoodi</target>
|
<target>Tarkista turvakoodi</target>
|
||||||
@@ -5175,6 +5445,35 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Olet jo muodostanut yhteyden %@:n kanssa.</target>
|
<target>Olet jo muodostanut yhteyden %@:n kanssa.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Olet yhteydessä palvelimeen, jota käytetään vastaanottamaan viestejä tältä kontaktilta.</target>
|
<target>Olet yhteydessä palvelimeen, jota käytetään vastaanottamaan viestejä tältä kontaktilta.</target>
|
||||||
@@ -5270,6 +5569,15 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Sinua ei voitu todentaa; yritä uudelleen.</target>
|
<target>Sinua ei voitu todentaa; yritä uudelleen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>Sinulla ei ole keskusteluja</target>
|
<target>Sinulla ei ole keskusteluja</target>
|
||||||
@@ -5320,6 +5628,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Sinut yhdistetään ryhmään, kun ryhmän isännän laite on online-tilassa, odota tai tarkista myöhemmin!</target>
|
<target>Sinut yhdistetään ryhmään, kun ryhmän isännän laite on online-tilassa, odota tai tarkista myöhemmin!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Sinut yhdistetään, kun yhteyspyyntösi on hyväksytty, odota tai tarkista myöhemmin!</target>
|
<target>Sinut yhdistetään, kun yhteyspyyntösi on hyväksytty, odota tai tarkista myöhemmin!</target>
|
||||||
@@ -5335,9 +5647,8 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Sinun on tunnistauduttava, kun käynnistät sovelluksen tai jatkat sen käyttöä 30 sekunnin tauon jälkeen.</target>
|
<target>Sinun on tunnistauduttava, kun käynnistät sovelluksen tai jatkat sen käyttöä 30 sekunnin tauon jälkeen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Liityt ryhmään, johon tämä linkki viittaa, ja muodostat yhteyden sen ryhmän jäseniin.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5405,11 +5716,6 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Keskustelut-tietokantasi ei ole salattu - aseta tunnuslause sen salaamiseksi.</target>
|
<target>Keskustelut-tietokantasi ei ole salattu - aseta tunnuslause sen salaamiseksi.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Keskusteluprofiilisi lähetetään ryhmän jäsenille</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Keskusteluprofiilisi</target>
|
<target>Keskusteluprofiilisi</target>
|
||||||
@@ -5464,6 +5770,10 @@ Voit muuttaa sitä Asetuksista.</target>
|
|||||||
<target>Yksityisyytesi</target>
|
<target>Yksityisyytesi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Profiilisi **%@** jaetaan.</target>
|
<target>Profiilisi **%@** jaetaan.</target>
|
||||||
@@ -5556,6 +5866,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|||||||
<target>aina</target>
|
<target>aina</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>äänipuhelu (ei e2e-salattu)</target>
|
<target>äänipuhelu (ei e2e-salattu)</target>
|
||||||
@@ -5571,6 +5885,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|||||||
<target>virheellinen viestin tarkiste</target>
|
<target>virheellinen viestin tarkiste</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>lihavoitu</target>
|
<target>lihavoitu</target>
|
||||||
@@ -5740,6 +6058,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|||||||
<target>poistettu</target>
|
<target>poistettu</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>poistettu ryhmä</target>
|
<target>poistettu ryhmä</target>
|
||||||
@@ -6024,7 +6346,8 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>pois</target>
|
<target>pois</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6041,11 +6364,6 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|||||||
<target>päällä</target>
|
<target>päällä</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>tai keskustele kehittäjien kanssa</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>omistaja</target>
|
<target>omistaja</target>
|
||||||
@@ -6135,6 +6453,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|||||||
<target>päivitetty ryhmäprofiili</target>
|
<target>päivitetty ryhmäprofiili</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6272,6 +6594,10 @@ SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|||||||
<target>SimpleX käyttää Face ID:tä paikalliseen todennukseen</target>
|
<target>SimpleX käyttää Face ID:tä paikalliseen todennukseen</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX tarvitsee mikrofonia ääni- ja videopuheluita ja ääniviestien tallentamista varten.</target>
|
<target>SimpleX tarvitsee mikrofonia ääni- ja videopuheluita ja ääniviestien tallentamista varten.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,11 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<target>%@ et %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ et %@ sont connecté.es</target>
|
<target>%@ et %@ sont connecté.es</target>
|
||||||
@@ -97,6 +102,11 @@
|
|||||||
<target>%1$@ à %2$@ :</target>
|
<target>%1$@ à %2$@ :</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<target>%@ connecté(e)</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ est connecté·e !</target>
|
<target>%@ est connecté·e !</target>
|
||||||
@@ -122,6 +132,11 @@
|
|||||||
<target>%@ veut se connecter !</target>
|
<target>%@ veut se connecter !</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<target>%@, %@ et %lld membres</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ et %lld autres membres sont connectés</target>
|
<target>%@, %@ et %lld autres membres sont connectés</target>
|
||||||
@@ -187,11 +202,31 @@
|
|||||||
<target>%lld fichier·s pour une taille totale de %@</target>
|
<target>%lld fichier·s pour une taille totale de %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<target>%lld événements de groupe</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld membres</target>
|
<target>%lld membres</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<target>%lld messages bloqués</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<target>%lld messages marqués comme supprimés</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<target>%lld messages modérés par %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld minutes</target>
|
<target>%lld minutes</target>
|
||||||
@@ -262,6 +297,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -364,6 +407,11 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<target>0 sec</target>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -589,6 +637,11 @@
|
|||||||
<target>Tous les messages seront supprimés - impossible de revenir en arrière ! Les messages seront supprimés UNIQUEMENT pour vous.</target>
|
<target>Tous les messages seront supprimés - impossible de revenir en arrière ! Les messages seront supprimés UNIQUEMENT pour vous.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<target>Tous les nouveaux messages de %@ seront cachés !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Tous vos contacts resteront connectés.</target>
|
<target>Tous vos contacts resteront connectés.</target>
|
||||||
@@ -694,6 +747,16 @@
|
|||||||
<target>Déjà connecté ?</target>
|
<target>Déjà connecté ?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<target>Déjà en connexion !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<target>Groupe déjà rejoint !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Se connecter via relais</target>
|
<target>Se connecter via relais</target>
|
||||||
@@ -814,6 +877,10 @@
|
|||||||
<target>Retour</target>
|
<target>Retour</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>Mauvais ID de message</target>
|
<target>Mauvais ID de message</target>
|
||||||
@@ -829,6 +896,21 @@
|
|||||||
<target>Meilleurs messages</target>
|
<target>Meilleurs messages</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<target>Bloquer</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<target>Bloquer ce membre</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<target>Bloquer ce membre ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>Vous et votre contact pouvez ajouter des réactions aux messages.</target>
|
<target>Vous et votre contact pouvez ajouter des réactions aux messages.</target>
|
||||||
@@ -1090,24 +1172,37 @@
|
|||||||
<target>Se connecter</target>
|
<target>Se connecter</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Se connecter directement</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Se connecter incognito</target>
|
<target>Se connecter incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Se connecter via un lien de contact</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Se connecter via le lien du groupe ?</target>
|
<target>Se connecter à soi-même ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<target>Se connecter à soi-même ?
|
||||||
|
C'est votre propre adresse SimpleX !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<target>Se connecter à soi-même ?
|
||||||
|
Il s'agit de votre propre lien unique !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
|
<target>Se connecter via l'adresse de contact</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1125,6 +1220,19 @@
|
|||||||
<target>Se connecter via un lien unique</target>
|
<target>Se connecter via un lien unique</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<target>Se connecter avec %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Connexion au serveur…</target>
|
<target>Connexion au serveur…</target>
|
||||||
@@ -1135,6 +1243,10 @@
|
|||||||
<target>Connexion au serveur… (erreur : %@)</target>
|
<target>Connexion au serveur… (erreur : %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Connexion</target>
|
<target>Connexion</target>
|
||||||
@@ -1155,6 +1267,10 @@
|
|||||||
<target>Demande de connexion envoyée !</target>
|
<target>Demande de connexion envoyée !</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Délai de connexion</target>
|
<target>Délai de connexion</target>
|
||||||
@@ -1170,11 +1286,6 @@
|
|||||||
<target>Contact déjà existant</target>
|
<target>Contact déjà existant</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Le contact et tous les messages seront supprimés - impossible de revenir en arrière !</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Contact masqué :</target>
|
<target>Contact masqué :</target>
|
||||||
@@ -1225,6 +1336,11 @@
|
|||||||
<target>Version du cœur : v%@</target>
|
<target>Version du cœur : v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<target>Corriger le nom pour %@ ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Créer</target>
|
<target>Créer</target>
|
||||||
@@ -1245,6 +1361,11 @@
|
|||||||
<target>Créer un fichier</target>
|
<target>Créer un fichier</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<target>Créer un groupe</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Créer un lien de groupe</target>
|
<target>Créer un lien de groupe</target>
|
||||||
@@ -1265,6 +1386,11 @@
|
|||||||
<target>Créer un lien d'invitation unique</target>
|
<target>Créer un lien d'invitation unique</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<target>Créer le profil</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Créer une file d'attente</target>
|
<target>Créer une file d'attente</target>
|
||||||
@@ -1423,6 +1549,11 @@
|
|||||||
<target>Supprimer</target>
|
<target>Supprimer</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<target>Supprimer %lld messages ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Supprimer le contact</target>
|
<target>Supprimer le contact</target>
|
||||||
@@ -1448,6 +1579,11 @@
|
|||||||
<target>Effacer tous les fichiers</target>
|
<target>Effacer tous les fichiers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<target>Supprimer et en informer le contact</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Supprimer l'archive</target>
|
<target>Supprimer l'archive</target>
|
||||||
@@ -1478,9 +1614,11 @@
|
|||||||
<target>Supprimer le contact</target>
|
<target>Supprimer le contact</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Supprimer le contact ?</target>
|
This cannot be undone!</source>
|
||||||
|
<target>Supprimer le contact ?
|
||||||
|
Cette opération ne peut être annulée !</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1623,6 +1761,18 @@
|
|||||||
<target>Description</target>
|
<target>Description</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Développer</target>
|
<target>Développer</target>
|
||||||
@@ -1713,19 +1863,17 @@
|
|||||||
<target>Se déconnecter</target>
|
<target>Se déconnecter</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<target>Découvrir et rejoindre des groupes</target>
|
<target>Découvrir et rejoindre des groupes</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Nom affiché</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Nom affiché :</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1898,6 +2046,14 @@
|
|||||||
<target>Message chiffrée : erreur inattendue</target>
|
<target>Message chiffrée : erreur inattendue</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Entrer le code d'accès</target>
|
<target>Entrer le code d'accès</target>
|
||||||
@@ -1908,6 +2064,11 @@
|
|||||||
<target>Entrez la phrase secrète correcte.</target>
|
<target>Entrez la phrase secrète correcte.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<target>Entrer un nom de groupe…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Entrez la phrase secrète…</target>
|
<target>Entrez la phrase secrète…</target>
|
||||||
@@ -1923,6 +2084,10 @@
|
|||||||
<target>Entrer un serveur manuellement</target>
|
<target>Entrer un serveur manuellement</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Entrez un message de bienvenue…</target>
|
<target>Entrez un message de bienvenue…</target>
|
||||||
@@ -1933,6 +2098,11 @@
|
|||||||
<target>Entrez un message de bienvenue… (facultatif)</target>
|
<target>Entrez un message de bienvenue… (facultatif)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<target>Entrez votre nom…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Erreur</target>
|
<target>Erreur</target>
|
||||||
@@ -1990,6 +2160,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating member contact" xml:space="preserve">
|
<trans-unit id="Error creating member contact" xml:space="preserve">
|
||||||
<source>Error creating member contact</source>
|
<source>Error creating member contact</source>
|
||||||
|
<target>Erreur lors de la création du contact du membre</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating profile!" xml:space="preserve">
|
<trans-unit id="Error creating profile!" xml:space="preserve">
|
||||||
@@ -2124,6 +2295,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
||||||
<source>Error sending member contact invitation</source>
|
<source>Error sending member contact invitation</source>
|
||||||
|
<target>Erreur lors de l'envoi de l'invitation de contact d'un membre</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending message" xml:space="preserve">
|
<trans-unit id="Error sending message" xml:space="preserve">
|
||||||
@@ -2206,6 +2378,11 @@
|
|||||||
<target>Quitter sans sauvegarder</target>
|
<target>Quitter sans sauvegarder</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<target>Développer</target>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Exporter la base de données</target>
|
<target>Exporter la base de données</target>
|
||||||
@@ -2351,6 +2528,11 @@
|
|||||||
<target>Nom complet :</target>
|
<target>Nom complet :</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<target>Entièrement décentralisé – visible que par ses membres.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Entièrement réimplémenté - fonctionne en arrière-plan !</target>
|
<target>Entièrement réimplémenté - fonctionne en arrière-plan !</target>
|
||||||
@@ -2371,6 +2553,16 @@
|
|||||||
<target>Groupe</target>
|
<target>Groupe</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<target>Le groupe existe déjà</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<target>Ce groupe existe déjà !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Nom d'affichage du groupe</target>
|
<target>Nom d'affichage du groupe</target>
|
||||||
@@ -2671,6 +2863,10 @@
|
|||||||
<target>Version de la base de données incompatible</target>
|
<target>Version de la base de données incompatible</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Code d'accès erroné</target>
|
<target>Code d'accès erroné</target>
|
||||||
@@ -2718,6 +2914,11 @@
|
|||||||
<target>Lien de connection invalide</target>
|
<target>Lien de connection invalide</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<target>Nom invalide !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Adresse de serveur invalide !</target>
|
<target>Adresse de serveur invalide !</target>
|
||||||
@@ -2809,16 +3010,37 @@
|
|||||||
<target>Rejoindre le groupe</target>
|
<target>Rejoindre le groupe</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<target>Rejoindre le groupe ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Rejoindre en incognito</target>
|
<target>Rejoindre en incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<target>Rejoindre avec le profil actuel</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<target>Rejoindre votre groupe ?
|
||||||
|
Voici votre lien pour le groupe %@ !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Entrain de rejoindre le groupe</target>
|
<target>Entrain de rejoindre le groupe</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Conserver vos connexions</target>
|
<target>Conserver vos connexions</target>
|
||||||
@@ -2879,6 +3101,14 @@
|
|||||||
<target>Limitations</target>
|
<target>Limitations</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Message dynamique !</target>
|
<target>Message dynamique !</target>
|
||||||
@@ -3029,6 +3259,11 @@
|
|||||||
<target>Messages</target>
|
<target>Messages</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<target>Les messages de %@ seront affichés !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Migration de l'archive de la base de données…</target>
|
<target>Migration de l'archive de la base de données…</target>
|
||||||
@@ -3360,6 +3595,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open" xml:space="preserve">
|
<trans-unit id="Open" xml:space="preserve">
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
|
<target>Ouvrir</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open Settings" xml:space="preserve">
|
<trans-unit id="Open Settings" xml:space="preserve">
|
||||||
@@ -3377,6 +3613,11 @@
|
|||||||
<target>Ouvrir la console du chat</target>
|
<target>Ouvrir la console du chat</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<target>Ouvrir le groupe</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Ouvrir les profils d'utilisateurs</target>
|
<target>Ouvrir les profils d'utilisateurs</target>
|
||||||
@@ -3392,11 +3633,6 @@
|
|||||||
<target>Ouverture de la base de données…</target>
|
<target>Ouverture de la base de données…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Ouvrir le lien dans le navigateur peut réduire la confidentialité et la sécurité de la connexion. Les liens SimpleX non fiables seront en rouge.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>Nombre de PING</target>
|
<target>Nombre de PING</target>
|
||||||
@@ -3442,6 +3678,10 @@
|
|||||||
<target>Coller</target>
|
<target>Coller</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Coller l'image</target>
|
<target>Coller l'image</target>
|
||||||
@@ -3587,6 +3827,16 @@
|
|||||||
<target>Image de profil</target>
|
<target>Image de profil</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<target>Nom du profil</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<target>Nom du profil :</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Mot de passe de profil</target>
|
<target>Mot de passe de profil</target>
|
||||||
@@ -3832,6 +4082,16 @@
|
|||||||
<target>Renégocier le chiffrement?</target>
|
<target>Renégocier le chiffrement?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<target>Répéter la demande de connexion ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<target>Répéter la requête d'adhésion ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Répondre</target>
|
<target>Répondre</target>
|
||||||
@@ -4017,6 +4277,10 @@
|
|||||||
<target>Scanner un code QR</target>
|
<target>Scanner un code QR</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Scanner le code</target>
|
<target>Scanner le code</target>
|
||||||
@@ -4094,11 +4358,12 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message" xml:space="preserve">
|
<trans-unit id="Send direct message" xml:space="preserve">
|
||||||
<source>Send direct message</source>
|
<source>Send direct message</source>
|
||||||
<target>Envoi de message direct</target>
|
<target>Envoyer un message direct</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
||||||
<source>Send direct message to connect</source>
|
<source>Send direct message to connect</source>
|
||||||
|
<target>Envoyer un message direct pour vous connecter</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send disappearing message" xml:space="preserve">
|
<trans-unit id="Send disappearing message" xml:space="preserve">
|
||||||
@@ -4236,6 +4501,10 @@
|
|||||||
<target>Serveurs</target>
|
<target>Serveurs</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Définir 1 jour</target>
|
<target>Définir 1 jour</target>
|
||||||
@@ -4546,6 +4815,11 @@
|
|||||||
<target>Appuyez sur le bouton </target>
|
<target>Appuyez sur le bouton </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<target>Tapez pour vous connecter</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Appuyez pour activer un profil.</target>
|
<target>Appuyez pour activer un profil.</target>
|
||||||
@@ -4643,11 +4917,6 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
|
|||||||
<target>Le chiffrement fonctionne et le nouvel accord de chiffrement n'est pas nécessaire. Cela peut provoquer des erreurs de connexion !</target>
|
<target>Le chiffrement fonctionne et le nouvel accord de chiffrement n'est pas nécessaire. Cela peut provoquer des erreurs de connexion !</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>Le groupe est entièrement décentralisé – il n'est visible que par ses membres.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>Le hash du message précédent est différent.</target>
|
<target>Le hash du message précédent est différent.</target>
|
||||||
@@ -4733,6 +5002,10 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
|
|||||||
<target>Cette action ne peut être annulée - votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus.</target>
|
<target>Cette action ne peut être annulée - votre profil, vos contacts, vos messages et vos fichiers seront irréversiblement perdus.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>Ce groupe compte plus de %lld membres, les accusés de réception ne sont pas envoyés.</target>
|
<target>Ce groupe compte plus de %lld membres, les accusés de réception ne sont pas envoyés.</target>
|
||||||
@@ -4743,6 +5016,16 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
|
|||||||
<target>Ce groupe n'existe plus.</target>
|
<target>Ce groupe n'existe plus.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<target>Voici votre propre adresse SimpleX !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<target>Voici votre propre lien unique !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>Ce paramètre s'applique aux messages de votre profil de chat actuel **%@**.</target>
|
<target>Ce paramètre s'applique aux messages de votre profil de chat actuel **%@**.</target>
|
||||||
@@ -4840,6 +5123,21 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
|
|||||||
<target>Impossible d'enregistrer un message vocal</target>
|
<target>Impossible d'enregistrer un message vocal</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<target>Débloquer</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<target>Débloquer ce membre</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<target>Débloquer ce membre ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Erreur inattendue : %@</target>
|
<target>Erreur inattendue : %@</target>
|
||||||
@@ -4902,6 +5200,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
Pour vous connecter, veuillez demander à votre contact de créer un autre lien de connexion et vérifiez que vous disposez d'une connexion réseau stable.</target>
|
Pour vous connecter, veuillez demander à votre contact de créer un autre lien de connexion et vérifiez que vous disposez d'une connexion réseau stable.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Déverrouiller</target>
|
<target>Déverrouiller</target>
|
||||||
@@ -4992,6 +5298,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Utiliser pour les nouvelles connexions</target>
|
<target>Utiliser pour les nouvelles connexions</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Utiliser l'interface d'appel d'iOS</target>
|
<target>Utiliser l'interface d'appel d'iOS</target>
|
||||||
@@ -5022,11 +5332,23 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Utilisation des serveurs SimpleX Chat.</target>
|
<target>Utilisation des serveurs SimpleX Chat.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Vérifier la sécurité de la connexion</target>
|
<target>Vérifier la sécurité de la connexion</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Vérifier le code de sécurité</target>
|
<target>Vérifier le code de sécurité</target>
|
||||||
@@ -5187,6 +5509,43 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Vous êtes déjà connecté·e à %@ via ce lien.</target>
|
<target>Vous êtes déjà connecté·e à %@ via ce lien.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<target>Vous êtes déjà en train de vous connecter à %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<target>Vous êtes déjà connecté(e) via ce lien unique !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<target>Vous êtes déjà dans le groupe %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<target>Vous êtes déjà en train de rejoindre le groupe %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<target>Vous êtes déjà en train de rejoindre le groupe via ce lien !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<target>Vous êtes déjà en train de rejoindre le groupe via ce lien.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<target>Vous êtes déjà membre de ce groupe !
|
||||||
|
Répéter la demande d'adhésion ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Vous êtes connecté·e au serveur utilisé pour recevoir les messages de ce contact.</target>
|
<target>Vous êtes connecté·e au serveur utilisé pour recevoir les messages de ce contact.</target>
|
||||||
@@ -5282,6 +5641,18 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Vous n'avez pas pu être vérifié·e ; veuillez réessayer.</target>
|
<target>Vous n'avez pas pu être vérifié·e ; veuillez réessayer.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<target>Vous avez déjà demandé une connexion via cette adresse !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<target>Vous avez déjà demandé une connexion !
|
||||||
|
Répéter la demande de connexion ?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>Vous n'avez aucune discussion</target>
|
<target>Vous n'avez aucune discussion</target>
|
||||||
@@ -5332,6 +5703,11 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Vous serez connecté·e au groupe lorsque l'appareil de l'hôte sera en ligne, veuillez attendre ou vérifier plus tard !</target>
|
<target>Vous serez connecté·e au groupe lorsque l'appareil de l'hôte sera en ligne, veuillez attendre ou vérifier plus tard !</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<target>Vous serez connecté(e) lorsque l'appareil de l'hôte du lien de groupe sera en ligne, veuillez patienter ou vérifier plus tard !</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Vous serez connecté·e lorsque votre demande de connexion sera acceptée, veuillez attendre ou vérifier plus tard !</target>
|
<target>Vous serez connecté·e lorsque votre demande de connexion sera acceptée, veuillez attendre ou vérifier plus tard !</target>
|
||||||
@@ -5347,9 +5723,9 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Il vous sera demandé de vous authentifier lorsque vous démarrez ou reprenez l'application après 30 secondes en arrière-plan.</target>
|
<target>Il vous sera demandé de vous authentifier lorsque vous démarrez ou reprenez l'application après 30 secondes en arrière-plan.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Vous allez rejoindre le groupe correspondant à ce lien et être mis en relation avec les autres membres du groupe.</target>
|
<target>Vous vous connecterez à tous les membres du groupe.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5417,11 +5793,6 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Votre base de données de chat n'est pas chiffrée - définisez une phrase secrète.</target>
|
<target>Votre base de données de chat n'est pas chiffrée - définisez une phrase secrète.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Votre profil de chat sera envoyé aux membres du groupe</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Vos profils de chat</target>
|
<target>Vos profils de chat</target>
|
||||||
@@ -5476,6 +5847,11 @@ Vous pouvez modifier ce choix dans les Paramètres.</target>
|
|||||||
<target>Votre vie privée</target>
|
<target>Votre vie privée</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<target>Votre profil</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Votre profil **%@** sera partagé.</target>
|
<target>Votre profil **%@** sera partagé.</target>
|
||||||
@@ -5568,6 +5944,11 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
<target>toujours</target>
|
<target>toujours</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<target>et %lld autres événements</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>appel audio (sans chiffrement)</target>
|
<target>appel audio (sans chiffrement)</target>
|
||||||
@@ -5583,6 +5964,11 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
<target>hash de message incorrect</target>
|
<target>hash de message incorrect</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<target>blocké</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>gras</target>
|
<target>gras</target>
|
||||||
@@ -5655,6 +6041,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connected directly" xml:space="preserve">
|
<trans-unit id="connected directly" xml:space="preserve">
|
||||||
<source>connected directly</source>
|
<source>connected directly</source>
|
||||||
|
<target>s'est connecté.e de manière directe</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connecting" xml:space="preserve">
|
<trans-unit id="connecting" xml:space="preserve">
|
||||||
@@ -5752,6 +6139,11 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
<target>supprimé</target>
|
<target>supprimé</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<target>contact supprimé</target>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>groupe supprimé</target>
|
<target>groupe supprimé</target>
|
||||||
@@ -6036,7 +6428,8 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>off</target>
|
<target>off</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6053,11 +6446,6 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
<target>on</target>
|
<target>on</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>ou ici pour discuter avec les développeurs</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>propriétaire</target>
|
<target>propriétaire</target>
|
||||||
@@ -6120,6 +6508,7 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="send direct message" xml:space="preserve">
|
<trans-unit id="send direct message" xml:space="preserve">
|
||||||
<source>send direct message</source>
|
<source>send direct message</source>
|
||||||
|
<target>envoyer un message direct</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="starting…" xml:space="preserve">
|
<trans-unit id="starting…" xml:space="preserve">
|
||||||
@@ -6147,6 +6536,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
<target>mise à jour du profil de groupe</target>
|
<target>mise à jour du profil de groupe</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6284,6 +6677,10 @@ Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|||||||
<target>SimpleGroup not found!X utilise Face ID pour l'authentification locale</target>
|
<target>SimpleGroup not found!X utilise Face ID pour l'authentification locale</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX a besoin d'un accès au microphone pour les appels audio et vidéo ainsi que pour enregistrer des messages vocaux.</target>
|
<target>SimpleX a besoin d'un accès au microphone pour les appels audio et vidéo ainsi que pour enregistrer des messages vocaux.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,11 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<target>%@ e %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ e %@ sono connessi/e</target>
|
<target>%@ e %@ sono connessi/e</target>
|
||||||
@@ -97,6 +102,11 @@
|
|||||||
<target>%1$@ alle %2$@:</target>
|
<target>%1$@ alle %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<target>%@ si è connesso/a</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ è connesso/a!</target>
|
<target>%@ è connesso/a!</target>
|
||||||
@@ -122,6 +132,11 @@
|
|||||||
<target>%@ si vuole connettere!</target>
|
<target>%@ si vuole connettere!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<target>%@, %@ e %lld membri</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ e altri %lld membri sono connessi</target>
|
<target>%@, %@ e altri %lld membri sono connessi</target>
|
||||||
@@ -187,11 +202,31 @@
|
|||||||
<target>%lld file con dimensione totale di %@</target>
|
<target>%lld file con dimensione totale di %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<target>%lld eventi del gruppo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld membri</target>
|
<target>%lld membri</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<target>%lld messaggi bloccati</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<target>%lld messaggi contrassegnati eliminati</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<target>%lld messaggi moderati da %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld minuti</target>
|
<target>%lld minuti</target>
|
||||||
@@ -262,6 +297,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -364,6 +407,11 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<target>0 sec</target>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -589,6 +637,11 @@
|
|||||||
<target>Tutti i messaggi verranno eliminati, non è reversibile! I messaggi verranno eliminati SOLO per te.</target>
|
<target>Tutti i messaggi verranno eliminati, non è reversibile! I messaggi verranno eliminati SOLO per te.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<target>Tutti i nuovi messaggi da %@ verrranno nascosti!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Tutti i tuoi contatti resteranno connessi.</target>
|
<target>Tutti i tuoi contatti resteranno connessi.</target>
|
||||||
@@ -694,6 +747,16 @@
|
|||||||
<target>Già connesso/a?</target>
|
<target>Già connesso/a?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<target>Già in connessione!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<target>Già in ingresso nel gruppo!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Connetti via relay</target>
|
<target>Connetti via relay</target>
|
||||||
@@ -814,6 +877,10 @@
|
|||||||
<target>Indietro</target>
|
<target>Indietro</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>ID del messaggio errato</target>
|
<target>ID del messaggio errato</target>
|
||||||
@@ -829,6 +896,21 @@
|
|||||||
<target>Messaggi migliorati</target>
|
<target>Messaggi migliorati</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<target>Blocca</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<target>Blocca membro</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<target>Bloccare il membro?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>Sia tu che il tuo contatto potete aggiungere reazioni ai messaggi.</target>
|
<target>Sia tu che il tuo contatto potete aggiungere reazioni ai messaggi.</target>
|
||||||
@@ -1090,24 +1172,37 @@
|
|||||||
<target>Connetti</target>
|
<target>Connetti</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Connetti direttamente</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Connetti in incognito</target>
|
<target>Connetti in incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Connetti via link del contatto</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Connettere via link del gruppo?</target>
|
<target>Connettersi a te stesso?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<target>Connettersi a te stesso?
|
||||||
|
Questo è il tuo indirizzo SimpleX!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<target>Connettersi a te stesso?
|
||||||
|
Questo è il tuo link una tantum!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
|
<target>Connettere via indirizzo del contatto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1125,6 +1220,19 @@
|
|||||||
<target>Connetti via link una tantum</target>
|
<target>Connetti via link una tantum</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<target>Connettersi con %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Connessione al server…</target>
|
<target>Connessione al server…</target>
|
||||||
@@ -1135,6 +1243,10 @@
|
|||||||
<target>Connessione al server… (errore: %@)</target>
|
<target>Connessione al server… (errore: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Connessione</target>
|
<target>Connessione</target>
|
||||||
@@ -1155,6 +1267,10 @@
|
|||||||
<target>Richiesta di connessione inviata!</target>
|
<target>Richiesta di connessione inviata!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Connessione scaduta</target>
|
<target>Connessione scaduta</target>
|
||||||
@@ -1170,11 +1286,6 @@
|
|||||||
<target>Il contatto esiste già</target>
|
<target>Il contatto esiste già</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Il contatto e tutti i messaggi verranno eliminati, non è reversibile!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Contatto nascosto:</target>
|
<target>Contatto nascosto:</target>
|
||||||
@@ -1225,6 +1336,11 @@
|
|||||||
<target>Versione core: v%@</target>
|
<target>Versione core: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<target>Correggere il nome a %@?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Crea</target>
|
<target>Crea</target>
|
||||||
@@ -1245,6 +1361,11 @@
|
|||||||
<target>Crea file</target>
|
<target>Crea file</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<target>Crea gruppo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Crea link del gruppo</target>
|
<target>Crea link del gruppo</target>
|
||||||
@@ -1265,6 +1386,11 @@
|
|||||||
<target>Crea link di invito una tantum</target>
|
<target>Crea link di invito una tantum</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<target>Crea profilo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Crea coda</target>
|
<target>Crea coda</target>
|
||||||
@@ -1423,6 +1549,11 @@
|
|||||||
<target>Elimina</target>
|
<target>Elimina</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<target>Eliminare %lld messaggi?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Elimina contatto</target>
|
<target>Elimina contatto</target>
|
||||||
@@ -1448,6 +1579,11 @@
|
|||||||
<target>Elimina tutti i file</target>
|
<target>Elimina tutti i file</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<target>Elimina e avvisa il contatto</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Elimina archivio</target>
|
<target>Elimina archivio</target>
|
||||||
@@ -1478,9 +1614,11 @@
|
|||||||
<target>Elimina contatto</target>
|
<target>Elimina contatto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Eliminare il contatto?</target>
|
This cannot be undone!</source>
|
||||||
|
<target>Eliminare il contatto?
|
||||||
|
Non è reversibile!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1623,6 +1761,18 @@
|
|||||||
<target>Descrizione</target>
|
<target>Descrizione</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Sviluppa</target>
|
<target>Sviluppa</target>
|
||||||
@@ -1713,19 +1863,17 @@
|
|||||||
<target>Disconnetti</target>
|
<target>Disconnetti</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<target>Scopri ed unisciti ai gruppi</target>
|
<target>Scopri ed unisciti ai gruppi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Nome da mostrare</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Nome da mostrare:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1898,6 +2046,14 @@
|
|||||||
<target>Messaggio crittografato: errore imprevisto</target>
|
<target>Messaggio crittografato: errore imprevisto</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Inserisci il codice di accesso</target>
|
<target>Inserisci il codice di accesso</target>
|
||||||
@@ -1908,6 +2064,11 @@
|
|||||||
<target>Inserisci la password giusta.</target>
|
<target>Inserisci la password giusta.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<target>Inserisci il nome del gruppo…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Inserisci la password…</target>
|
<target>Inserisci la password…</target>
|
||||||
@@ -1923,6 +2084,10 @@
|
|||||||
<target>Inserisci il server a mano</target>
|
<target>Inserisci il server a mano</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Inserisci il messaggio di benvenuto…</target>
|
<target>Inserisci il messaggio di benvenuto…</target>
|
||||||
@@ -1933,6 +2098,11 @@
|
|||||||
<target>Inserisci il messaggio di benvenuto… (facoltativo)</target>
|
<target>Inserisci il messaggio di benvenuto… (facoltativo)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<target>Inserisci il tuo nome…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Errore</target>
|
<target>Errore</target>
|
||||||
@@ -1990,6 +2160,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating member contact" xml:space="preserve">
|
<trans-unit id="Error creating member contact" xml:space="preserve">
|
||||||
<source>Error creating member contact</source>
|
<source>Error creating member contact</source>
|
||||||
|
<target>Errore di creazione del contatto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating profile!" xml:space="preserve">
|
<trans-unit id="Error creating profile!" xml:space="preserve">
|
||||||
@@ -2124,6 +2295,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
||||||
<source>Error sending member contact invitation</source>
|
<source>Error sending member contact invitation</source>
|
||||||
|
<target>Errore di invio dell'invito al contatto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending message" xml:space="preserve">
|
<trans-unit id="Error sending message" xml:space="preserve">
|
||||||
@@ -2206,6 +2378,11 @@
|
|||||||
<target>Esci senza salvare</target>
|
<target>Esci senza salvare</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<target>Espandi</target>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Esporta database</target>
|
<target>Esporta database</target>
|
||||||
@@ -2351,6 +2528,11 @@
|
|||||||
<target>Nome completo:</target>
|
<target>Nome completo:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<target>Completamente decentralizzato: visibile solo ai membri.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Completamente reimplementato - funziona in secondo piano!</target>
|
<target>Completamente reimplementato - funziona in secondo piano!</target>
|
||||||
@@ -2371,6 +2553,16 @@
|
|||||||
<target>Gruppo</target>
|
<target>Gruppo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<target>Il gruppo esiste già</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<target>Il gruppo esiste già!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Nome mostrato del gruppo</target>
|
<target>Nome mostrato del gruppo</target>
|
||||||
@@ -2671,6 +2863,10 @@
|
|||||||
<target>Versione del database incompatibile</target>
|
<target>Versione del database incompatibile</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Codice di accesso errato</target>
|
<target>Codice di accesso errato</target>
|
||||||
@@ -2718,6 +2914,11 @@
|
|||||||
<target>Link di connessione non valido</target>
|
<target>Link di connessione non valido</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<target>Nome non valido!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Indirizzo del server non valido!</target>
|
<target>Indirizzo del server non valido!</target>
|
||||||
@@ -2809,16 +3010,37 @@
|
|||||||
<target>Entra nel gruppo</target>
|
<target>Entra nel gruppo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<target>Entrare nel gruppo?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Entra in incognito</target>
|
<target>Entra in incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<target>Entra con il profilo attuale</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<target>Entrare nel tuo gruppo?
|
||||||
|
Questo è il tuo link per il gruppo %@!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Ingresso nel gruppo</target>
|
<target>Ingresso nel gruppo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Mantieni le tue connessioni</target>
|
<target>Mantieni le tue connessioni</target>
|
||||||
@@ -2879,6 +3101,14 @@
|
|||||||
<target>Limitazioni</target>
|
<target>Limitazioni</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Messaggio in diretta!</target>
|
<target>Messaggio in diretta!</target>
|
||||||
@@ -3029,6 +3259,11 @@
|
|||||||
<target>Messaggi</target>
|
<target>Messaggi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<target>I messaggi da %@ verranno mostrati!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Migrazione archivio del database…</target>
|
<target>Migrazione archivio del database…</target>
|
||||||
@@ -3360,6 +3595,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open" xml:space="preserve">
|
<trans-unit id="Open" xml:space="preserve">
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
|
<target>Apri</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open Settings" xml:space="preserve">
|
<trans-unit id="Open Settings" xml:space="preserve">
|
||||||
@@ -3377,6 +3613,11 @@
|
|||||||
<target>Apri la console della chat</target>
|
<target>Apri la console della chat</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<target>Apri gruppo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Apri i profili utente</target>
|
<target>Apri i profili utente</target>
|
||||||
@@ -3392,11 +3633,6 @@
|
|||||||
<target>Apertura del database…</target>
|
<target>Apertura del database…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Aprire il link nel browser può ridurre la privacy e la sicurezza della connessione. I link SimpleX non fidati saranno in rosso.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>Conteggio PING</target>
|
<target>Conteggio PING</target>
|
||||||
@@ -3442,6 +3678,10 @@
|
|||||||
<target>Incolla</target>
|
<target>Incolla</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Incolla immagine</target>
|
<target>Incolla immagine</target>
|
||||||
@@ -3587,6 +3827,16 @@
|
|||||||
<target>Immagine del profilo</target>
|
<target>Immagine del profilo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<target>Nome del profilo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<target>Nome del profilo:</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Password del profilo</target>
|
<target>Password del profilo</target>
|
||||||
@@ -3832,6 +4082,16 @@
|
|||||||
<target>Rinegoziare la crittografia?</target>
|
<target>Rinegoziare la crittografia?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<target>Ripetere la richiesta di connessione?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<target>Ripetere la richiesta di ingresso?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Rispondi</target>
|
<target>Rispondi</target>
|
||||||
@@ -3894,7 +4154,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Revert" xml:space="preserve">
|
<trans-unit id="Revert" xml:space="preserve">
|
||||||
<source>Revert</source>
|
<source>Revert</source>
|
||||||
<target>Annulla</target>
|
<target>Ripristina</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Revoke" xml:space="preserve">
|
<trans-unit id="Revoke" xml:space="preserve">
|
||||||
@@ -4017,6 +4277,10 @@
|
|||||||
<target>Scansiona codice QR</target>
|
<target>Scansiona codice QR</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Scansiona codice</target>
|
<target>Scansiona codice</target>
|
||||||
@@ -4099,6 +4363,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
||||||
<source>Send direct message to connect</source>
|
<source>Send direct message to connect</source>
|
||||||
|
<target>Invia messaggio diretto per connetterti</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send disappearing message" xml:space="preserve">
|
<trans-unit id="Send disappearing message" xml:space="preserve">
|
||||||
@@ -4236,6 +4501,10 @@
|
|||||||
<target>Server</target>
|
<target>Server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Imposta 1 giorno</target>
|
<target>Imposta 1 giorno</target>
|
||||||
@@ -4546,6 +4815,11 @@
|
|||||||
<target>Tocca il pulsante </target>
|
<target>Tocca il pulsante </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<target>Tocca per connettere</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Tocca per attivare il profilo.</target>
|
<target>Tocca per attivare il profilo.</target>
|
||||||
@@ -4643,11 +4917,6 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
|
|||||||
<target>La crittografia funziona e il nuovo accordo sulla crittografia non è richiesto. Potrebbero verificarsi errori di connessione!</target>
|
<target>La crittografia funziona e il nuovo accordo sulla crittografia non è richiesto. Potrebbero verificarsi errori di connessione!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>Il gruppo è completamente decentralizzato: è visibile solo ai membri.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>L'hash del messaggio precedente è diverso.</target>
|
<target>L'hash del messaggio precedente è diverso.</target>
|
||||||
@@ -4733,6 +5002,10 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
|
|||||||
<target>Questa azione non può essere annullata: il tuo profilo, i contatti, i messaggi e i file andranno persi in modo irreversibile.</target>
|
<target>Questa azione non può essere annullata: il tuo profilo, i contatti, i messaggi e i file andranno persi in modo irreversibile.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>Questo gruppo ha più di %lld membri, le ricevute di consegna non vengono inviate.</target>
|
<target>Questo gruppo ha più di %lld membri, le ricevute di consegna non vengono inviate.</target>
|
||||||
@@ -4743,6 +5016,16 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
|
|||||||
<target>Questo gruppo non esiste più.</target>
|
<target>Questo gruppo non esiste più.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<target>Questo è il tuo indirizzo SimpleX!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<target>Questo è il tuo link una tantum!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>Questa impostazione si applica ai messaggi del profilo di chat attuale **%@**.</target>
|
<target>Questa impostazione si applica ai messaggi del profilo di chat attuale **%@**.</target>
|
||||||
@@ -4840,6 +5123,21 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
|
|||||||
<target>Impossibile registrare il messaggio vocale</target>
|
<target>Impossibile registrare il messaggio vocale</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<target>Sblocca</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<target>Sblocca membro</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<target>Sbloccare il membro?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Errore imprevisto: % @</target>
|
<target>Errore imprevisto: % @</target>
|
||||||
@@ -4902,6 +5200,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e controlla di avere una connessione di rete stabile.</target>
|
Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e controlla di avere una connessione di rete stabile.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Sblocca</target>
|
<target>Sblocca</target>
|
||||||
@@ -4992,6 +5298,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Usa per connessioni nuove</target>
|
<target>Usa per connessioni nuove</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Usa interfaccia di chiamata iOS</target>
|
<target>Usa interfaccia di chiamata iOS</target>
|
||||||
@@ -5022,11 +5332,23 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Utilizzo dei server SimpleX Chat.</target>
|
<target>Utilizzo dei server SimpleX Chat.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Verifica la sicurezza della connessione</target>
|
<target>Verifica la sicurezza della connessione</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Verifica codice di sicurezza</target>
|
<target>Verifica codice di sicurezza</target>
|
||||||
@@ -5187,6 +5509,43 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Sei già connesso/a a %@.</target>
|
<target>Sei già connesso/a a %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<target>Ti stai già connettendo a %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<target>Ti stai già connettendo tramite questo link una tantum!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<target>Sei già nel gruppo %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<target>Stai già entrando nel gruppo %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<target>Stai già entrando nel gruppo tramite questo link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<target>Stai già entrando nel gruppo tramite questo link.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<target>Stai già entrando nel gruppo!
|
||||||
|
Ripetere la richiesta di ingresso?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Sei connesso/a al server usato per ricevere messaggi da questo contatto.</target>
|
<target>Sei connesso/a al server usato per ricevere messaggi da questo contatto.</target>
|
||||||
@@ -5282,6 +5641,18 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Non è stato possibile verificarti, riprova.</target>
|
<target>Non è stato possibile verificarti, riprova.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<target>Hai già richiesto la connessione tramite questo indirizzo!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<target>Hai già richiesto la connessione!
|
||||||
|
Ripetere la richiesta di connessione?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>Non hai chat</target>
|
<target>Non hai chat</target>
|
||||||
@@ -5332,6 +5703,11 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Verrai connesso/a al gruppo quando il dispositivo dell'host del gruppo sarà in linea, attendi o controlla più tardi!</target>
|
<target>Verrai connesso/a al gruppo quando il dispositivo dell'host del gruppo sarà in linea, attendi o controlla più tardi!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<target>Verrai connesso/a quando il dispositivo dell'host del gruppo sarà in linea, attendi o controlla più tardi!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Verrai connesso/a quando la tua richiesta di connessione verrà accettata, attendi o controlla più tardi!</target>
|
<target>Verrai connesso/a quando la tua richiesta di connessione verrà accettata, attendi o controlla più tardi!</target>
|
||||||
@@ -5347,9 +5723,9 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Dovrai autenticarti quando avvii o riapri l'app dopo 30 secondi in secondo piano.</target>
|
<target>Dovrai autenticarti quando avvii o riapri l'app dopo 30 secondi in secondo piano.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Entrerai in un gruppo a cui si riferisce questo link e ti connetterai ai suoi membri.</target>
|
<target>Ti connetterai a tutti i membri del gruppo.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5417,11 +5793,6 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Il tuo database della chat non è crittografato: imposta la password per crittografarlo.</target>
|
<target>Il tuo database della chat non è crittografato: imposta la password per crittografarlo.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Il tuo profilo di chat verrà inviato ai membri del gruppo</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>I tuoi profili di chat</target>
|
<target>I tuoi profili di chat</target>
|
||||||
@@ -5476,6 +5847,11 @@ Puoi modificarlo nelle impostazioni.</target>
|
|||||||
<target>La tua privacy</target>
|
<target>La tua privacy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<target>Il tuo profilo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Il tuo profilo **%@** verrà condiviso.</target>
|
<target>Il tuo profilo **%@** verrà condiviso.</target>
|
||||||
@@ -5568,6 +5944,11 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
<target>sempre</target>
|
<target>sempre</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<target>e altri %lld eventi</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>chiamata audio (non crittografata e2e)</target>
|
<target>chiamata audio (non crittografata e2e)</target>
|
||||||
@@ -5583,6 +5964,11 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
<target>hash del messaggio errato</target>
|
<target>hash del messaggio errato</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<target>bloccato</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>grassetto</target>
|
<target>grassetto</target>
|
||||||
@@ -5615,7 +6001,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="changed role of %@ to %@" xml:space="preserve">
|
<trans-unit id="changed role of %@ to %@" xml:space="preserve">
|
||||||
<source>changed role of %1$@ to %2$@</source>
|
<source>changed role of %1$@ to %2$@</source>
|
||||||
<target>cambiato il ruolo di %1$@ in %2$@</target>
|
<target>ha cambiato il ruolo di %1$@ in %2$@</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="changed your role to %@" xml:space="preserve">
|
<trans-unit id="changed your role to %@" xml:space="preserve">
|
||||||
@@ -5655,6 +6041,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connected directly" xml:space="preserve">
|
<trans-unit id="connected directly" xml:space="preserve">
|
||||||
<source>connected directly</source>
|
<source>connected directly</source>
|
||||||
|
<target>si è connesso/a direttamente</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connecting" xml:space="preserve">
|
<trans-unit id="connecting" xml:space="preserve">
|
||||||
@@ -5752,6 +6139,11 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
<target>eliminato</target>
|
<target>eliminato</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<target>contatto eliminato</target>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>gruppo eliminato</target>
|
<target>gruppo eliminato</target>
|
||||||
@@ -5969,7 +6361,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="member connected" xml:space="preserve">
|
<trans-unit id="member connected" xml:space="preserve">
|
||||||
<source>connected</source>
|
<source>connected</source>
|
||||||
<target>è connesso/a</target>
|
<target>si è connesso/a</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="message received" xml:space="preserve">
|
<trans-unit id="message received" xml:space="preserve">
|
||||||
@@ -6036,7 +6428,8 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>off</target>
|
<target>off</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6053,11 +6446,6 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
<target>on</target>
|
<target>on</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>o scrivi agli sviluppatori</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>proprietario</target>
|
<target>proprietario</target>
|
||||||
@@ -6085,7 +6473,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="removed" xml:space="preserve">
|
<trans-unit id="removed" xml:space="preserve">
|
||||||
<source>removed</source>
|
<source>removed</source>
|
||||||
<target>ha rimosso</target>
|
<target>rimosso</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="removed %@" xml:space="preserve">
|
<trans-unit id="removed %@" xml:space="preserve">
|
||||||
@@ -6095,7 +6483,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="removed you" xml:space="preserve">
|
<trans-unit id="removed you" xml:space="preserve">
|
||||||
<source>removed you</source>
|
<source>removed you</source>
|
||||||
<target>sei stato/a rimosso/a</target>
|
<target>ti ha rimosso/a</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="sec" xml:space="preserve">
|
<trans-unit id="sec" xml:space="preserve">
|
||||||
@@ -6120,6 +6508,7 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="send direct message" xml:space="preserve">
|
<trans-unit id="send direct message" xml:space="preserve">
|
||||||
<source>send direct message</source>
|
<source>send direct message</source>
|
||||||
|
<target>invia messaggio diretto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="starting…" xml:space="preserve">
|
<trans-unit id="starting…" xml:space="preserve">
|
||||||
@@ -6147,6 +6536,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
<target>profilo del gruppo aggiornato</target>
|
<target>profilo del gruppo aggiornato</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6284,6 +6677,10 @@ I server di SimpleX non possono vedere il tuo profilo.</target>
|
|||||||
<target>SimpleX usa Face ID per l'autenticazione locale</target>
|
<target>SimpleX usa Face ID per l'autenticazione locale</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX ha bisogno dell'accesso al microfono per le chiamate audio e video e per registrare messaggi vocali.</target>
|
<target>SimpleX ha bisogno dell'accesso al microfono per le chiamate audio e video e per registrare messaggi vocali.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ と %@ は接続中</target>
|
<target>%@ と %@ は接続中</target>
|
||||||
@@ -97,6 +101,10 @@
|
|||||||
<target>%1$@ at %2$@:</target>
|
<target>%1$@ at %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ 接続中!</target>
|
<target>%@ 接続中!</target>
|
||||||
@@ -122,6 +130,10 @@
|
|||||||
<target>%@ が接続を希望しています!</target>
|
<target>%@ が接続を希望しています!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ および %lld 人のメンバーが接続中</target>
|
<target>%@, %@ および %lld 人のメンバーが接続中</target>
|
||||||
@@ -187,11 +199,27 @@
|
|||||||
<target>%lld 個のファイル(合計サイズ: %@)</target>
|
<target>%lld 個のファイル(合計サイズ: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld 人のメンバー</target>
|
<target>%lld 人のメンバー</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld 分</target>
|
<target>%lld 分</target>
|
||||||
@@ -199,6 +227,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%lld new interface languages" xml:space="preserve">
|
<trans-unit id="%lld new interface languages" xml:space="preserve">
|
||||||
<source>%lld new interface languages</source>
|
<source>%lld new interface languages</source>
|
||||||
|
<target>%lldつの新しいインターフェース言語</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="%lld second(s)" xml:space="preserve">
|
<trans-unit id="%lld second(s)" xml:space="preserve">
|
||||||
@@ -261,6 +290,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -360,6 +397,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0秒</target>
|
<target>0秒</target>
|
||||||
@@ -585,6 +626,10 @@
|
|||||||
<target>全てのメッセージが削除されます(※注意:元に戻せません!※)。削除されるのは片方あなたのメッセージのみ。</target>
|
<target>全てのメッセージが削除されます(※注意:元に戻せません!※)。削除されるのは片方あなたのメッセージのみ。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>あなたの連絡先が繋がったまま継続します。</target>
|
<target>あなたの連絡先が繋がったまま継続します。</target>
|
||||||
@@ -690,6 +735,14 @@
|
|||||||
<target>すでに接続済みですか?</target>
|
<target>すでに接続済みですか?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>常にリレーを経由する</target>
|
<target>常にリレーを経由する</target>
|
||||||
@@ -712,6 +765,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
|
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
|
||||||
<source>App encrypts new local files (except videos).</source>
|
<source>App encrypts new local files (except videos).</source>
|
||||||
|
<target>アプリは新しいローカルファイル(ビデオを除く)を暗号化します。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="App icon" xml:space="preserve">
|
<trans-unit id="App icon" xml:space="preserve">
|
||||||
@@ -809,6 +863,10 @@
|
|||||||
<target>戻る</target>
|
<target>戻る</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>メッセージ ID が正しくありません</target>
|
<target>メッセージ ID が正しくありません</target>
|
||||||
@@ -824,6 +882,18 @@
|
|||||||
<target>より良いメッセージ</target>
|
<target>より良いメッセージ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>自分も相手もメッセージへのリアクションを追加できます。</target>
|
<target>自分も相手もメッセージへのリアクションを追加できます。</target>
|
||||||
@@ -851,6 +921,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" xml:space="preserve">
|
<trans-unit id="Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" xml:space="preserve">
|
||||||
<source>Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</source>
|
<source>Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</source>
|
||||||
|
<target>ブルガリア語、フィンランド語、タイ語、ウクライナ語 - ユーザーと [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)に感謝します!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
|
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
|
||||||
@@ -1084,24 +1155,31 @@
|
|||||||
<target>接続</target>
|
<target>接続</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>直接接続する</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>シークレットモードで接続</target>
|
<target>シークレットモードで接続</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>連絡先リンク経由で接続しますか?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>グループリンク経由で接続しますか?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1119,6 +1197,18 @@
|
|||||||
<target>使い捨てリンク経由で接続しますか?</target>
|
<target>使い捨てリンク経由で接続しますか?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>サーバーに接続中…</target>
|
<target>サーバーに接続中…</target>
|
||||||
@@ -1129,6 +1219,10 @@
|
|||||||
<target>サーバーに接続中… (エラー: %@)</target>
|
<target>サーバーに接続中… (エラー: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>接続</target>
|
<target>接続</target>
|
||||||
@@ -1149,6 +1243,10 @@
|
|||||||
<target>接続リクエストを送信しました!</target>
|
<target>接続リクエストを送信しました!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>接続タイムアウト</target>
|
<target>接続タイムアウト</target>
|
||||||
@@ -1164,11 +1262,6 @@
|
|||||||
<target>連絡先に既に存在します</target>
|
<target>連絡先に既に存在します</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>連絡先と全メッセージが削除されます (※元に戻せません※)!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>連絡先が非表示:</target>
|
<target>連絡先が非表示:</target>
|
||||||
@@ -1219,6 +1312,10 @@
|
|||||||
<target>コアのバージョン: v%@</target>
|
<target>コアのバージョン: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>作成</target>
|
<target>作成</target>
|
||||||
@@ -1239,6 +1336,10 @@
|
|||||||
<target>ファイルを作成</target>
|
<target>ファイルを作成</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>グループのリンクを生成する</target>
|
<target>グループのリンクを生成する</target>
|
||||||
@@ -1251,6 +1352,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
||||||
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
||||||
|
<target>[デスクトップアプリ](https://simplex.chat/downloads/)で新しいプロファイルを作成します。 💻</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
||||||
@@ -1258,6 +1360,10 @@
|
|||||||
<target>使い捨ての招待リンクを生成する</target>
|
<target>使い捨ての招待リンクを生成する</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>キューの作成</target>
|
<target>キューの作成</target>
|
||||||
@@ -1416,6 +1522,10 @@
|
|||||||
<target>削除</target>
|
<target>削除</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>連絡先を削除</target>
|
<target>連絡先を削除</target>
|
||||||
@@ -1441,6 +1551,10 @@
|
|||||||
<target>ファイルを全て削除</target>
|
<target>ファイルを全て削除</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>アーカイブを削除</target>
|
<target>アーカイブを削除</target>
|
||||||
@@ -1471,9 +1585,9 @@
|
|||||||
<target>連絡先を削除</target>
|
<target>連絡先を削除</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>連絡先を削除しますか?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1608,6 +1722,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delivery receipts!" xml:space="preserve">
|
<trans-unit id="Delivery receipts!" xml:space="preserve">
|
||||||
<source>Delivery receipts!</source>
|
<source>Delivery receipts!</source>
|
||||||
|
<target>配信通知!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Description" xml:space="preserve">
|
<trans-unit id="Description" xml:space="preserve">
|
||||||
@@ -1615,6 +1730,18 @@
|
|||||||
<target>説明</target>
|
<target>説明</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>開発</target>
|
<target>開発</target>
|
||||||
@@ -1705,18 +1832,17 @@
|
|||||||
<target>切断</target>
|
<target>切断</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
|
<target>グループを見つけて参加する</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>表示名</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>表示名:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1851,6 +1977,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Encrypt stored files & media" xml:space="preserve">
|
<trans-unit id="Encrypt stored files & media" xml:space="preserve">
|
||||||
<source>Encrypt stored files & media</source>
|
<source>Encrypt stored files & media</source>
|
||||||
|
<target>保存されたファイルとメディアを暗号化する</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Encrypted database" xml:space="preserve">
|
<trans-unit id="Encrypted database" xml:space="preserve">
|
||||||
@@ -1888,6 +2015,14 @@
|
|||||||
<target>暗号化されたメッセージ : 予期しないエラー</target>
|
<target>暗号化されたメッセージ : 予期しないエラー</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>パスコードを入力</target>
|
<target>パスコードを入力</target>
|
||||||
@@ -1898,6 +2033,10 @@
|
|||||||
<target>正しいパスフレーズを入力してください。</target>
|
<target>正しいパスフレーズを入力してください。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>暗証フレーズを入力…</target>
|
<target>暗証フレーズを入力…</target>
|
||||||
@@ -1913,6 +2052,10 @@
|
|||||||
<target>サーバを手動で入力</target>
|
<target>サーバを手動で入力</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>ウェルカムメッセージを入力してください…</target>
|
<target>ウェルカムメッセージを入力してください…</target>
|
||||||
@@ -1923,6 +2066,10 @@
|
|||||||
<target>ウェルカムメッセージを入力…(オプション)</target>
|
<target>ウェルカムメッセージを入力…(オプション)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>エラー</target>
|
<target>エラー</target>
|
||||||
@@ -1980,6 +2127,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating member contact" xml:space="preserve">
|
<trans-unit id="Error creating member contact" xml:space="preserve">
|
||||||
<source>Error creating member contact</source>
|
<source>Error creating member contact</source>
|
||||||
|
<target>メンバー連絡先の作成中にエラーが発生</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating profile!" xml:space="preserve">
|
<trans-unit id="Error creating profile!" xml:space="preserve">
|
||||||
@@ -2113,6 +2261,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
||||||
<source>Error sending member contact invitation</source>
|
<source>Error sending member contact invitation</source>
|
||||||
|
<target>招待メッセージの送信エラー</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending message" xml:space="preserve">
|
<trans-unit id="Error sending message" xml:space="preserve">
|
||||||
@@ -2194,6 +2343,10 @@
|
|||||||
<target>保存せずに閉じる</target>
|
<target>保存せずに閉じる</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>データベースをエキスポート</target>
|
<target>データベースをエキスポート</target>
|
||||||
@@ -2339,6 +2492,10 @@
|
|||||||
<target>フルネーム:</target>
|
<target>フルネーム:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>完全に再実装されました - バックグラウンドで動作します!</target>
|
<target>完全に再実装されました - バックグラウンドで動作します!</target>
|
||||||
@@ -2359,6 +2516,14 @@
|
|||||||
<target>グループ</target>
|
<target>グループ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>グループ表示の名前</target>
|
<target>グループ表示の名前</target>
|
||||||
@@ -2659,6 +2824,10 @@
|
|||||||
<target>データベースのバージョンと互換性がない</target>
|
<target>データベースのバージョンと互換性がない</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>パスコードが正しくありません</target>
|
<target>パスコードが正しくありません</target>
|
||||||
@@ -2706,6 +2875,10 @@
|
|||||||
<target>無効な接続リンク</target>
|
<target>無効な接続リンク</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>無効なサーバアドレス!</target>
|
<target>無効なサーバアドレス!</target>
|
||||||
@@ -2797,16 +2970,33 @@
|
|||||||
<target>グループに参加</target>
|
<target>グループに参加</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>シークレットモードで参加</target>
|
<target>シークレットモードで参加</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>グループに参加</target>
|
<target>グループに参加</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>接続を維持</target>
|
<target>接続を維持</target>
|
||||||
@@ -2867,6 +3057,14 @@
|
|||||||
<target>制限事項</target>
|
<target>制限事項</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>ライブメッセージ!</target>
|
<target>ライブメッセージ!</target>
|
||||||
@@ -3016,6 +3214,10 @@
|
|||||||
<target>メッセージ & ファイル</target>
|
<target>メッセージ & ファイル</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>データベースのアーカイブを移行しています…</target>
|
<target>データベースのアーカイブを移行しています…</target>
|
||||||
@@ -3128,6 +3330,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="New desktop app!" xml:space="preserve">
|
<trans-unit id="New desktop app!" xml:space="preserve">
|
||||||
<source>New desktop app!</source>
|
<source>New desktop app!</source>
|
||||||
|
<target>新しいデスクトップアプリ!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="New display name" xml:space="preserve">
|
<trans-unit id="New display name" xml:space="preserve">
|
||||||
@@ -3346,6 +3549,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open" xml:space="preserve">
|
<trans-unit id="Open" xml:space="preserve">
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
|
<target>開く</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open Settings" xml:space="preserve">
|
<trans-unit id="Open Settings" xml:space="preserve">
|
||||||
@@ -3363,6 +3567,10 @@
|
|||||||
<target>チャットのコンソールを開く</target>
|
<target>チャットのコンソールを開く</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>ユーザープロフィールを開く</target>
|
<target>ユーザープロフィールを開く</target>
|
||||||
@@ -3378,11 +3586,6 @@
|
|||||||
<target>データベースを開いています…</target>
|
<target>データベースを開いています…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>ブラウザでリンクを開くと接続のプライバシーとセキュリティが下がる可能性があります。信頼されないSimpleXリンクは読み込まれません。</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>PING回数</target>
|
<target>PING回数</target>
|
||||||
@@ -3428,6 +3631,10 @@
|
|||||||
<target>貼り付け</target>
|
<target>貼り付け</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>画像の貼り付け</target>
|
<target>画像の貼り付け</target>
|
||||||
@@ -3573,6 +3780,14 @@
|
|||||||
<target>プロフィール画像</target>
|
<target>プロフィール画像</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>プロフィールのパスワード</target>
|
<target>プロフィールのパスワード</target>
|
||||||
@@ -3817,6 +4032,14 @@
|
|||||||
<target>暗号化を再ネゴシエートしますか?</target>
|
<target>暗号化を再ネゴシエートしますか?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>返信</target>
|
<target>返信</target>
|
||||||
@@ -4002,6 +4225,10 @@
|
|||||||
<target>QRコードを読み込む</target>
|
<target>QRコードを読み込む</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>コードを読み込む</target>
|
<target>コードを読み込む</target>
|
||||||
@@ -4083,6 +4310,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
||||||
<source>Send direct message to connect</source>
|
<source>Send direct message to connect</source>
|
||||||
|
<target>ダイレクトメッセージを送信して接続する</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send disappearing message" xml:space="preserve">
|
<trans-unit id="Send disappearing message" xml:space="preserve">
|
||||||
@@ -4213,6 +4441,10 @@
|
|||||||
<target>サーバ</target>
|
<target>サーバ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>1日に設定</target>
|
<target>1日に設定</target>
|
||||||
@@ -4380,6 +4612,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Simplified incognito mode" xml:space="preserve">
|
<trans-unit id="Simplified incognito mode" xml:space="preserve">
|
||||||
<source>Simplified incognito mode</source>
|
<source>Simplified incognito mode</source>
|
||||||
|
<target>シークレットモードの簡素化</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Skip" xml:space="preserve">
|
<trans-unit id="Skip" xml:space="preserve">
|
||||||
@@ -4522,6 +4755,10 @@
|
|||||||
<target>ボタンをタップ </target>
|
<target>ボタンをタップ </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>タップしてプロフィールを有効化する。</target>
|
<target>タップしてプロフィールを有効化する。</target>
|
||||||
@@ -4619,11 +4856,6 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>暗号化は機能しており、新しい暗号化への同意は必要ありません。接続エラーが発生する可能性があります!</target>
|
<target>暗号化は機能しており、新しい暗号化への同意は必要ありません。接続エラーが発生する可能性があります!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>グループは完全分散型で、メンバーしか内容を見れません。</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>以前のメッセージとハッシュ値が異なります。</target>
|
<target>以前のメッセージとハッシュ値が異なります。</target>
|
||||||
@@ -4709,6 +4941,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>あなたのプロフィール、連絡先、メッセージ、ファイルが完全削除されます (※元に戻せません※)。</target>
|
<target>あなたのプロフィール、連絡先、メッセージ、ファイルが完全削除されます (※元に戻せません※)。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -4718,6 +4954,14 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>このグループはもう存在しません。</target>
|
<target>このグループはもう存在しません。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>この設定は現在のチャットプロフィール **%@** のメッセージに適用されます。</target>
|
<target>この設定は現在のチャットプロフィール **%@** のメッセージに適用されます。</target>
|
||||||
@@ -4814,6 +5058,18 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<target>音声メッセージを録音できません</target>
|
<target>音声メッセージを録音できません</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>予期しないエラー: %@</target>
|
<target>予期しないエラー: %@</target>
|
||||||
@@ -4876,6 +5132,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
接続するには、連絡先に別の接続リンクを作成するよう依頼し、ネットワーク接続が安定していることを確認してください。</target>
|
接続するには、連絡先に別の接続リンクを作成するよう依頼し、ネットワーク接続が安定していることを確認してください。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>ロック解除</target>
|
<target>ロック解除</target>
|
||||||
@@ -4966,6 +5230,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>新しい接続に使う</target>
|
<target>新しい接続に使う</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>iOS通話インターフェースを使用する</target>
|
<target>iOS通話インターフェースを使用する</target>
|
||||||
@@ -4996,11 +5264,23 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>SimpleX チャット サーバーを使用する。</target>
|
<target>SimpleX チャット サーバーを使用する。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>接続のセキュリティを確認</target>
|
<target>接続のセキュリティを確認</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>セキュリティコードを確認</target>
|
<target>セキュリティコードを確認</target>
|
||||||
@@ -5161,6 +5441,35 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>すでに %@ に接続されています。</target>
|
<target>すでに %@ に接続されています。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>この連絡先から受信するメッセージのサーバに既に接続してます。</target>
|
<target>この連絡先から受信するメッセージのサーバに既に接続してます。</target>
|
||||||
@@ -5256,6 +5565,15 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>確認できませんでした。 もう一度お試しください。</target>
|
<target>確認できませんでした。 もう一度お試しください。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>あなたはチャットがありません</target>
|
<target>あなたはチャットがありません</target>
|
||||||
@@ -5306,6 +5624,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>グループのホスト端末がオンラインになったら、接続されます。後でチェックするか、しばらくお待ちください!</target>
|
<target>グループのホスト端末がオンラインになったら、接続されます。後でチェックするか、しばらくお待ちください!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>連絡先が繋がりリクエストを承認したら、接続されます。後でチェックするか、しばらくお待ちください!</target>
|
<target>連絡先が繋がりリクエストを承認したら、接続されます。後でチェックするか、しばらくお待ちください!</target>
|
||||||
@@ -5321,9 +5643,8 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>起動時、または非アクティブ状態で30秒が経った後に戻ると、認証する必要となります。</target>
|
<target>起動時、または非アクティブ状態で30秒が経った後に戻ると、認証する必要となります。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>このリンクのグループに参加し、そのメンバーに繋がります。</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5391,11 +5712,6 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>チャット データベースは暗号化されていません - 暗号化するにはパスフレーズを設定してください。</target>
|
<target>チャット データベースは暗号化されていません - 暗号化するにはパスフレーズを設定してください。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>あなたのチャットプロフィールが他のグループメンバーに送られます</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>あなたのチャットプロフィール</target>
|
<target>あなたのチャットプロフィール</target>
|
||||||
@@ -5450,6 +5766,10 @@ You can change it in Settings.</source>
|
|||||||
<target>あなたのプライバシー</target>
|
<target>あなたのプライバシー</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>あなたのプロファイル **%@** が共有されます。</target>
|
<target>あなたのプロファイル **%@** が共有されます。</target>
|
||||||
@@ -5542,6 +5862,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
|
|||||||
<target>常に</target>
|
<target>常に</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>音声通話 (エンドツーエンド暗号化なし)</target>
|
<target>音声通話 (エンドツーエンド暗号化なし)</target>
|
||||||
@@ -5557,6 +5881,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
|
|||||||
<target>メッセージのハッシュ値問題</target>
|
<target>メッセージのハッシュ値問題</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>太文字</target>
|
<target>太文字</target>
|
||||||
@@ -5726,6 +6054,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
|
|||||||
<target>削除完了</target>
|
<target>削除完了</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>削除されたグループ</target>
|
<target>削除されたグループ</target>
|
||||||
@@ -6010,7 +6342,8 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>オフ</target>
|
<target>オフ</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6027,11 +6360,6 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
|
|||||||
<target>オン</target>
|
<target>オン</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>または開発者とチャットする</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>オーナー</target>
|
<target>オーナー</target>
|
||||||
@@ -6121,6 +6449,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
|
|||||||
<target>グループプロフィールを更新しました</target>
|
<target>グループプロフィールを更新しました</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6258,6 +6590,10 @@ SimpleX サーバーはあなたのプロファイルを参照できません。
|
|||||||
<target>SimpleX はローカル認証に Face ID を使用します</target>
|
<target>SimpleX はローカル認証に Face ID を使用します</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX では、音声通話やビデオ通話、および音声メッセージの録音のためにマイクへのアクセスが必要です。</target>
|
<target>SimpleX では、音声通話やビデオ通話、および音声メッセージの録音のためにマイクへのアクセスが必要です。</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,11 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<target>%@ i %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ i %@ połączeni</target>
|
<target>%@ i %@ połączeni</target>
|
||||||
@@ -97,6 +102,11 @@
|
|||||||
<target>%1$@ o %2$@:</target>
|
<target>%1$@ o %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<target>%@ połączony</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ jest połączony!</target>
|
<target>%@ jest połączony!</target>
|
||||||
@@ -122,6 +132,11 @@
|
|||||||
<target>%@ chce się połączyć!</target>
|
<target>%@ chce się połączyć!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<target>%@, %@ i %lld członków</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ i %lld innych członków połączeni</target>
|
<target>%@, %@ i %lld innych członków połączeni</target>
|
||||||
@@ -187,11 +202,31 @@
|
|||||||
<target>%lld plik(i) o całkowitym rozmiarze %@</target>
|
<target>%lld plik(i) o całkowitym rozmiarze %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<target>%lld wydarzeń grupy</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld członków</target>
|
<target>%lld członków</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<target>%lld wiadomości zablokowanych</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<target>%lld wiadomości oznaczonych do usunięcia</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<target>%lld wiadomości zmoderowanych przez %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld minut</target>
|
<target>%lld minut</target>
|
||||||
@@ -262,6 +297,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -364,6 +407,11 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<target>0 sek</target>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -589,6 +637,11 @@
|
|||||||
<target>Wszystkie wiadomości zostaną usunięte - nie można tego cofnąć! Wiadomości zostaną usunięte TYLKO dla Ciebie.</target>
|
<target>Wszystkie wiadomości zostaną usunięte - nie można tego cofnąć! Wiadomości zostaną usunięte TYLKO dla Ciebie.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<target>Wszystkie nowe wiadomości z %@ zostaną ukryte!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Wszystkie Twoje kontakty pozostaną połączone.</target>
|
<target>Wszystkie Twoje kontakty pozostaną połączone.</target>
|
||||||
@@ -694,6 +747,16 @@
|
|||||||
<target>Już połączony?</target>
|
<target>Już połączony?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<target>Już połączony!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<target>Już dołączono do grupy!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Zawsze używaj przekaźnika</target>
|
<target>Zawsze używaj przekaźnika</target>
|
||||||
@@ -814,6 +877,10 @@
|
|||||||
<target>Wstecz</target>
|
<target>Wstecz</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>Zły identyfikator wiadomości</target>
|
<target>Zły identyfikator wiadomości</target>
|
||||||
@@ -829,6 +896,21 @@
|
|||||||
<target>Lepsze wiadomości</target>
|
<target>Lepsze wiadomości</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<target>Zablokuj</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<target>Zablokuj członka</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<target>Zablokować członka?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>Zarówno Ty, jak i Twój kontakt możecie dodawać reakcje wiadomości.</target>
|
<target>Zarówno Ty, jak i Twój kontakt możecie dodawać reakcje wiadomości.</target>
|
||||||
@@ -1090,24 +1172,37 @@
|
|||||||
<target>Połącz</target>
|
<target>Połącz</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Połącz bezpośrednio</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Połącz incognito</target>
|
<target>Połącz incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Połącz przez link kontaktowy</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Połącz się przez link grupowy?</target>
|
<target>Połączyć się ze sobą?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<target>Połączyć się ze sobą?
|
||||||
|
To jest twój własny adres SimpleX!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<target>Połączyć się ze sobą?
|
||||||
|
To jest twój jednorazowy link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
|
<target>Połącz przez adres kontaktowy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1125,6 +1220,19 @@
|
|||||||
<target>Połącz przez jednorazowy link</target>
|
<target>Połącz przez jednorazowy link</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<target>Połącz z %@</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Łączenie z serwerem…</target>
|
<target>Łączenie z serwerem…</target>
|
||||||
@@ -1135,6 +1243,10 @@
|
|||||||
<target>Łączenie z serwerem... (błąd: %@)</target>
|
<target>Łączenie z serwerem... (błąd: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Połączenie</target>
|
<target>Połączenie</target>
|
||||||
@@ -1155,6 +1267,10 @@
|
|||||||
<target>Prośba o połączenie wysłana!</target>
|
<target>Prośba o połączenie wysłana!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Czas połączenia minął</target>
|
<target>Czas połączenia minął</target>
|
||||||
@@ -1170,11 +1286,6 @@
|
|||||||
<target>Kontakt już istnieje</target>
|
<target>Kontakt już istnieje</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Kontakt i wszystkie wiadomości zostaną usunięte - nie można tego cofnąć!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Kontakt ukryty:</target>
|
<target>Kontakt ukryty:</target>
|
||||||
@@ -1225,6 +1336,11 @@
|
|||||||
<target>Wersja rdzenia: v%@</target>
|
<target>Wersja rdzenia: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<target>Poprawić imię na %@?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Utwórz</target>
|
<target>Utwórz</target>
|
||||||
@@ -1245,6 +1361,11 @@
|
|||||||
<target>Utwórz plik</target>
|
<target>Utwórz plik</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<target>Utwórz grupę</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Utwórz link do grupy</target>
|
<target>Utwórz link do grupy</target>
|
||||||
@@ -1265,6 +1386,11 @@
|
|||||||
<target>Utwórz jednorazowy link do zaproszenia</target>
|
<target>Utwórz jednorazowy link do zaproszenia</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<target>Utwórz profil</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Utwórz kolejkę</target>
|
<target>Utwórz kolejkę</target>
|
||||||
@@ -1423,6 +1549,11 @@
|
|||||||
<target>Usuń</target>
|
<target>Usuń</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<target>Usunąć %lld wiadomości?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Usuń Kontakt</target>
|
<target>Usuń Kontakt</target>
|
||||||
@@ -1448,6 +1579,11 @@
|
|||||||
<target>Usuń wszystkie pliki</target>
|
<target>Usuń wszystkie pliki</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<target>Usuń i powiadom kontakt</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Usuń archiwum</target>
|
<target>Usuń archiwum</target>
|
||||||
@@ -1478,9 +1614,11 @@
|
|||||||
<target>Usuń kontakt</target>
|
<target>Usuń kontakt</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Usunąć kontakt?</target>
|
This cannot be undone!</source>
|
||||||
|
<target>Usunąć kontakt?
|
||||||
|
To nie może być cofnięte!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1623,6 +1761,18 @@
|
|||||||
<target>Opis</target>
|
<target>Opis</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Deweloperskie</target>
|
<target>Deweloperskie</target>
|
||||||
@@ -1713,19 +1863,17 @@
|
|||||||
<target>Rozłącz</target>
|
<target>Rozłącz</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<target>Odkrywaj i dołączaj do grup</target>
|
<target>Odkrywaj i dołączaj do grup</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Wyświetlana nazwa</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Wyświetlana nazwa:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1898,6 +2046,14 @@
|
|||||||
<target>Zaszyfrowana wiadomość: nieoczekiwany błąd</target>
|
<target>Zaszyfrowana wiadomość: nieoczekiwany błąd</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Wprowadź Pin</target>
|
<target>Wprowadź Pin</target>
|
||||||
@@ -1908,6 +2064,11 @@
|
|||||||
<target>Wprowadź poprawne hasło.</target>
|
<target>Wprowadź poprawne hasło.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<target>Wpisz nazwę grupy…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Wprowadź hasło…</target>
|
<target>Wprowadź hasło…</target>
|
||||||
@@ -1923,6 +2084,10 @@
|
|||||||
<target>Wprowadź serwer ręcznie</target>
|
<target>Wprowadź serwer ręcznie</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Wpisz wiadomość powitalną…</target>
|
<target>Wpisz wiadomość powitalną…</target>
|
||||||
@@ -1933,6 +2098,11 @@
|
|||||||
<target>Wpisz wiadomość powitalną… (opcjonalne)</target>
|
<target>Wpisz wiadomość powitalną… (opcjonalne)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<target>Wpisz swoją nazwę…</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Błąd</target>
|
<target>Błąd</target>
|
||||||
@@ -1990,6 +2160,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating member contact" xml:space="preserve">
|
<trans-unit id="Error creating member contact" xml:space="preserve">
|
||||||
<source>Error creating member contact</source>
|
<source>Error creating member contact</source>
|
||||||
|
<target>Błąd tworzenia kontaktu członka</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating profile!" xml:space="preserve">
|
<trans-unit id="Error creating profile!" xml:space="preserve">
|
||||||
@@ -2124,6 +2295,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
||||||
<source>Error sending member contact invitation</source>
|
<source>Error sending member contact invitation</source>
|
||||||
|
<target>Błąd wysyłania zaproszenia kontaktu członka</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending message" xml:space="preserve">
|
<trans-unit id="Error sending message" xml:space="preserve">
|
||||||
@@ -2206,6 +2378,11 @@
|
|||||||
<target>Wyjdź bez zapisywania</target>
|
<target>Wyjdź bez zapisywania</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<target>Rozszerz</target>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Eksportuj bazę danych</target>
|
<target>Eksportuj bazę danych</target>
|
||||||
@@ -2351,6 +2528,11 @@
|
|||||||
<target>Pełna nazwa:</target>
|
<target>Pełna nazwa:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<target>W pełni zdecentralizowana – widoczna tylko dla członków.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>W pełni ponownie zaimplementowany - praca w tle!</target>
|
<target>W pełni ponownie zaimplementowany - praca w tle!</target>
|
||||||
@@ -2371,6 +2553,16 @@
|
|||||||
<target>Grupa</target>
|
<target>Grupa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<target>Grupa już istnieje</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<target>Grupa już istnieje!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Wyświetlana nazwa grupy</target>
|
<target>Wyświetlana nazwa grupy</target>
|
||||||
@@ -2671,6 +2863,10 @@
|
|||||||
<target>Niekompatybilna wersja bazy danych</target>
|
<target>Niekompatybilna wersja bazy danych</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Nieprawidłowy pin</target>
|
<target>Nieprawidłowy pin</target>
|
||||||
@@ -2718,6 +2914,11 @@
|
|||||||
<target>Nieprawidłowy link połączenia</target>
|
<target>Nieprawidłowy link połączenia</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<target>Nieprawidłowa nazwa!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Nieprawidłowy adres serwera!</target>
|
<target>Nieprawidłowy adres serwera!</target>
|
||||||
@@ -2809,16 +3010,37 @@
|
|||||||
<target>Dołącz do grupy</target>
|
<target>Dołącz do grupy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<target>Dołączyć do grupy?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Dołącz incognito</target>
|
<target>Dołącz incognito</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<target>Dołącz z obecnym profilem</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<target>Dołączyć do twojej grupy?
|
||||||
|
To jest twój link do grupy %@!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Dołączanie do grupy</target>
|
<target>Dołączanie do grupy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Zachowaj swoje połączenia</target>
|
<target>Zachowaj swoje połączenia</target>
|
||||||
@@ -2879,6 +3101,14 @@
|
|||||||
<target>Ograniczenia</target>
|
<target>Ograniczenia</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Wiadomość na żywo!</target>
|
<target>Wiadomość na żywo!</target>
|
||||||
@@ -3029,6 +3259,11 @@
|
|||||||
<target>Wiadomości i pliki</target>
|
<target>Wiadomości i pliki</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<target>Wiadomości od %@ zostaną pokazane!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Migrowanie archiwum bazy danych…</target>
|
<target>Migrowanie archiwum bazy danych…</target>
|
||||||
@@ -3360,6 +3595,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open" xml:space="preserve">
|
<trans-unit id="Open" xml:space="preserve">
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
|
<target>Otwórz</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open Settings" xml:space="preserve">
|
<trans-unit id="Open Settings" xml:space="preserve">
|
||||||
@@ -3377,6 +3613,11 @@
|
|||||||
<target>Otwórz konsolę czatu</target>
|
<target>Otwórz konsolę czatu</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<target>Grupa otwarta</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Otwórz profile użytkownika</target>
|
<target>Otwórz profile użytkownika</target>
|
||||||
@@ -3392,11 +3633,6 @@
|
|||||||
<target>Otwieranie bazy danych…</target>
|
<target>Otwieranie bazy danych…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Otwarcie łącza w przeglądarce może zmniejszyć prywatność i bezpieczeństwo połączenia. Niezaufane linki SimpleX będą miały kolor czerwony.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>Liczba PINGÓW</target>
|
<target>Liczba PINGÓW</target>
|
||||||
@@ -3442,6 +3678,10 @@
|
|||||||
<target>Wklej</target>
|
<target>Wklej</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Wklej obraz</target>
|
<target>Wklej obraz</target>
|
||||||
@@ -3587,6 +3827,16 @@
|
|||||||
<target>Zdjęcie profilowe</target>
|
<target>Zdjęcie profilowe</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<target>Nazwa profilu</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<target>Nazwa profilu:</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Hasło profilu</target>
|
<target>Hasło profilu</target>
|
||||||
@@ -3832,6 +4082,16 @@
|
|||||||
<target>Renegocjować szyfrowanie?</target>
|
<target>Renegocjować szyfrowanie?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<target>Powtórzyć prośbę połączenia?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<target>Powtórzyć prośbę dołączenia?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Odpowiedz</target>
|
<target>Odpowiedz</target>
|
||||||
@@ -4017,6 +4277,10 @@
|
|||||||
<target>Zeskanuj kod QR</target>
|
<target>Zeskanuj kod QR</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Zeskanuj kod</target>
|
<target>Zeskanuj kod</target>
|
||||||
@@ -4099,6 +4363,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
||||||
<source>Send direct message to connect</source>
|
<source>Send direct message to connect</source>
|
||||||
|
<target>Wyślij wiadomość bezpośrednią aby połączyć</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send disappearing message" xml:space="preserve">
|
<trans-unit id="Send disappearing message" xml:space="preserve">
|
||||||
@@ -4236,6 +4501,10 @@
|
|||||||
<target>Serwery</target>
|
<target>Serwery</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Ustaw 1 dzień</target>
|
<target>Ustaw 1 dzień</target>
|
||||||
@@ -4546,6 +4815,11 @@
|
|||||||
<target>Naciśnij przycisk </target>
|
<target>Naciśnij przycisk </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<target>Dotknij aby połączyć</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Dotknij, aby aktywować profil.</target>
|
<target>Dotknij, aby aktywować profil.</target>
|
||||||
@@ -4643,11 +4917,6 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
|
|||||||
<target>Szyfrowanie działa, a nowe uzgodnienie szyfrowania nie jest wymagane. Może to spowodować błędy w połączeniu!</target>
|
<target>Szyfrowanie działa, a nowe uzgodnienie szyfrowania nie jest wymagane. Może to spowodować błędy w połączeniu!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>Grupa jest w pełni zdecentralizowana – jest widoczna tylko dla członków.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>Hash poprzedniej wiadomości jest inny.</target>
|
<target>Hash poprzedniej wiadomości jest inny.</target>
|
||||||
@@ -4733,6 +5002,10 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
|
|||||||
<target>Tego działania nie można cofnąć - Twój profil, kontakty, wiadomości i pliki zostaną nieodwracalnie utracone.</target>
|
<target>Tego działania nie można cofnąć - Twój profil, kontakty, wiadomości i pliki zostaną nieodwracalnie utracone.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>Ta grupa ma ponad %lld członków, potwierdzenia dostawy nie są wysyłane.</target>
|
<target>Ta grupa ma ponad %lld członków, potwierdzenia dostawy nie są wysyłane.</target>
|
||||||
@@ -4743,6 +5016,16 @@ Może się to zdarzyć z powodu jakiegoś błędu lub gdy połączenie jest skom
|
|||||||
<target>Ta grupa już nie istnieje.</target>
|
<target>Ta grupa już nie istnieje.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<target>To jest twój własny adres SimpleX!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<target>To jest twój jednorazowy link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>To ustawienie dotyczy wiadomości Twojego bieżącego profilu czatu **%@**.</target>
|
<target>To ustawienie dotyczy wiadomości Twojego bieżącego profilu czatu **%@**.</target>
|
||||||
@@ -4840,6 +5123,21 @@ Przed włączeniem tej funkcji zostanie wyświetlony monit uwierzytelniania.</ta
|
|||||||
<target>Nie można nagrać wiadomości głosowej</target>
|
<target>Nie można nagrać wiadomości głosowej</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<target>Odblokuj</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<target>Odblokuj członka</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<target>Odblokować członka?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Nieoczekiwany błąd: %@</target>
|
<target>Nieoczekiwany błąd: %@</target>
|
||||||
@@ -4902,6 +5200,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połączenia i sprawdź, czy masz stabilne połączenie z siecią.</target>
|
Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połączenia i sprawdź, czy masz stabilne połączenie z siecią.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Odblokuj</target>
|
<target>Odblokuj</target>
|
||||||
@@ -4992,6 +5298,10 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
|
|||||||
<target>Użyj dla nowych połączeń</target>
|
<target>Użyj dla nowych połączeń</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Użyj interfejsu połączeń iOS</target>
|
<target>Użyj interfejsu połączeń iOS</target>
|
||||||
@@ -5022,11 +5332,23 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
|
|||||||
<target>Używanie serwerów SimpleX Chat.</target>
|
<target>Używanie serwerów SimpleX Chat.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Weryfikuj bezpieczeństwo połączenia</target>
|
<target>Weryfikuj bezpieczeństwo połączenia</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Weryfikuj kod bezpieczeństwa</target>
|
<target>Weryfikuj kod bezpieczeństwa</target>
|
||||||
@@ -5187,6 +5509,43 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
|
|||||||
<target>Jesteś już połączony z %@.</target>
|
<target>Jesteś już połączony z %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<target>Już się łączysz z %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<target>Już jesteś połączony z tym jednorazowym linkiem!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<target>Już jesteś w grupie %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<target>Już dołączasz do grupy %@.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<target>Już dołączasz do grupy przez ten link!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<target>Już dołączasz do grupy przez ten link.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<target>Już dołączasz do grupy!
|
||||||
|
Powtórzyć prośbę dołączenia?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Jesteś połączony z serwerem używanym do odbierania wiadomości od tego kontaktu.</target>
|
<target>Jesteś połączony z serwerem używanym do odbierania wiadomości od tego kontaktu.</target>
|
||||||
@@ -5282,6 +5641,18 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
|
|||||||
<target>Nie można zweryfikować użytkownika; proszę spróbować ponownie.</target>
|
<target>Nie można zweryfikować użytkownika; proszę spróbować ponownie.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<target>Już prosiłeś o połączenie na ten adres!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<target>Już prosiłeś o połączenie!
|
||||||
|
Powtórzyć prośbę połączenia?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>Nie masz czatów</target>
|
<target>Nie masz czatów</target>
|
||||||
@@ -5332,6 +5703,11 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
|
|||||||
<target>Zostaniesz połączony do grupy, gdy urządzenie gospodarza grupy będzie online, proszę czekać lub sprawdzić później!</target>
|
<target>Zostaniesz połączony do grupy, gdy urządzenie gospodarza grupy będzie online, proszę czekać lub sprawdzić później!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<target>Zostaniesz połączony, gdy urządzenie hosta grupy będzie online, proszę czekać lub sprawdzić później!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Zostaniesz połączony, gdy Twoje żądanie połączenia zostanie zaakceptowane, proszę czekać lub sprawdzić później!</target>
|
<target>Zostaniesz połączony, gdy Twoje żądanie połączenia zostanie zaakceptowane, proszę czekać lub sprawdzić później!</target>
|
||||||
@@ -5347,9 +5723,9 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
|
|||||||
<target>Uwierzytelnienie będzie wymagane przy uruchamianiu lub wznawianiu aplikacji po 30 sekundach w tle.</target>
|
<target>Uwierzytelnienie będzie wymagane przy uruchamianiu lub wznawianiu aplikacji po 30 sekundach w tle.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Dołączysz do grupy, do której odnosi się ten link i połączysz się z jej członkami.</target>
|
<target>Zostaniesz połączony ze wszystkimi członkami grupy.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5417,11 +5793,6 @@ Aby się połączyć, poproś Twój kontakt o utworzenie kolejnego linku połąc
|
|||||||
<target>Baza danych czatu nie jest szyfrowana - ustaw hasło, aby ją zaszyfrować.</target>
|
<target>Baza danych czatu nie jest szyfrowana - ustaw hasło, aby ją zaszyfrować.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Twój profil czatu zostanie wysłany do członków grupy</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Twoje profile czatu</target>
|
<target>Twoje profile czatu</target>
|
||||||
@@ -5476,6 +5847,11 @@ Możesz to zmienić w Ustawieniach.</target>
|
|||||||
<target>Twoja prywatność</target>
|
<target>Twoja prywatność</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<target>Twój profil</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Twój profil **%@** zostanie udostępniony.</target>
|
<target>Twój profil **%@** zostanie udostępniony.</target>
|
||||||
@@ -5568,6 +5944,11 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
<target>zawsze</target>
|
<target>zawsze</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<target>i %lld innych wydarzeń</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>połączenie audio (nie szyfrowane e2e)</target>
|
<target>połączenie audio (nie szyfrowane e2e)</target>
|
||||||
@@ -5583,6 +5964,11 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
<target>zły hash wiadomości</target>
|
<target>zły hash wiadomości</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<target>zablokowany</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>pogrubiona</target>
|
<target>pogrubiona</target>
|
||||||
@@ -5655,6 +6041,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connected directly" xml:space="preserve">
|
<trans-unit id="connected directly" xml:space="preserve">
|
||||||
<source>connected directly</source>
|
<source>connected directly</source>
|
||||||
|
<target>połącz bezpośrednio</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connecting" xml:space="preserve">
|
<trans-unit id="connecting" xml:space="preserve">
|
||||||
@@ -5752,6 +6139,11 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
<target>usunięty</target>
|
<target>usunięty</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<target>usunięto kontakt</target>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>usunięta grupa</target>
|
<target>usunięta grupa</target>
|
||||||
@@ -6036,7 +6428,8 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>wyłączony</target>
|
<target>wyłączony</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6053,11 +6446,6 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
<target>włączone</target>
|
<target>włączone</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>lub porozmawiać z deweloperami</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>właściciel</target>
|
<target>właściciel</target>
|
||||||
@@ -6120,6 +6508,7 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="send direct message" xml:space="preserve">
|
<trans-unit id="send direct message" xml:space="preserve">
|
||||||
<source>send direct message</source>
|
<source>send direct message</source>
|
||||||
|
<target>wyślij wiadomość bezpośrednią</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="starting…" xml:space="preserve">
|
<trans-unit id="starting…" xml:space="preserve">
|
||||||
@@ -6147,6 +6536,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
<target>zaktualizowano profil grupy</target>
|
<target>zaktualizowano profil grupy</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6284,6 +6677,10 @@ Serwery SimpleX nie mogą zobaczyć Twojego profilu.</target>
|
|||||||
<target>SimpleX używa Face ID do lokalnego uwierzytelniania</target>
|
<target>SimpleX używa Face ID do lokalnego uwierzytelniania</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX potrzebuje dostępu do mikrofonu, w celu połączeń audio i wideo oraz nagrywania wiadomości głosowych.</target>
|
<target>SimpleX potrzebuje dostępu do mikrofonu, w celu połączeń audio i wideo oraz nagrywania wiadomości głosowych.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ и %@ соединены</target>
|
<target>%@ и %@ соединены</target>
|
||||||
@@ -97,6 +101,10 @@
|
|||||||
<target>%1$@ в %2$@:</target>
|
<target>%1$@ в %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>Установлено соединение с %@!</target>
|
<target>Установлено соединение с %@!</target>
|
||||||
@@ -122,6 +130,10 @@
|
|||||||
<target>%@ хочет соединиться!</target>
|
<target>%@ хочет соединиться!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ и %lld других членов соединены</target>
|
<target>%@, %@ и %lld других членов соединены</target>
|
||||||
@@ -187,11 +199,27 @@
|
|||||||
<target>%lld файл(ов) общим размером %@</target>
|
<target>%lld файл(ов) общим размером %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>Членов группы: %lld</target>
|
<target>Членов группы: %lld</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld минуты</target>
|
<target>%lld минуты</target>
|
||||||
@@ -262,6 +290,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -364,6 +400,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0с</target>
|
<target>0с</target>
|
||||||
@@ -589,6 +629,10 @@
|
|||||||
<target>Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для Вас.</target>
|
<target>Все сообщения будут удалены - это действие нельзя отменить! Сообщения будут удалены только для Вас.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Все контакты, которые соединились через этот адрес, сохранятся.</target>
|
<target>Все контакты, которые соединились через этот адрес, сохранятся.</target>
|
||||||
@@ -694,6 +738,14 @@
|
|||||||
<target>Соединение уже установлено?</target>
|
<target>Соединение уже установлено?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Всегда соединяться через relay</target>
|
<target>Всегда соединяться через relay</target>
|
||||||
@@ -814,6 +866,10 @@
|
|||||||
<target>Назад</target>
|
<target>Назад</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>Ошибка ID сообщения</target>
|
<target>Ошибка ID сообщения</target>
|
||||||
@@ -829,6 +885,18 @@
|
|||||||
<target>Улучшенные сообщения</target>
|
<target>Улучшенные сообщения</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>И Вы, и Ваш контакт можете добавлять реакции на сообщения.</target>
|
<target>И Вы, и Ваш контакт можете добавлять реакции на сообщения.</target>
|
||||||
@@ -1090,24 +1158,31 @@
|
|||||||
<target>Соединиться</target>
|
<target>Соединиться</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Соединиться напрямую</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Соединиться Инкогнито</target>
|
<target>Соединиться Инкогнито</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Соединиться через ссылку-контакт</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Соединиться через ссылку группы?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1125,6 +1200,18 @@
|
|||||||
<target>Соединиться через одноразовую ссылку</target>
|
<target>Соединиться через одноразовую ссылку</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Устанавливается соединение с сервером…</target>
|
<target>Устанавливается соединение с сервером…</target>
|
||||||
@@ -1135,6 +1222,10 @@
|
|||||||
<target>Устанавливается соединение с сервером… (ошибка: %@)</target>
|
<target>Устанавливается соединение с сервером… (ошибка: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Соединение</target>
|
<target>Соединение</target>
|
||||||
@@ -1155,6 +1246,10 @@
|
|||||||
<target>Запрос на соединение отправлен!</target>
|
<target>Запрос на соединение отправлен!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Превышено время соединения</target>
|
<target>Превышено время соединения</target>
|
||||||
@@ -1170,11 +1265,6 @@
|
|||||||
<target>Существующий контакт</target>
|
<target>Существующий контакт</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Контакт и все сообщения будут удалены - это действие нельзя отменить!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Контакт скрыт:</target>
|
<target>Контакт скрыт:</target>
|
||||||
@@ -1225,6 +1315,10 @@
|
|||||||
<target>Версия ядра: v%@</target>
|
<target>Версия ядра: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Создать</target>
|
<target>Создать</target>
|
||||||
@@ -1245,6 +1339,10 @@
|
|||||||
<target>Создание файла</target>
|
<target>Создание файла</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Создать ссылку группы</target>
|
<target>Создать ссылку группы</target>
|
||||||
@@ -1265,6 +1363,10 @@
|
|||||||
<target>Создать ссылку-приглашение</target>
|
<target>Создать ссылку-приглашение</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Создание очереди</target>
|
<target>Создание очереди</target>
|
||||||
@@ -1423,6 +1525,10 @@
|
|||||||
<target>Удалить</target>
|
<target>Удалить</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Удалить контакт</target>
|
<target>Удалить контакт</target>
|
||||||
@@ -1448,6 +1554,10 @@
|
|||||||
<target>Удалить все файлы</target>
|
<target>Удалить все файлы</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Удалить архив</target>
|
<target>Удалить архив</target>
|
||||||
@@ -1478,9 +1588,9 @@
|
|||||||
<target>Удалить контакт</target>
|
<target>Удалить контакт</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Удалить контакт?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1623,6 +1733,18 @@
|
|||||||
<target>Описание</target>
|
<target>Описание</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Для разработчиков</target>
|
<target>Для разработчиков</target>
|
||||||
@@ -1713,19 +1835,17 @@
|
|||||||
<target>Разрыв соединения</target>
|
<target>Разрыв соединения</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<target>Найдите и вступите в группы</target>
|
<target>Найдите и вступите в группы</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Имя профиля</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Имя профиля:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1898,6 +2018,14 @@
|
|||||||
<target>Зашифрованное сообщение: неожиданная ошибка</target>
|
<target>Зашифрованное сообщение: неожиданная ошибка</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Введите Код</target>
|
<target>Введите Код</target>
|
||||||
@@ -1908,6 +2036,10 @@
|
|||||||
<target>Введите правильный пароль.</target>
|
<target>Введите правильный пароль.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Введите пароль…</target>
|
<target>Введите пароль…</target>
|
||||||
@@ -1923,6 +2055,10 @@
|
|||||||
<target>Ввести сервер вручную</target>
|
<target>Ввести сервер вручную</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Введите приветственное сообщение…</target>
|
<target>Введите приветственное сообщение…</target>
|
||||||
@@ -1933,6 +2069,10 @@
|
|||||||
<target>Введите приветственное сообщение... (опционально)</target>
|
<target>Введите приветственное сообщение... (опционально)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Ошибка</target>
|
<target>Ошибка</target>
|
||||||
@@ -2206,6 +2346,10 @@
|
|||||||
<target>Выйти без сохранения</target>
|
<target>Выйти без сохранения</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Экспорт архива чата</target>
|
<target>Экспорт архива чата</target>
|
||||||
@@ -2351,6 +2495,10 @@
|
|||||||
<target>Полное имя:</target>
|
<target>Полное имя:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Полностью обновлены - работают в фоне!</target>
|
<target>Полностью обновлены - работают в фоне!</target>
|
||||||
@@ -2371,6 +2519,14 @@
|
|||||||
<target>Группа</target>
|
<target>Группа</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Имя группы</target>
|
<target>Имя группы</target>
|
||||||
@@ -2671,6 +2827,10 @@
|
|||||||
<target>Несовместимая версия базы данных</target>
|
<target>Несовместимая версия базы данных</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Неправильный код</target>
|
<target>Неправильный код</target>
|
||||||
@@ -2718,6 +2878,10 @@
|
|||||||
<target>Ошибка в ссылке контакта</target>
|
<target>Ошибка в ссылке контакта</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Ошибка в адресе сервера!</target>
|
<target>Ошибка в адресе сервера!</target>
|
||||||
@@ -2809,16 +2973,33 @@
|
|||||||
<target>Вступить в группу</target>
|
<target>Вступить в группу</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Вступить инкогнито</target>
|
<target>Вступить инкогнито</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Вступление в группу</target>
|
<target>Вступление в группу</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Сохраните Ваши соединения</target>
|
<target>Сохраните Ваши соединения</target>
|
||||||
@@ -2879,6 +3060,14 @@
|
|||||||
<target>Ограничения</target>
|
<target>Ограничения</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Живое сообщение!</target>
|
<target>Живое сообщение!</target>
|
||||||
@@ -3029,6 +3218,10 @@
|
|||||||
<target>Сообщения</target>
|
<target>Сообщения</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Данные чата перемещаются…</target>
|
<target>Данные чата перемещаются…</target>
|
||||||
@@ -3377,6 +3570,10 @@
|
|||||||
<target>Открыть консоль</target>
|
<target>Открыть консоль</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Открыть профили пользователя</target>
|
<target>Открыть профили пользователя</target>
|
||||||
@@ -3392,11 +3589,6 @@
|
|||||||
<target>Открытие базы данных…</target>
|
<target>Открытие базы данных…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Использование ссылки в браузере может уменьшить конфиденциальность и безопасность соединения. Ссылки на неизвестные сайты будут красными.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>Количество PING</target>
|
<target>Количество PING</target>
|
||||||
@@ -3442,6 +3634,10 @@
|
|||||||
<target>Вставить</target>
|
<target>Вставить</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Вставить изображение</target>
|
<target>Вставить изображение</target>
|
||||||
@@ -3587,6 +3783,14 @@
|
|||||||
<target>Аватар</target>
|
<target>Аватар</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Пароль профиля</target>
|
<target>Пароль профиля</target>
|
||||||
@@ -3832,6 +4036,14 @@
|
|||||||
<target>Пересогласовать шифрование?</target>
|
<target>Пересогласовать шифрование?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Ответить</target>
|
<target>Ответить</target>
|
||||||
@@ -4017,6 +4229,10 @@
|
|||||||
<target>Сканировать QR код</target>
|
<target>Сканировать QR код</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Сканировать код</target>
|
<target>Сканировать код</target>
|
||||||
@@ -4236,6 +4452,10 @@
|
|||||||
<target>Серверы</target>
|
<target>Серверы</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Установить 1 день</target>
|
<target>Установить 1 день</target>
|
||||||
@@ -4546,6 +4766,10 @@
|
|||||||
<target>Нажмите кнопку </target>
|
<target>Нажмите кнопку </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Нажмите, чтобы сделать профиль активным.</target>
|
<target>Нажмите, чтобы сделать профиль активным.</target>
|
||||||
@@ -4643,11 +4867,6 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Шифрование работает, и новое соглашение не требуется. Это может привести к ошибкам соединения!</target>
|
<target>Шифрование работает, и новое соглашение не требуется. Это может привести к ошибкам соединения!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>Группа полностью децентрализована — она видна только членам.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>Хэш предыдущего сообщения отличается.</target>
|
<target>Хэш предыдущего сообщения отличается.</target>
|
||||||
@@ -4733,6 +4952,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Это действие нельзя отменить — Ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</target>
|
<target>Это действие нельзя отменить — Ваш профиль, контакты, сообщения и файлы будут безвозвратно утеряны.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>В группе более %lld членов, отчёты о доставке выключены.</target>
|
<target>В группе более %lld членов, отчёты о доставке выключены.</target>
|
||||||
@@ -4743,6 +4966,14 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Эта группа больше не существует.</target>
|
<target>Эта группа больше не существует.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>Эта настройка применяется к сообщениям в Вашем текущем профиле чата **%@**.</target>
|
<target>Эта настройка применяется к сообщениям в Вашем текущем профиле чата **%@**.</target>
|
||||||
@@ -4840,6 +5071,18 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<target>Невозможно записать голосовое сообщение</target>
|
<target>Невозможно записать голосовое сообщение</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Неожиданная ошибка: %@</target>
|
<target>Неожиданная ошибка: %@</target>
|
||||||
@@ -4902,6 +5145,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
Чтобы установить соединение, попросите Ваш контакт создать еще одну ссылку и проверьте Ваше соединение с сетью.</target>
|
Чтобы установить соединение, попросите Ваш контакт создать еще одну ссылку и проверьте Ваше соединение с сетью.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Разблокировать</target>
|
<target>Разблокировать</target>
|
||||||
@@ -4992,6 +5243,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Использовать для новых соединений</target>
|
<target>Использовать для новых соединений</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Использовать интерфейс iOS для звонков</target>
|
<target>Использовать интерфейс iOS для звонков</target>
|
||||||
@@ -5022,11 +5277,23 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Используются серверы, предоставленные SimpleX Chat.</target>
|
<target>Используются серверы, предоставленные SimpleX Chat.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Проверить безопасность соединения</target>
|
<target>Проверить безопасность соединения</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Подтвердить код безопасности</target>
|
<target>Подтвердить код безопасности</target>
|
||||||
@@ -5187,6 +5454,35 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Вы уже соединены с контактом %@.</target>
|
<target>Вы уже соединены с контактом %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Установлено соединение с сервером, через который Вы получаете сообщения от этого контакта.</target>
|
<target>Установлено соединение с сервером, через который Вы получаете сообщения от этого контакта.</target>
|
||||||
@@ -5282,6 +5578,15 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Верификация не удалась; пожалуйста, попробуйте ещё раз.</target>
|
<target>Верификация не удалась; пожалуйста, попробуйте ещё раз.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>У Вас нет чатов</target>
|
<target>У Вас нет чатов</target>
|
||||||
@@ -5332,6 +5637,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Соединение с группой будет установлено, когда хост группы будет онлайн. Пожалуйста, подождите или проверьте позже!</target>
|
<target>Соединение с группой будет установлено, когда хост группы будет онлайн. Пожалуйста, подождите или проверьте позже!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Соединение будет установлено, когда Ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!</target>
|
<target>Соединение будет установлено, когда Ваш запрос будет принят. Пожалуйста, подождите или проверьте позже!</target>
|
||||||
@@ -5347,9 +5656,8 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Вы будете аутентифицированы при запуске и возобновлении приложения, которое было 30 секунд в фоновом режиме.</target>
|
<target>Вы будете аутентифицированы при запуске и возобновлении приложения, которое было 30 секунд в фоновом режиме.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Вы вступите в группу, на которую ссылается эта ссылка, и соединитесь с её членами.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5417,11 +5725,6 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>База данных НЕ зашифрована. Установите пароль, чтобы защитить Ваши данные.</target>
|
<target>База данных НЕ зашифрована. Установите пароль, чтобы защитить Ваши данные.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Ваш профиль чата будет отправлен членам группы</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Ваши профили чата</target>
|
<target>Ваши профили чата</target>
|
||||||
@@ -5476,6 +5779,10 @@ You can change it in Settings.</source>
|
|||||||
<target>Конфиденциальность</target>
|
<target>Конфиденциальность</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Будет отправлен Ваш профиль **%@**.</target>
|
<target>Будет отправлен Ваш профиль **%@**.</target>
|
||||||
@@ -5568,6 +5875,10 @@ SimpleX серверы не могут получить доступ к Ваше
|
|||||||
<target>всегда</target>
|
<target>всегда</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>аудиозвонок (не e2e зашифрованный)</target>
|
<target>аудиозвонок (не e2e зашифрованный)</target>
|
||||||
@@ -5583,6 +5894,10 @@ SimpleX серверы не могут получить доступ к Ваше
|
|||||||
<target>ошибка хэш сообщения</target>
|
<target>ошибка хэш сообщения</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>жирный</target>
|
<target>жирный</target>
|
||||||
@@ -5752,6 +6067,10 @@ SimpleX серверы не могут получить доступ к Ваше
|
|||||||
<target>удалено</target>
|
<target>удалено</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>удалил(а) группу</target>
|
<target>удалил(а) группу</target>
|
||||||
@@ -6036,7 +6355,8 @@ SimpleX серверы не могут получить доступ к Ваше
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>нет</target>
|
<target>нет</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6053,11 +6373,6 @@ SimpleX серверы не могут получить доступ к Ваше
|
|||||||
<target>да</target>
|
<target>да</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>или соединитесь с разработчиками</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>владелец</target>
|
<target>владелец</target>
|
||||||
@@ -6147,6 +6462,10 @@ SimpleX серверы не могут получить доступ к Ваше
|
|||||||
<target>обновил(а) профиль группы</target>
|
<target>обновил(а) профиль группы</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6284,6 +6603,10 @@ SimpleX серверы не могут получить доступ к Ваше
|
|||||||
<target>SimpleX использует Face ID для аутентификации</target>
|
<target>SimpleX использует Face ID для аутентификации</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX использует микрофон для аудио и видео звонков, и для записи голосовых сообщений.</target>
|
<target>SimpleX использует микрофон для аудио и видео звонков, и для записи голосовых сообщений.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -84,6 +84,10 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -93,6 +97,10 @@
|
|||||||
<target>%1$@ ที่ %2$@:</target>
|
<target>%1$@ ที่ %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ เชื่อมต่อสำเร็จ!</target>
|
<target>%@ เชื่อมต่อสำเร็จ!</target>
|
||||||
@@ -118,6 +126,10 @@
|
|||||||
<target>%@ อยากเชื่อมต่อ!</target>
|
<target>%@ อยากเชื่อมต่อ!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -182,11 +194,27 @@
|
|||||||
<target>%lld ไฟล์ที่มีขนาดรวม %@</target>
|
<target>%lld ไฟล์ที่มีขนาดรวม %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld สมาชิก</target>
|
<target>%lld สมาชิก</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld นาที</target>
|
<target>%lld นาที</target>
|
||||||
@@ -256,6 +284,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -355,6 +391,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0s</target>
|
<target>0s</target>
|
||||||
@@ -578,6 +618,10 @@
|
|||||||
<target>ข้อความทั้งหมดจะถูกลบ - ไม่สามารถยกเลิกได้! ข้อความจะถูกลบสำหรับคุณเท่านั้น.</target>
|
<target>ข้อความทั้งหมดจะถูกลบ - ไม่สามารถยกเลิกได้! ข้อความจะถูกลบสำหรับคุณเท่านั้น.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>ผู้ติดต่อทั้งหมดของคุณจะยังคงเชื่อมต่ออยู่.</target>
|
<target>ผู้ติดต่อทั้งหมดของคุณจะยังคงเชื่อมต่ออยู่.</target>
|
||||||
@@ -683,6 +727,14 @@
|
|||||||
<target>เชื่อมต่อสำเร็จแล้ว?</target>
|
<target>เชื่อมต่อสำเร็จแล้ว?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>ใช้รีเลย์เสมอ</target>
|
<target>ใช้รีเลย์เสมอ</target>
|
||||||
@@ -802,6 +854,10 @@
|
|||||||
<target>กลับ</target>
|
<target>กลับ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>ID ข้อความที่ไม่ดี</target>
|
<target>ID ข้อความที่ไม่ดี</target>
|
||||||
@@ -817,6 +873,18 @@
|
|||||||
<target>ข้อความที่ดีขึ้น</target>
|
<target>ข้อความที่ดีขึ้น</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>ทั้งคุณและผู้ติดต่อของคุณสามารถเพิ่มปฏิกิริยาของข้อความได้</target>
|
<target>ทั้งคุณและผู้ติดต่อของคุณสามารถเพิ่มปฏิกิริยาของข้อความได้</target>
|
||||||
@@ -1077,21 +1145,30 @@
|
|||||||
<target>เชื่อมต่อ</target>
|
<target>เชื่อมต่อ</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>เชื่อมต่อผ่านลิงค์กลุ่ม?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1108,6 +1185,18 @@
|
|||||||
<source>Connect via one-time link</source>
|
<source>Connect via one-time link</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>กำลังเชื่อมต่อกับเซิร์ฟเวอร์…</target>
|
<target>กำลังเชื่อมต่อกับเซิร์ฟเวอร์…</target>
|
||||||
@@ -1118,6 +1207,10 @@
|
|||||||
<target>กำลังเชื่อมต่อกับเซิร์ฟเวอร์... (ข้อผิดพลาด: %@)</target>
|
<target>กำลังเชื่อมต่อกับเซิร์ฟเวอร์... (ข้อผิดพลาด: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>การเชื่อมต่อ</target>
|
<target>การเชื่อมต่อ</target>
|
||||||
@@ -1138,6 +1231,10 @@
|
|||||||
<target>ส่งคําขอเชื่อมต่อแล้ว!</target>
|
<target>ส่งคําขอเชื่อมต่อแล้ว!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>หมดเวลาการเชื่อมต่อ</target>
|
<target>หมดเวลาการเชื่อมต่อ</target>
|
||||||
@@ -1153,11 +1250,6 @@
|
|||||||
<target>ผู้ติดต่อรายนี้มีอยู่แล้ว</target>
|
<target>ผู้ติดต่อรายนี้มีอยู่แล้ว</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>ผู้ติดต่อและข้อความทั้งหมดจะถูกลบ - ไม่สามารถยกเลิกได้!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>ผู้ติดต่อถูกซ่อน:</target>
|
<target>ผู้ติดต่อถูกซ่อน:</target>
|
||||||
@@ -1208,6 +1300,10 @@
|
|||||||
<target>รุ่นหลัก: v%@</target>
|
<target>รุ่นหลัก: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>สร้าง</target>
|
<target>สร้าง</target>
|
||||||
@@ -1228,6 +1324,10 @@
|
|||||||
<target>สร้างไฟล์</target>
|
<target>สร้างไฟล์</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>สร้างลิงค์กลุ่ม</target>
|
<target>สร้างลิงค์กลุ่ม</target>
|
||||||
@@ -1247,6 +1347,10 @@
|
|||||||
<target>สร้างลิงก์เชิญแบบใช้ครั้งเดียว</target>
|
<target>สร้างลิงก์เชิญแบบใช้ครั้งเดียว</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>สร้างคิว</target>
|
<target>สร้างคิว</target>
|
||||||
@@ -1405,6 +1509,10 @@
|
|||||||
<target>ลบ</target>
|
<target>ลบ</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>ลบผู้ติดต่อ</target>
|
<target>ลบผู้ติดต่อ</target>
|
||||||
@@ -1430,6 +1538,10 @@
|
|||||||
<target>ลบไฟล์ทั้งหมด</target>
|
<target>ลบไฟล์ทั้งหมด</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>ลบที่เก็บถาวร</target>
|
<target>ลบที่เก็บถาวร</target>
|
||||||
@@ -1460,9 +1572,9 @@
|
|||||||
<target>ลบผู้ติดต่อ</target>
|
<target>ลบผู้ติดต่อ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>ลบผู้ติดต่อ?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1604,6 +1716,18 @@
|
|||||||
<target>คำอธิบาย</target>
|
<target>คำอธิบาย</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>พัฒนา</target>
|
<target>พัฒนา</target>
|
||||||
@@ -1694,18 +1818,16 @@
|
|||||||
<target>ตัดการเชื่อมต่อ</target>
|
<target>ตัดการเชื่อมต่อ</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>ชื่อที่แสดง</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>ชื่อที่แสดง:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1876,6 +1998,14 @@
|
|||||||
<target>ข้อความที่ encrypt: ข้อผิดพลาดที่ไม่คาดคิด</target>
|
<target>ข้อความที่ encrypt: ข้อผิดพลาดที่ไม่คาดคิด</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>ใส่รหัสผ่าน</target>
|
<target>ใส่รหัสผ่าน</target>
|
||||||
@@ -1886,6 +2016,10 @@
|
|||||||
<target>ใส่รหัสผ่านที่ถูกต้อง</target>
|
<target>ใส่รหัสผ่านที่ถูกต้อง</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>ใส่รหัสผ่าน</target>
|
<target>ใส่รหัสผ่าน</target>
|
||||||
@@ -1901,6 +2035,10 @@
|
|||||||
<target>ใส่เซิร์ฟเวอร์ด้วยตนเอง</target>
|
<target>ใส่เซิร์ฟเวอร์ด้วยตนเอง</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>ใส่ข้อความต้อนรับ…</target>
|
<target>ใส่ข้อความต้อนรับ…</target>
|
||||||
@@ -1911,6 +2049,10 @@
|
|||||||
<target>ใส่ข้อความต้อนรับ… (ไม่บังคับ)</target>
|
<target>ใส่ข้อความต้อนรับ… (ไม่บังคับ)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>ผิดพลาด</target>
|
<target>ผิดพลาด</target>
|
||||||
@@ -2183,6 +2325,10 @@
|
|||||||
<target>ออกโดยไม่บันทึก</target>
|
<target>ออกโดยไม่บันทึก</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>ส่งออกฐานข้อมูล</target>
|
<target>ส่งออกฐานข้อมูล</target>
|
||||||
@@ -2328,6 +2474,10 @@
|
|||||||
<target>ชื่อเต็ม:</target>
|
<target>ชื่อเต็ม:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>ดำเนินการใหม่อย่างสมบูรณ์ - ทำงานในพื้นหลัง!</target>
|
<target>ดำเนินการใหม่อย่างสมบูรณ์ - ทำงานในพื้นหลัง!</target>
|
||||||
@@ -2348,6 +2498,14 @@
|
|||||||
<target>กลุ่ม</target>
|
<target>กลุ่ม</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>ชื่อกลุ่มที่แสดง</target>
|
<target>ชื่อกลุ่มที่แสดง</target>
|
||||||
@@ -2647,6 +2805,10 @@
|
|||||||
<target>เวอร์ชันฐานข้อมูลที่เข้ากันไม่ได้</target>
|
<target>เวอร์ชันฐานข้อมูลที่เข้ากันไม่ได้</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>รหัสผ่านไม่ถูกต้อง</target>
|
<target>รหัสผ่านไม่ถูกต้อง</target>
|
||||||
@@ -2694,6 +2856,10 @@
|
|||||||
<target>ลิงค์เชื่อมต่อไม่ถูกต้อง</target>
|
<target>ลิงค์เชื่อมต่อไม่ถูกต้อง</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>ที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง!</target>
|
<target>ที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง!</target>
|
||||||
@@ -2784,16 +2950,33 @@
|
|||||||
<target>เข้าร่วมกลุ่ม</target>
|
<target>เข้าร่วมกลุ่ม</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>เข้าร่วมแบบไม่ระบุตัวตน</target>
|
<target>เข้าร่วมแบบไม่ระบุตัวตน</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>กำลังจะเข้าร่วมกลุ่ม</target>
|
<target>กำลังจะเข้าร่วมกลุ่ม</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>รักษาการเชื่อมต่อของคุณ</target>
|
<target>รักษาการเชื่อมต่อของคุณ</target>
|
||||||
@@ -2854,6 +3037,14 @@
|
|||||||
<target>ข้อจำกัด</target>
|
<target>ข้อจำกัด</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>ข้อความสด!</target>
|
<target>ข้อความสด!</target>
|
||||||
@@ -3004,6 +3195,10 @@
|
|||||||
<target>ข้อความและไฟล์</target>
|
<target>ข้อความและไฟล์</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>กำลังย้ายข้อมูลที่เก็บถาวรของฐานข้อมูล…</target>
|
<target>กำลังย้ายข้อมูลที่เก็บถาวรของฐานข้อมูล…</target>
|
||||||
@@ -3349,6 +3544,10 @@
|
|||||||
<target>เปิดคอนโซลการแชท</target>
|
<target>เปิดคอนโซลการแชท</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>เปิดโปรไฟล์ผู้ใช้</target>
|
<target>เปิดโปรไฟล์ผู้ใช้</target>
|
||||||
@@ -3364,11 +3563,6 @@
|
|||||||
<target>กำลังเปิดฐานข้อมูล…</target>
|
<target>กำลังเปิดฐานข้อมูล…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>การเปิดลิงก์ในเบราว์เซอร์อาจลดความเป็นส่วนตัวและความปลอดภัยของการเชื่อมต่อ ลิงก์ SimpleX ที่ไม่น่าเชื่อถือจะเป็นสีแดง</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>จํานวน PING</target>
|
<target>จํานวน PING</target>
|
||||||
@@ -3414,6 +3608,10 @@
|
|||||||
<target>แปะ</target>
|
<target>แปะ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>แปะภาพ</target>
|
<target>แปะภาพ</target>
|
||||||
@@ -3558,6 +3756,14 @@
|
|||||||
<target>รูปโปรไฟล์</target>
|
<target>รูปโปรไฟล์</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>รหัสผ่านโปรไฟล์</target>
|
<target>รหัสผ่านโปรไฟล์</target>
|
||||||
@@ -3801,6 +4007,14 @@
|
|||||||
<target>เจรจา enryption ใหม่หรือไม่?</target>
|
<target>เจรจา enryption ใหม่หรือไม่?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>ตอบ</target>
|
<target>ตอบ</target>
|
||||||
@@ -3986,6 +4200,10 @@
|
|||||||
<target>สแกนคิวอาร์โค้ด</target>
|
<target>สแกนคิวอาร์โค้ด</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>สแกนรหัส</target>
|
<target>สแกนรหัส</target>
|
||||||
@@ -4203,6 +4421,10 @@
|
|||||||
<target>เซิร์ฟเวอร์</target>
|
<target>เซิร์ฟเวอร์</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>ตั้ง 1 วัน</target>
|
<target>ตั้ง 1 วัน</target>
|
||||||
@@ -4510,6 +4732,10 @@
|
|||||||
<target>แตะปุ่ม </target>
|
<target>แตะปุ่ม </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>แตะเพื่อเปิดใช้งานโปรไฟล์</target>
|
<target>แตะเพื่อเปิดใช้งานโปรไฟล์</target>
|
||||||
@@ -4608,11 +4834,6 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>encryption กำลังทำงานและไม่จำเป็นต้องใช้ข้อตกลง encryption ใหม่ อาจทำให้การเชื่อมต่อผิดพลาดได้!</target>
|
<target>encryption กำลังทำงานและไม่จำเป็นต้องใช้ข้อตกลง encryption ใหม่ อาจทำให้การเชื่อมต่อผิดพลาดได้!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>กลุ่มมีการกระจายอำนาจอย่างเต็มที่ – มองเห็นได้เฉพาะสมาชิกเท่านั้น</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>แฮชของข้อความก่อนหน้านี้แตกต่างกัน</target>
|
<target>แฮชของข้อความก่อนหน้านี้แตกต่างกัน</target>
|
||||||
@@ -4697,6 +4918,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>การดำเนินการนี้ไม่สามารถยกเลิกได้ - โปรไฟล์ ผู้ติดต่อ ข้อความ และไฟล์ของคุณจะสูญหายไปอย่างถาวร</target>
|
<target>การดำเนินการนี้ไม่สามารถยกเลิกได้ - โปรไฟล์ ผู้ติดต่อ ข้อความ และไฟล์ของคุณจะสูญหายไปอย่างถาวร</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -4706,6 +4931,14 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>ไม่มีกลุ่มนี้แล้ว</target>
|
<target>ไม่มีกลุ่มนี้แล้ว</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>การตั้งค่านี้ใช้กับข้อความในโปรไฟล์แชทปัจจุบันของคุณ **%@**</target>
|
<target>การตั้งค่านี้ใช้กับข้อความในโปรไฟล์แชทปัจจุบันของคุณ **%@**</target>
|
||||||
@@ -4802,6 +5035,18 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<target>ไม่สามารถบันทึกข้อความเสียง</target>
|
<target>ไม่สามารถบันทึกข้อความเสียง</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>ข้อผิดพลาดที่ไม่คาดคิด: %@</target>
|
<target>ข้อผิดพลาดที่ไม่คาดคิด: %@</target>
|
||||||
@@ -4864,6 +5109,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
ในการเชื่อมต่อ โปรดขอให้ผู้ติดต่อของคุณสร้างลิงก์การเชื่อมต่ออื่น และตรวจสอบว่าคุณมีการเชื่อมต่อเครือข่ายที่เสถียร</target>
|
ในการเชื่อมต่อ โปรดขอให้ผู้ติดต่อของคุณสร้างลิงก์การเชื่อมต่ออื่น และตรวจสอบว่าคุณมีการเชื่อมต่อเครือข่ายที่เสถียร</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>ปลดล็อค</target>
|
<target>ปลดล็อค</target>
|
||||||
@@ -4953,6 +5206,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>ใช้สำหรับการเชื่อมต่อใหม่</target>
|
<target>ใช้สำหรับการเชื่อมต่อใหม่</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>ใช้อินเทอร์เฟซการโทร iOS</target>
|
<target>ใช้อินเทอร์เฟซการโทร iOS</target>
|
||||||
@@ -4982,11 +5239,23 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่</target>
|
<target>กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>ตรวจสอบความปลอดภัยในการเชื่อมต่อ</target>
|
<target>ตรวจสอบความปลอดภัยในการเชื่อมต่อ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>ตรวจสอบรหัสความปลอดภัย</target>
|
<target>ตรวจสอบรหัสความปลอดภัย</target>
|
||||||
@@ -5147,6 +5416,35 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>คุณได้เชื่อมต่อกับ %@ แล้ว</target>
|
<target>คุณได้เชื่อมต่อกับ %@ แล้ว</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>คุณเชื่อมต่อกับเซิร์ฟเวอร์ที่ใช้รับข้อความจากผู้ติดต่อนี้</target>
|
<target>คุณเชื่อมต่อกับเซิร์ฟเวอร์ที่ใช้รับข้อความจากผู้ติดต่อนี้</target>
|
||||||
@@ -5242,6 +5540,15 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>เราไม่สามารถตรวจสอบคุณได้ กรุณาลองอีกครั้ง.</target>
|
<target>เราไม่สามารถตรวจสอบคุณได้ กรุณาลองอีกครั้ง.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>คุณไม่มีการแชท</target>
|
<target>คุณไม่มีการแชท</target>
|
||||||
@@ -5291,6 +5598,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>คุณจะเชื่อมต่อกับกลุ่มเมื่ออุปกรณ์โฮสต์ของกลุ่มออนไลน์อยู่ โปรดรอหรือตรวจสอบภายหลัง!</target>
|
<target>คุณจะเชื่อมต่อกับกลุ่มเมื่ออุปกรณ์โฮสต์ของกลุ่มออนไลน์อยู่ โปรดรอหรือตรวจสอบภายหลัง!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>คุณจะเชื่อมต่อเมื่อคำขอเชื่อมต่อของคุณได้รับการยอมรับ โปรดรอหรือตรวจสอบในภายหลัง!</target>
|
<target>คุณจะเชื่อมต่อเมื่อคำขอเชื่อมต่อของคุณได้รับการยอมรับ โปรดรอหรือตรวจสอบในภายหลัง!</target>
|
||||||
@@ -5306,9 +5617,8 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>คุณจะต้องตรวจสอบสิทธิ์เมื่อคุณเริ่มหรือกลับมาใช้แอปพลิเคชันอีกครั้งหลังจากผ่านไป 30 วินาทีในพื้นหลัง</target>
|
<target>คุณจะต้องตรวจสอบสิทธิ์เมื่อคุณเริ่มหรือกลับมาใช้แอปพลิเคชันอีกครั้งหลังจากผ่านไป 30 วินาทีในพื้นหลัง</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>คุณจะเข้าร่วมกลุ่มที่ลิงก์นี้อ้างถึงและเชื่อมต่อกับสมาชิกในกลุ่ม</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5376,11 +5686,6 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>ฐานข้อมูลการแชทของคุณไม่ได้ถูก encrypt - ตั้งรหัสผ่านเพื่อ encrypt</target>
|
<target>ฐานข้อมูลการแชทของคุณไม่ได้ถูก encrypt - ตั้งรหัสผ่านเพื่อ encrypt</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>โปรไฟล์การแชทของคุณจะถูกส่งไปยังสมาชิกในกลุ่ม</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>โปรไฟล์แชทของคุณ</target>
|
<target>โปรไฟล์แชทของคุณ</target>
|
||||||
@@ -5435,6 +5740,10 @@ You can change it in Settings.</source>
|
|||||||
<target>ความเป็นส่วนตัวของคุณ</target>
|
<target>ความเป็นส่วนตัวของคุณ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5526,6 +5835,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>เสมอ</target>
|
<target>เสมอ</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>การโทรด้วยเสียง (ไม่ได้ encrypt จากต้นจนจบ)</target>
|
<target>การโทรด้วยเสียง (ไม่ได้ encrypt จากต้นจนจบ)</target>
|
||||||
@@ -5541,6 +5854,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>แฮชข้อความไม่ดี</target>
|
<target>แฮชข้อความไม่ดี</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>ตัวหนา</target>
|
<target>ตัวหนา</target>
|
||||||
@@ -5710,6 +6027,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>ลบแล้ว</target>
|
<target>ลบแล้ว</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>กลุ่มที่ถูกลบ</target>
|
<target>กลุ่มที่ถูกลบ</target>
|
||||||
@@ -5992,7 +6313,8 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>ปิด</target>
|
<target>ปิด</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6009,11 +6331,6 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>เปิด</target>
|
<target>เปิด</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>หรือแชทกับนักพัฒนาแอป</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>เจ้าของ</target>
|
<target>เจ้าของ</target>
|
||||||
@@ -6103,6 +6420,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>อัปเดตโปรไฟล์กลุ่มแล้ว</target>
|
<target>อัปเดตโปรไฟล์กลุ่มแล้ว</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6240,6 +6561,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>SimpleX ใช้ Face ID สำหรับการรับรองความถูกต้องในเครื่อง</target>
|
<target>SimpleX ใช้ Face ID สำหรับการรับรองความถูกต้องในเครื่อง</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX ต้องการการเข้าถึงไมโครโฟนสำหรับการโทรด้วยเสียงและวิดีโอ และเพื่อบันทึกข้อความเสียง</target>
|
<target>SimpleX ต้องการการเข้าถึงไมโครโฟนสำหรับการโทรด้วยเสียงและวิดีโอ และเพื่อบันทึกข้อความเสียง</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ і %@ підключено</target>
|
<target>%@ і %@ підключено</target>
|
||||||
@@ -97,6 +101,10 @@
|
|||||||
<target>%1$@ за %2$@:</target>
|
<target>%1$@ за %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ підключено!</target>
|
<target>%@ підключено!</target>
|
||||||
@@ -122,6 +130,10 @@
|
|||||||
<target>%@ хоче підключитися!</target>
|
<target>%@ хоче підключитися!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ та %lld інші підключені учасники</target>
|
<target>%@, %@ та %lld інші підключені учасники</target>
|
||||||
@@ -187,11 +199,27 @@
|
|||||||
<target>%lld файл(и) загальним розміром %@</target>
|
<target>%lld файл(и) загальним розміром %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld учасників</target>
|
<target>%lld учасників</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld хвилин</target>
|
<target>%lld хвилин</target>
|
||||||
@@ -261,6 +289,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -360,6 +396,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0с</target>
|
<target>0с</target>
|
||||||
@@ -585,6 +625,10 @@
|
|||||||
<target>Всі повідомлення будуть видалені - це неможливо скасувати! Повідомлення будуть видалені ТІЛЬКИ для вас.</target>
|
<target>Всі повідомлення будуть видалені - це неможливо скасувати! Повідомлення будуть видалені ТІЛЬКИ для вас.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>Всі ваші контакти залишаться на зв'язку.</target>
|
<target>Всі ваші контакти залишаться на зв'язку.</target>
|
||||||
@@ -690,6 +734,14 @@
|
|||||||
<target>Вже підключено?</target>
|
<target>Вже підключено?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>Завжди використовуйте реле</target>
|
<target>Завжди використовуйте реле</target>
|
||||||
@@ -809,6 +861,10 @@
|
|||||||
<target>Назад</target>
|
<target>Назад</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>Неправильний ідентифікатор повідомлення</target>
|
<target>Неправильний ідентифікатор повідомлення</target>
|
||||||
@@ -824,6 +880,18 @@
|
|||||||
<target>Кращі повідомлення</target>
|
<target>Кращі повідомлення</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>Реакції на повідомлення можете додавати як ви, так і ваш контакт.</target>
|
<target>Реакції на повідомлення можете додавати як ви, так і ваш контакт.</target>
|
||||||
@@ -1084,24 +1152,31 @@
|
|||||||
<target>Підключіться</target>
|
<target>Підключіться</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>Підключіться безпосередньо</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>Підключайтеся інкогніто</target>
|
<target>Підключайтеся інкогніто</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>Підключіться за контактним посиланням</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>Підключитися за груповим посиланням?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1119,6 +1194,18 @@
|
|||||||
<target>Під'єднатися за одноразовим посиланням</target>
|
<target>Під'єднатися за одноразовим посиланням</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>Підключення до сервера…</target>
|
<target>Підключення до сервера…</target>
|
||||||
@@ -1129,6 +1216,10 @@
|
|||||||
<target>Підключення до сервера... (помилка: %@)</target>
|
<target>Підключення до сервера... (помилка: %@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>Підключення</target>
|
<target>Підключення</target>
|
||||||
@@ -1149,6 +1240,10 @@
|
|||||||
<target>Запит на підключення відправлено!</target>
|
<target>Запит на підключення відправлено!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>Тайм-аут з'єднання</target>
|
<target>Тайм-аут з'єднання</target>
|
||||||
@@ -1164,11 +1259,6 @@
|
|||||||
<target>Контакт вже існує</target>
|
<target>Контакт вже існує</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>Контакт і всі повідомлення будуть видалені - це неможливо скасувати!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>Контакт приховано:</target>
|
<target>Контакт приховано:</target>
|
||||||
@@ -1219,6 +1309,10 @@
|
|||||||
<target>Основна версія: v%@</target>
|
<target>Основна версія: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>Створити</target>
|
<target>Створити</target>
|
||||||
@@ -1239,6 +1333,10 @@
|
|||||||
<target>Створити файл</target>
|
<target>Створити файл</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>Створити групове посилання</target>
|
<target>Створити групове посилання</target>
|
||||||
@@ -1258,6 +1356,10 @@
|
|||||||
<target>Створіть одноразове посилання-запрошення</target>
|
<target>Створіть одноразове посилання-запрошення</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>Створити чергу</target>
|
<target>Створити чергу</target>
|
||||||
@@ -1416,6 +1518,10 @@
|
|||||||
<target>Видалити</target>
|
<target>Видалити</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>Видалити контакт</target>
|
<target>Видалити контакт</target>
|
||||||
@@ -1441,6 +1547,10 @@
|
|||||||
<target>Видалити всі файли</target>
|
<target>Видалити всі файли</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>Видалити архів</target>
|
<target>Видалити архів</target>
|
||||||
@@ -1471,9 +1581,9 @@
|
|||||||
<target>Видалити контакт</target>
|
<target>Видалити контакт</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>Видалити контакт?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1616,6 +1726,18 @@
|
|||||||
<target>Опис</target>
|
<target>Опис</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>Розробник</target>
|
<target>Розробник</target>
|
||||||
@@ -1706,18 +1828,16 @@
|
|||||||
<target>Від'єднати</target>
|
<target>Від'єднати</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>Відображуване ім'я</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>Відображуване ім'я:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1888,6 +2008,14 @@
|
|||||||
<target>Зашифроване повідомлення: несподівана помилка</target>
|
<target>Зашифроване повідомлення: несподівана помилка</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>Введіть пароль</target>
|
<target>Введіть пароль</target>
|
||||||
@@ -1898,6 +2026,10 @@
|
|||||||
<target>Введіть правильну парольну фразу.</target>
|
<target>Введіть правильну парольну фразу.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>Введіть пароль…</target>
|
<target>Введіть пароль…</target>
|
||||||
@@ -1913,6 +2045,10 @@
|
|||||||
<target>Увійдіть на сервер вручну</target>
|
<target>Увійдіть на сервер вручну</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>Введіть вітальне повідомлення…</target>
|
<target>Введіть вітальне повідомлення…</target>
|
||||||
@@ -1923,6 +2059,10 @@
|
|||||||
<target>Введіть вітальне повідомлення... (необов'язково)</target>
|
<target>Введіть вітальне повідомлення... (необов'язково)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>Помилка</target>
|
<target>Помилка</target>
|
||||||
@@ -2195,6 +2335,10 @@
|
|||||||
<target>Вихід без збереження</target>
|
<target>Вихід без збереження</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>Експорт бази даних</target>
|
<target>Експорт бази даних</target>
|
||||||
@@ -2340,6 +2484,10 @@
|
|||||||
<target>Повне ім'я:</target>
|
<target>Повне ім'я:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>Повністю перероблено - робота у фоновому режимі!</target>
|
<target>Повністю перероблено - робота у фоновому режимі!</target>
|
||||||
@@ -2360,6 +2508,14 @@
|
|||||||
<target>Група</target>
|
<target>Група</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>Назва групи для відображення</target>
|
<target>Назва групи для відображення</target>
|
||||||
@@ -2660,6 +2816,10 @@
|
|||||||
<target>Несумісна версія бази даних</target>
|
<target>Несумісна версія бази даних</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>Неправильний пароль</target>
|
<target>Неправильний пароль</target>
|
||||||
@@ -2707,6 +2867,10 @@
|
|||||||
<target>Неправильне посилання для підключення</target>
|
<target>Неправильне посилання для підключення</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>Неправильна адреса сервера!</target>
|
<target>Неправильна адреса сервера!</target>
|
||||||
@@ -2798,16 +2962,33 @@
|
|||||||
<target>Приєднуйтесь до групи</target>
|
<target>Приєднуйтесь до групи</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>Приєднуйтесь інкогніто</target>
|
<target>Приєднуйтесь інкогніто</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>Приєднання до групи</target>
|
<target>Приєднання до групи</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>Зберігайте свої зв'язки</target>
|
<target>Зберігайте свої зв'язки</target>
|
||||||
@@ -2868,6 +3049,14 @@
|
|||||||
<target>Обмеження</target>
|
<target>Обмеження</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>Живе повідомлення!</target>
|
<target>Живе повідомлення!</target>
|
||||||
@@ -3018,6 +3207,10 @@
|
|||||||
<target>Повідомлення та файли</target>
|
<target>Повідомлення та файли</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>Перенесення архіву бази даних…</target>
|
<target>Перенесення архіву бази даних…</target>
|
||||||
@@ -3365,6 +3558,10 @@
|
|||||||
<target>Відкрийте консоль чату</target>
|
<target>Відкрийте консоль чату</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>Відкрити профілі користувачів</target>
|
<target>Відкрити профілі користувачів</target>
|
||||||
@@ -3380,11 +3577,6 @@
|
|||||||
<target>Відкриття бази даних…</target>
|
<target>Відкриття бази даних…</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>Відкриття посилання в браузері може знизити конфіденційність і безпеку з'єднання. Ненадійні посилання SimpleX будуть червоного кольору.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>Кількість PING</target>
|
<target>Кількість PING</target>
|
||||||
@@ -3430,6 +3622,10 @@
|
|||||||
<target>Вставити</target>
|
<target>Вставити</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>Вставити зображення</target>
|
<target>Вставити зображення</target>
|
||||||
@@ -3575,6 +3771,14 @@
|
|||||||
<target>Зображення профілю</target>
|
<target>Зображення профілю</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>Пароль до профілю</target>
|
<target>Пароль до профілю</target>
|
||||||
@@ -3820,6 +4024,14 @@
|
|||||||
<target>Переузгодьте шифрування?</target>
|
<target>Переузгодьте шифрування?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>Відповісти</target>
|
<target>Відповісти</target>
|
||||||
@@ -4005,6 +4217,10 @@
|
|||||||
<target>Відскануйте QR-код</target>
|
<target>Відскануйте QR-код</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>Сканувати код</target>
|
<target>Сканувати код</target>
|
||||||
@@ -4224,6 +4440,10 @@
|
|||||||
<target>Сервери</target>
|
<target>Сервери</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>Встановити 1 день</target>
|
<target>Встановити 1 день</target>
|
||||||
@@ -4533,6 +4753,10 @@
|
|||||||
<target>Натисніть кнопку </target>
|
<target>Натисніть кнопку </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>Натисніть, щоб активувати профіль.</target>
|
<target>Натисніть, щоб активувати профіль.</target>
|
||||||
@@ -4630,11 +4854,6 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Шифрування працює і нова угода про шифрування не потрібна. Це може призвести до помилок з'єднання!</target>
|
<target>Шифрування працює і нова угода про шифрування не потрібна. Це може призвести до помилок з'єднання!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>Група повністю децентралізована - її бачать лише учасники.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>Хеш попереднього повідомлення відрізняється.</target>
|
<target>Хеш попереднього повідомлення відрізняється.</target>
|
||||||
@@ -4720,6 +4939,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Цю дію неможливо скасувати - ваш профіль, контакти, повідомлення та файли будуть безповоротно втрачені.</target>
|
<target>Цю дію неможливо скасувати - ваш профіль, контакти, повідомлення та файли будуть безповоротно втрачені.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>У цій групі більше %lld учасників, підтвердження доставки не надсилаються.</target>
|
<target>У цій групі більше %lld учасників, підтвердження доставки не надсилаються.</target>
|
||||||
@@ -4730,6 +4953,14 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>Цієї групи більше не існує.</target>
|
<target>Цієї групи більше не існує.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>Це налаштування застосовується до повідомлень у вашому поточному профілі чату **%@**.</target>
|
<target>Це налаштування застосовується до повідомлень у вашому поточному профілі чату **%@**.</target>
|
||||||
@@ -4826,6 +5057,18 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<target>Не вдається записати голосове повідомлення</target>
|
<target>Не вдається записати голосове повідомлення</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>Неочікувана помилка: %@</target>
|
<target>Неочікувана помилка: %@</target>
|
||||||
@@ -4888,6 +5131,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
Щоб підключитися, попросіть вашого контакта створити інше посилання і перевірте, чи маєте ви стабільне з'єднання з мережею.</target>
|
Щоб підключитися, попросіть вашого контакта створити інше посилання і перевірте, чи маєте ви стабільне з'єднання з мережею.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>Розблокувати</target>
|
<target>Розблокувати</target>
|
||||||
@@ -4978,6 +5229,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Використовуйте для нових з'єднань</target>
|
<target>Використовуйте для нових з'єднань</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>Використовуйте інтерфейс виклику iOS</target>
|
<target>Використовуйте інтерфейс виклику iOS</target>
|
||||||
@@ -5008,11 +5263,23 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Використання серверів SimpleX Chat.</target>
|
<target>Використання серверів SimpleX Chat.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>Перевірте безпеку з'єднання</target>
|
<target>Перевірте безпеку з'єднання</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>Підтвердіть код безпеки</target>
|
<target>Підтвердіть код безпеки</target>
|
||||||
@@ -5173,6 +5440,35 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Ви вже підключені до %@.</target>
|
<target>Ви вже підключені до %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>Ви підключені до сервера, який використовується для отримання повідомлень від цього контакту.</target>
|
<target>Ви підключені до сервера, який використовується для отримання повідомлень від цього контакту.</target>
|
||||||
@@ -5268,6 +5564,15 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Вас не вдалося верифікувати, спробуйте ще раз.</target>
|
<target>Вас не вдалося верифікувати, спробуйте ще раз.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>У вас немає чатів</target>
|
<target>У вас немає чатів</target>
|
||||||
@@ -5318,6 +5623,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Ви будете підключені до групи, коли пристрій господаря групи буде в мережі, будь ласка, зачекайте або перевірте пізніше!</target>
|
<target>Ви будете підключені до групи, коли пристрій господаря групи буде в мережі, будь ласка, зачекайте або перевірте пізніше!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>Ви будете підключені, коли ваш запит на підключення буде прийнято, будь ласка, зачекайте або перевірте пізніше!</target>
|
<target>Ви будете підключені, коли ваш запит на підключення буде прийнято, будь ласка, зачекайте або перевірте пізніше!</target>
|
||||||
@@ -5333,9 +5642,8 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Вам потрібно буде пройти автентифікацію при запуску або відновленні програми після 30 секунд роботи у фоновому режимі.</target>
|
<target>Вам потрібно буде пройти автентифікацію при запуску або відновленні програми після 30 секунд роботи у фоновому режимі.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>Ви приєднаєтеся до групи, на яку посилається це посилання, і з'єднаєтеся з її учасниками.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5403,11 +5711,6 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Ваша база даних чату не зашифрована - встановіть ключову фразу, щоб зашифрувати її.</target>
|
<target>Ваша база даних чату не зашифрована - встановіть ключову фразу, щоб зашифрувати її.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>Ваш профіль у чаті буде надіслано учасникам групи</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>Ваші профілі чату</target>
|
<target>Ваші профілі чату</target>
|
||||||
@@ -5462,6 +5765,10 @@ You can change it in Settings.</source>
|
|||||||
<target>Ваша конфіденційність</target>
|
<target>Ваша конфіденційність</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>Ваш профіль **%@** буде опублікований.</target>
|
<target>Ваш профіль **%@** буде опублікований.</target>
|
||||||
@@ -5554,6 +5861,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>завжди</target>
|
<target>завжди</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>аудіовиклик (без шифрування e2e)</target>
|
<target>аудіовиклик (без шифрування e2e)</target>
|
||||||
@@ -5569,6 +5880,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>невірний хеш повідомлення</target>
|
<target>невірний хеш повідомлення</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>жирний</target>
|
<target>жирний</target>
|
||||||
@@ -5738,6 +6053,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>видалено</target>
|
<target>видалено</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>видалено групу</target>
|
<target>видалено групу</target>
|
||||||
@@ -6022,7 +6341,8 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>вимкнено</target>
|
<target>вимкнено</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6039,11 +6359,6 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>увімкнено</target>
|
<target>увімкнено</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>або поспілкуйтеся з розробниками</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>власник</target>
|
<target>власник</target>
|
||||||
@@ -6133,6 +6448,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>оновлений профіль групи</target>
|
<target>оновлений профіль групи</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6270,6 +6589,10 @@ SimpleX servers cannot see your profile.</source>
|
|||||||
<target>SimpleX використовує Face ID для локальної автентифікації</target>
|
<target>SimpleX використовує Face ID для локальної автентифікації</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX потребує доступу до мікрофона для аудіо та відео дзвінків, а також для запису голосових повідомлень.</target>
|
<target>SimpleX потребує доступу до мікрофона для аудіо та відео дзвінків, а також для запису голосових повідомлень.</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -87,6 +87,10 @@
|
|||||||
<target>%@ / %@</target>
|
<target>%@ / %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ and %@" xml:space="preserve">
|
||||||
|
<source>%@ and %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
<trans-unit id="%@ and %@ connected" xml:space="preserve">
|
||||||
<source>%@ and %@ connected</source>
|
<source>%@ and %@ connected</source>
|
||||||
<target>%@ 和%@ 以建立连接</target>
|
<target>%@ 和%@ 以建立连接</target>
|
||||||
@@ -97,6 +101,10 @@
|
|||||||
<target>@ %2$@:</target>
|
<target>@ %2$@:</target>
|
||||||
<note>copied message info, <sender> at <time></note>
|
<note>copied message info, <sender> at <time></note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ connected" xml:space="preserve">
|
||||||
|
<source>%@ connected</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@ is connected!" xml:space="preserve">
|
<trans-unit id="%@ is connected!" xml:space="preserve">
|
||||||
<source>%@ is connected!</source>
|
<source>%@ is connected!</source>
|
||||||
<target>%@ 已连接!</target>
|
<target>%@ 已连接!</target>
|
||||||
@@ -122,6 +130,10 @@
|
|||||||
<target>%@ 要连接!</target>
|
<target>%@ 要连接!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld other members connected</source>
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
<target>%@, %@ 和 %lld 个成员</target>
|
<target>%@, %@ 和 %lld 个成员</target>
|
||||||
@@ -187,11 +199,27 @@
|
|||||||
<target>%lld 总文件大小 %@</target>
|
<target>%lld 总文件大小 %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld group events" xml:space="preserve">
|
||||||
|
<source>%lld group events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld members" xml:space="preserve">
|
<trans-unit id="%lld members" xml:space="preserve">
|
||||||
<source>%lld members</source>
|
<source>%lld members</source>
|
||||||
<target>%lld 成员</target>
|
<target>%lld 成员</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages moderated by %@" xml:space="preserve">
|
||||||
|
<source>%lld messages moderated by %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%lld minutes" xml:space="preserve">
|
<trans-unit id="%lld minutes" xml:space="preserve">
|
||||||
<source>%lld minutes</source>
|
<source>%lld minutes</source>
|
||||||
<target>%lld 分钟</target>
|
<target>%lld 分钟</target>
|
||||||
@@ -262,6 +290,14 @@
|
|||||||
<target>(</target>
|
<target>(</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve">
|
||||||
|
<source>(new)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id=")" xml:space="preserve">
|
<trans-unit id=")" xml:space="preserve">
|
||||||
<source>)</source>
|
<source>)</source>
|
||||||
<target>)</target>
|
<target>)</target>
|
||||||
@@ -336,6 +372,9 @@
|
|||||||
<source>- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!
|
<source>- connect to [directory service](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!
|
||||||
- delivery receipts (up to 20 members).
|
- delivery receipts (up to 20 members).
|
||||||
- faster and more stable.</source>
|
- faster and more stable.</source>
|
||||||
|
<target>- 连接 [目录服务](simplex:/contact#/?v=1-4&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2FeXSPwqTkKyDO3px4fLf1wx3MvPdjdLW3%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAaiv6MkMH44L2TcYrt_CsX3ZvM11WgbMEUn0hkIKTOho%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion) (BETA)!
|
||||||
|
- 发送回执(最多20成员)。
|
||||||
|
- 更快并且更稳固。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="- more stable message delivery. - a bit better groups. - and more!" xml:space="preserve">
|
<trans-unit id="- more stable message delivery. - a bit better groups. - and more!" xml:space="preserve">
|
||||||
@@ -361,6 +400,10 @@
|
|||||||
<target>.</target>
|
<target>.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<note>time to disappear</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="0s" xml:space="preserve">
|
<trans-unit id="0s" xml:space="preserve">
|
||||||
<source>0s</source>
|
<source>0s</source>
|
||||||
<target>0秒</target>
|
<target>0秒</target>
|
||||||
@@ -586,6 +629,10 @@
|
|||||||
<target>所有聊天记录和消息将被删除——这一行为无法撤销!只有您的消息会被删除。</target>
|
<target>所有聊天记录和消息将被删除——这一行为无法撤销!只有您的消息会被删除。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
<trans-unit id="All your contacts will remain connected." xml:space="preserve">
|
||||||
<source>All your contacts will remain connected.</source>
|
<source>All your contacts will remain connected.</source>
|
||||||
<target>所有联系人会保持连接。</target>
|
<target>所有联系人会保持连接。</target>
|
||||||
@@ -691,6 +738,14 @@
|
|||||||
<target>已连接?</target>
|
<target>已连接?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Always use relay" xml:space="preserve">
|
<trans-unit id="Always use relay" xml:space="preserve">
|
||||||
<source>Always use relay</source>
|
<source>Always use relay</source>
|
||||||
<target>一直使用中继</target>
|
<target>一直使用中继</target>
|
||||||
@@ -713,6 +768,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
|
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve">
|
||||||
<source>App encrypts new local files (except videos).</source>
|
<source>App encrypts new local files (except videos).</source>
|
||||||
|
<target>应用程序为新的本地文件(视频除外)加密。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="App icon" xml:space="preserve">
|
<trans-unit id="App icon" xml:space="preserve">
|
||||||
@@ -810,6 +866,10 @@
|
|||||||
<target>返回</target>
|
<target>返回</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Bad message ID" xml:space="preserve">
|
<trans-unit id="Bad message ID" xml:space="preserve">
|
||||||
<source>Bad message ID</source>
|
<source>Bad message ID</source>
|
||||||
<target>错误消息 ID</target>
|
<target>错误消息 ID</target>
|
||||||
@@ -825,6 +885,18 @@
|
|||||||
<target>更好的消息</target>
|
<target>更好的消息</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve">
|
||||||
|
<source>Block</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve">
|
||||||
|
<source>Block member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
<trans-unit id="Both you and your contact can add message reactions." xml:space="preserve">
|
||||||
<source>Both you and your contact can add message reactions.</source>
|
<source>Both you and your contact can add message reactions.</source>
|
||||||
<target>您和您的联系人都可以添加消息回应。</target>
|
<target>您和您的联系人都可以添加消息回应。</target>
|
||||||
@@ -852,6 +924,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" xml:space="preserve">
|
<trans-unit id="Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!" xml:space="preserve">
|
||||||
<source>Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</source>
|
<source>Bulgarian, Finnish, Thai and Ukrainian - thanks to the users and [Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</source>
|
||||||
|
<target>保加利亚语、芬兰语、泰语和乌克兰语——感谢用户和[Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
|
<trans-unit id="By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA)." xml:space="preserve">
|
||||||
@@ -1085,24 +1158,31 @@
|
|||||||
<target>连接</target>
|
<target>连接</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect directly" xml:space="preserve">
|
|
||||||
<source>Connect directly</source>
|
|
||||||
<target>直接连接</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Connect incognito" xml:space="preserve">
|
<trans-unit id="Connect incognito" xml:space="preserve">
|
||||||
<source>Connect incognito</source>
|
<source>Connect incognito</source>
|
||||||
<target>在隐身状态下连接</target>
|
<target>在隐身状态下连接</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via contact link" xml:space="preserve">
|
<trans-unit id="Connect to desktop" xml:space="preserve">
|
||||||
<source>Connect via contact link</source>
|
<source>Connect to desktop</source>
|
||||||
<target>通过联系人链接进行连接</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via group link?" xml:space="preserve">
|
<trans-unit id="Connect to yourself?" xml:space="preserve">
|
||||||
<source>Connect via group link?</source>
|
<source>Connect to yourself?</source>
|
||||||
<target>通过群组链接连接?</target>
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect to yourself? This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>Connect to yourself?
|
||||||
|
This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect via contact address" xml:space="preserve">
|
||||||
|
<source>Connect via contact address</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connect via link" xml:space="preserve">
|
<trans-unit id="Connect via link" xml:space="preserve">
|
||||||
@@ -1120,6 +1200,18 @@
|
|||||||
<target>通过一次性链接连接</target>
|
<target>通过一次性链接连接</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connect with %@" xml:space="preserve">
|
||||||
|
<source>Connect with %@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected desktop" xml:space="preserve">
|
||||||
|
<source>Connected desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Connected to desktop" xml:space="preserve">
|
||||||
|
<source>Connected to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connecting server…" xml:space="preserve">
|
<trans-unit id="Connecting server…" xml:space="preserve">
|
||||||
<source>Connecting to server…</source>
|
<source>Connecting to server…</source>
|
||||||
<target>连接服务器中……</target>
|
<target>连接服务器中……</target>
|
||||||
@@ -1130,6 +1222,10 @@
|
|||||||
<target>连接服务器中……(错误:%@)</target>
|
<target>连接服务器中……(错误:%@)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connecting to desktop" xml:space="preserve">
|
||||||
|
<source>Connecting to desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection" xml:space="preserve">
|
<trans-unit id="Connection" xml:space="preserve">
|
||||||
<source>Connection</source>
|
<source>Connection</source>
|
||||||
<target>连接</target>
|
<target>连接</target>
|
||||||
@@ -1150,6 +1246,10 @@
|
|||||||
<target>已发送连接请求!</target>
|
<target>已发送连接请求!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Connection terminated" xml:space="preserve">
|
||||||
|
<source>Connection terminated</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Connection timeout" xml:space="preserve">
|
<trans-unit id="Connection timeout" xml:space="preserve">
|
||||||
<source>Connection timeout</source>
|
<source>Connection timeout</source>
|
||||||
<target>连接超时</target>
|
<target>连接超时</target>
|
||||||
@@ -1165,11 +1265,6 @@
|
|||||||
<target>联系人已存在</target>
|
<target>联系人已存在</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Contact and all messages will be deleted - this cannot be undone!" xml:space="preserve">
|
|
||||||
<source>Contact and all messages will be deleted - this cannot be undone!</source>
|
|
||||||
<target>联系人和所有的消息都将被删除——这是不可逆回的!</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Contact hidden:" xml:space="preserve">
|
<trans-unit id="Contact hidden:" xml:space="preserve">
|
||||||
<source>Contact hidden:</source>
|
<source>Contact hidden:</source>
|
||||||
<target>联系人已隐藏:</target>
|
<target>联系人已隐藏:</target>
|
||||||
@@ -1220,6 +1315,10 @@
|
|||||||
<target>核心版本: v%@</target>
|
<target>核心版本: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
|
<source>Correct name to %@?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create" xml:space="preserve">
|
<trans-unit id="Create" xml:space="preserve">
|
||||||
<source>Create</source>
|
<source>Create</source>
|
||||||
<target>创建</target>
|
<target>创建</target>
|
||||||
@@ -1240,6 +1339,10 @@
|
|||||||
<target>创建文件</target>
|
<target>创建文件</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create group" xml:space="preserve">
|
||||||
|
<source>Create group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create group link" xml:space="preserve">
|
<trans-unit id="Create group link" xml:space="preserve">
|
||||||
<source>Create group link</source>
|
<source>Create group link</source>
|
||||||
<target>创建群组链接</target>
|
<target>创建群组链接</target>
|
||||||
@@ -1252,6 +1355,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
<trans-unit id="Create new profile in [desktop app](https://simplex.chat/downloads/). 💻" xml:space="preserve">
|
||||||
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
<source>Create new profile in [desktop app](https://simplex.chat/downloads/). 💻</source>
|
||||||
|
<target>在[桌面应用程序](https://simplex.chat/downloads/)中创建新的个人资料。 💻</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
<trans-unit id="Create one-time invitation link" xml:space="preserve">
|
||||||
@@ -1259,6 +1363,10 @@
|
|||||||
<target>创建一次性邀请链接</target>
|
<target>创建一次性邀请链接</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Create profile" xml:space="preserve">
|
||||||
|
<source>Create profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Create queue" xml:space="preserve">
|
<trans-unit id="Create queue" xml:space="preserve">
|
||||||
<source>Create queue</source>
|
<source>Create queue</source>
|
||||||
<target>创建队列</target>
|
<target>创建队列</target>
|
||||||
@@ -1417,6 +1525,10 @@
|
|||||||
<target>删除</target>
|
<target>删除</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete %lld messages?" xml:space="preserve">
|
||||||
|
<source>Delete %lld messages?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete Contact" xml:space="preserve">
|
<trans-unit id="Delete Contact" xml:space="preserve">
|
||||||
<source>Delete Contact</source>
|
<source>Delete Contact</source>
|
||||||
<target>删除联系人</target>
|
<target>删除联系人</target>
|
||||||
@@ -1442,6 +1554,10 @@
|
|||||||
<target>删除所有文件</target>
|
<target>删除所有文件</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Delete and notify contact" xml:space="preserve">
|
||||||
|
<source>Delete and notify contact</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Delete archive" xml:space="preserve">
|
<trans-unit id="Delete archive" xml:space="preserve">
|
||||||
<source>Delete archive</source>
|
<source>Delete archive</source>
|
||||||
<target>删除档案</target>
|
<target>删除档案</target>
|
||||||
@@ -1472,9 +1588,9 @@
|
|||||||
<target>删除联系人</target>
|
<target>删除联系人</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete contact?" xml:space="preserve">
|
<trans-unit id="Delete contact? This cannot be undone!" xml:space="preserve">
|
||||||
<source>Delete contact?</source>
|
<source>Delete contact?
|
||||||
<target>删除联系人?</target>
|
This cannot be undone!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete database" xml:space="preserve">
|
<trans-unit id="Delete database" xml:space="preserve">
|
||||||
@@ -1617,6 +1733,18 @@
|
|||||||
<target>描述</target>
|
<target>描述</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop address" xml:space="preserve">
|
||||||
|
<source>Desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop app version %@ is not compatible with this app." xml:space="preserve">
|
||||||
|
<source>Desktop app version %@ is not compatible with this app.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Desktop devices" xml:space="preserve">
|
||||||
|
<source>Desktop devices</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Develop" xml:space="preserve">
|
<trans-unit id="Develop" xml:space="preserve">
|
||||||
<source>Develop</source>
|
<source>Develop</source>
|
||||||
<target>开发</target>
|
<target>开发</target>
|
||||||
@@ -1707,18 +1835,17 @@
|
|||||||
<target>断开连接</target>
|
<target>断开连接</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Disconnect desktop?" xml:space="preserve">
|
||||||
|
<source>Disconnect desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Discover and join groups" xml:space="preserve">
|
<trans-unit id="Discover and join groups" xml:space="preserve">
|
||||||
<source>Discover and join groups</source>
|
<source>Discover and join groups</source>
|
||||||
|
<target>发现和加入群组</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Display name" xml:space="preserve">
|
<trans-unit id="Discover on network" xml:space="preserve">
|
||||||
<source>Display name</source>
|
<source>Discover on network</source>
|
||||||
<target>显示名称</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Display name:" xml:space="preserve">
|
|
||||||
<source>Display name:</source>
|
|
||||||
<target>显示名:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
<trans-unit id="Do NOT use SimpleX for emergency calls." xml:space="preserve">
|
||||||
@@ -1853,6 +1980,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Encrypt stored files & media" xml:space="preserve">
|
<trans-unit id="Encrypt stored files & media" xml:space="preserve">
|
||||||
<source>Encrypt stored files & media</source>
|
<source>Encrypt stored files & media</source>
|
||||||
|
<target>为存储的文件和媒体加密</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Encrypted database" xml:space="preserve">
|
<trans-unit id="Encrypted database" xml:space="preserve">
|
||||||
@@ -1890,6 +2018,14 @@
|
|||||||
<target>加密消息:意外错误</target>
|
<target>加密消息:意外错误</target>
|
||||||
<note>notification</note>
|
<note>notification</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation error" xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation error</source>
|
||||||
|
<note>message decrypt error item</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encryption re-negotiation failed." xml:space="preserve">
|
||||||
|
<source>Encryption re-negotiation failed.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter Passcode" xml:space="preserve">
|
<trans-unit id="Enter Passcode" xml:space="preserve">
|
||||||
<source>Enter Passcode</source>
|
<source>Enter Passcode</source>
|
||||||
<target>输入密码</target>
|
<target>输入密码</target>
|
||||||
@@ -1900,6 +2036,10 @@
|
|||||||
<target>输入正确密码。</target>
|
<target>输入正确密码。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter group name…" xml:space="preserve">
|
||||||
|
<source>Enter group name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
<trans-unit id="Enter passphrase…" xml:space="preserve">
|
||||||
<source>Enter passphrase…</source>
|
<source>Enter passphrase…</source>
|
||||||
<target>输入密码……</target>
|
<target>输入密码……</target>
|
||||||
@@ -1915,6 +2055,10 @@
|
|||||||
<target>手动输入服务器</target>
|
<target>手动输入服务器</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter this device name…" xml:space="preserve">
|
||||||
|
<source>Enter this device name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
<trans-unit id="Enter welcome message…" xml:space="preserve">
|
||||||
<source>Enter welcome message…</source>
|
<source>Enter welcome message…</source>
|
||||||
<target>输入欢迎消息……</target>
|
<target>输入欢迎消息……</target>
|
||||||
@@ -1925,6 +2069,10 @@
|
|||||||
<target>输入欢迎消息……(可选)</target>
|
<target>输入欢迎消息……(可选)</target>
|
||||||
<note>placeholder</note>
|
<note>placeholder</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Enter your name…" xml:space="preserve">
|
||||||
|
<source>Enter your name…</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error" xml:space="preserve">
|
<trans-unit id="Error" xml:space="preserve">
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<target>错误</target>
|
<target>错误</target>
|
||||||
@@ -1982,6 +2130,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating member contact" xml:space="preserve">
|
<trans-unit id="Error creating member contact" xml:space="preserve">
|
||||||
<source>Error creating member contact</source>
|
<source>Error creating member contact</source>
|
||||||
|
<target>创建成员联系人时出错</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error creating profile!" xml:space="preserve">
|
<trans-unit id="Error creating profile!" xml:space="preserve">
|
||||||
@@ -2116,6 +2265,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
<trans-unit id="Error sending member contact invitation" xml:space="preserve">
|
||||||
<source>Error sending member contact invitation</source>
|
<source>Error sending member contact invitation</source>
|
||||||
|
<target>发送成员联系人邀请错误</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error sending message" xml:space="preserve">
|
<trans-unit id="Error sending message" xml:space="preserve">
|
||||||
@@ -2198,6 +2348,10 @@
|
|||||||
<target>退出而不保存</target>
|
<target>退出而不保存</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Expand" xml:space="preserve">
|
||||||
|
<source>Expand</source>
|
||||||
|
<note>chat item action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Export database" xml:space="preserve">
|
<trans-unit id="Export database" xml:space="preserve">
|
||||||
<source>Export database</source>
|
<source>Export database</source>
|
||||||
<target>导出数据库</target>
|
<target>导出数据库</target>
|
||||||
@@ -2343,6 +2497,10 @@
|
|||||||
<target>全名:</target>
|
<target>全名:</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
<trans-unit id="Fully re-implemented - work in background!" xml:space="preserve">
|
||||||
<source>Fully re-implemented - work in background!</source>
|
<source>Fully re-implemented - work in background!</source>
|
||||||
<target>完全重新实现 - 在后台工作!</target>
|
<target>完全重新实现 - 在后台工作!</target>
|
||||||
@@ -2363,6 +2521,14 @@
|
|||||||
<target>群组</target>
|
<target>群组</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists" xml:space="preserve">
|
||||||
|
<source>Group already exists</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Group already exists!" xml:space="preserve">
|
||||||
|
<source>Group already exists!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Group display name" xml:space="preserve">
|
<trans-unit id="Group display name" xml:space="preserve">
|
||||||
<source>Group display name</source>
|
<source>Group display name</source>
|
||||||
<target>群组显示名称</target>
|
<target>群组显示名称</target>
|
||||||
@@ -2663,6 +2829,10 @@
|
|||||||
<target>数据库版本不兼容</target>
|
<target>数据库版本不兼容</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Incompatible version" xml:space="preserve">
|
||||||
|
<source>Incompatible version</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
<trans-unit id="Incorrect passcode" xml:space="preserve">
|
||||||
<source>Incorrect passcode</source>
|
<source>Incorrect passcode</source>
|
||||||
<target>密码错误</target>
|
<target>密码错误</target>
|
||||||
@@ -2710,6 +2880,10 @@
|
|||||||
<target>无效的连接链接</target>
|
<target>无效的连接链接</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Invalid name!" xml:space="preserve">
|
||||||
|
<source>Invalid name!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Invalid server address!" xml:space="preserve">
|
<trans-unit id="Invalid server address!" xml:space="preserve">
|
||||||
<source>Invalid server address!</source>
|
<source>Invalid server address!</source>
|
||||||
<target>无效的服务器地址!</target>
|
<target>无效的服务器地址!</target>
|
||||||
@@ -2801,16 +2975,33 @@
|
|||||||
<target>加入群组</target>
|
<target>加入群组</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join group?" xml:space="preserve">
|
||||||
|
<source>Join group?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Join incognito" xml:space="preserve">
|
<trans-unit id="Join incognito" xml:space="preserve">
|
||||||
<source>Join incognito</source>
|
<source>Join incognito</source>
|
||||||
<target>加入隐身聊天</target>
|
<target>加入隐身聊天</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Join with current profile" xml:space="preserve">
|
||||||
|
<source>Join with current profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Join your group? This is your link for group %@!" xml:space="preserve">
|
||||||
|
<source>Join your group?
|
||||||
|
This is your link for group %@!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Joining group" xml:space="preserve">
|
<trans-unit id="Joining group" xml:space="preserve">
|
||||||
<source>Joining group</source>
|
<source>Joining group</source>
|
||||||
<target>加入群组中</target>
|
<target>加入群组中</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
|
<source>Keep the app open to use it from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Keep your connections" xml:space="preserve">
|
<trans-unit id="Keep your connections" xml:space="preserve">
|
||||||
<source>Keep your connections</source>
|
<source>Keep your connections</source>
|
||||||
<target>保持连接</target>
|
<target>保持连接</target>
|
||||||
@@ -2871,6 +3062,14 @@
|
|||||||
<target>限制</target>
|
<target>限制</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktop options" xml:space="preserve">
|
||||||
|
<source>Linked desktop options</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Linked desktops" xml:space="preserve">
|
||||||
|
<source>Linked desktops</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Live message!" xml:space="preserve">
|
<trans-unit id="Live message!" xml:space="preserve">
|
||||||
<source>Live message!</source>
|
<source>Live message!</source>
|
||||||
<target>实时消息!</target>
|
<target>实时消息!</target>
|
||||||
@@ -3021,6 +3220,10 @@
|
|||||||
<target>消息</target>
|
<target>消息</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages from %@ will be shown!" xml:space="preserve">
|
||||||
|
<source>Messages from %@ will be shown!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
<trans-unit id="Migrating database archive…" xml:space="preserve">
|
||||||
<source>Migrating database archive…</source>
|
<source>Migrating database archive…</source>
|
||||||
<target>迁移数据库档案中…</target>
|
<target>迁移数据库档案中…</target>
|
||||||
@@ -3133,6 +3336,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="New desktop app!" xml:space="preserve">
|
<trans-unit id="New desktop app!" xml:space="preserve">
|
||||||
<source>New desktop app!</source>
|
<source>New desktop app!</source>
|
||||||
|
<target>全新桌面应用!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="New display name" xml:space="preserve">
|
<trans-unit id="New display name" xml:space="preserve">
|
||||||
@@ -3351,6 +3555,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open" xml:space="preserve">
|
<trans-unit id="Open" xml:space="preserve">
|
||||||
<source>Open</source>
|
<source>Open</source>
|
||||||
|
<target>打开</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Open Settings" xml:space="preserve">
|
<trans-unit id="Open Settings" xml:space="preserve">
|
||||||
@@ -3368,6 +3573,10 @@
|
|||||||
<target>打开聊天控制台</target>
|
<target>打开聊天控制台</target>
|
||||||
<note>authentication reason</note>
|
<note>authentication reason</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Open group" xml:space="preserve">
|
||||||
|
<source>Open group</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Open user profiles" xml:space="preserve">
|
<trans-unit id="Open user profiles" xml:space="preserve">
|
||||||
<source>Open user profiles</source>
|
<source>Open user profiles</source>
|
||||||
<target>打开用户个人资料</target>
|
<target>打开用户个人资料</target>
|
||||||
@@ -3383,11 +3592,6 @@
|
|||||||
<target>打开数据库中……</target>
|
<target>打开数据库中……</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red." xml:space="preserve">
|
|
||||||
<source>Opening the link in the browser may reduce connection privacy and security. Untrusted SimpleX links will be red.</source>
|
|
||||||
<target>在浏览器中打开链接可能会降低连接的隐私和安全性。SimpleX 上不受信任的链接将显示为红色。</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="PING count" xml:space="preserve">
|
<trans-unit id="PING count" xml:space="preserve">
|
||||||
<source>PING count</source>
|
<source>PING count</source>
|
||||||
<target>PING 次数</target>
|
<target>PING 次数</target>
|
||||||
@@ -3433,6 +3637,10 @@
|
|||||||
<target>粘贴</target>
|
<target>粘贴</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Paste desktop address" xml:space="preserve">
|
||||||
|
<source>Paste desktop address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Paste image" xml:space="preserve">
|
<trans-unit id="Paste image" xml:space="preserve">
|
||||||
<source>Paste image</source>
|
<source>Paste image</source>
|
||||||
<target>粘贴图片</target>
|
<target>粘贴图片</target>
|
||||||
@@ -3578,6 +3786,14 @@
|
|||||||
<target>资料图片</target>
|
<target>资料图片</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name" xml:space="preserve">
|
||||||
|
<source>Profile name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Profile name:" xml:space="preserve">
|
||||||
|
<source>Profile name:</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Profile password" xml:space="preserve">
|
<trans-unit id="Profile password" xml:space="preserve">
|
||||||
<source>Profile password</source>
|
<source>Profile password</source>
|
||||||
<target>个人资料密码</target>
|
<target>个人资料密码</target>
|
||||||
@@ -3823,6 +4039,14 @@
|
|||||||
<target>重新协商加密?</target>
|
<target>重新协商加密?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Repeat join request?" xml:space="preserve">
|
||||||
|
<source>Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Reply" xml:space="preserve">
|
<trans-unit id="Reply" xml:space="preserve">
|
||||||
<source>Reply</source>
|
<source>Reply</source>
|
||||||
<target>回复</target>
|
<target>回复</target>
|
||||||
@@ -4008,6 +4232,10 @@
|
|||||||
<target>扫描二维码</target>
|
<target>扫描二维码</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Scan QR code from desktop" xml:space="preserve">
|
||||||
|
<source>Scan QR code from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scan code" xml:space="preserve">
|
<trans-unit id="Scan code" xml:space="preserve">
|
||||||
<source>Scan code</source>
|
<source>Scan code</source>
|
||||||
<target>扫码</target>
|
<target>扫码</target>
|
||||||
@@ -4090,6 +4318,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
<trans-unit id="Send direct message to connect" xml:space="preserve">
|
||||||
<source>Send direct message to connect</source>
|
<source>Send direct message to connect</source>
|
||||||
|
<target>发送私信来连接</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send disappearing message" xml:space="preserve">
|
<trans-unit id="Send disappearing message" xml:space="preserve">
|
||||||
@@ -4227,6 +4456,10 @@
|
|||||||
<target>服务器</target>
|
<target>服务器</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Session code" xml:space="preserve">
|
||||||
|
<source>Session code</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Set 1 day" xml:space="preserve">
|
<trans-unit id="Set 1 day" xml:space="preserve">
|
||||||
<source>Set 1 day</source>
|
<source>Set 1 day</source>
|
||||||
<target>设定1天</target>
|
<target>设定1天</target>
|
||||||
@@ -4394,6 +4627,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Simplified incognito mode" xml:space="preserve">
|
<trans-unit id="Simplified incognito mode" xml:space="preserve">
|
||||||
<source>Simplified incognito mode</source>
|
<source>Simplified incognito mode</source>
|
||||||
|
<target>简化的隐身模式</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Skip" xml:space="preserve">
|
<trans-unit id="Skip" xml:space="preserve">
|
||||||
@@ -4536,6 +4770,10 @@
|
|||||||
<target>点击按钮 </target>
|
<target>点击按钮 </target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tap to Connect" xml:space="preserve">
|
||||||
|
<source>Tap to Connect</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
<trans-unit id="Tap to activate profile." xml:space="preserve">
|
||||||
<source>Tap to activate profile.</source>
|
<source>Tap to activate profile.</source>
|
||||||
<target>点击以激活个人资料。</target>
|
<target>点击以激活个人资料。</target>
|
||||||
@@ -4633,11 +4871,6 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>加密正在运行,不需要新的加密协议。这可能会导致连接错误!</target>
|
<target>加密正在运行,不需要新的加密协议。这可能会导致连接错误!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The group is fully decentralized – it is visible only to the members." xml:space="preserve">
|
|
||||||
<source>The group is fully decentralized – it is visible only to the members.</source>
|
|
||||||
<target>该小组是完全分散式的——它只对成员可见。</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
<trans-unit id="The hash of the previous message is different." xml:space="preserve">
|
||||||
<source>The hash of the previous message is different.</source>
|
<source>The hash of the previous message is different.</source>
|
||||||
<target>上一条消息的散列不同。</target>
|
<target>上一条消息的散列不同。</target>
|
||||||
@@ -4723,6 +4956,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>此操作无法撤消——您的个人资料、联系人、消息和文件将不可撤回地丢失。</target>
|
<target>此操作无法撤消——您的个人资料、联系人、消息和文件将不可撤回地丢失。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This device name" xml:space="preserve">
|
||||||
|
<source>This device name</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
<trans-unit id="This group has over %lld members, delivery receipts are not sent." xml:space="preserve">
|
||||||
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
<source>This group has over %lld members, delivery receipts are not sent.</source>
|
||||||
<target>该组有超过 %lld 个成员,不发送送货单。</target>
|
<target>该组有超过 %lld 个成员,不发送送货单。</target>
|
||||||
@@ -4733,6 +4970,14 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target>该群组已不存在。</target>
|
<target>该群组已不存在。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own SimpleX address!" xml:space="preserve">
|
||||||
|
<source>This is your own SimpleX address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="This is your own one-time link!" xml:space="preserve">
|
||||||
|
<source>This is your own one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="This setting applies to messages in your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
<source>This setting applies to messages in your current chat profile **%@**.</source>
|
||||||
<target>此设置适用于您当前聊天资料 **%@** 中的消息。</target>
|
<target>此设置适用于您当前聊天资料 **%@** 中的消息。</target>
|
||||||
@@ -4792,6 +5037,7 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
|
<trans-unit id="Toggle incognito when connecting." xml:space="preserve">
|
||||||
<source>Toggle incognito when connecting.</source>
|
<source>Toggle incognito when connecting.</source>
|
||||||
|
<target>在连接时切换隐身模式。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Transport isolation" xml:space="preserve">
|
<trans-unit id="Transport isolation" xml:space="preserve">
|
||||||
@@ -4829,6 +5075,18 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<target>无法录制语音消息</target>
|
<target>无法录制语音消息</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock" xml:space="preserve">
|
||||||
|
<source>Unblock</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member" xml:space="preserve">
|
||||||
|
<source>Unblock member</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unblock member?" xml:space="preserve">
|
||||||
|
<source>Unblock member?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
<trans-unit id="Unexpected error: %@" xml:space="preserve">
|
||||||
<source>Unexpected error: %@</source>
|
<source>Unexpected error: %@</source>
|
||||||
<target>意外错误: %@</target>
|
<target>意外错误: %@</target>
|
||||||
@@ -4891,6 +5149,14 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
如果要连接,请让您的联系人创建另一个连接链接,并检查您的网络连接是否稳定。</target>
|
如果要连接,请让您的联系人创建另一个连接链接,并检查您的网络连接是否稳定。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink" xml:space="preserve">
|
||||||
|
<source>Unlink</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Unlink desktop?" xml:space="preserve">
|
||||||
|
<source>Unlink desktop?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Unlock" xml:space="preserve">
|
<trans-unit id="Unlock" xml:space="preserve">
|
||||||
<source>Unlock</source>
|
<source>Unlock</source>
|
||||||
<target>解锁</target>
|
<target>解锁</target>
|
||||||
@@ -4981,6 +5247,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>用于新连接</target>
|
<target>用于新连接</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use from desktop" xml:space="preserve">
|
||||||
|
<source>Use from desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
<trans-unit id="Use iOS call interface" xml:space="preserve">
|
||||||
<source>Use iOS call interface</source>
|
<source>Use iOS call interface</source>
|
||||||
<target>使用 iOS 通话界面</target>
|
<target>使用 iOS 通话界面</target>
|
||||||
@@ -5011,11 +5281,23 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>使用 SimpleX Chat 服务器。</target>
|
<target>使用 SimpleX Chat 服务器。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify code with desktop" xml:space="preserve">
|
||||||
|
<source>Verify code with desktop</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connection" xml:space="preserve">
|
||||||
|
<source>Verify connection</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify connection security" xml:space="preserve">
|
<trans-unit id="Verify connection security" xml:space="preserve">
|
||||||
<source>Verify connection security</source>
|
<source>Verify connection security</source>
|
||||||
<target>验证连接安全</target>
|
<target>验证连接安全</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Verify connections" xml:space="preserve">
|
||||||
|
<source>Verify connections</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Verify security code" xml:space="preserve">
|
<trans-unit id="Verify security code" xml:space="preserve">
|
||||||
<source>Verify security code</source>
|
<source>Verify security code</source>
|
||||||
<target>验证安全码</target>
|
<target>验证安全码</target>
|
||||||
@@ -5176,6 +5458,35 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>您已经连接到 %@。</target>
|
<target>您已经连接到 %@。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting to %@." xml:space="preserve">
|
||||||
|
<source>You are already connecting to %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already connecting via this one-time link!" xml:space="preserve">
|
||||||
|
<source>You are already connecting via this one-time link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already in group %@." xml:space="preserve">
|
||||||
|
<source>You are already in group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group %@." xml:space="preserve">
|
||||||
|
<source>You are already joining the group %@.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link!" xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group via this link." xml:space="preserve">
|
||||||
|
<source>You are already joining the group via this link.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You are already joining the group! Repeat join request?" xml:space="preserve">
|
||||||
|
<source>You are already joining the group!
|
||||||
|
Repeat join request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
<trans-unit id="You are connected to the server used to receive messages from this contact." xml:space="preserve">
|
||||||
<source>You are connected to the server used to receive messages from this contact.</source>
|
<source>You are connected to the server used to receive messages from this contact.</source>
|
||||||
<target>您已连接到用于接收该联系人消息的服务器。</target>
|
<target>您已连接到用于接收该联系人消息的服务器。</target>
|
||||||
@@ -5271,6 +5582,15 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>您的身份无法验证,请再试一次。</target>
|
<target>您的身份无法验证,请再试一次。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection via this address!" xml:space="preserve">
|
||||||
|
<source>You have already requested connection via this address!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="You have already requested connection! Repeat connection request?" xml:space="preserve">
|
||||||
|
<source>You have already requested connection!
|
||||||
|
Repeat connection request?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You have no chats" xml:space="preserve">
|
<trans-unit id="You have no chats" xml:space="preserve">
|
||||||
<source>You have no chats</source>
|
<source>You have no chats</source>
|
||||||
<target>您没有聊天记录</target>
|
<target>您没有聊天记录</target>
|
||||||
@@ -5321,6 +5641,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>您将在组主设备上线时连接到该群组,请稍等或稍后再检查!</target>
|
<target>您将在组主设备上线时连接到该群组,请稍等或稍后再检查!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="You will be connected when group link host's device is online, please wait or check later!" xml:space="preserve">
|
||||||
|
<source>You will be connected when group link host's device is online, please wait or check later!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
<trans-unit id="You will be connected when your connection request is accepted, please wait or check later!" xml:space="preserve">
|
||||||
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
<source>You will be connected when your connection request is accepted, please wait or check later!</source>
|
||||||
<target>当您的连接请求被接受后,您将可以连接,请稍等或稍后检查!</target>
|
<target>当您的连接请求被接受后,您将可以连接,请稍等或稍后检查!</target>
|
||||||
@@ -5336,9 +5660,8 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>当您启动应用或在应用程序驻留后台超过30 秒后,您将需要进行身份验证。</target>
|
<target>当您启动应用或在应用程序驻留后台超过30 秒后,您将需要进行身份验证。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will join a group this link refers to and connect to its group members." xml:space="preserve">
|
<trans-unit id="You will connect to all group members." xml:space="preserve">
|
||||||
<source>You will join a group this link refers to and connect to its group members.</source>
|
<source>You will connect to all group members.</source>
|
||||||
<target>您将加入此链接指向的群组并连接到其群组成员。</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
<trans-unit id="You will still receive calls and notifications from muted profiles when they are active." xml:space="preserve">
|
||||||
@@ -5406,11 +5729,6 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>您的聊天数据库未加密——设置密码来加密。</target>
|
<target>您的聊天数据库未加密——设置密码来加密。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your chat profile will be sent to group members" xml:space="preserve">
|
|
||||||
<source>Your chat profile will be sent to group members</source>
|
|
||||||
<target>您的聊天资料将被发送给群组成员</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Your chat profiles" xml:space="preserve">
|
<trans-unit id="Your chat profiles" xml:space="preserve">
|
||||||
<source>Your chat profiles</source>
|
<source>Your chat profiles</source>
|
||||||
<target>您的聊天资料</target>
|
<target>您的聊天资料</target>
|
||||||
@@ -5465,6 +5783,10 @@ You can change it in Settings.</source>
|
|||||||
<target>您的隐私设置</target>
|
<target>您的隐私设置</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile" xml:space="preserve">
|
||||||
|
<source>Your profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
<trans-unit id="Your profile **%@** will be shared." xml:space="preserve">
|
||||||
<source>Your profile **%@** will be shared.</source>
|
<source>Your profile **%@** will be shared.</source>
|
||||||
<target>您的个人资料 **%@** 将被共享。</target>
|
<target>您的个人资料 **%@** 将被共享。</target>
|
||||||
@@ -5557,6 +5879,10 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
<target>始终</target>
|
<target>始终</target>
|
||||||
<note>pref value</note>
|
<note>pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="and %lld other events" xml:space="preserve">
|
||||||
|
<source>and %lld other events</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
<trans-unit id="audio call (not e2e encrypted)" xml:space="preserve">
|
||||||
<source>audio call (not e2e encrypted)</source>
|
<source>audio call (not e2e encrypted)</source>
|
||||||
<target>语音通话(非端到端加密)</target>
|
<target>语音通话(非端到端加密)</target>
|
||||||
@@ -5572,6 +5898,10 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
<target>错误消息散列</target>
|
<target>错误消息散列</target>
|
||||||
<note>integrity error chat item</note>
|
<note>integrity error chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="blocked" xml:space="preserve">
|
||||||
|
<source>blocked</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="bold" xml:space="preserve">
|
<trans-unit id="bold" xml:space="preserve">
|
||||||
<source>bold</source>
|
<source>bold</source>
|
||||||
<target>加粗</target>
|
<target>加粗</target>
|
||||||
@@ -5644,6 +5974,7 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connected directly" xml:space="preserve">
|
<trans-unit id="connected directly" xml:space="preserve">
|
||||||
<source>connected directly</source>
|
<source>connected directly</source>
|
||||||
|
<target>已直连</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="connecting" xml:space="preserve">
|
<trans-unit id="connecting" xml:space="preserve">
|
||||||
@@ -5741,6 +6072,10 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
<target>已删除</target>
|
<target>已删除</target>
|
||||||
<note>deleted chat item</note>
|
<note>deleted chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="deleted contact" xml:space="preserve">
|
||||||
|
<source>deleted contact</source>
|
||||||
|
<note>rcv direct event chat item</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="deleted group" xml:space="preserve">
|
<trans-unit id="deleted group" xml:space="preserve">
|
||||||
<source>deleted group</source>
|
<source>deleted group</source>
|
||||||
<target>已删除群组</target>
|
<target>已删除群组</target>
|
||||||
@@ -6025,7 +6360,8 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
<source>off</source>
|
<source>off</source>
|
||||||
<target>关闭</target>
|
<target>关闭</target>
|
||||||
<note>enabled status
|
<note>enabled status
|
||||||
group pref value</note>
|
group pref value
|
||||||
|
time to disappear</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="offered %@" xml:space="preserve">
|
<trans-unit id="offered %@" xml:space="preserve">
|
||||||
<source>offered %@</source>
|
<source>offered %@</source>
|
||||||
@@ -6042,11 +6378,6 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
<target>开启</target>
|
<target>开启</target>
|
||||||
<note>group pref value</note>
|
<note>group pref value</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="or chat with the developers" xml:space="preserve">
|
|
||||||
<source>or chat with the developers</source>
|
|
||||||
<target>或与开发者聊天</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="owner" xml:space="preserve">
|
<trans-unit id="owner" xml:space="preserve">
|
||||||
<source>owner</source>
|
<source>owner</source>
|
||||||
<target>群主</target>
|
<target>群主</target>
|
||||||
@@ -6109,6 +6440,7 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="send direct message" xml:space="preserve">
|
<trans-unit id="send direct message" xml:space="preserve">
|
||||||
<source>send direct message</source>
|
<source>send direct message</source>
|
||||||
|
<target>发送私信</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="starting…" xml:space="preserve">
|
<trans-unit id="starting…" xml:space="preserve">
|
||||||
@@ -6136,6 +6468,10 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
<target>已更新的群组资料</target>
|
<target>已更新的群组资料</target>
|
||||||
<note>rcv group event chat item</note>
|
<note>rcv group event chat item</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="v%@" xml:space="preserve">
|
||||||
|
<source>v%@</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
<trans-unit id="v%@ (%@)" xml:space="preserve">
|
||||||
<source>v%@ (%@)</source>
|
<source>v%@ (%@)</source>
|
||||||
<target>v%@ (%@)</target>
|
<target>v%@ (%@)</target>
|
||||||
@@ -6273,6 +6609,10 @@ SimpleX 服务器无法看到您的资料。</target>
|
|||||||
<target>SimpleX 使用Face ID进行本地身份验证</target>
|
<target>SimpleX 使用Face ID进行本地身份验证</target>
|
||||||
<note>Privacy - Face ID Usage Description</note>
|
<note>Privacy - Face ID Usage Description</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="NSLocalNetworkUsageDescription" xml:space="preserve">
|
||||||
|
<source>SimpleX uses local network access to allow using user chat profile via desktop app on the same network.</source>
|
||||||
|
<note>Privacy - Local Network Usage Description</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
<trans-unit id="NSMicrophoneUsageDescription" xml:space="preserve">
|
||||||
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
<source>SimpleX needs microphone access for audio and video calls, and to record voice messages.</source>
|
||||||
<target>SimpleX 需要麦克风访问权限才能进行音频和视频通话,以及录制语音消息。</target>
|
<target>SimpleX 需要麦克风访问权限才能进行音频和视频通话,以及录制语音消息。</target>
|
||||||
|
|||||||
+2
@@ -4,6 +4,8 @@
|
|||||||
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
"NSCameraUsageDescription" = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
/* Privacy - Face ID Usage Description */
|
/* Privacy - Face ID Usage Description */
|
||||||
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
"NSFaceIDUsageDescription" = "SimpleX uses Face ID for local authentication";
|
||||||
|
/* Privacy - Local Network Usage Description */
|
||||||
|
"NSLocalNetworkUsageDescription" = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
/* Privacy - Microphone Usage Description */
|
/* Privacy - Microphone Usage Description */
|
||||||
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
"NSMicrophoneUsageDescription" = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
/* Privacy - Photo Library Additions Usage Description */
|
/* Privacy - Photo Library Additions Usage Description */
|
||||||
|
|||||||
@@ -216,6 +216,7 @@ func startChat() -> DBMigrationResult? {
|
|||||||
try apiSetTempFolder(tempFolder: getTempFilesDirectory().path)
|
try apiSetTempFolder(tempFolder: getTempFilesDirectory().path)
|
||||||
try apiSetFilesFolder(filesFolder: getAppFilesDirectory().path)
|
try apiSetFilesFolder(filesFolder: getAppFilesDirectory().path)
|
||||||
try setXFTPConfig(xftpConfig)
|
try setXFTPConfig(xftpConfig)
|
||||||
|
try apiSetEncryptLocalFiles(privacyEncryptLocalFilesGroupDefault.get())
|
||||||
let justStarted = try apiStartChat()
|
let justStarted = try apiStartChat()
|
||||||
chatStarted = true
|
chatStarted = true
|
||||||
if justStarted {
|
if justStarted {
|
||||||
@@ -351,6 +352,12 @@ func setXFTPConfig(_ cfg: XFTPFileConfig?) throws {
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiSetEncryptLocalFiles(_ enable: Bool) throws {
|
||||||
|
let r = sendSimpleXCmd(.apiSetEncryptLocalFiles(enable: enable))
|
||||||
|
if case .cmdOk = r { return }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? {
|
func apiGetNtfMessage(nonce: String, encNtfInfo: String) -> NtfMessages? {
|
||||||
guard apiGetActiveUser() != nil else {
|
guard apiGetActiveUser() != nil else {
|
||||||
logger.debug("no active user")
|
logger.debug("no active user")
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
18415C6C56DBCEC2CBBD2F11 /* WebRTCClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415323A4082FC92887F906 /* WebRTCClient.swift */; };
|
18415C6C56DBCEC2CBBD2F11 /* WebRTCClient.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415323A4082FC92887F906 /* WebRTCClient.swift */; };
|
||||||
18415F9A2D551F9757DA4654 /* CIVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415FD2E36F13F596A45BB4 /* CIVideoView.swift */; };
|
18415F9A2D551F9757DA4654 /* CIVideoView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 18415FD2E36F13F596A45BB4 /* CIVideoView.swift */; };
|
||||||
18415FEFE153C5920BFB7828 /* GroupWelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1841516F0CE5992B0EDFB377 /* GroupWelcomeView.swift */; };
|
18415FEFE153C5920BFB7828 /* GroupWelcomeView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1841516F0CE5992B0EDFB377 /* GroupWelcomeView.swift */; };
|
||||||
3C71477A281C0F6800CB4D4B /* www in Resources */ = {isa = PBXBuildFile; fileRef = 3C714779281C0F6800CB4D4B /* www */; };
|
|
||||||
3C8C548928133C84000A3EC7 /* PasteToConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */; };
|
3C8C548928133C84000A3EC7 /* PasteToConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */; };
|
||||||
3CDBCF4227FAE51000354CDD /* ComposeLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */; };
|
3CDBCF4227FAE51000354CDD /* ComposeLinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */; };
|
||||||
3CDBCF4827FF621E00354CDD /* CILinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4727FF621E00354CDD /* CILinkView.swift */; };
|
3CDBCF4827FF621E00354CDD /* CILinkView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3CDBCF4727FF621E00354CDD /* CILinkView.swift */; };
|
||||||
@@ -40,6 +39,7 @@
|
|||||||
5C36027327F47AD5009F19D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C36027227F47AD5009F19D9 /* AppDelegate.swift */; };
|
5C36027327F47AD5009F19D9 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C36027227F47AD5009F19D9 /* AppDelegate.swift */; };
|
||||||
5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */; };
|
5C3A88CE27DF50170060F1C2 /* DetermineWidth.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */; };
|
||||||
5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; };
|
5C3A88D127DF57800060F1C2 /* FramedItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3A88D027DF57800060F1C2 /* FramedItemView.swift */; };
|
||||||
|
5C3CCFCC2AE6BD3100C3F0C3 /* ConnectDesktopView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */; };
|
||||||
5C3F1D562842B68D00EC8A82 /* IntegrityErrorItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D552842B68D00EC8A82 /* IntegrityErrorItemView.swift */; };
|
5C3F1D562842B68D00EC8A82 /* IntegrityErrorItemView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D552842B68D00EC8A82 /* IntegrityErrorItemView.swift */; };
|
||||||
5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */; };
|
5C3F1D58284363C400EC8A82 /* PrivacySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */; };
|
||||||
5C4B3B0A285FB130003915F2 /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4B3B09285FB130003915F2 /* DatabaseView.swift */; };
|
5C4B3B0A285FB130003915F2 /* DatabaseView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C4B3B09285FB130003915F2 /* DatabaseView.swift */; };
|
||||||
@@ -48,11 +48,6 @@
|
|||||||
5C55A921283CCCB700C4E99E /* IncomingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A920283CCCB700C4E99E /* IncomingCallView.swift */; };
|
5C55A921283CCCB700C4E99E /* IncomingCallView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A920283CCCB700C4E99E /* IncomingCallView.swift */; };
|
||||||
5C55A923283CEDE600C4E99E /* SoundPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A922283CEDE600C4E99E /* SoundPlayer.swift */; };
|
5C55A923283CEDE600C4E99E /* SoundPlayer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C55A922283CEDE600C4E99E /* SoundPlayer.swift */; };
|
||||||
5C55A92E283D0FDE00C4E99E /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = 5C55A92D283D0FDE00C4E99E /* sounds */; };
|
5C55A92E283D0FDE00C4E99E /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = 5C55A92D283D0FDE00C4E99E /* sounds */; };
|
||||||
5C5625102ABDFA8900A21210 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C56250B2ABDFA8900A21210 /* libffi.a */; };
|
|
||||||
5C5625112ABDFA8900A21210 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C56250C2ABDFA8900A21210 /* libgmp.a */; };
|
|
||||||
5C5625122ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C56250D2ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m.a */; };
|
|
||||||
5C5625132ABDFA8900A21210 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C56250E2ABDFA8900A21210 /* libgmpxx.a */; };
|
|
||||||
5C5625142ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m-ghc8.10.7.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5C56250F2ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m-ghc8.10.7.a */; };
|
|
||||||
5C577F7D27C83AA10006112D /* MarkdownHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C577F7C27C83AA10006112D /* MarkdownHelp.swift */; };
|
5C577F7D27C83AA10006112D /* MarkdownHelp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C577F7C27C83AA10006112D /* MarkdownHelp.swift */; };
|
||||||
5C58BCD6292BEBE600AF9E4F /* CIChatFeatureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C58BCD5292BEBE600AF9E4F /* CIChatFeatureView.swift */; };
|
5C58BCD6292BEBE600AF9E4F /* CIChatFeatureView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C58BCD5292BEBE600AF9E4F /* CIChatFeatureView.swift */; };
|
||||||
5C5DB70E289ABDD200730FFF /* AppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5DB70D289ABDD200730FFF /* AppearanceSettings.swift */; };
|
5C5DB70E289ABDD200730FFF /* AppearanceSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5C5DB70D289ABDD200730FFF /* AppearanceSettings.swift */; };
|
||||||
@@ -123,6 +118,11 @@
|
|||||||
5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */; };
|
5CCB939C297EFCB100399E78 /* NavStackCompat.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCB939B297EFCB100399E78 /* NavStackCompat.swift */; };
|
||||||
5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; };
|
5CCD403427A5F6DF00368C90 /* AddContactView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403327A5F6DF00368C90 /* AddContactView.swift */; };
|
||||||
5CCD403727A5F9A200368C90 /* ScanToConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403627A5F9A200368C90 /* ScanToConnectView.swift */; };
|
5CCD403727A5F9A200368C90 /* ScanToConnectView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CCD403627A5F9A200368C90 /* ScanToConnectView.swift */; };
|
||||||
|
5CDA5A2D2B04FE2D00A71D61 /* libgmp.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CDA5A282B04FE2D00A71D61 /* libgmp.a */; };
|
||||||
|
5CDA5A2E2B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL-ghc9.6.3.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CDA5A292B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL-ghc9.6.3.a */; };
|
||||||
|
5CDA5A2F2B04FE2D00A71D61 /* libffi.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CDA5A2A2B04FE2D00A71D61 /* libffi.a */; };
|
||||||
|
5CDA5A302B04FE2D00A71D61 /* libgmpxx.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CDA5A2B2B04FE2D00A71D61 /* libgmpxx.a */; };
|
||||||
|
5CDA5A312B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CDA5A2C2B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL.a */; };
|
||||||
5CDCAD482818589900503DA2 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDCAD472818589900503DA2 /* NotificationService.swift */; };
|
5CDCAD482818589900503DA2 /* NotificationService.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5CDCAD472818589900503DA2 /* NotificationService.swift */; };
|
||||||
5CE2BA702845308900EC33A6 /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; };
|
5CE2BA702845308900EC33A6 /* SimpleXChat.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; };
|
||||||
5CE2BA712845308900EC33A6 /* SimpleXChat.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
5CE2BA712845308900EC33A6 /* SimpleXChat.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 5CE2BA682845308900EC33A6 /* SimpleXChat.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
|
||||||
@@ -257,7 +257,6 @@
|
|||||||
18415B08031E8FB0F7FC27F9 /* CallViewRenderers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallViewRenderers.swift; sourceTree = "<group>"; };
|
18415B08031E8FB0F7FC27F9 /* CallViewRenderers.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CallViewRenderers.swift; sourceTree = "<group>"; };
|
||||||
18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerView.swift; sourceTree = "<group>"; };
|
18415DAAAD1ADBEDB0EDA852 /* VideoPlayerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VideoPlayerView.swift; sourceTree = "<group>"; };
|
||||||
18415FD2E36F13F596A45BB4 /* CIVideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIVideoView.swift; sourceTree = "<group>"; };
|
18415FD2E36F13F596A45BB4 /* CIVideoView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CIVideoView.swift; sourceTree = "<group>"; };
|
||||||
3C714779281C0F6800CB4D4B /* www */ = {isa = PBXFileReference; lastKnownFileType = folder; name = www; path = ../multiplatform/android/src/main/assets/www; sourceTree = "<group>"; };
|
|
||||||
3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteToConnectView.swift; sourceTree = "<group>"; };
|
3C8C548828133C84000A3EC7 /* PasteToConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteToConnectView.swift; sourceTree = "<group>"; };
|
||||||
3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeLinkView.swift; sourceTree = "<group>"; };
|
3CDBCF4127FAE51000354CDD /* ComposeLinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ComposeLinkView.swift; sourceTree = "<group>"; };
|
||||||
3CDBCF4727FF621E00354CDD /* CILinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CILinkView.swift; sourceTree = "<group>"; };
|
3CDBCF4727FF621E00354CDD /* CILinkView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CILinkView.swift; sourceTree = "<group>"; };
|
||||||
@@ -284,6 +283,7 @@
|
|||||||
5C36027227F47AD5009F19D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
5C36027227F47AD5009F19D9 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; };
|
||||||
5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetermineWidth.swift; sourceTree = "<group>"; };
|
5C3A88CD27DF50170060F1C2 /* DetermineWidth.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DetermineWidth.swift; sourceTree = "<group>"; };
|
||||||
5C3A88D027DF57800060F1C2 /* FramedItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramedItemView.swift; sourceTree = "<group>"; };
|
5C3A88D027DF57800060F1C2 /* FramedItemView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FramedItemView.swift; sourceTree = "<group>"; };
|
||||||
|
5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ConnectDesktopView.swift; sourceTree = "<group>"; };
|
||||||
5C3F1D552842B68D00EC8A82 /* IntegrityErrorItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegrityErrorItemView.swift; sourceTree = "<group>"; };
|
5C3F1D552842B68D00EC8A82 /* IntegrityErrorItemView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegrityErrorItemView.swift; sourceTree = "<group>"; };
|
||||||
5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacySettings.swift; sourceTree = "<group>"; };
|
5C3F1D57284363C400EC8A82 /* PrivacySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivacySettings.swift; sourceTree = "<group>"; };
|
||||||
5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SimpleX (iOS).entitlements"; sourceTree = "<group>"; };
|
5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "SimpleX (iOS).entitlements"; sourceTree = "<group>"; };
|
||||||
@@ -293,11 +293,6 @@
|
|||||||
5C55A920283CCCB700C4E99E /* IncomingCallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingCallView.swift; sourceTree = "<group>"; };
|
5C55A920283CCCB700C4E99E /* IncomingCallView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IncomingCallView.swift; sourceTree = "<group>"; };
|
||||||
5C55A922283CEDE600C4E99E /* SoundPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoundPlayer.swift; sourceTree = "<group>"; };
|
5C55A922283CEDE600C4E99E /* SoundPlayer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SoundPlayer.swift; sourceTree = "<group>"; };
|
||||||
5C55A92D283D0FDE00C4E99E /* sounds */ = {isa = PBXFileReference; lastKnownFileType = folder; path = sounds; sourceTree = "<group>"; };
|
5C55A92D283D0FDE00C4E99E /* sounds */ = {isa = PBXFileReference; lastKnownFileType = folder; path = sounds; sourceTree = "<group>"; };
|
||||||
5C56250B2ABDFA8900A21210 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
|
|
||||||
5C56250C2ABDFA8900A21210 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
|
|
||||||
5C56250D2ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m.a"; sourceTree = "<group>"; };
|
|
||||||
5C56250E2ABDFA8900A21210 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
|
|
||||||
5C56250F2ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m-ghc8.10.7.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m-ghc8.10.7.a"; sourceTree = "<group>"; };
|
|
||||||
5C577F7C27C83AA10006112D /* MarkdownHelp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkdownHelp.swift; sourceTree = "<group>"; };
|
5C577F7C27C83AA10006112D /* MarkdownHelp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MarkdownHelp.swift; sourceTree = "<group>"; };
|
||||||
5C58BCD5292BEBE600AF9E4F /* CIChatFeatureView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIChatFeatureView.swift; sourceTree = "<group>"; };
|
5C58BCD5292BEBE600AF9E4F /* CIChatFeatureView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CIChatFeatureView.swift; sourceTree = "<group>"; };
|
||||||
5C5B67912ABAF4B500DA9412 /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
|
5C5B67912ABAF4B500DA9412 /* bg */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = bg; path = bg.lproj/Localizable.strings; sourceTree = "<group>"; };
|
||||||
@@ -404,6 +399,11 @@
|
|||||||
5CCB939B297EFCB100399E78 /* NavStackCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavStackCompat.swift; sourceTree = "<group>"; };
|
5CCB939B297EFCB100399E78 /* NavStackCompat.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavStackCompat.swift; sourceTree = "<group>"; };
|
||||||
5CCD403327A5F6DF00368C90 /* AddContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContactView.swift; sourceTree = "<group>"; };
|
5CCD403327A5F6DF00368C90 /* AddContactView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AddContactView.swift; sourceTree = "<group>"; };
|
||||||
5CCD403627A5F9A200368C90 /* ScanToConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanToConnectView.swift; sourceTree = "<group>"; };
|
5CCD403627A5F9A200368C90 /* ScanToConnectView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScanToConnectView.swift; sourceTree = "<group>"; };
|
||||||
|
5CDA5A282B04FE2D00A71D61 /* libgmp.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmp.a; sourceTree = "<group>"; };
|
||||||
|
5CDA5A292B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL-ghc9.6.3.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL-ghc9.6.3.a"; sourceTree = "<group>"; };
|
||||||
|
5CDA5A2A2B04FE2D00A71D61 /* libffi.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libffi.a; sourceTree = "<group>"; };
|
||||||
|
5CDA5A2B2B04FE2D00A71D61 /* libgmpxx.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libgmpxx.a; sourceTree = "<group>"; };
|
||||||
|
5CDA5A2C2B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = "libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL.a"; sourceTree = "<group>"; };
|
||||||
5CDCAD452818589900503DA2 /* SimpleX NSE.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "SimpleX NSE.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
|
5CDCAD452818589900503DA2 /* SimpleX NSE.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "SimpleX NSE.appex"; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
5CDCAD472818589900503DA2 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
|
5CDCAD472818589900503DA2 /* NotificationService.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationService.swift; sourceTree = "<group>"; };
|
||||||
5CDCAD492818589900503DA2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
5CDCAD492818589900503DA2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
|
||||||
@@ -507,13 +507,13 @@
|
|||||||
isa = PBXFrameworksBuildPhase;
|
isa = PBXFrameworksBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
5C5625132ABDFA8900A21210 /* libgmpxx.a in Frameworks */,
|
5CDA5A302B04FE2D00A71D61 /* libgmpxx.a in Frameworks */,
|
||||||
5C5625122ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m.a in Frameworks */,
|
|
||||||
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
|
5CE2BA93284534B000EC33A6 /* libiconv.tbd in Frameworks */,
|
||||||
5C5625142ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m-ghc8.10.7.a in Frameworks */,
|
5CDA5A2D2B04FE2D00A71D61 /* libgmp.a in Frameworks */,
|
||||||
5C5625102ABDFA8900A21210 /* libffi.a in Frameworks */,
|
5CDA5A2E2B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL-ghc9.6.3.a in Frameworks */,
|
||||||
5C5625112ABDFA8900A21210 /* libgmp.a in Frameworks */,
|
5CDA5A2F2B04FE2D00A71D61 /* libffi.a in Frameworks */,
|
||||||
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
|
5CE2BA94284534BB00EC33A6 /* libz.tbd in Frameworks */,
|
||||||
|
5CDA5A312B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL.a in Frameworks */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -546,6 +546,7 @@
|
|||||||
5CB924DD27A8622200ACCCDD /* NewChat */,
|
5CB924DD27A8622200ACCCDD /* NewChat */,
|
||||||
5CFA59C22860B04D00863A68 /* Database */,
|
5CFA59C22860B04D00863A68 /* Database */,
|
||||||
5CB634AB29E46CDB0066AD6B /* LocalAuth */,
|
5CB634AB29E46CDB0066AD6B /* LocalAuth */,
|
||||||
|
5CA8D01B2AD9B076001FD661 /* RemoteAccess */,
|
||||||
5CB924DF27A8678B00ACCCDD /* UserSettings */,
|
5CB924DF27A8678B00ACCCDD /* UserSettings */,
|
||||||
5C2E261127A30FEA00F70299 /* TerminalView.swift */,
|
5C2E261127A30FEA00F70299 /* TerminalView.swift */,
|
||||||
);
|
);
|
||||||
@@ -574,11 +575,11 @@
|
|||||||
5C764E5C279C70B7000C6508 /* Libraries */ = {
|
5C764E5C279C70B7000C6508 /* Libraries */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
5C56250B2ABDFA8900A21210 /* libffi.a */,
|
5CDA5A2A2B04FE2D00A71D61 /* libffi.a */,
|
||||||
5C56250C2ABDFA8900A21210 /* libgmp.a */,
|
5CDA5A282B04FE2D00A71D61 /* libgmp.a */,
|
||||||
5C56250E2ABDFA8900A21210 /* libgmpxx.a */,
|
5CDA5A2B2B04FE2D00A71D61 /* libgmpxx.a */,
|
||||||
5C56250F2ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m-ghc8.10.7.a */,
|
5CDA5A292B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL-ghc9.6.3.a */,
|
||||||
5C56250D2ABDFA8900A21210 /* libHSsimplex-chat-5.3.0.10-9vCXcrdx54qEnAYPtVuU9m.a */,
|
5CDA5A2C2B04FE2D00A71D61 /* libHSsimplex-chat-5.4.0.3-rODxCBVsb2BkD1fnTAqXL.a */,
|
||||||
);
|
);
|
||||||
path = Libraries;
|
path = Libraries;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -638,7 +639,6 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
5C55A92D283D0FDE00C4E99E /* sounds */,
|
5C55A92D283D0FDE00C4E99E /* sounds */,
|
||||||
3C714779281C0F6800CB4D4B /* www */,
|
|
||||||
5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */,
|
5CC2C0FD2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings */,
|
||||||
5CC2C0FA2809BF11000C35E3 /* Localizable.strings */,
|
5CC2C0FA2809BF11000C35E3 /* Localizable.strings */,
|
||||||
5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */,
|
5C422A7C27A9A6FA0097A1E1 /* SimpleX (iOS).entitlements */,
|
||||||
@@ -687,6 +687,14 @@
|
|||||||
path = "Tests iOS";
|
path = "Tests iOS";
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
5CA8D01B2AD9B076001FD661 /* RemoteAccess */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
5C3CCFCB2AE6BD3100C3F0C3 /* ConnectDesktopView.swift */,
|
||||||
|
);
|
||||||
|
path = RemoteAccess;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
5CB0BA8C282711BC00B3292C /* Onboarding */ = {
|
5CB0BA8C282711BC00B3292C /* Onboarding */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
@@ -1050,7 +1058,6 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
5C55A92E283D0FDE00C4E99E /* sounds in Resources */,
|
5C55A92E283D0FDE00C4E99E /* sounds in Resources */,
|
||||||
3C71477A281C0F6800CB4D4B /* www in Resources */,
|
|
||||||
5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */,
|
5CA059EF279559F40002BEB4 /* Assets.xcassets in Resources */,
|
||||||
5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */,
|
5CC2C0FC2809BF11000C35E3 /* Localizable.strings in Resources */,
|
||||||
5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */,
|
5CC2C0FF2809BF11000C35E3 /* SimpleX--iOS--InfoPlist.strings in Resources */,
|
||||||
@@ -1174,6 +1181,7 @@
|
|||||||
6454036F2822A9750090DDFF /* ComposeFileView.swift in Sources */,
|
6454036F2822A9750090DDFF /* ComposeFileView.swift in Sources */,
|
||||||
5C5DB70E289ABDD200730FFF /* AppearanceSettings.swift in Sources */,
|
5C5DB70E289ABDD200730FFF /* AppearanceSettings.swift in Sources */,
|
||||||
5C5F2B6D27EBC3FE006A9D5F /* ImagePicker.swift in Sources */,
|
5C5F2B6D27EBC3FE006A9D5F /* ImagePicker.swift in Sources */,
|
||||||
|
5C3CCFCC2AE6BD3100C3F0C3 /* ConnectDesktopView.swift in Sources */,
|
||||||
5C9C2DA92899DA6F00CC63B1 /* NetworkAndServers.swift in Sources */,
|
5C9C2DA92899DA6F00CC63B1 /* NetworkAndServers.swift in Sources */,
|
||||||
5C6BA667289BD954009B8ECC /* DismissSheets.swift in Sources */,
|
5C6BA667289BD954009B8ECC /* DismissSheets.swift in Sources */,
|
||||||
5C577F7D27C83AA10006112D /* MarkdownHelp.swift in Sources */,
|
5C577F7D27C83AA10006112D /* MarkdownHelp.swift in Sources */,
|
||||||
@@ -1486,7 +1494,7 @@
|
|||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 173;
|
CURRENT_PROJECT_VERSION = 181;
|
||||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -1494,6 +1502,7 @@
|
|||||||
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
|
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
|
||||||
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
INFOPLIST_KEY_NSFaceIDUsageDescription = "SimpleX uses Face ID for local authentication";
|
INFOPLIST_KEY_NSFaceIDUsageDescription = "SimpleX uses Face ID for local authentication";
|
||||||
|
INFOPLIST_KEY_NSLocalNetworkUsageDescription = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
INFOPLIST_KEY_NSMicrophoneUsageDescription = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
INFOPLIST_KEY_NSMicrophoneUsageDescription = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SimpleX needs access to Photo Library for saving captured and received media";
|
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SimpleX needs access to Photo Library for saving captured and received media";
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
@@ -1507,7 +1516,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 5.3;
|
MARKETING_VERSION = 5.4;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
|
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
|
||||||
PRODUCT_NAME = SimpleX;
|
PRODUCT_NAME = SimpleX;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
@@ -1528,7 +1537,7 @@
|
|||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
CODE_SIGN_ENTITLEMENTS = "SimpleX (iOS).entitlements";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 173;
|
CURRENT_PROJECT_VERSION = 181;
|
||||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
ENABLE_PREVIEWS = YES;
|
ENABLE_PREVIEWS = YES;
|
||||||
@@ -1536,6 +1545,7 @@
|
|||||||
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
|
INFOPLIST_FILE = "SimpleX--iOS--Info.plist";
|
||||||
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
INFOPLIST_KEY_NSCameraUsageDescription = "SimpleX needs camera access to scan QR codes to connect to other users and for video calls.";
|
||||||
INFOPLIST_KEY_NSFaceIDUsageDescription = "SimpleX uses Face ID for local authentication";
|
INFOPLIST_KEY_NSFaceIDUsageDescription = "SimpleX uses Face ID for local authentication";
|
||||||
|
INFOPLIST_KEY_NSLocalNetworkUsageDescription = "SimpleX uses local network access to allow using user chat profile via desktop app on the same network.";
|
||||||
INFOPLIST_KEY_NSMicrophoneUsageDescription = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
INFOPLIST_KEY_NSMicrophoneUsageDescription = "SimpleX needs microphone access for audio and video calls, and to record voice messages.";
|
||||||
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SimpleX needs access to Photo Library for saving captured and received media";
|
INFOPLIST_KEY_NSPhotoLibraryAddUsageDescription = "SimpleX needs access to Photo Library for saving captured and received media";
|
||||||
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
INFOPLIST_KEY_UIApplicationSceneManifest_Generation = YES;
|
||||||
@@ -1549,7 +1559,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 5.3;
|
MARKETING_VERSION = 5.4;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
|
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.app;
|
||||||
PRODUCT_NAME = SimpleX;
|
PRODUCT_NAME = SimpleX;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
@@ -1608,7 +1618,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 173;
|
CURRENT_PROJECT_VERSION = 181;
|
||||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -1621,7 +1631,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 5.3;
|
MARKETING_VERSION = 5.4;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
|
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
@@ -1640,7 +1650,7 @@
|
|||||||
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
CODE_SIGN_ENTITLEMENTS = "SimpleX NSE/SimpleX NSE.entitlements";
|
||||||
CODE_SIGN_IDENTITY = "Apple Development";
|
CODE_SIGN_IDENTITY = "Apple Development";
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 173;
|
CURRENT_PROJECT_VERSION = 181;
|
||||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||||
ENABLE_BITCODE = NO;
|
ENABLE_BITCODE = NO;
|
||||||
GENERATE_INFOPLIST_FILE = YES;
|
GENERATE_INFOPLIST_FILE = YES;
|
||||||
@@ -1653,7 +1663,7 @@
|
|||||||
"@executable_path/Frameworks",
|
"@executable_path/Frameworks",
|
||||||
"@executable_path/../../Frameworks",
|
"@executable_path/../../Frameworks",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 5.3;
|
MARKETING_VERSION = 5.4;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
|
PRODUCT_BUNDLE_IDENTIFIER = "chat.simplex.app.SimpleX-NSE";
|
||||||
PRODUCT_NAME = "$(TARGET_NAME)";
|
PRODUCT_NAME = "$(TARGET_NAME)";
|
||||||
PROVISIONING_PROFILE_SPECIFIER = "";
|
PROVISIONING_PROFILE_SPECIFIER = "";
|
||||||
@@ -1672,7 +1682,7 @@
|
|||||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 173;
|
CURRENT_PROJECT_VERSION = 181;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
@@ -1696,7 +1706,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/Libraries/sim",
|
"$(PROJECT_DIR)/Libraries/sim",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 5.3;
|
MARKETING_VERSION = 5.4;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
|
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
@@ -1718,7 +1728,7 @@
|
|||||||
APPLICATION_EXTENSION_API_ONLY = YES;
|
APPLICATION_EXTENSION_API_ONLY = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
CODE_SIGN_STYLE = Automatic;
|
CODE_SIGN_STYLE = Automatic;
|
||||||
CURRENT_PROJECT_VERSION = 173;
|
CURRENT_PROJECT_VERSION = 181;
|
||||||
DEFINES_MODULE = YES;
|
DEFINES_MODULE = YES;
|
||||||
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
DEVELOPMENT_TEAM = 5NN7GUYB6T;
|
||||||
DYLIB_COMPATIBILITY_VERSION = 1;
|
DYLIB_COMPATIBILITY_VERSION = 1;
|
||||||
@@ -1742,7 +1752,7 @@
|
|||||||
"$(inherited)",
|
"$(inherited)",
|
||||||
"$(PROJECT_DIR)/Libraries/sim",
|
"$(PROJECT_DIR)/Libraries/sim",
|
||||||
);
|
);
|
||||||
MARKETING_VERSION = 5.3;
|
MARKETING_VERSION = 5.4;
|
||||||
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
|
PRODUCT_BUNDLE_IDENTIFIER = chat.simplex.SimpleXChat;
|
||||||
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
|
|||||||
@@ -50,6 +50,13 @@ public func chatMigrateInit(_ useKey: String? = nil, confirmMigrations: Migratio
|
|||||||
return result
|
return result
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func chatCloseStore() {
|
||||||
|
let err = fromCString(chat_close_store(getChatCtrl()))
|
||||||
|
if err != "" {
|
||||||
|
logger.error("chatCloseStore error: \(err)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public func resetChatCtrl() {
|
public func resetChatCtrl() {
|
||||||
chatController = nil
|
chatController = nil
|
||||||
migrationResult = nil
|
migrationResult = nil
|
||||||
@@ -132,8 +139,11 @@ public func chatResponse(_ s: String) -> ChatResponse {
|
|||||||
var type: String?
|
var type: String?
|
||||||
var json: String?
|
var json: String?
|
||||||
if let j = try? JSONSerialization.jsonObject(with: d) as? NSDictionary {
|
if let j = try? JSONSerialization.jsonObject(with: d) as? NSDictionary {
|
||||||
if let jResp = j["resp"] as? NSDictionary, jResp.count == 1 {
|
if let jResp = j["resp"] as? NSDictionary, jResp.count == 1 || jResp.count == 2 {
|
||||||
type = jResp.allKeys[0] as? String
|
type = jResp.allKeys[0] as? String
|
||||||
|
if jResp.count == 2 && type == "_owsf" {
|
||||||
|
type = jResp.allKeys[1] as? String
|
||||||
|
}
|
||||||
if type == "apiChats" {
|
if type == "apiChats" {
|
||||||
if let jApiChats = jResp["apiChats"] as? NSDictionary,
|
if let jApiChats = jResp["apiChats"] as? NSDictionary,
|
||||||
let user: UserRef = try? decodeObject(jApiChats["user"] as Any),
|
let user: UserRef = try? decodeObject(jApiChats["user"] as Any),
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user