mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2024-12-17 17:20:21 +01:00
Compare commits
225 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| c2c689ca91 | |||
| 56922c6323 | |||
| 91823eec95 | |||
| 8547fab700 | |||
| 5c078f91fc | |||
| ec444e7ce1 | |||
| e69d94896d | |||
| a134b3cb2f | |||
| ab24369333 | |||
| 026a8022e0 | |||
| 592b8d49d0 | |||
| af7ebe1587 | |||
| dc1106afad | |||
| cc9b4f3bb3 | |||
| 533d0e40ac | |||
| d9ad755474 | |||
| 15ca662805 | |||
| 2a8df6ace1 | |||
| bbe614aef7 | |||
| ab034e626f | |||
| fc83bc692a | |||
| d20d444e6e | |||
| fc0879ebb7 | |||
| 63ffcbc4e7 | |||
| 01edff3ca3 | |||
| cd9aa120bc | |||
| f048ddb922 | |||
| 0e39a62ab1 | |||
| 53f0fe9ca4 | |||
| 95c1d8d798 | |||
| 86dce0921e | |||
| 4a39b481b1 | |||
| e21d49db18 | |||
| 73673ab073 | |||
| 65c7ecbddf | |||
| ff065d7720 | |||
| 07165039a8 | |||
| 67472b6285 | |||
| 240aa6a2b1 | |||
| 9199fbffd5 | |||
| fcde05e9a4 | |||
| cabf8aba16 | |||
| de594aac88 | |||
| 6e5eb697a2 | |||
| 91f3335503 | |||
| 2663e6330a | |||
| f28a5b6e92 | |||
| e2e6935e5b | |||
| 769ef25c31 | |||
| 2f730d54e9 | |||
| fe0013c4a9 | |||
| 5261886b31 | |||
| 93ab3076d4 | |||
| 3b88ddbd4f | |||
| 54ff95f350 | |||
| d6dc35738e | |||
| 5b3aba9db2 | |||
| d59fdb1e09 | |||
| 4526afe7e9 | |||
| c67302a5bb | |||
| 3685c85743 | |||
| 0f301adc57 | |||
| 1f226dda64 | |||
| b4ec4df687 | |||
| f154a0bcb4 | |||
| ce5d113ff6 | |||
| a35b20f54c | |||
| 981cbb8bf9 | |||
| d5507f2fa3 | |||
| 55d180466a | |||
| 8a906485d1 | |||
| e79fa136a4 | |||
| 560b521673 | |||
| c849f5356d | |||
| 33e12e35a0 | |||
| 8a70bad9af | |||
| efb7fc6c3b | |||
| 630fea42c3 | |||
| 68e570656d | |||
| 3cbb2c2d71 | |||
| 5ca27f63e6 | |||
| 63d1b2060e | |||
| 25fb099c44 | |||
| d69e222b7b | |||
| f7cb6f2796 | |||
| c5813b3489 | |||
| 10ded1530c | |||
| 255538e5d7 | |||
| acc9be1a5b | |||
| d47ff3597d | |||
| 529921e16a | |||
| 0a4667304c | |||
| 17a0f3a210 | |||
| c13e8e4037 | |||
| 3a61290730 | |||
| 166082c021 | |||
| 69bbe0ae91 | |||
| 0d9ef4e567 | |||
| 17b55c51c5 | |||
| 665d9dcd00 | |||
| c13c7baaaf | |||
| af993529f9 | |||
| 05aab35a1f | |||
| 40e93cc61e | |||
| ea320f531f | |||
| 4f99075b14 | |||
| de7882c904 | |||
| 0cad378bc5 | |||
| da058ca376 | |||
| c22d23750f | |||
| b5f91f2d31 | |||
| c6ab8ec6b3 | |||
| 4447b66b4e | |||
| 2539255957 | |||
| 4cfda91124 | |||
| 7aec147cec | |||
| f6f2044675 | |||
| 5f0b5c5a9f | |||
| dfdb4af646 | |||
| 2ab5f14119 | |||
| 46d774a822 | |||
| acf2f1fbbe | |||
| 1a853d4eea | |||
| 3ea8279451 | |||
| 87c55dbbf7 | |||
| fb4475027d | |||
| 388609563d | |||
| 0cb568d206 | |||
| 8f6e9741e7 | |||
| e00001b571 | |||
| 351cfcbcbc | |||
| 74b837bf9a | |||
| 691cd489ea | |||
| 5ed701402b | |||
| 1839dab17b | |||
| 06939343a1 | |||
| b2ebb81fcf | |||
| bccbb9900f | |||
| 1f3355921c | |||
| 9e45f68a6e | |||
| ebb5d629e7 | |||
| e002f33c53 | |||
| 71bea947a5 | |||
| 90d5abdff1 | |||
| 6407d5de63 | |||
| 9cba96082d | |||
| 2089fd8539 | |||
| 31c4ff2705 | |||
| 33895b0330 | |||
| fe20a43232 | |||
| 087519c39d | |||
| 3b49817f17 | |||
| f94f0dea08 | |||
| d68a3ba80d | |||
| 7a4dca1e4c | |||
| fff29f8548 | |||
| 8cc03b6c21 | |||
| 7a5b04d523 | |||
| d7ab0aef14 | |||
| 41cb734d56 | |||
| 6adf8f29b0 | |||
| 4ca1b57e1b | |||
| 9432a5e5cd | |||
| a9ec1f9ec1 | |||
| 122387d180 | |||
| 23f54c1022 | |||
| 0b0b78293f | |||
| eef1e97ecc | |||
| 564b137f95 | |||
| 6edea46dad | |||
| 2fe3acf4df | |||
| 1c64b17545 | |||
| 700918f0ca | |||
| 94c552ca12 | |||
| dfe16991d0 | |||
| acb372a4ce | |||
| 121eaf6073 | |||
| 8cc075eda8 | |||
| 05e7f35037 | |||
| e582d2d742 | |||
| 043a4ed915 | |||
| 76cb9013f5 | |||
| f1e8c65aa1 | |||
| 8a6bf05773 | |||
| 0118e64ab4 | |||
| 0477b1aad3 | |||
| ae850c8ce8 | |||
| 94ae571ec3 | |||
| 4552860345 | |||
| a1579810bb | |||
| 4574198990 | |||
| 4d18174b11 | |||
| defd095a4f | |||
| ed60f28e56 | |||
| f0b889ffcf | |||
| c07df9e05f | |||
| efe8ed1739 | |||
| bcd50019be | |||
| 7b48c59f9f | |||
| 04033fc0b5 | |||
| 7b90e01b3a | |||
| ef1897f865 | |||
| f587179045 | |||
| 791489e943 | |||
| c485837910 | |||
| a95415fa1a | |||
| 8d48c4b14c | |||
| 9f44242e4c | |||
| 7e7d93c596 | |||
| 073818db55 | |||
| 519dd9e219 | |||
| 94218a1a7e | |||
| 996c6efddd | |||
| fd9c080103 | |||
| 5cb8badb22 | |||
| 0438f35539 | |||
| d5eb7b7811 | |||
| e04f74738e | |||
| 5f0ccb9f17 | |||
| b2d18f6960 | |||
| b52dfee078 | |||
| 70991debfd | |||
| 885aa9cfa5 | |||
| 75a468434c | |||
| 3b98032371 |
@@ -5,12 +5,22 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- stable
|
- stable
|
||||||
- users
|
|
||||||
tags:
|
tags:
|
||||||
- "v*"
|
- "v*"
|
||||||
- "!*-fdroid"
|
- "!*-fdroid"
|
||||||
- "!*-armv7a"
|
- "!*-armv7a"
|
||||||
pull_request:
|
pull_request:
|
||||||
|
paths-ignore:
|
||||||
|
- "apps/ios"
|
||||||
|
- "apps/multiplatform"
|
||||||
|
- "blog"
|
||||||
|
- "docs"
|
||||||
|
- "fastlane"
|
||||||
|
- "images"
|
||||||
|
- "packages"
|
||||||
|
- "website"
|
||||||
|
- "README.md"
|
||||||
|
- "PRIVACY.md"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
prepare-release:
|
prepare-release:
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ website/package/generated*
|
|||||||
# Ignore build tool output, e.g. code coverage
|
# Ignore build tool output, e.g. code coverage
|
||||||
website/.nyc_output/
|
website/.nyc_output/
|
||||||
website/coverage/
|
website/coverage/
|
||||||
|
result
|
||||||
|
|
||||||
# Ignore API documentation
|
# Ignore API documentation
|
||||||
website/api-docs/
|
website/api-docs/
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ You must:
|
|||||||
|
|
||||||
Messages not following these rules will be deleted, the right to send messages may be revoked, and the access to the new members to the group may be temporarily restricted, to prevent re-joining under a different name - our imperfect group moderation does not have a better solution at the moment.
|
Messages not following these rules will be deleted, the right to send messages may be revoked, and the access to the new members to the group may be temporarily restricted, to prevent re-joining under a different name - our imperfect group moderation does not have a better solution at the moment.
|
||||||
|
|
||||||
You can join an English-speaking users group if you want to ask any questions: [#SimpleX users group](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2Fos8FftfoV8zjb2T89fUEjJtF7y64p5av%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAQqMgh0fw2lPhjn3PDIEfAKA_E0-gf8Hr8zzhYnDivRs%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22lBPiveK2mjfUH43SN77R0w%3D%3D%22%7D)
|
You can join an English-speaking users group if you want to ask any questions: [#SimpleX users group](https://simplex.chat/contact#/?v=2-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2Fos8FftfoV8zjb2T89fUEjJtF7y64p5av%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAQqMgh0fw2lPhjn3PDIEfAKA_E0-gf8Hr8zzhYnDivRs%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22lBPiveK2mjfUH43SN77R0w%3D%3D%22%7D)
|
||||||
|
|
||||||
There is also a group [#simplex-devs](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FvYCRjIflKNMGYlfTkuHe4B40qSlQ0439%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAHNdcqNbzXZhyMoSBjT2R0-Eb1EPaLyUg3KZjn-kmM1w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22PD20tcXjw7IpkkMCfR6HLA%3D%3D%22%7D) for developers who build on SimpleX platform:
|
There is also a group [#simplex-devs](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FvYCRjIflKNMGYlfTkuHe4B40qSlQ0439%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAHNdcqNbzXZhyMoSBjT2R0-Eb1EPaLyUg3KZjn-kmM1w%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22PD20tcXjw7IpkkMCfR6HLA%3D%3D%22%7D) for developers who build on SimpleX platform:
|
||||||
|
|
||||||
@@ -83,7 +83,7 @@ There is also a group [#simplex-devs](https://simplex.chat/contact#/?v=1-4&smp=s
|
|||||||
|
|
||||||
There are groups in other languages, that we have the apps interface translated into. These groups are for testing, and asking questions to other SimpleX Chat users:
|
There are groups in other languages, that we have the apps interface translated into. These groups are for testing, and asking questions to other SimpleX Chat users:
|
||||||
|
|
||||||
[\#SimpleX-DE](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FkIEl7OQzcp-J6aDmjdlQbRJwqkcZE7XR%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAR16PCu02MobRmKAsjzhDWMZcWP9hS8l5AUZi-Gs8z18%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22puYPMCQt11yPUvgmI5jCiw%3D%3D%22%7D) (German-speaking), [\#SimpleX-ES](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FaJ8O1O8A8GbeoaHTo_V8dcefaCl7ouPb%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA034qWTA3sWcTsi6aWhNf9BA34vKVCFaEBdP2R66z6Ao%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22wiZ1v_wNjLPlT-nCSB-bRA%3D%3D%22%7D) (Spanish-speaking), [\#SimpleX-FR](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FvIHQDxTor53nwnWWTy5cHNwQQAdWN5Hw%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAPdgK1eBnETmgiqEQufbUkydKBJafoRx4iRrtrC2NAGc%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%221FyUryBPza-1ZFFE80Ekbg%3D%3D%22%7D) (French-speaking), [\#SimpleX-RU](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FXZyt3hJmWsycpN7Dqve_wbrAqb6myk1R%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAMFVIoytozTEa_QXOgoZFq_oe0IwZBYKvW50trSFXzXo%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22xz05ngjA3pNIxLZ32a8Vxg%3D%3D%22%7D) (Russian-speaking), [\#SimpleX-IT](https://simplex.chat/contact#/?v=1-2&smp=smp%3A%2F%2Fu2dS9sG8nMNURyZwqASV4yROM28Er0luVTx5X1CsMrU%3D%40smp4.simplex.im%2F0weR-ZgDUl7ruOtI_8TZwEsnJP6UiImA%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAq4PSThO9Fvb5ydF48wB0yNbpzCbuQJCW3vZ9BGUfcxk%253D%26srv%3Do5vmywmrnaxalvz6wi3zicyftgio6psuvyniis6gco6bp6ekl4cqj4id.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22e-iceLA0SctC62eARgYDWg%3D%3D%22%7D) (Italian-speaking).
|
[\#SimpleX-DE](https://simplex.chat/contact#/?v=1-4&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FmfiivxDKWFuowXrQOp11jsY8TuP__rBL%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAiz3pKNwvKudckFYMUfgoT0s96B0jfZ7ALHAu7rtE9HQ%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22jZeJpXGrRXQJU_-MSJ_v2A%3D%3D%22%7D) (German-speaking), [\#SimpleX-ES](https://simplex.chat/contact#/?v=2-4&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FJ5ES83pJimY2BRklS8fvy_iQwIU37xra%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEA0F0STP6UqN_12_k2cjjTrIjFgBGeWhOAmbY1qlk3pnM%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22VmUU0fqmYdCRmVCyvStvHA%3D%3D%22%7D) (Spanish-speaking), [\#SimpleX-FR](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FxCHBE_6PBRMqNEpm4UQDHXb9cz-mN7dd%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEAetqlcM7zTCRw-iatnwCrvpJSto7lq5Yv6AsBMWv7GSM%253D%26srv%3Dbylepyau3ty4czmn77q4fglvperknl4bi2eb2fdy2bh4jxtf32kf73yd.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22foO5Xw4hhjOa_x7zET7otw%3D%3D%22%7D) (French-speaking), [\#SimpleX-RU](https://simplex.chat/contact#/?v=2-4&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FVXQTB0J2lLjYkgjWByhl6-1qmb5fgZHh%23%2F%3Fv%3D1-2%26dh%3DMCowBQYDK2VuAyEAI6JaEWezfSwvcoTEkk6au-gkjrXR2ew2OqZYMYBvayk%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%22ORH9OEe8Duissh-hslfeVg%3D%3D%22%7D) (Russian-speaking), [\#SimpleX-IT](https://simplex.chat/contact#/?v=2-7&smp=smp%3A%2F%2Fhpq7_4gGJiilmz5Rf-CswuU5kZGkm_zOIooSw6yALRg%3D%40smp5.simplex.im%2FqpHu0psOUdYfc11yQCzSyq5JhijrBzZT%23%2F%3Fv%3D1-3%26dh%3DMCowBQYDK2VuAyEACZ_7fbwlM45wl6cGif8cY47oPQ_AMdP0ATqOYLA6zHY%253D%26srv%3Djjbyvoemxysm7qxap7m5d5m35jzv5qq6gnlv7s4rsn7tdwwmuqciwpid.onion&data=%7B%22type%22%3A%22group%22%2C%22groupLinkId%22%3A%229uRQRTir3ealdcSfB0zsrw%3D%3D%22%7D) (Italian-speaking).
|
||||||
|
|
||||||
You can join either by opening these links in the app or by opening them in a desktop browser and scanning the QR code.
|
You can join either by opening these links in the app or by opening them in a desktop browser and scanning the QR code.
|
||||||
|
|
||||||
@@ -300,25 +300,27 @@ What is already implemented:
|
|||||||
1. Instead of user profile identifiers used by all other platforms, even the most private ones, SimpleX uses [pairwise per-queue identifiers](./docs/GLOSSARY.md#pairwise-pseudonymous-identifier) (2 addresses for each unidirectional message queue, with an optional 3rd address for push notifications on iOS, 2 queues in each connection between the users). It makes observing the network graph on the application level more difficult, as for `n` users there can be up to `n * (n-1)` message queues.
|
1. Instead of user profile identifiers used by all other platforms, even the most private ones, SimpleX uses [pairwise per-queue identifiers](./docs/GLOSSARY.md#pairwise-pseudonymous-identifier) (2 addresses for each unidirectional message queue, with an optional 3rd address for push notifications on iOS, 2 queues in each connection between the users). It makes observing the network graph on the application level more difficult, as for `n` users there can be up to `n * (n-1)` message queues.
|
||||||
2. [End-to-end encryption](./docs/GLOSSARY.md#end-to-end-encryption) in each message queue using [NaCl cryptobox](https://nacl.cr.yp.to/box.html). This is added to allow redundancy in the future (passing each message via several servers), to avoid having the same ciphertext in different queues (that would only be visible to the attacker if TLS is compromised). The encryption keys used for this encryption are not rotated, instead we are planning to rotate the queues. Curve25519 keys are used for key negotiation.
|
2. [End-to-end encryption](./docs/GLOSSARY.md#end-to-end-encryption) in each message queue using [NaCl cryptobox](https://nacl.cr.yp.to/box.html). This is added to allow redundancy in the future (passing each message via several servers), to avoid having the same ciphertext in different queues (that would only be visible to the attacker if TLS is compromised). The encryption keys used for this encryption are not rotated, instead we are planning to rotate the queues. Curve25519 keys are used for key negotiation.
|
||||||
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. [Post-quantum resistant key exchange](./docs/GLOSSARY.md#post-quantum-cryptography) in double ratchet protocol *on every ratchet step*. Read more in [this post](./blog/20240314-simplex-chat-v5-6-quantum-resistance-signal-double-ratchet-algorithm.md) and also see this [publication by Apple]( https://security.apple.com/blog/imessage-pq3/) explaining the need for post-quantum key rotation.
|
||||||
5. Several levels of [content padding](./docs/GLOSSARY.md#message-padding) to frustrate message size attacks.
|
5. 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).
|
||||||
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.
|
6. Several levels of [content padding](./docs/GLOSSARY.md#message-padding) to frustrate message size attacks.
|
||||||
7. Only TLS 1.2/1.3 are allowed for client-server connections, limited to cryptographic algorithms: CHACHA20POLY1305_SHA256, Ed25519/Ed448, Curve25519/Curve448.
|
7. 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.
|
||||||
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. Only TLS 1.2/1.3 are allowed for client-server connections, limited to cryptographic algorithms: CHACHA20POLY1305_SHA256, Ed25519/Ed448, Curve25519/Curve448.
|
||||||
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 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.
|
||||||
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. To protect your IP address from unknown messaging relays, and for per-message transport anonymity (compared with Tor/VPN per-connection anonymity), from v6.0 all SimpleX Chat clients use private message routing by default. Read more in [this post](./blog/20240604-simplex-chat-v5.8-private-message-routing-chat-themes.md#private-message-routing).
|
||||||
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. To protect your IP address from unknown file relays, when SOCKS proxy is not enabled SimpleX Chat clients ask for a confirmation before downloading the files from unknown servers.
|
||||||
12. Manual messaging queue rotations to move conversation to another SMP relay.
|
12. To protect your IP address from known servers 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.
|
||||||
13. Sending end-to-end encrypted files using [XFTP protocol](https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html).
|
13. 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.
|
||||||
14. Local files encryption.
|
14. Transport isolation - different TCP connections and Tor circuits are used for traffic of different user profiles, optionally - for different contacts and group member connections.
|
||||||
|
15. Manual messaging queue rotations to move conversation to another SMP relay.
|
||||||
|
16. Sending end-to-end encrypted files using [XFTP protocol](https://simplex.chat/blog/20230301-simplex-file-transfer-protocol.html).
|
||||||
|
17. Local files encryption.
|
||||||
|
|
||||||
We plan to add:
|
We plan to add:
|
||||||
|
|
||||||
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.
|
1. 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).
|
||||||
2. Post-quantum resistant key exchange in double ratchet protocol.
|
2. Message "mixing" - adding latency to message delivery, to protect against traffic correlation by message time.
|
||||||
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. 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.
|
||||||
4. Message "mixing" - adding latency to message delivery, to protect against traffic correlation by message time.
|
4. Recipients' XFTP relays to reduce traffic and conceal IP addresses from the relays chosen, and potentially controlled, by another party.
|
||||||
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.
|
|
||||||
|
|
||||||
## For developers
|
## For developers
|
||||||
|
|
||||||
|
|||||||
@@ -15,16 +15,11 @@ class AppDelegate: NSObject, UIApplicationDelegate {
|
|||||||
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
|
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
|
||||||
logger.debug("AppDelegate: didFinishLaunchingWithOptions")
|
logger.debug("AppDelegate: didFinishLaunchingWithOptions")
|
||||||
application.registerForRemoteNotifications()
|
application.registerForRemoteNotifications()
|
||||||
NotificationCenter.default.addObserver(self, selector: #selector(pasteboardChanged), name: UIPasteboard.changedNotification, object: nil)
|
|
||||||
removePasscodesIfReinstalled()
|
removePasscodesIfReinstalled()
|
||||||
prepareForLaunch()
|
prepareForLaunch()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@objc func pasteboardChanged() {
|
|
||||||
ChatModel.shared.pasteboardHasStrings = UIPasteboard.general.hasStrings
|
|
||||||
}
|
|
||||||
|
|
||||||
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
|
func application(_ application: UIApplication, didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
|
||||||
let token = deviceToken.map { String(format: "%02hhx", $0) }.joined()
|
let token = deviceToken.map { String(format: "%02hhx", $0) }.joined()
|
||||||
logger.debug("AppDelegate: didRegisterForRemoteNotificationsWithDeviceToken \(token)")
|
logger.debug("AppDelegate: didRegisterForRemoteNotificationsWithDeviceToken \(token)")
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"info": {
|
||||||
|
"author": "xcode",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"symbols": [
|
||||||
|
{
|
||||||
|
"filename": "checkmark.2.svg",
|
||||||
|
"idiom": "universal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,227 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="3300px" height="2200px" viewBox="0 0 3300 2200" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>checkmark.2</title>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="double.checkmark">
|
||||||
|
<g id="Notes">
|
||||||
|
<rect id="artboard" fill="#FFFFFF" fill-rule="nonzero" x="0" y="0" width="3300" height="2200"></rect>
|
||||||
|
<line x1="263" y1="292" x2="3036" y2="292" id="Path" stroke="#000000" stroke-width="0.5"></line>
|
||||||
|
<text id="Weight/Scale-Variations" fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="322">Weight/Scale Variations</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Ultralight" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="533.711" y="322">Ultralight</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Thin" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="843.422" y="322">Thin</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Light" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1138.63" y="322">Light</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Regular" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1426.84" y="322">Regular</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Medium" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1723.06" y="322">Medium</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Semibold" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2015.77" y="322">Semibold</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Bold" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2326.48" y="322">Bold</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Heavy" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2618.19" y="322">Heavy</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Black" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2917.4" y="322">Black</tspan>
|
||||||
|
</text>
|
||||||
|
<line x1="263" y1="1903" x2="3036" y2="1903" id="Path" stroke="#000000" stroke-width="0.5"></line>
|
||||||
|
<g id="Group" transform="translate(264.3672, 1918.0684)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M7.88088,15.76172 C12.18752,15.76172 15.7715,12.1875 15.7715,7.88086 C15.7715,3.57422 12.17774,0 7.8711,0 C3.57422,0 0,3.57422 0,7.88086 C0,12.1875 3.58398,15.76172 7.88086,15.76172 L7.88088,15.76172 Z M7.88088,14.277344 C4.33596,14.277344 1.50392,11.435544 1.50392,7.880864 C1.50392,4.326184 4.32618,1.484384 7.8711,1.484384 C11.42578,1.484384 14.27734,4.326184 14.27734,7.880864 C14.27734,11.435544 11.43554,14.277344 7.88086,14.277344 L7.88088,14.277344 Z M4.28712,7.880864 C4.28712,8.310552 4.589854,8.60352 5.039074,8.60352 L7.138674,8.60352 L7.138674,10.72266 C7.138674,11.162114 7.431642,11.464848 7.86133,11.464848 C8.310548,11.464848 8.603518,11.162114 8.603518,10.72266 L8.603518,8.60352 L10.722658,8.60352 C11.162112,8.60352 11.464846,8.310552 11.464846,7.880864 C11.464846,7.44141 11.162112,7.138676 10.722658,7.138676 L8.603518,7.138676 L8.603518,5.029296 C8.603518,4.580078 8.31055,4.277342 7.86133,4.277342 C7.431642,4.277342 7.138674,4.580076 7.138674,5.029296 L7.138674,7.138676 L5.039074,7.138676 C4.589856,7.138676 4.28712,7.44141 4.28712,7.880864 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(283.254, 1915.9883)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M9.96094,19.92188 C15.41016,19.92188 19.92188,15.4004 19.92188,9.96094 C19.92188,4.51172 15.4004,0 9.95118,0 C4.51172,0 0,4.51172 0,9.96094 C0,15.4004 4.52148,19.92188 9.96094,19.92188 Z M9.96094,18.261724 C5.35156,18.261724 1.66992,14.570324 1.66992,9.960944 C1.66992,5.351564 5.3418,1.660164 9.95116,1.660164 C14.56052,1.660164 18.2617,5.351564 18.2617,9.960944 C18.2617,14.570324 14.5703,18.261724 9.96092,18.261724 L9.96094,18.261724 Z M5.4297,9.960944 C5.4297,10.43946 5.761732,10.761726 6.259778,10.761726 L9.130878,10.761726 L9.130878,13.642586 C9.130878,14.130868 9.46291,14.472664 9.941424,14.472664 C10.4297,14.472664 10.771502,14.140632 10.771502,13.642586 L10.771502,10.761726 L13.652362,10.761726 C14.140644,10.761726 14.48244,10.43946 14.48244,9.960944 C14.48244,9.472662 14.140644,9.130866 13.652362,9.130866 L10.771502,9.130866 L10.771502,6.259766 C10.771502,5.76172 10.4297,5.419922 9.941424,5.419922 C9.462908,5.419922 9.130878,5.761718 9.130878,6.259766 L9.130878,9.130866 L6.259778,9.130866 C5.761732,9.130866 5.4297,9.472662 5.4297,9.960944 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(307.1798, 1913.2246)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M12.71486,25.43944 C19.67776,25.43944 25.43946,19.67772 25.43946,12.7246 C25.43946,5.7617 19.66798,0 12.70508,0 C5.75196,0 -1.42108547e-15,5.76172 -1.42108547e-15,12.7246 C-1.42108547e-15,19.67772 5.76172,25.43944 12.71484,25.43944 L12.71486,25.43944 Z M12.71486,23.623034 C6.6797,23.623034 1.82618,18.759754 1.82618,12.724594 C1.82618,6.679674 6.66994,1.826154 12.70508,1.826154 C18.75,1.826154 23.61328,6.679674 23.61328,12.724594 C23.61328,18.759754 18.75976,23.623034 12.71484,23.623034 L12.71486,23.623034 Z M6.94338,12.724594 C6.94338,13.242172 7.314474,13.6035 7.861348,13.6035 L11.806668,13.6035 L11.806668,17.55858 C11.806668,18.09569 12.177762,18.476548 12.69534,18.476548 C13.23245,18.476548 13.603544,18.105454 13.603544,17.55858 L13.603544,13.6035 L17.558624,13.6035 C18.095734,13.6035 18.476592,13.242172 18.476592,12.724594 C18.476592,12.177718 18.105498,11.806626 17.558624,11.806626 L13.603544,11.806626 L13.603544,7.861306 C13.603544,7.31443 13.23245,6.933572 12.69534,6.933572 C12.177762,6.933572 11.806668,7.314432 11.806668,7.861306 L11.806668,11.806626 L7.861348,11.806626 C7.314472,11.806626 6.94338,12.17772 6.94338,12.724594 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<text id="Design-Variations" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="1953">Design Variations</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Symbols-are-supported-in-up-to-nine-weights-and-three-scales." fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="1971">Symbols are supported in up to nine weights and three scales.</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="For-optimal-layout-with-text-and-other-symbols,-vertically-align" fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="1989">For optimal layout with text and other symbols, vertically align</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="symbols-with-the-adjacent-text." fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="2007">symbols with the adjacent text.</tspan>
|
||||||
|
</text>
|
||||||
|
<line x1="776" y1="1919" x2="776" y2="1933" id="Path" stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<g id="Group" transform="translate(778.4902, 1918.7324)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0.8203116,14.423832 C1.3378896,14.423832 1.5917956,14.2285116 1.7773436,13.681636 L3.0371096,10.234376 L8.7988296,10.234376 L10.0585956,13.681636 C10.2441424,14.228512 10.4980496,14.423832 11.0058616,14.423832 C11.5234396,14.423832 11.8554716,14.111324 11.8554716,13.623042 C11.8554716,13.4570264 11.8261748,13.300776 11.7480498,13.095698 L7.1679698,0.898438 C6.9433598,0.302734 6.5429698,0 5.9179698,0 C5.3125018,0 4.9023458,0.292968 4.6875018,0.888672 L0.1074218,13.105472 C0.0292968,13.31055 -3.55271368e-16,13.4668 -3.55271368e-16,13.632816 C-3.55271368e-16,14.121098 0.3125,14.423832 0.820312,14.423832 L0.8203116,14.423832 Z M3.5156316,8.750004 L5.8886716,2.177744 L5.9374998,2.177744 L8.3105398,8.750004 L3.5156316,8.750004 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="792.836" y1="1919" x2="792.836" y2="1933" id="Path" stroke="#00AEEF" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<text id="Margins" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="776" y="1953">Margins</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Leading-and-trailing-margins-on-the-left-and-right-side-of-each-symbol" fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="776" y="1971">Leading and trailing margins on the left and right side of each symbol
|
||||||
|
</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="can-be-adjusted-by-modifying-the-x-location-of-the-margin-guidelines." fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="776" y="1989">can be adjusted by modifying the x-location of the margin guidelines.
|
||||||
|
</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Modifications-are-automatically-applied-proportionally-to-all" fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="776" y="2007">Modifications are automatically applied proportionally to all</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="scales-and-weights." fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="776" y="2025">scales and weights.</tspan>
|
||||||
|
</text>
|
||||||
|
<g id="Group" transform="translate(1291.2481, 1914.5174)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0.593687825,20.3477978 L2.29290583,22.0567818 C3.15228183,22.9259218 4.13860983,22.8673278 5.06634583,21.8419378 L15.7597058,10.0548378 L14.7929098,9.07827578 L4.17766983,20.7579558 C3.82610783,21.1583458 3.49407583,21.2560018 3.02532583,20.7872526 L1.85344983,19.6251426 C1.38469983,19.1661586 1.49212183,18.8243606 1.89251223,18.4630326 L13.3671122,7.66225258 L12.3905502,6.69545658 L0.798750225,17.5841366 C-0.187577775,18.5021046 -0.265703775,19.4786686 0.593672225,20.3478166 L0.593687825,20.3477978 Z M7.00970783,2.15443778 C6.58978583,2.56459378 6.56048983,3.14076578 6.79486383,3.53139178 C7.02923983,3.89271978 7.48822383,4.12709578 8.13275383,3.96107978 C9.59759783,3.61928378 11.1210338,3.56068978 12.5468138,4.49818978 L11.9608758,5.95326778 C11.6190798,6.78334578 11.7948602,7.36928378 12.3319698,7.91615778 L14.6268898,10.2306178 C15.1151718,10.7188998 15.5253278,10.7384298 16.0917338,10.6407738 L17.1561878,10.4454614 L17.8202498,11.1192894 L17.7811874,11.6759294 C17.742125,12.1739754 17.869078,12.5548354 18.3573594,13.0333514 L19.1190774,13.7755394 C19.5975934,14.2540554 20.2128274,14.2833514 20.6815774,13.8146018 L23.5917374,10.8946818 C24.0604874,10.4259318 24.0409554,9.83022778 23.5624406,9.35171378 L22.7909566,8.58999578 C22.3124406,8.11147978 21.9413466,7.95522978 21.4628326,7.99429178 L20.8866606,8.04311998 L20.2421286,7.40835398 L20.4862686,6.28530798 C20.6132218,5.71890198 20.4569718,5.27944798 19.8710346,4.69351198 L17.6737746,2.50601198 C14.3339346,-0.814308021 9.90033463,-0.736168021 7.00971463,2.15444998 L7.00970783,2.15443778 Z M8.50384783,2.52553178 C10.9354878,0.748187779 14.2265078,1.05092178 16.4530678,3.27748578 L18.8847078,5.68958578 C19.1190838,5.92396178 19.1581458,6.10950778 19.0897858,6.45130378 L18.7675198,7.93567978 L20.2714258,9.42005578 L21.2577538,9.36146198 C21.5116598,9.35169636 21.5897858,9.3712276 21.7850978,9.56653998 L22.3612698,10.142712 L19.9198698,12.584112 L19.3436978,12.00794 C19.1483854,11.8126276 19.1190878,11.734502 19.1288538,11.47083 L19.1972132,10.494268 L17.7030732,9.00989198 L16.1796352,9.26379798 C15.8573692,9.33215738 15.7108852,9.30286038 15.4667452,9.06848558 L13.4647852,7.06652558 C13.2108792,6.83214958 13.1815812,6.66613558 13.337832,6.29504158 L14.216738,4.20520158 C12.654238,2.75012358 10.622978,2.12512158 8.59173803,2.72082558 C8.43548803,2.75988798 8.37689403,2.63293498 8.50384743,2.52551318 L8.50384783,2.52553178 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<text id="Exporting" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1289" y="1953">Exporting</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Symbols-should-be-outlined-when-exporting-to-ensure-the" fill="#000000" fill-rule="nonzero"
|
||||||
|
font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="1289" y="1971">Symbols should be outlined when exporting to ensure the</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="design-is-preserved-when-submitting-to-Xcode." fill="#000000" fill-rule="nonzero"
|
||||||
|
font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="1289" y="1989">design is preserved when submitting to Xcode.</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="template-version" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2952" y="1933">Template v.5.0</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Requires-Xcode-15-or-greater" fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="2865" y="1951">Requires Xcode 15 or greater</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="descriptive-name" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2835" y="1969">Generated from double.checkmark</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Typeset-at-100.0-points" fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="2901" y="1987">Typeset at 100.0 points</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Small" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="726">Small</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Medium" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="1156">Medium</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Large" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="1586">Large</tspan>
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g id="Guides" transform="translate(263, 600.785)">
|
||||||
|
<g id="H-reference" transform="translate(76.9937, 24.756)" fill="#27AAE1" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0,70.459 L2.644096,70.459 L28.334446,3.3267 L29.036646,3.3267 L29.036646,0 L27.128946,0 L0,70.459 Z M10.694846,45.9791 L45.987846,45.9791 L45.237846,43.7305 L11.444846,43.7305 L10.694846,45.9791 Z M54.125946,70.459 L56.770046,70.459 L29.644546,0 L28.438946,0 L28.438946,3.3267 L54.125946,70.459 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="0" y1="95.215" x2="2773" y2="95.215" id="Baseline-S" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="0" y1="24.756" x2="2773" y2="24.756" id="Capline-S" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<g id="H-reference" transform="translate(76.9937, 454.756)" fill="#27AAE1" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0,70.459 L2.644096,70.459 L28.334446,3.3267 L29.036646,3.3267 L29.036646,0 L27.128946,0 L0,70.459 Z M10.694846,45.9791 L45.987846,45.9791 L45.237846,43.7305 L11.444846,43.7305 L10.694846,45.9791 Z M54.125946,70.459 L56.770046,70.459 L29.644546,0 L28.438946,0 L28.438946,3.3267 L54.125946,70.459 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="0" y1="525.215" x2="2773" y2="525.215" id="Baseline-M" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="0" y1="454.755" x2="2773" y2="454.755" id="Capline-M" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<g id="H-reference" transform="translate(76.9937, 884.756)" fill="#27AAE1" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0,70.459 L2.644096,70.459 L28.334446,3.3267 L29.036646,3.3267 L29.036646,0 L27.128946,0 L0,70.459 Z M10.694846,45.9791 L45.987846,45.9791 L45.237846,43.7305 L11.444846,43.7305 L10.694846,45.9791 Z M54.125946,70.459 L56.770046,70.459 L29.644546,0 L28.438946,0 L28.438946,3.3267 L54.125946,70.459 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="0" y1="955.215" x2="2773" y2="955.215" id="Baseline-L" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="0" y1="884.755" x2="2773" y2="884.755" id="Capline-L" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="256.625" y1="1.13686838e-13" x2="256.625" y2="119.336" id="left-margin-Ultralight-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="348.798" y1="1.13686838e-13" x2="348.798" y2="119.336" id="right-margin-Ultralight-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="1143.53" y1="1.13686838e-13" x2="1143.53" y2="119.336" id="left-margin-Regular-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="1257.15" y1="1.13686838e-13" x2="1257.15" y2="119.336" id="right-margin-Regular-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="2622.62" y1="1.13686838e-13" x2="2622.62" y2="119.336" id="left-margin-Black-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="2760.18" y1="1.13686838e-13" x2="2760.18" y2="119.336" id="right-margin-Black-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
</g>
|
||||||
|
<g id="Symbols" transform="translate(529.3906, 625.2969)" stroke="#000000" stroke-width="0.5">
|
||||||
|
<g id="Black-S" transform="translate(2365.995, 0)">
|
||||||
|
<path
|
||||||
|
d="M67.46878,71.191381 C71.17968,71.191381 74.06058,69.873022 76.01368,66.99216 L111.07228,15.2343 C112.43948,13.2324 113.02538,11.1328 113.02538,9.2773 C113.02538,4.0039 108.82618,0 103.35738,0 C99.69528,0 97.30278,1.3183 95.05668,4.834 L67.32228,47.9492 L53.69918,32.6172 C51.79488,30.4687 49.54888,29.4433 46.52148,29.4433 C41.05278,29.4433 37,33.4472 37,38.7695 C37,41.2109 37.63478,43.1152 39.73438,45.459 L59.36328,67.67576 C61.51168,70.117162 64.14848,71.191381 67.46878,71.191381 Z"
|
||||||
|
id="Path"></path>
|
||||||
|
<path
|
||||||
|
d="M9.52148,29.4433 C12.54888,29.4433 14.79488,30.4687 16.69918,32.6172 L30.32228,47.9492 L32.291,44.888 L44.484,58.915 L39.01368,66.99216 C37.1235832,69.780091 34.3645791,71.1046997 30.825305,71.1872572 L30.46878,71.191381 C27.14848,71.191381 24.51168,70.117162 22.36328,67.67576 L2.73438,45.459 C0.63478,43.1152 0,41.2109 0,38.7695 C0,33.4472 4.05278,29.4433 9.52148,29.4433 Z M66.35738,0 C71.82618,0 76.02538,4.0039 76.02538,9.2773 C76.02538,11.1328 75.43948,13.2324 74.07228,15.2343 L61.951,33.129 L49.252,18.52 L58.05668,4.834 C60.2386057,1.41874857 62.5586852,0.0771252245 66.0465687,0.00324899359 Z"
|
||||||
|
id="Combined-Shape"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Regular-S" transform="translate(886.905, 3.7109)">
|
||||||
|
<path
|
||||||
|
d="M55.87888,66.113294 C57.78318,66.113294 59.29688,65.28322 60.37108,63.62306 L95.96678,7.3242 C96.79688,6.0547 97.08988,5.0293 97.08988,4.0039 C97.08988,1.6113 95.52738,0 93.08598,0 C91.32818,0 90.35158,0.586 89.27738,2.2949 L55.68358,56.2012 L38.00778,32.3731 C36.88478,30.8594 35.81058,30.2246 34.19918,30.2246 C31.75778,30.2246 30,31.9336 30,34.375 C30,35.4004 30.43948,36.5234 31.26958,37.5977 L51.24028,63.5254 C52.60738,65.28322 53.97458,66.113294 55.87888,66.113294 Z"
|
||||||
|
id="Path"></path>
|
||||||
|
<path
|
||||||
|
d="M4.19918,30.2246 C5.81058,30.2246 6.88478,30.8594 8.00778,32.3731 L25.68358,56.2012 L30.332,48.741 L35.554,55.426 L30.37108,63.62306 C29.3457073,65.2077582 27.919881,66.0361177 26.1361316,66.1081489 L25.87888,66.113294 C23.97458,66.113294 22.60738,65.28322 21.24028,63.5254 L1.26958,37.5977 C0.43948,36.5234 0,35.4004 0,34.375 C0,31.9336 1.75778,30.2246 4.19918,30.2246 Z M63.08598,0 C65.52738,0 67.08988,1.6113 67.08988,4.0039 C67.08988,5.0293 66.79688,6.0547 65.96678,7.3242 L48.893,34.328 L43.564,27.508 L59.27738,2.2949 C60.3068217,0.657204167 61.2466272,0.0507828125 62.8702602,0.00309092159 Z"
|
||||||
|
id="Combined-Shape"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Ultralight-S" transform="translate(0, 4.4375)">
|
||||||
|
<path
|
||||||
|
d="M36.79298,62.07178 C37.24418,62.07178 37.53178,61.87744 37.78868,61.53417 L76.33598,2.0112 C76.57578,1.6045 76.64168,1.3965 76.64168,1.1885 C76.64168,0.5215 76.12358,0 75.45318,0 C75.01228,0 74.71678,0.1772 74.50538,0.5693 L36.73398,58.97114 L18.24078,37.7768 C17.98048,37.3984 17.67828,37.2177 17.20218,37.2177 C16.48638,37.2177 16,37.7006 16,38.371 C16,38.6699 16.12159,38.9755 16.40678,39.2778 L35.65088,61.52733 C36.01908,61.96826 36.29638,62.07178 36.79298,62.07178 Z"
|
||||||
|
id="Path"></path>
|
||||||
|
<path
|
||||||
|
d="M1.20218,37.2177 C1.67828,37.2177 1.98048,37.3984 2.24078,37.7768 L20.73398,58.97114 L23.078,55.345 L24.636,57.137 L21.78868,61.53417 C21.5603244,61.8392989 21.3077121,62.0267547 20.937503,62.0646445 L20.79298,62.07178 C20.29638,62.07178 20.01908,61.96826 19.65088,61.52733 L0.40678,39.2778 C0.12159,38.9755 0,38.6699 0,38.371 C0,37.7006 0.48638,37.2177 1.20218,37.2177 Z M59.45318,0 C60.12358,0 60.64168,0.5215 60.64168,1.1885 C60.64168,1.3965 60.57578,1.6045 60.33598,2.0112 L32.216,45.432 L30.652,43.634 L58.50538,0.5693 C58.6932911,0.220766667 58.9476516,0.0420308642 59.3115144,0.00661467764 Z"
|
||||||
|
id="Combined-Shape"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 24 KiB |
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"info": {
|
||||||
|
"author": "xcode",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
"symbols": [
|
||||||
|
{
|
||||||
|
"filename": "checkmark.wide.svg",
|
||||||
|
"idiom": "universal"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -0,0 +1,218 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<svg width="3300px" height="2200px" viewBox="0 0 3300 2200" version="1.1" xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<title>checkmark.wide</title>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="double.checkmark">
|
||||||
|
<g id="Notes">
|
||||||
|
<rect id="artboard" fill="#FFFFFF" fill-rule="nonzero" x="0" y="0" width="3300" height="2200"></rect>
|
||||||
|
<line x1="263" y1="292" x2="3036" y2="292" id="Path" stroke="#000000" stroke-width="0.5"></line>
|
||||||
|
<text id="Weight/Scale-Variations" fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="322">Weight/Scale Variations</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Ultralight" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="533.711" y="322">Ultralight</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Thin" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="843.422" y="322">Thin</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Light" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1138.63" y="322">Light</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Regular" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1426.84" y="322">Regular</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Medium" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1723.06" y="322">Medium</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Semibold" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2015.77" y="322">Semibold</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Bold" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2326.48" y="322">Bold</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Heavy" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2618.19" y="322">Heavy</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Black" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2917.4" y="322">Black</tspan>
|
||||||
|
</text>
|
||||||
|
<line x1="263" y1="1903" x2="3036" y2="1903" id="Path" stroke="#000000" stroke-width="0.5"></line>
|
||||||
|
<g id="Group" transform="translate(264.3672, 1918.0684)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M7.88088,15.76172 C12.18752,15.76172 15.7715,12.1875 15.7715,7.88086 C15.7715,3.57422 12.17774,0 7.8711,0 C3.57422,0 0,3.57422 0,7.88086 C0,12.1875 3.58398,15.76172 7.88086,15.76172 L7.88088,15.76172 Z M7.88088,14.277344 C4.33596,14.277344 1.50392,11.435544 1.50392,7.880864 C1.50392,4.326184 4.32618,1.484384 7.8711,1.484384 C11.42578,1.484384 14.27734,4.326184 14.27734,7.880864 C14.27734,11.435544 11.43554,14.277344 7.88086,14.277344 L7.88088,14.277344 Z M4.28712,7.880864 C4.28712,8.310552 4.589854,8.60352 5.039074,8.60352 L7.138674,8.60352 L7.138674,10.72266 C7.138674,11.162114 7.431642,11.464848 7.86133,11.464848 C8.310548,11.464848 8.603518,11.162114 8.603518,10.72266 L8.603518,8.60352 L10.722658,8.60352 C11.162112,8.60352 11.464846,8.310552 11.464846,7.880864 C11.464846,7.44141 11.162112,7.138676 10.722658,7.138676 L8.603518,7.138676 L8.603518,5.029296 C8.603518,4.580078 8.31055,4.277342 7.86133,4.277342 C7.431642,4.277342 7.138674,4.580076 7.138674,5.029296 L7.138674,7.138676 L5.039074,7.138676 C4.589856,7.138676 4.28712,7.44141 4.28712,7.880864 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(283.254, 1915.9883)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M9.96094,19.92188 C15.41016,19.92188 19.92188,15.4004 19.92188,9.96094 C19.92188,4.51172 15.4004,0 9.95118,0 C4.51172,0 0,4.51172 0,9.96094 C0,15.4004 4.52148,19.92188 9.96094,19.92188 Z M9.96094,18.261724 C5.35156,18.261724 1.66992,14.570324 1.66992,9.960944 C1.66992,5.351564 5.3418,1.660164 9.95116,1.660164 C14.56052,1.660164 18.2617,5.351564 18.2617,9.960944 C18.2617,14.570324 14.5703,18.261724 9.96092,18.261724 L9.96094,18.261724 Z M5.4297,9.960944 C5.4297,10.43946 5.761732,10.761726 6.259778,10.761726 L9.130878,10.761726 L9.130878,13.642586 C9.130878,14.130868 9.46291,14.472664 9.941424,14.472664 C10.4297,14.472664 10.771502,14.140632 10.771502,13.642586 L10.771502,10.761726 L13.652362,10.761726 C14.140644,10.761726 14.48244,10.43946 14.48244,9.960944 C14.48244,9.472662 14.140644,9.130866 13.652362,9.130866 L10.771502,9.130866 L10.771502,6.259766 C10.771502,5.76172 10.4297,5.419922 9.941424,5.419922 C9.462908,5.419922 9.130878,5.761718 9.130878,6.259766 L9.130878,9.130866 L6.259778,9.130866 C5.761732,9.130866 5.4297,9.472662 5.4297,9.960944 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(307.1798, 1913.2246)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M12.71486,25.43944 C19.67776,25.43944 25.43946,19.67772 25.43946,12.7246 C25.43946,5.7617 19.66798,0 12.70508,0 C5.75196,0 -1.42108547e-15,5.76172 -1.42108547e-15,12.7246 C-1.42108547e-15,19.67772 5.76172,25.43944 12.71484,25.43944 L12.71486,25.43944 Z M12.71486,23.623034 C6.6797,23.623034 1.82618,18.759754 1.82618,12.724594 C1.82618,6.679674 6.66994,1.826154 12.70508,1.826154 C18.75,1.826154 23.61328,6.679674 23.61328,12.724594 C23.61328,18.759754 18.75976,23.623034 12.71484,23.623034 L12.71486,23.623034 Z M6.94338,12.724594 C6.94338,13.242172 7.314474,13.6035 7.861348,13.6035 L11.806668,13.6035 L11.806668,17.55858 C11.806668,18.09569 12.177762,18.476548 12.69534,18.476548 C13.23245,18.476548 13.603544,18.105454 13.603544,17.55858 L13.603544,13.6035 L17.558624,13.6035 C18.095734,13.6035 18.476592,13.242172 18.476592,12.724594 C18.476592,12.177718 18.105498,11.806626 17.558624,11.806626 L13.603544,11.806626 L13.603544,7.861306 C13.603544,7.31443 13.23245,6.933572 12.69534,6.933572 C12.177762,6.933572 11.806668,7.314432 11.806668,7.861306 L11.806668,11.806626 L7.861348,11.806626 C7.314472,11.806626 6.94338,12.17772 6.94338,12.724594 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<text id="Design-Variations" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="1953">Design Variations</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Symbols-are-supported-in-up-to-nine-weights-and-three-scales." fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="1971">Symbols are supported in up to nine weights and three scales.</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="For-optimal-layout-with-text-and-other-symbols,-vertically-align" fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="1989">For optimal layout with text and other symbols, vertically align</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="symbols-with-the-adjacent-text." fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="263" y="2007">symbols with the adjacent text.</tspan>
|
||||||
|
</text>
|
||||||
|
<line x1="776" y1="1919" x2="776" y2="1933" id="Path" stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<g id="Group" transform="translate(778.4902, 1918.7324)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0.8203116,14.423832 C1.3378896,14.423832 1.5917956,14.2285116 1.7773436,13.681636 L3.0371096,10.234376 L8.7988296,10.234376 L10.0585956,13.681636 C10.2441424,14.228512 10.4980496,14.423832 11.0058616,14.423832 C11.5234396,14.423832 11.8554716,14.111324 11.8554716,13.623042 C11.8554716,13.4570264 11.8261748,13.300776 11.7480498,13.095698 L7.1679698,0.898438 C6.9433598,0.302734 6.5429698,0 5.9179698,0 C5.3125018,0 4.9023458,0.292968 4.6875018,0.888672 L0.1074218,13.105472 C0.0292968,13.31055 -3.55271368e-16,13.4668 -3.55271368e-16,13.632816 C-3.55271368e-16,14.121098 0.3125,14.423832 0.820312,14.423832 L0.8203116,14.423832 Z M3.5156316,8.750004 L5.8886716,2.177744 L5.9374998,2.177744 L8.3105398,8.750004 L3.5156316,8.750004 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="792.836" y1="1919" x2="792.836" y2="1933" id="Path" stroke="#00AEEF" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<text id="Margins" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="776" y="1953">Margins</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Leading-and-trailing-margins-on-the-left-and-right-side-of-each-symbol" fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="776" y="1971">Leading and trailing margins on the left and right side of each symbol
|
||||||
|
</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="can-be-adjusted-by-modifying-the-x-location-of-the-margin-guidelines." fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="776" y="1989">can be adjusted by modifying the x-location of the margin guidelines.
|
||||||
|
</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Modifications-are-automatically-applied-proportionally-to-all" fill="#000000"
|
||||||
|
fill-rule="nonzero" font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="776" y="2007">Modifications are automatically applied proportionally to all</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="scales-and-weights." fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="776" y="2025">scales and weights.</tspan>
|
||||||
|
</text>
|
||||||
|
<g id="Group" transform="translate(1291.2481, 1914.5174)" fill="#000000" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0.593687825,20.3477978 L2.29290583,22.0567818 C3.15228183,22.9259218 4.13860983,22.8673278 5.06634583,21.8419378 L15.7597058,10.0548378 L14.7929098,9.07827578 L4.17766983,20.7579558 C3.82610783,21.1583458 3.49407583,21.2560018 3.02532583,20.7872526 L1.85344983,19.6251426 C1.38469983,19.1661586 1.49212183,18.8243606 1.89251223,18.4630326 L13.3671122,7.66225258 L12.3905502,6.69545658 L0.798750225,17.5841366 C-0.187577775,18.5021046 -0.265703775,19.4786686 0.593672225,20.3478166 L0.593687825,20.3477978 Z M7.00970783,2.15443778 C6.58978583,2.56459378 6.56048983,3.14076578 6.79486383,3.53139178 C7.02923983,3.89271978 7.48822383,4.12709578 8.13275383,3.96107978 C9.59759783,3.61928378 11.1210338,3.56068978 12.5468138,4.49818978 L11.9608758,5.95326778 C11.6190798,6.78334578 11.7948602,7.36928378 12.3319698,7.91615778 L14.6268898,10.2306178 C15.1151718,10.7188998 15.5253278,10.7384298 16.0917338,10.6407738 L17.1561878,10.4454614 L17.8202498,11.1192894 L17.7811874,11.6759294 C17.742125,12.1739754 17.869078,12.5548354 18.3573594,13.0333514 L19.1190774,13.7755394 C19.5975934,14.2540554 20.2128274,14.2833514 20.6815774,13.8146018 L23.5917374,10.8946818 C24.0604874,10.4259318 24.0409554,9.83022778 23.5624406,9.35171378 L22.7909566,8.58999578 C22.3124406,8.11147978 21.9413466,7.95522978 21.4628326,7.99429178 L20.8866606,8.04311998 L20.2421286,7.40835398 L20.4862686,6.28530798 C20.6132218,5.71890198 20.4569718,5.27944798 19.8710346,4.69351198 L17.6737746,2.50601198 C14.3339346,-0.814308021 9.90033463,-0.736168021 7.00971463,2.15444998 L7.00970783,2.15443778 Z M8.50384783,2.52553178 C10.9354878,0.748187779 14.2265078,1.05092178 16.4530678,3.27748578 L18.8847078,5.68958578 C19.1190838,5.92396178 19.1581458,6.10950778 19.0897858,6.45130378 L18.7675198,7.93567978 L20.2714258,9.42005578 L21.2577538,9.36146198 C21.5116598,9.35169636 21.5897858,9.3712276 21.7850978,9.56653998 L22.3612698,10.142712 L19.9198698,12.584112 L19.3436978,12.00794 C19.1483854,11.8126276 19.1190878,11.734502 19.1288538,11.47083 L19.1972132,10.494268 L17.7030732,9.00989198 L16.1796352,9.26379798 C15.8573692,9.33215738 15.7108852,9.30286038 15.4667452,9.06848558 L13.4647852,7.06652558 C13.2108792,6.83214958 13.1815812,6.66613558 13.337832,6.29504158 L14.216738,4.20520158 C12.654238,2.75012358 10.622978,2.12512158 8.59173803,2.72082558 C8.43548803,2.75988798 8.37689403,2.63293498 8.50384743,2.52551318 L8.50384783,2.52553178 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<text id="Exporting" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="1289" y="1953">Exporting</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Symbols-should-be-outlined-when-exporting-to-ensure-the" fill="#000000" fill-rule="nonzero"
|
||||||
|
font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="1289" y="1971">Symbols should be outlined when exporting to ensure the</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="design-is-preserved-when-submitting-to-Xcode." fill="#000000" fill-rule="nonzero"
|
||||||
|
font-family="Helvetica" font-size="13" font-weight="normal">
|
||||||
|
<tspan x="1289" y="1989">design is preserved when submitting to Xcode.</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="template-version" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2952" y="1933">Template v.5.0</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Requires-Xcode-15-or-greater" fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="2865" y="1951">Requires Xcode 15 or greater</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="descriptive-name" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="2835" y="1969">Generated from double.checkmark</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Typeset-at-100.0-points" fill="#000000" fill-rule="nonzero" font-family="Helvetica"
|
||||||
|
font-size="13" font-weight="normal">
|
||||||
|
<tspan x="2901" y="1987">Typeset at 100.0 points</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Small" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="726">Small</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Medium" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="1156">Medium</tspan>
|
||||||
|
</text>
|
||||||
|
<text id="Large" fill="#000000" fill-rule="nonzero" font-family="Helvetica" font-size="13"
|
||||||
|
font-weight="normal">
|
||||||
|
<tspan x="263" y="1586">Large</tspan>
|
||||||
|
</text>
|
||||||
|
</g>
|
||||||
|
<g id="Guides" transform="translate(263, 600.785)">
|
||||||
|
<g id="H-reference" transform="translate(76.9937, 24.756)" fill="#27AAE1" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0,70.459 L2.644096,70.459 L28.334446,3.3267 L29.036646,3.3267 L29.036646,0 L27.128946,0 L0,70.459 Z M10.694846,45.9791 L45.987846,45.9791 L45.237846,43.7305 L11.444846,43.7305 L10.694846,45.9791 Z M54.125946,70.459 L56.770046,70.459 L29.644546,0 L28.438946,0 L28.438946,3.3267 L54.125946,70.459 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="0" y1="95.215" x2="2773" y2="95.215" id="Baseline-S" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="0" y1="24.756" x2="2773" y2="24.756" id="Capline-S" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<g id="H-reference" transform="translate(76.9937, 454.756)" fill="#27AAE1" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0,70.459 L2.644096,70.459 L28.334446,3.3267 L29.036646,3.3267 L29.036646,0 L27.128946,0 L0,70.459 Z M10.694846,45.9791 L45.987846,45.9791 L45.237846,43.7305 L11.444846,43.7305 L10.694846,45.9791 Z M54.125946,70.459 L56.770046,70.459 L29.644546,0 L28.438946,0 L28.438946,3.3267 L54.125946,70.459 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="0" y1="525.215" x2="2773" y2="525.215" id="Baseline-M" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="0" y1="454.755" x2="2773" y2="454.755" id="Capline-M" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<g id="H-reference" transform="translate(76.9937, 884.756)" fill="#27AAE1" fill-rule="nonzero">
|
||||||
|
<path
|
||||||
|
d="M0,70.459 L2.644096,70.459 L28.334446,3.3267 L29.036646,3.3267 L29.036646,0 L27.128946,0 L0,70.459 Z M10.694846,45.9791 L45.987846,45.9791 L45.237846,43.7305 L11.444846,43.7305 L10.694846,45.9791 Z M54.125946,70.459 L56.770046,70.459 L29.644546,0 L28.438946,0 L28.438946,3.3267 L54.125946,70.459 Z"
|
||||||
|
id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
<line x1="0" y1="955.215" x2="2773" y2="955.215" id="Baseline-L" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="0" y1="884.755" x2="2773" y2="884.755" id="Capline-L" stroke="#27AAE1" stroke-width="0.5">
|
||||||
|
</line>
|
||||||
|
<line x1="256.625" y1="1.13686838e-13" x2="256.625" y2="119.336" id="left-margin-Ultralight-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="348.798" y1="1.13686838e-13" x2="348.798" y2="119.336" id="right-margin-Ultralight-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="1143.53" y1="1.13686838e-13" x2="1143.53" y2="119.336" id="left-margin-Regular-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="1257.15" y1="1.13686838e-13" x2="1257.15" y2="119.336" id="right-margin-Regular-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="2622.62" y1="1.13686838e-13" x2="2622.62" y2="119.336" id="left-margin-Black-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
<line x1="2760.18" y1="1.13686838e-13" x2="2760.18" y2="119.336" id="right-margin-Black-S"
|
||||||
|
stroke="#00AEEF" stroke-width="0.5"></line>
|
||||||
|
</g>
|
||||||
|
<g id="Symbols" transform="translate(529.3906, 625.2969)" stroke="#000000" stroke-width="0.5">
|
||||||
|
<g id="Black-S" transform="translate(2365.995, 0)">
|
||||||
|
<path
|
||||||
|
d="M30.46878,71.191381 C34.17968,71.191381 37.06058,69.873022 39.01368,66.99216 L74.07228,15.2343 C75.43948,13.2324 76.02538,11.1328 76.02538,9.2773 C76.02538,4.0039 71.82618,0 66.35738,0 C62.69528,0 60.30278,1.3183 58.05668,4.834 L30.32228,47.9492 L16.69918,32.6172 C14.79488,30.4687 12.54888,29.4433 9.52148,29.4433 C4.05278,29.4433 0,33.4472 0,38.7695 C0,41.2109 0.63478,43.1152 2.73438,45.459 L22.36328,67.67576 C24.51168,70.117162 27.14848,71.191381 30.46878,71.191381 Z"
|
||||||
|
id="Path"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Regular-S" transform="translate(886.905, 3.7109)">
|
||||||
|
<path
|
||||||
|
d="M25.87888,66.113294 C27.78318,66.113294 29.29688,65.28322 30.37108,63.62306 L65.96678,7.3242 C66.79688,6.0547 67.08988,5.0293 67.08988,4.0039 C67.08988,1.6113 65.52738,0 63.08598,0 C61.32818,0 60.35158,0.586 59.27738,2.2949 L25.68358,56.2012 L8.00778,32.3731 C6.88478,30.8594 5.81058,30.2246 4.19918,30.2246 C1.75778,30.2246 0,31.9336 0,34.375 C0,35.4004 0.43948,36.5234 1.26958,37.5977 L21.24028,63.5254 C22.60738,65.28322 23.97458,66.113294 25.87888,66.113294 Z"
|
||||||
|
id="Path"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Ultralight-S" transform="translate(0, 4.4375)">
|
||||||
|
<path
|
||||||
|
d="M20.79298,62.07178 C21.24418,62.07178 21.53178,61.87744 21.78868,61.53417 L60.33598,2.0112 C60.57578,1.6045 60.64168,1.3965 60.64168,1.1885 C60.64168,0.5215 60.12358,0 59.45318,0 C59.01228,0 58.71678,0.1772 58.50538,0.5693 L20.73398,58.97114 L2.24078,37.7768 C1.98048,37.3984 1.67828,37.2177 1.20218,37.2177 C0.48638,37.2177 0,37.7006 0,38.371 C0,38.6699 0.12159,38.9755 0.40678,39.2778 L19.65088,61.52733 C20.01908,61.96826 20.29638,62.07178 20.79298,62.07178 Z"
|
||||||
|
id="Path"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 22 KiB |
@@ -29,14 +29,14 @@ struct ContentView: View {
|
|||||||
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
|
@AppStorage(DEFAULT_PERFORM_LA) private var prefPerformLA = false
|
||||||
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
|
@AppStorage(DEFAULT_PRIVACY_PROTECT_SCREEN) private var protectScreen = false
|
||||||
@AppStorage(DEFAULT_NOTIFICATION_ALERT_SHOWN) private var notificationAlertShown = false
|
@AppStorage(DEFAULT_NOTIFICATION_ALERT_SHOWN) private var notificationAlertShown = false
|
||||||
@State private var showSettings = false
|
|
||||||
@State private var showWhatsNew = false
|
@State private var showWhatsNew = false
|
||||||
@State private var showChooseLAMode = false
|
@State private var showChooseLAMode = false
|
||||||
@State private var showSetPasscode = false
|
@State private var showSetPasscode = false
|
||||||
@State private var waitingForOrPassedAuth = true
|
@State private var waitingForOrPassedAuth = true
|
||||||
@State private var chatListActionSheet: ChatListActionSheet? = nil
|
@State private var chatListActionSheet: ChatListActionSheet? = nil
|
||||||
|
@State private var chatListUserPickerSheet: UserPickerSheet? = nil
|
||||||
|
|
||||||
private let callTopPadding: CGFloat = 50
|
private let callTopPadding: CGFloat = 40
|
||||||
|
|
||||||
private enum ChatListActionSheet: Identifiable {
|
private enum ChatListActionSheet: Identifiable {
|
||||||
case planAndConnectSheet(sheet: PlanAndConnectActionSheet)
|
case planAndConnectSheet(sheet: PlanAndConnectActionSheet)
|
||||||
@@ -86,7 +86,7 @@ struct ContentView: View {
|
|||||||
callView(call)
|
callView(call)
|
||||||
}
|
}
|
||||||
|
|
||||||
if !showSettings, let la = chatModel.laRequest {
|
if chatListUserPickerSheet == nil, let la = chatModel.laRequest {
|
||||||
LocalAuthView(authRequest: la)
|
LocalAuthView(authRequest: la)
|
||||||
.onDisappear {
|
.onDisappear {
|
||||||
// this flag is separate from accessAuthenticated to show initializationView while we wait for authentication
|
// this flag is separate from accessAuthenticated to show initializationView while we wait for authentication
|
||||||
@@ -109,9 +109,6 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.alert(isPresented: $alertManager.presentAlert) { alertManager.alertView! }
|
.alert(isPresented: $alertManager.presentAlert) { alertManager.alertView! }
|
||||||
.sheet(isPresented: $showSettings) {
|
|
||||||
SettingsView(showSettings: $showSettings)
|
|
||||||
}
|
|
||||||
.confirmationDialog("SimpleX Lock mode", isPresented: $showChooseLAMode, titleVisibility: .visible) {
|
.confirmationDialog("SimpleX Lock mode", isPresented: $showChooseLAMode, titleVisibility: .visible) {
|
||||||
Button("System authentication") { initialEnableLA() }
|
Button("System authentication") { initialEnableLA() }
|
||||||
Button("Passcode entry") { showSetPasscode = true }
|
Button("Passcode entry") { showSetPasscode = true }
|
||||||
@@ -151,12 +148,12 @@ struct ContentView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onAppear {
|
.onAppear {
|
||||||
reactOnDarkThemeChanges()
|
reactOnDarkThemeChanges(systemInDarkThemeCurrently)
|
||||||
}
|
}
|
||||||
.onChange(of: colorScheme) { scheme in
|
.onChange(of: colorScheme) { scheme in
|
||||||
// It's needed to update UI colors when iOS wants to make screenshot after going to background,
|
// It's needed to update UI colors when iOS wants to make screenshot after going to background,
|
||||||
// so when a user changes his global theme from dark to light or back, the app will adapt to it
|
// so when a user changes his global theme from dark to light or back, the app will adapt to it
|
||||||
reactOnDarkThemeChanges()
|
reactOnDarkThemeChanges(scheme == .dark)
|
||||||
}
|
}
|
||||||
.onChange(of: theme.name) { _ in
|
.onChange(of: theme.name) { _ in
|
||||||
ThemeManager.adjustWindowStyle()
|
ThemeManager.adjustWindowStyle()
|
||||||
@@ -207,7 +204,7 @@ struct ContentView: View {
|
|||||||
CallDuration(call: call)
|
CallDuration(call: call)
|
||||||
}
|
}
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
.frame(height: callTopPadding - 10)
|
.frame(height: callTopPadding)
|
||||||
.background(Color(uiColor: UIColor(red: 47/255, green: 208/255, blue: 88/255, alpha: 1)))
|
.background(Color(uiColor: UIColor(red: 47/255, green: 208/255, blue: 88/255, alpha: 1)))
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
chatModel.activeCallViewIsCollapsed = false
|
chatModel.activeCallViewIsCollapsed = false
|
||||||
@@ -253,7 +250,7 @@ struct ContentView: View {
|
|||||||
|
|
||||||
private func mainView() -> some View {
|
private func mainView() -> some View {
|
||||||
ZStack(alignment: .top) {
|
ZStack(alignment: .top) {
|
||||||
ChatListView(showSettings: $showSettings).privacySensitive(protectScreen)
|
ChatListView(activeUserPickerSheet: $chatListUserPickerSheet).privacySensitive(protectScreen)
|
||||||
.onAppear {
|
.onAppear {
|
||||||
requestNtfAuthorization()
|
requestNtfAuthorization()
|
||||||
// Local Authentication notice is to be shown on next start after onboarding is complete
|
// Local Authentication notice is to be shown on next start after onboarding is complete
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ class ItemsModel: ObservableObject {
|
|||||||
|
|
||||||
init() {
|
init() {
|
||||||
publisher
|
publisher
|
||||||
.throttle(for: 0.25, scheduler: DispatchQueue.main, latest: true)
|
.throttle(for: 0.2, scheduler: DispatchQueue.main, latest: true)
|
||||||
.sink { self.objectWillChange.send() }
|
.sink { self.objectWillChange.send() }
|
||||||
.store(in: &bag)
|
.store(in: &bag)
|
||||||
}
|
}
|
||||||
@@ -123,6 +123,14 @@ class NetworkModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ChatItemWithMenu can depend on previous or next item for it's appearance
|
||||||
|
/// This dummy model is used to force an update of all chat items,
|
||||||
|
/// when they might have changed appearance.
|
||||||
|
class ChatItemDummyModel: ObservableObject {
|
||||||
|
static let shared = ChatItemDummyModel()
|
||||||
|
func sendUpdate() { objectWillChange.send() }
|
||||||
|
}
|
||||||
|
|
||||||
final class ChatModel: ObservableObject {
|
final class ChatModel: ObservableObject {
|
||||||
@Published var onboardingStage: OnboardingStage?
|
@Published var onboardingStage: OnboardingStage?
|
||||||
@Published var setDeliveryReceipts = false
|
@Published var setDeliveryReceipts = false
|
||||||
@@ -143,7 +151,7 @@ final class ChatModel: ObservableObject {
|
|||||||
@Published var contentViewAccessAuthenticated: Bool = false
|
@Published var contentViewAccessAuthenticated: Bool = false
|
||||||
@Published var laRequest: LocalAuthRequest?
|
@Published var laRequest: LocalAuthRequest?
|
||||||
// list of chat "previews"
|
// list of chat "previews"
|
||||||
@Published var chats: [Chat] = []
|
@Published private(set) var chats: [Chat] = []
|
||||||
@Published var deletedChats: Set<String> = []
|
@Published var deletedChats: Set<String> = []
|
||||||
// current chat
|
// current chat
|
||||||
@Published var chatId: String?
|
@Published var chatId: String?
|
||||||
@@ -183,7 +191,6 @@ final class ChatModel: ObservableObject {
|
|||||||
@Published var stopPreviousRecPlay: URL? = nil // coordinates currently playing source
|
@Published var stopPreviousRecPlay: URL? = nil // coordinates currently playing source
|
||||||
@Published var draft: ComposeState?
|
@Published var draft: ComposeState?
|
||||||
@Published var draftChatId: String?
|
@Published var draftChatId: String?
|
||||||
@Published var pasteboardHasStrings: Bool = UIPasteboard.general.hasStrings
|
|
||||||
@Published var networkInfo = UserNetworkInfo(networkType: .other, online: true)
|
@Published var networkInfo = UserNetworkInfo(networkType: .other, online: true)
|
||||||
|
|
||||||
var messageDelivery: Dictionary<Int64, () -> Void> = [:]
|
var messageDelivery: Dictionary<Int64, () -> Void> = [:]
|
||||||
@@ -357,25 +364,8 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func updateChats(with newChats: [ChatData]) {
|
func updateChats(_ newChats: [ChatData]) {
|
||||||
for i in 0..<newChats.count {
|
chats = newChats.map { Chat($0) }
|
||||||
let c = newChats[i]
|
|
||||||
if let j = getChatIndex(c.id) {
|
|
||||||
let chat = chats[j]
|
|
||||||
chat.chatInfo = c.chatInfo
|
|
||||||
chat.chatItems = c.chatItems
|
|
||||||
chat.chatStats = c.chatStats
|
|
||||||
if i != j {
|
|
||||||
if chatId != c.chatInfo.id {
|
|
||||||
popChat_(j, to: i)
|
|
||||||
} else if i == 0 {
|
|
||||||
chatToTop = c.chatInfo.id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
addChat_(Chat(c), at: i)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NtfManager.shared.setNtfBadgeCount(totalUnreadCountForAllUsers())
|
NtfManager.shared.setNtfBadgeCount(totalUnreadCountForAllUsers())
|
||||||
popChatCollector.clear()
|
popChatCollector.clear()
|
||||||
}
|
}
|
||||||
@@ -445,19 +435,17 @@ final class ChatModel: ObservableObject {
|
|||||||
|
|
||||||
private func _upsertChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) -> Bool {
|
private func _upsertChatItem(_ cInfo: ChatInfo, _ cItem: ChatItem) -> Bool {
|
||||||
if let i = getChatItemIndex(cItem) {
|
if let i = getChatItemIndex(cItem) {
|
||||||
withConditionalAnimation {
|
_updateChatItem(at: i, with: cItem)
|
||||||
_updateChatItem(at: i, with: cItem)
|
ChatItemDummyModel.shared.sendUpdate()
|
||||||
}
|
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
withConditionalAnimation(itemAnimation()) {
|
var ci = cItem
|
||||||
var ci = cItem
|
if let status = chatItemStatuses.removeValue(forKey: ci.id), case .sndNew = ci.meta.itemStatus {
|
||||||
if let status = chatItemStatuses.removeValue(forKey: ci.id), case .sndNew = ci.meta.itemStatus {
|
ci.meta.itemStatus = status
|
||||||
ci.meta.itemStatus = status
|
|
||||||
}
|
|
||||||
im.reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0)
|
|
||||||
im.itemAdded = true
|
|
||||||
}
|
}
|
||||||
|
im.reversedChatItems.insert(ci, at: hasLiveDummy ? 1 : 0)
|
||||||
|
im.itemAdded = true
|
||||||
|
ChatItemDummyModel.shared.sendUpdate()
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -574,6 +562,7 @@ final class ChatModel: ObservableObject {
|
|||||||
// update preview
|
// update preview
|
||||||
_updateChat(cInfo.id) { chat in
|
_updateChat(cInfo.id) { chat in
|
||||||
self.decreaseUnreadCounter(user: self.currentUser!, by: chat.chatStats.unreadCount)
|
self.decreaseUnreadCounter(user: self.currentUser!, by: chat.chatStats.unreadCount)
|
||||||
|
self.updateFloatingButtons(unreadCount: 0)
|
||||||
chat.chatStats = ChatStats()
|
chat.chatStats = ChatStats()
|
||||||
}
|
}
|
||||||
// update current chat
|
// update current chat
|
||||||
@@ -590,6 +579,12 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func updateFloatingButtons(unreadCount: Int) {
|
||||||
|
let fbm = ChatView.FloatingButtonModel.shared
|
||||||
|
fbm.totalUnread = unreadCount
|
||||||
|
fbm.objectWillChange.send()
|
||||||
|
}
|
||||||
|
|
||||||
func markChatItemsRead(_ cInfo: ChatInfo, aboveItem: ChatItem? = nil) {
|
func markChatItemsRead(_ cInfo: ChatInfo, aboveItem: ChatItem? = nil) {
|
||||||
if let cItem = aboveItem {
|
if let cItem = aboveItem {
|
||||||
if chatId == cInfo.id, let i = getChatItemIndex(cItem) {
|
if chatId == cInfo.id, let i = getChatItemIndex(cItem) {
|
||||||
@@ -608,6 +603,7 @@ final class ChatModel: ObservableObject {
|
|||||||
if markedCount > 0 {
|
if markedCount > 0 {
|
||||||
chat.chatStats.unreadCount -= markedCount
|
chat.chatStats.unreadCount -= markedCount
|
||||||
self.decreaseUnreadCounter(user: self.currentUser!, by: markedCount)
|
self.decreaseUnreadCounter(user: self.currentUser!, by: markedCount)
|
||||||
|
self.updateFloatingButtons(unreadCount: chat.chatStats.unreadCount)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -637,19 +633,15 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func markChatItemRead(_ cInfo: ChatInfo, _ cItem: ChatItem) async {
|
func markChatItemsRead(_ cInfo: ChatInfo, _ itemIds: [ChatItem.ID]) {
|
||||||
if chatId == cInfo.id,
|
if self.chatId == cInfo.id {
|
||||||
let itemIndex = getChatItemIndex(cItem),
|
for itemId in itemIds {
|
||||||
im.reversedChatItems[itemIndex].isRcvNew {
|
if let i = im.reversedChatItems.firstIndex(where: { $0.id == itemId }) {
|
||||||
await MainActor.run {
|
markChatItemRead_(i)
|
||||||
withTransaction(Transaction()) {
|
|
||||||
// update current chat
|
|
||||||
markChatItemRead_(itemIndex)
|
|
||||||
// update preview
|
|
||||||
unreadCollector.changeUnreadCounter(cInfo.id, by: -1)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
self.unreadCollector.changeUnreadCounter(cInfo.id, by: -itemIds.count)
|
||||||
}
|
}
|
||||||
|
|
||||||
private let unreadCollector = UnreadCollector()
|
private let unreadCollector = UnreadCollector()
|
||||||
@@ -675,9 +667,10 @@ final class ChatModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func changeUnreadCounter(_ chatId: ChatId, by count: Int) {
|
func changeUnreadCounter(_ chatId: ChatId, by count: Int) {
|
||||||
DispatchQueue.main.async {
|
if chatId == ChatModel.shared.chatId {
|
||||||
self.unreadCounts[chatId] = (self.unreadCounts[chatId] ?? 0) + count
|
ChatView.FloatingButtonModel.shared.totalUnread += count
|
||||||
}
|
}
|
||||||
|
self.unreadCounts[chatId] = (self.unreadCounts[chatId] ?? 0) + count
|
||||||
subject.send()
|
subject.send()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -899,35 +892,6 @@ final class ChatModel: ObservableObject {
|
|||||||
_ = upsertGroupMember(groupInfo, updatedMember)
|
_ = upsertGroupMember(groupInfo, updatedMember)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func unreadChatItemCounts(itemsInView: Set<String>) -> UnreadChatItemCounts {
|
|
||||||
var i = 0
|
|
||||||
var totalBelow = 0
|
|
||||||
var unreadBelow = 0
|
|
||||||
while i < im.reversedChatItems.count - 1 && !itemsInView.contains(im.reversedChatItems[i].viewId) {
|
|
||||||
totalBelow += 1
|
|
||||||
if im.reversedChatItems[i].isRcvNew {
|
|
||||||
unreadBelow += 1
|
|
||||||
}
|
|
||||||
i += 1
|
|
||||||
}
|
|
||||||
return UnreadChatItemCounts(
|
|
||||||
// TODO these thresholds account for the fact that items are still "visible" while
|
|
||||||
// covered by compose area, they should be replaced with the actual height in pixels below the screen.
|
|
||||||
isNearBottom: totalBelow < 15,
|
|
||||||
isReallyNearBottom: totalBelow < 2,
|
|
||||||
unreadBelow: unreadBelow
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func topItemInView(itemsInView: Set<String>) -> ChatItem? {
|
|
||||||
let maxIx = im.reversedChatItems.count - 1
|
|
||||||
var i = 0
|
|
||||||
let inView = { itemsInView.contains(self.im.reversedChatItems[$0].viewId) }
|
|
||||||
while i < maxIx && !inView(i) { i += 1 }
|
|
||||||
while i < maxIx && inView(i) { i += 1 }
|
|
||||||
return im.reversedChatItems[min(i - 1, maxIx)]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ShowingInvitation {
|
struct ShowingInvitation {
|
||||||
@@ -940,12 +904,6 @@ struct NTFContactRequest {
|
|||||||
var chatId: String
|
var chatId: String
|
||||||
}
|
}
|
||||||
|
|
||||||
struct UnreadChatItemCounts: Equatable {
|
|
||||||
var isNearBottom: Bool
|
|
||||||
var isReallyNearBottom: Bool
|
|
||||||
var unreadBelow: Int
|
|
||||||
}
|
|
||||||
|
|
||||||
final class Chat: ObservableObject, Identifiable, ChatLike {
|
final class Chat: ObservableObject, Identifiable, ChatLike {
|
||||||
@Published var chatInfo: ChatInfo
|
@Published var chatInfo: ChatInfo
|
||||||
@Published var chatItems: [ChatItem]
|
@Published var chatItems: [ChatItem]
|
||||||
|
|||||||
@@ -112,9 +112,9 @@ func chatSendCmdSync(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? =
|
|||||||
return resp
|
return resp
|
||||||
}
|
}
|
||||||
|
|
||||||
func chatSendCmd(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? = nil, _ ctrl: chat_ctrl? = nil) async -> ChatResponse {
|
func chatSendCmd(_ cmd: ChatCommand, bgTask: Bool = true, bgDelay: Double? = nil, _ ctrl: chat_ctrl? = nil, log: Bool = true) async -> ChatResponse {
|
||||||
await withCheckedContinuation { cont in
|
await withCheckedContinuation { cont in
|
||||||
cont.resume(returning: chatSendCmdSync(cmd, bgTask: bgTask, bgDelay: bgDelay, ctrl))
|
cont.resume(returning: chatSendCmdSync(cmd, bgTask: bgTask, bgDelay: bgDelay, ctrl, log: log))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -357,17 +357,23 @@ func apiGetChatItemInfo(type: ChatType, id: Int64, itemId: Int64) async throws -
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiForwardChatItem(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemId: Int64, ttl: Int?) async -> ChatItem? {
|
func apiPlanForwardChatItems(type: ChatType, id: Int64, itemIds: [Int64]) async throws -> ([Int64], ForwardConfirmation?) {
|
||||||
let cmd: ChatCommand = .apiForwardChatItem(toChatType: toChatType, toChatId: toChatId, fromChatType: fromChatType, fromChatId: fromChatId, itemId: itemId, ttl: ttl)
|
let r = await chatSendCmd(.apiPlanForwardChatItems(toChatType: type, toChatId: id, itemIds: itemIds))
|
||||||
|
if case let .forwardPlan(_, chatItemIds, forwardConfimation) = r { return (chatItemIds, forwardConfimation) }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
|
func apiForwardChatItems(toChatType: ChatType, toChatId: Int64, fromChatType: ChatType, fromChatId: Int64, itemIds: [Int64], ttl: Int?) async -> [ChatItem]? {
|
||||||
|
let cmd: ChatCommand = .apiForwardChatItems(toChatType: toChatType, toChatId: toChatId, fromChatType: fromChatType, fromChatId: fromChatId, itemIds: itemIds, ttl: ttl)
|
||||||
return await processSendMessageCmd(toChatType: toChatType, cmd: cmd)
|
return await processSendMessageCmd(toChatType: toChatType, cmd: cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiSendMessage(type: ChatType, id: Int64, file: CryptoFile?, quotedItemId: Int64?, msg: MsgContent, live: Bool = false, ttl: Int? = nil) async -> ChatItem? {
|
func apiSendMessages(type: ChatType, id: Int64, live: Bool = false, ttl: Int? = nil, composedMessages: [ComposedMessage]) async -> [ChatItem]? {
|
||||||
let cmd: ChatCommand = .apiSendMessage(type: type, id: id, file: file, quotedItemId: quotedItemId, msg: msg, live: live, ttl: ttl)
|
let cmd: ChatCommand = .apiSendMessages(type: type, id: id, live: live, ttl: ttl, composedMessages: composedMessages)
|
||||||
return await processSendMessageCmd(toChatType: type, cmd: cmd)
|
return await processSendMessageCmd(toChatType: type, cmd: cmd)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func processSendMessageCmd(toChatType: ChatType, cmd: ChatCommand) async -> ChatItem? {
|
private func processSendMessageCmd(toChatType: ChatType, cmd: ChatCommand) async -> [ChatItem]? {
|
||||||
let chatModel = ChatModel.shared
|
let chatModel = ChatModel.shared
|
||||||
let r: ChatResponse
|
let r: ChatResponse
|
||||||
if toChatType == .direct {
|
if toChatType == .direct {
|
||||||
@@ -380,10 +386,13 @@ private func processSendMessageCmd(toChatType: ChatType, cmd: ChatCommand) async
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
r = await chatSendCmd(cmd, bgTask: false)
|
r = await chatSendCmd(cmd, bgTask: false)
|
||||||
if case let .newChatItem(_, aChatItem) = r {
|
if case let .newChatItems(_, aChatItems) = r {
|
||||||
cItem = aChatItem.chatItem
|
let cItems = aChatItems.map { $0.chatItem }
|
||||||
chatModel.messageDelivery[aChatItem.chatItem.id] = endTask
|
if let cItemLast = cItems.last {
|
||||||
return cItem
|
cItem = cItemLast
|
||||||
|
chatModel.messageDelivery[cItemLast.id] = endTask
|
||||||
|
}
|
||||||
|
return cItems
|
||||||
}
|
}
|
||||||
if let networkErrorAlert = networkErrorAlert(r) {
|
if let networkErrorAlert = networkErrorAlert(r) {
|
||||||
AlertManager.shared.showAlert(networkErrorAlert)
|
AlertManager.shared.showAlert(networkErrorAlert)
|
||||||
@@ -394,18 +403,18 @@ private func processSendMessageCmd(toChatType: ChatType, cmd: ChatCommand) async
|
|||||||
return nil
|
return nil
|
||||||
} else {
|
} else {
|
||||||
r = await chatSendCmd(cmd, bgDelay: msgDelay)
|
r = await chatSendCmd(cmd, bgDelay: msgDelay)
|
||||||
if case let .newChatItem(_, aChatItem) = r {
|
if case let .newChatItems(_, aChatItems) = r {
|
||||||
return aChatItem.chatItem
|
return aChatItems.map { $0.chatItem }
|
||||||
}
|
}
|
||||||
sendMessageErrorAlert(r)
|
sendMessageErrorAlert(r)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiCreateChatItem(noteFolderId: Int64, file: CryptoFile?, msg: MsgContent) async -> ChatItem? {
|
func apiCreateChatItems(noteFolderId: Int64, composedMessages: [ComposedMessage]) async -> [ChatItem]? {
|
||||||
let r = await chatSendCmd(.apiCreateChatItem(noteFolderId: noteFolderId, file: file, msg: msg))
|
let r = await chatSendCmd(.apiCreateChatItems(noteFolderId: noteFolderId, composedMessages: composedMessages))
|
||||||
if case let .newChatItem(_, aChatItem) = r { return aChatItem.chatItem }
|
if case let .newChatItems(_, aChatItems) = r { return aChatItems.map { $0.chatItem } }
|
||||||
createChatItemErrorAlert(r)
|
createChatItemsErrorAlert(r)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -417,8 +426,8 @@ private func sendMessageErrorAlert(_ r: ChatResponse) {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func createChatItemErrorAlert(_ r: ChatResponse) {
|
private func createChatItemsErrorAlert(_ r: ChatResponse) {
|
||||||
logger.error("apiCreateChatItem error: \(String(describing: r))")
|
logger.error("apiCreateChatItems error: \(String(describing: r))")
|
||||||
AlertManager.shared.showAlertMsg(
|
AlertManager.shared.showAlertMsg(
|
||||||
title: "Error creating message",
|
title: "Error creating message",
|
||||||
message: "Error: \(responseError(r))"
|
message: "Error: \(responseError(r))"
|
||||||
@@ -582,13 +591,13 @@ func apiGroupMemberInfo(_ groupId: Int64, _ groupMemberId: Int64) throws -> (Gro
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiContactQueueInfo(_ contactId: Int64) async throws -> (RcvMsgInfo?, QueueInfo) {
|
func apiContactQueueInfo(_ contactId: Int64) async throws -> (RcvMsgInfo?, ServerQueueInfo) {
|
||||||
let r = await chatSendCmd(.apiContactQueueInfo(contactId: contactId))
|
let r = await chatSendCmd(.apiContactQueueInfo(contactId: contactId))
|
||||||
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
|
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
|
||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiGroupMemberQueueInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (RcvMsgInfo?, QueueInfo) {
|
func apiGroupMemberQueueInfo(_ groupId: Int64, _ groupMemberId: Int64) async throws -> (RcvMsgInfo?, ServerQueueInfo) {
|
||||||
let r = await chatSendCmd(.apiGroupMemberQueueInfo(groupId: groupId, groupMemberId: groupMemberId))
|
let r = await chatSendCmd(.apiGroupMemberQueueInfo(groupId: groupId, groupMemberId: groupMemberId))
|
||||||
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
|
if case let .queueInfo(_, rcvMsgInfo, queueInfo) = r { return (rcvMsgInfo, queueInfo) }
|
||||||
throw r
|
throw r
|
||||||
@@ -673,6 +682,13 @@ func apiSetConnectionIncognito(connId: Int64, incognito: Bool) async throws -> P
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiChangeConnectionUser(connId: Int64, userId: Int64) async throws -> PendingContactConnection? {
|
||||||
|
let r = await chatSendCmd(.apiChangeConnectionUser(connId: connId, userId: userId))
|
||||||
|
|
||||||
|
if case let .connectionUserChanged(_, _, toConnection, _) = r {return toConnection}
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
func apiConnectPlan(connReq: String) async throws -> ConnectionPlan {
|
func apiConnectPlan(connReq: String) async throws -> ConnectionPlan {
|
||||||
let userId = try currentUserId("apiConnectPlan")
|
let userId = try currentUserId("apiConnectPlan")
|
||||||
let r = await chatSendCmd(.apiConnectPlan(userId: userId, connReq: connReq))
|
let r = await chatSendCmd(.apiConnectPlan(userId: userId, connReq: connReq))
|
||||||
@@ -990,6 +1006,10 @@ func apiChatRead(type: ChatType, id: Int64, itemRange: (Int64, Int64)) async thr
|
|||||||
try await sendCommandOkResp(.apiChatRead(type: type, id: id, itemRange: itemRange))
|
try await sendCommandOkResp(.apiChatRead(type: type, id: id, itemRange: itemRange))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiChatItemsRead(type: ChatType, id: Int64, itemIds: [Int64]) async throws {
|
||||||
|
try await sendCommandOkResp(.apiChatItemsRead(type: type, id: id, itemIds: itemIds))
|
||||||
|
}
|
||||||
|
|
||||||
func apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool) async throws {
|
func apiChatUnread(type: ChatType, id: Int64, unreadChat: Bool) async throws {
|
||||||
try await sendCommandOkResp(.apiChatUnread(type: type, id: id, unreadChat: unreadChat))
|
try await sendCommandOkResp(.apiChatUnread(type: type, id: id, unreadChat: unreadChat))
|
||||||
}
|
}
|
||||||
@@ -1025,77 +1045,122 @@ func standaloneFileInfo(url: String, ctrl: chat_ctrl? = nil) async -> MigrationF
|
|||||||
}
|
}
|
||||||
|
|
||||||
func receiveFile(user: any UserLike, fileId: Int64, userApprovedRelays: Bool = false, auto: Bool = false) async {
|
func receiveFile(user: any UserLike, fileId: Int64, userApprovedRelays: Bool = false, auto: Bool = false) async {
|
||||||
if let chatItem = await apiReceiveFile(
|
await receiveFiles(
|
||||||
fileId: fileId,
|
user: user,
|
||||||
userApprovedRelays: userApprovedRelays || !privacyAskToApproveRelaysGroupDefault.get(),
|
fileIds: [fileId],
|
||||||
encrypted: privacyEncryptLocalFilesGroupDefault.get(),
|
userApprovedRelays: userApprovedRelays,
|
||||||
auto: auto
|
auto: auto
|
||||||
) {
|
)
|
||||||
await chatItemSimpleUpdate(user, chatItem)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiReceiveFile(fileId: Int64, userApprovedRelays: Bool, encrypted: Bool, inline: Bool? = nil, auto: Bool = false) async -> AChatItem? {
|
func receiveFiles(user: any UserLike, fileIds: [Int64], userApprovedRelays: Bool = false, auto: Bool = false) async {
|
||||||
let r = await chatSendCmd(.receiveFile(fileId: fileId, userApprovedRelays: userApprovedRelays, encrypted: encrypted, inline: inline))
|
var fileIdsToApprove = [Int64]()
|
||||||
let am = AlertManager.shared
|
var srvsToApprove = Set<String>()
|
||||||
if case let .rcvFileAccepted(_, chatItem) = r { return chatItem }
|
var otherFileErrs = [ChatResponse]()
|
||||||
if case .rcvFileAcceptedSndCancelled = r {
|
|
||||||
logger.debug("apiReceiveFile error: sender cancelled file transfer")
|
for fileId in fileIds {
|
||||||
if !auto {
|
let r = await chatSendCmd(
|
||||||
am.showAlertMsg(
|
.receiveFile(
|
||||||
title: "Cannot receive file",
|
fileId: fileId,
|
||||||
message: "Sender cancelled file transfer."
|
userApprovedRelays: userApprovedRelays || !privacyAskToApproveRelaysGroupDefault.get(),
|
||||||
|
encrypted: privacyEncryptLocalFilesGroupDefault.get(),
|
||||||
|
inline: nil
|
||||||
)
|
)
|
||||||
|
)
|
||||||
|
switch r {
|
||||||
|
case let .rcvFileAccepted(_, chatItem):
|
||||||
|
await chatItemSimpleUpdate(user, chatItem)
|
||||||
|
default:
|
||||||
|
if let chatError = chatError(r) {
|
||||||
|
switch chatError {
|
||||||
|
case let .fileNotApproved(fileId, unknownServers):
|
||||||
|
fileIdsToApprove.append(fileId)
|
||||||
|
srvsToApprove.formUnion(unknownServers)
|
||||||
|
default:
|
||||||
|
otherFileErrs.append(r)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else if let networkErrorAlert = networkErrorAlert(r) {
|
}
|
||||||
logger.error("apiReceiveFile network error: \(String(describing: r))")
|
|
||||||
if !auto {
|
if !auto {
|
||||||
am.showAlert(networkErrorAlert)
|
let otherErrsStr = if otherFileErrs.isEmpty {
|
||||||
|
""
|
||||||
|
} else if otherFileErrs.count == 1 {
|
||||||
|
"\(otherFileErrs[0])"
|
||||||
|
} else if otherFileErrs.count == 2 {
|
||||||
|
"\(otherFileErrs[0])\n\(otherFileErrs[1])"
|
||||||
|
} else {
|
||||||
|
"\(otherFileErrs[0])\n\(otherFileErrs[1])\nand \(otherFileErrs.count - 2) other error(s)"
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
switch chatError(r) {
|
// If there are not approved files, alert is shown the same way both in case of singular and plural files reception
|
||||||
case .fileCancelled:
|
if !fileIdsToApprove.isEmpty {
|
||||||
logger.debug("apiReceiveFile ignoring fileCancelled error")
|
let srvs = srvsToApprove
|
||||||
case .fileAlreadyReceiving:
|
.map { s in
|
||||||
logger.debug("apiReceiveFile ignoring fileAlreadyReceiving error")
|
|
||||||
case let .fileNotApproved(fileId, unknownServers):
|
|
||||||
logger.debug("apiReceiveFile fileNotApproved error")
|
|
||||||
if !auto {
|
|
||||||
let srvs = unknownServers.map { s in
|
|
||||||
if let srv = parseServerAddress(s), !srv.hostnames.isEmpty {
|
if let srv = parseServerAddress(s), !srv.hostnames.isEmpty {
|
||||||
srv.hostnames[0]
|
srv.hostnames[0]
|
||||||
} else {
|
} else {
|
||||||
serverHost(s)
|
serverHost(s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
am.showAlert(Alert(
|
.sorted()
|
||||||
title: Text("Unknown servers!"),
|
.joined(separator: ", ")
|
||||||
message: Text("Without Tor or VPN, your IP address will be visible to these XFTP relays: \(srvs.sorted().joined(separator: ", "))."),
|
let fIds = fileIdsToApprove
|
||||||
primaryButton: .default(
|
await MainActor.run {
|
||||||
Text("Download"),
|
showAlert(
|
||||||
action: {
|
title: NSLocalizedString("Unknown servers!", comment: "alert title"),
|
||||||
Task {
|
message: (
|
||||||
logger.debug("apiReceiveFile fileNotApproved alert - in Task")
|
String.localizedStringWithFormat(NSLocalizedString("Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.", comment: "alert message"), srvs) +
|
||||||
if let user = ChatModel.shared.currentUser {
|
(otherErrsStr != "" ? "\n\n" + String.localizedStringWithFormat(NSLocalizedString("Other file errors:\n%@", comment: "alert message"), otherErrsStr) : "")
|
||||||
await receiveFile(user: user, fileId: fileId, userApprovedRelays: true)
|
),
|
||||||
}
|
buttonTitle: NSLocalizedString("Download", comment: "alert button"),
|
||||||
|
buttonAction: {
|
||||||
|
Task {
|
||||||
|
logger.debug("apiReceiveFile fileNotApproved alert - in Task")
|
||||||
|
if let user = ChatModel.shared.currentUser {
|
||||||
|
await receiveFiles(user: user, fileIds: fIds, userApprovedRelays: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
),
|
},
|
||||||
secondaryButton: .cancel()
|
cancelButton: true
|
||||||
))
|
)
|
||||||
}
|
}
|
||||||
default:
|
} else if otherFileErrs.count == 1 { // If there is a single other error, we differentiate on it
|
||||||
logger.error("apiReceiveFile error: \(String(describing: r))")
|
let errorResponse = otherFileErrs.first!
|
||||||
if !auto {
|
switch errorResponse {
|
||||||
am.showAlertMsg(
|
case let .rcvFileAcceptedSndCancelled(_, rcvFileTransfer):
|
||||||
title: "Error receiving file",
|
logger.debug("receiveFiles error: sender cancelled file transfer \(rcvFileTransfer.fileId)")
|
||||||
message: "Error: \(responseError(r))"
|
await MainActor.run {
|
||||||
|
showAlert(
|
||||||
|
NSLocalizedString("Cannot receive file", comment: "alert title"),
|
||||||
|
message: NSLocalizedString("Sender cancelled file transfer.", comment: "alert message")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
if let chatError = chatError(errorResponse) {
|
||||||
|
switch chatError {
|
||||||
|
case .fileCancelled, .fileAlreadyReceiving:
|
||||||
|
logger.debug("receiveFiles ignoring FileCancelled or FileAlreadyReceiving error")
|
||||||
|
default:
|
||||||
|
await MainActor.run {
|
||||||
|
showAlert(
|
||||||
|
NSLocalizedString("Error receiving file", comment: "alert title"),
|
||||||
|
message: responseError(errorResponse)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if otherFileErrs.count > 1 { // If there are multiple other errors, we show general alert
|
||||||
|
await MainActor.run {
|
||||||
|
showAlert(
|
||||||
|
NSLocalizedString("Error receiving file", comment: "alert title"),
|
||||||
|
message: String.localizedStringWithFormat(NSLocalizedString("File errors:\n%@", comment: "alert message"), otherErrsStr)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func cancelFile(user: User, fileId: Int64) async {
|
func cancelFile(user: User, fileId: Int64) async {
|
||||||
@@ -1218,12 +1283,18 @@ func apiEndCall(_ contact: Contact) async throws {
|
|||||||
try await sendCommandOkResp(.apiEndCall(contact: contact))
|
try await sendCommandOkResp(.apiEndCall(contact: contact))
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiGetCallInvitations() throws -> [RcvCallInvitation] {
|
func apiGetCallInvitationsSync() throws -> [RcvCallInvitation] {
|
||||||
let r = chatSendCmdSync(.apiGetCallInvitations)
|
let r = chatSendCmdSync(.apiGetCallInvitations)
|
||||||
if case let .callInvitations(invs) = r { return invs }
|
if case let .callInvitations(invs) = r { return invs }
|
||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func apiGetCallInvitations() async throws -> [RcvCallInvitation] {
|
||||||
|
let r = await chatSendCmd(.apiGetCallInvitations)
|
||||||
|
if case let .callInvitations(invs) = r { return invs }
|
||||||
|
throw r
|
||||||
|
}
|
||||||
|
|
||||||
func apiCallStatus(_ contact: Contact, _ status: String) async throws {
|
func apiCallStatus(_ contact: Contact, _ status: String) async throws {
|
||||||
if let callStatus = WebRTCCallStatus.init(rawValue: status) {
|
if let callStatus = WebRTCCallStatus.init(rawValue: status) {
|
||||||
try await sendCommandOkResp(.apiCallStatus(contact: contact, callStatus: callStatus))
|
try await sendCommandOkResp(.apiCallStatus(contact: contact, callStatus: callStatus))
|
||||||
@@ -1271,11 +1342,23 @@ func markChatUnread(_ chat: Chat, unreadChat: Bool = true) async {
|
|||||||
|
|
||||||
func apiMarkChatItemRead(_ cInfo: ChatInfo, _ cItem: ChatItem) async {
|
func apiMarkChatItemRead(_ cInfo: ChatInfo, _ cItem: ChatItem) async {
|
||||||
do {
|
do {
|
||||||
logger.debug("apiMarkChatItemRead: \(cItem.id)")
|
|
||||||
try await apiChatRead(type: cInfo.chatType, id: cInfo.apiId, itemRange: (cItem.id, cItem.id))
|
try await apiChatRead(type: cInfo.chatType, id: cInfo.apiId, itemRange: (cItem.id, cItem.id))
|
||||||
await ChatModel.shared.markChatItemRead(cInfo, cItem)
|
DispatchQueue.main.async {
|
||||||
|
ChatModel.shared.markChatItemsRead(cInfo, [cItem.id])
|
||||||
|
}
|
||||||
} catch {
|
} catch {
|
||||||
logger.error("apiMarkChatItemRead apiChatRead error: \(responseError(error))")
|
logger.error("apiChatRead error: \(responseError(error))")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func apiMarkChatItemsRead(_ cInfo: ChatInfo, _ itemIds: [ChatItem.ID]) async {
|
||||||
|
do {
|
||||||
|
try await apiChatItemsRead(type: cInfo.chatType, id: cInfo.apiId, itemIds: itemIds)
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
ChatModel.shared.markChatItemsRead(cInfo, itemIds)
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
logger.error("apiChatItemsRead error: \(responseError(error))")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1422,7 +1505,7 @@ func apiGetVersion() throws -> CoreVersionInfo {
|
|||||||
|
|
||||||
func getAgentSubsTotal() async throws -> (SMPServerSubs, Bool) {
|
func getAgentSubsTotal() async throws -> (SMPServerSubs, Bool) {
|
||||||
let userId = try currentUserId("getAgentSubsTotal")
|
let userId = try currentUserId("getAgentSubsTotal")
|
||||||
let r = await chatSendCmd(.getAgentSubsTotal(userId: userId))
|
let r = await chatSendCmd(.getAgentSubsTotal(userId: userId), log: false)
|
||||||
if case let .agentSubsTotal(_, subsTotal, hasSession) = r { return (subsTotal, hasSession) }
|
if case let .agentSubsTotal(_, subsTotal, hasSession) = r { return (subsTotal, hasSession) }
|
||||||
logger.error("getAgentSubsTotal error: \(String(describing: r))")
|
logger.error("getAgentSubsTotal error: \(String(describing: r))")
|
||||||
throw r
|
throw r
|
||||||
@@ -1517,7 +1600,7 @@ func startChat(refreshInvitations: Bool = true) throws {
|
|||||||
try getUserChatData()
|
try getUserChatData()
|
||||||
NtfManager.shared.setNtfBadgeCount(m.totalUnreadCountForAllUsers())
|
NtfManager.shared.setNtfBadgeCount(m.totalUnreadCountForAllUsers())
|
||||||
if (refreshInvitations) {
|
if (refreshInvitations) {
|
||||||
try refreshCallInvitations()
|
Task { try await refreshCallInvitations() }
|
||||||
}
|
}
|
||||||
(m.savedToken, m.tokenStatus, m.notificationMode, m.notificationServer) = apiGetNtfToken()
|
(m.savedToken, m.tokenStatus, m.notificationMode, m.notificationServer) = apiGetNtfToken()
|
||||||
_ = try apiStartChat()
|
_ = try apiStartChat()
|
||||||
@@ -1591,8 +1674,7 @@ func getUserChatData() throws {
|
|||||||
m.userAddress = try apiGetUserAddress()
|
m.userAddress = try apiGetUserAddress()
|
||||||
m.chatItemTTL = try getChatItemTTL()
|
m.chatItemTTL = try getChatItemTTL()
|
||||||
let chats = try apiGetChats()
|
let chats = try apiGetChats()
|
||||||
m.chats = chats.map { Chat.init($0) }
|
m.updateChats(chats)
|
||||||
m.popChatCollector.clear()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func getUserChatDataAsync() async throws {
|
private func getUserChatDataAsync() async throws {
|
||||||
@@ -1604,14 +1686,12 @@ private func getUserChatDataAsync() async throws {
|
|||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
m.userAddress = userAddress
|
m.userAddress = userAddress
|
||||||
m.chatItemTTL = chatItemTTL
|
m.chatItemTTL = chatItemTTL
|
||||||
m.chats = chats.map { Chat.init($0) }
|
m.updateChats(chats)
|
||||||
m.popChatCollector.clear()
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
m.userAddress = nil
|
m.userAddress = nil
|
||||||
m.chats = []
|
m.updateChats([])
|
||||||
m.popChatCollector.clear()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1772,36 +1852,45 @@ func processReceivedMsg(_ res: ChatResponse) async {
|
|||||||
n.networkStatuses = ns
|
n.networkStatuses = ns
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case let .newChatItem(user, aChatItem):
|
case let .newChatItems(user, chatItems):
|
||||||
let cInfo = aChatItem.chatInfo
|
for chatItem in chatItems {
|
||||||
let cItem = aChatItem.chatItem
|
let cInfo = chatItem.chatInfo
|
||||||
await MainActor.run {
|
let cItem = chatItem.chatItem
|
||||||
if active(user) {
|
await MainActor.run {
|
||||||
m.addChatItem(cInfo, cItem)
|
if active(user) {
|
||||||
} else if cItem.isRcvNew && cInfo.ntfsEnabled {
|
m.addChatItem(cInfo, cItem)
|
||||||
m.increaseUnreadCounter(user: user)
|
} else if cItem.isRcvNew && cInfo.ntfsEnabled {
|
||||||
|
m.increaseUnreadCounter(user: user)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if let file = cItem.autoReceiveFile() {
|
||||||
|
Task {
|
||||||
|
await receiveFile(user: user, fileId: file.fileId, auto: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if cItem.showNotification {
|
||||||
|
NtfManager.shared.notifyMessageReceived(user, cInfo, cItem)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if let file = cItem.autoReceiveFile() {
|
case let .chatItemsStatusesUpdated(user, chatItems):
|
||||||
Task {
|
for chatItem in chatItems {
|
||||||
await receiveFile(user: user, fileId: file.fileId, auto: true)
|
let cInfo = chatItem.chatInfo
|
||||||
|
let cItem = chatItem.chatItem
|
||||||
|
if !cItem.isDeletedContent && active(user) {
|
||||||
|
await MainActor.run { m.updateChatItem(cInfo, cItem, status: cItem.meta.itemStatus) }
|
||||||
}
|
}
|
||||||
}
|
if let endTask = m.messageDelivery[cItem.id] {
|
||||||
if cItem.showNotification {
|
switch cItem.meta.itemStatus {
|
||||||
NtfManager.shared.notifyMessageReceived(user, cInfo, cItem)
|
case .sndNew: ()
|
||||||
}
|
case .sndSent: endTask()
|
||||||
case let .chatItemStatusUpdated(user, aChatItem):
|
case .sndRcvd: endTask()
|
||||||
let cInfo = aChatItem.chatInfo
|
case .sndErrorAuth: endTask()
|
||||||
let cItem = aChatItem.chatItem
|
case .sndError: endTask()
|
||||||
if !cItem.isDeletedContent && active(user) {
|
case .sndWarning: endTask()
|
||||||
await MainActor.run { m.updateChatItem(cInfo, cItem, status: cItem.meta.itemStatus) }
|
case .rcvNew: ()
|
||||||
}
|
case .rcvRead: ()
|
||||||
if let endTask = m.messageDelivery[cItem.id] {
|
case .invalid: ()
|
||||||
switch cItem.meta.itemStatus {
|
}
|
||||||
case .sndSent: endTask()
|
|
||||||
case .sndErrorAuth: endTask()
|
|
||||||
case .sndError: endTask()
|
|
||||||
default: ()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case let .chatItemUpdated(user, aChatItem):
|
case let .chatItemUpdated(user, aChatItem):
|
||||||
@@ -2164,32 +2253,42 @@ func chatItemSimpleUpdate(_ user: any UserLike, _ aChatItem: AChatItem) async {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func refreshCallInvitations() throws {
|
func refreshCallInvitations() async throws {
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
let callInvitations = try justRefreshCallInvitations()
|
let callInvitations = try await apiGetCallInvitations()
|
||||||
if let (chatId, ntfAction) = m.ntfCallInvitationAction,
|
await MainActor.run {
|
||||||
let invitation = m.callInvitations.removeValue(forKey: chatId) {
|
m.callInvitations = callsByChat(callInvitations)
|
||||||
m.ntfCallInvitationAction = nil
|
if let (chatId, ntfAction) = m.ntfCallInvitationAction,
|
||||||
CallController.shared.callAction(invitation: invitation, action: ntfAction)
|
let invitation = m.callInvitations.removeValue(forKey: chatId) {
|
||||||
} else if let invitation = callInvitations.last(where: { $0.user.showNotifications }) {
|
m.ntfCallInvitationAction = nil
|
||||||
activateCall(invitation)
|
CallController.shared.callAction(invitation: invitation, action: ntfAction)
|
||||||
|
} else if let invitation = callInvitations.last(where: { $0.user.showNotifications }) {
|
||||||
|
activateCall(invitation)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func justRefreshCallInvitations() throws -> [RcvCallInvitation] {
|
func justRefreshCallInvitations() async throws {
|
||||||
let m = ChatModel.shared
|
let callInvitations = try apiGetCallInvitationsSync()
|
||||||
let callInvitations = try apiGetCallInvitations()
|
await MainActor.run {
|
||||||
m.callInvitations = callInvitations.reduce(into: [ChatId: RcvCallInvitation]()) { result, inv in result[inv.contact.id] = inv }
|
ChatModel.shared.callInvitations = callsByChat(callInvitations)
|
||||||
return callInvitations
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func callsByChat(_ callInvitations: [RcvCallInvitation]) -> [ChatId: RcvCallInvitation] {
|
||||||
|
callInvitations.reduce(into: [ChatId: RcvCallInvitation]()) {
|
||||||
|
result, inv in result[inv.contact.id] = inv
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func activateCall(_ callInvitation: RcvCallInvitation) {
|
func activateCall(_ callInvitation: RcvCallInvitation) {
|
||||||
if !callInvitation.user.showNotifications { return }
|
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
|
logger.debug("reportNewIncomingCall activeCallUUID \(String(describing: m.activeCall?.callUUID)) invitationUUID \(String(describing: callInvitation.callUUID))")
|
||||||
|
if !callInvitation.user.showNotifications || m.activeCall?.callUUID == callInvitation.callUUID { return }
|
||||||
CallController.shared.reportNewIncomingCall(invitation: callInvitation) { error in
|
CallController.shared.reportNewIncomingCall(invitation: callInvitation) { error in
|
||||||
if let error = error {
|
if let error = error {
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
m.callInvitations[callInvitation.contact.id]?.callkitUUID = nil
|
m.callInvitations[callInvitation.contact.id]?.callUUID = nil
|
||||||
}
|
}
|
||||||
logger.error("reportNewIncomingCall error: \(error.localizedDescription)")
|
logger.error("reportNewIncomingCall error: \(error.localizedDescription)")
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -83,9 +83,11 @@ struct SimpleXApp: App {
|
|||||||
if appState != .stopped {
|
if appState != .stopped {
|
||||||
startChatAndActivate {
|
startChatAndActivate {
|
||||||
if appState.inactive && chatModel.chatRunning == true {
|
if appState.inactive && chatModel.chatRunning == true {
|
||||||
updateChats()
|
Task {
|
||||||
if !chatModel.showCallView && !CallController.shared.hasActiveCalls() {
|
await updateChats()
|
||||||
updateCallInvitations()
|
if !chatModel.showCallView && !CallController.shared.hasActiveCalls() {
|
||||||
|
await updateCallInvitations()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -130,16 +132,16 @@ struct SimpleXApp: App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateChats() {
|
private func updateChats() async {
|
||||||
do {
|
do {
|
||||||
let chats = try apiGetChats()
|
let chats = try await apiGetChatsAsync()
|
||||||
chatModel.updateChats(with: chats)
|
await MainActor.run { chatModel.updateChats(chats) }
|
||||||
if let id = chatModel.chatId,
|
if let id = chatModel.chatId,
|
||||||
let chat = chatModel.getChat(id) {
|
let chat = chatModel.getChat(id) {
|
||||||
Task { await loadChat(chat: chat, clearItems: false) }
|
Task { await loadChat(chat: chat, clearItems: false) }
|
||||||
}
|
}
|
||||||
if let ncr = chatModel.ntfContactRequest {
|
if let ncr = chatModel.ntfContactRequest {
|
||||||
chatModel.ntfContactRequest = nil
|
await MainActor.run { chatModel.ntfContactRequest = nil }
|
||||||
if case let .contactRequest(contactRequest) = chatModel.getChat(ncr.chatId)?.chatInfo {
|
if case let .contactRequest(contactRequest) = chatModel.getChat(ncr.chatId)?.chatInfo {
|
||||||
Task { await acceptContactRequest(incognito: ncr.incognito, contactRequest: contactRequest) }
|
Task { await acceptContactRequest(incognito: ncr.incognito, contactRequest: contactRequest) }
|
||||||
}
|
}
|
||||||
@@ -149,9 +151,9 @@ struct SimpleXApp: App {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateCallInvitations() {
|
private func updateCallInvitations() async {
|
||||||
do {
|
do {
|
||||||
try refreshCallInvitations()
|
try await refreshCallInvitations()
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("apiGetCallInvitations: cannot update call invitations \(responseError(error))")
|
logger.error("apiGetCallInvitations: cannot update call invitations \(responseError(error))")
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -91,8 +91,8 @@ var systemInDarkThemeCurrently: Bool {
|
|||||||
return UITraitCollection.current.userInterfaceStyle == .dark
|
return UITraitCollection.current.userInterfaceStyle == .dark
|
||||||
}
|
}
|
||||||
|
|
||||||
func reactOnDarkThemeChanges() {
|
func reactOnDarkThemeChanges(_ inDarkNow: Bool) {
|
||||||
if currentThemeDefault.get() == DefaultTheme.SYSTEM_THEME_NAME && CurrentColors.colors.isLight == systemInDarkThemeCurrently {
|
if currentThemeDefault.get() == DefaultTheme.SYSTEM_THEME_NAME && CurrentColors.colors.isLight == inDarkNow {
|
||||||
// Change active colors from light to dark and back based on system theme
|
// Change active colors from light to dark and back based on system theme
|
||||||
ThemeManager.applyTheme(DefaultTheme.SYSTEM_THEME_NAME)
|
ThemeManager.applyTheme(DefaultTheme.SYSTEM_THEME_NAME)
|
||||||
}
|
}
|
||||||
@@ -102,7 +102,7 @@ extension ThemeWallpaper {
|
|||||||
public func importFromString() -> ThemeWallpaper {
|
public func importFromString() -> ThemeWallpaper {
|
||||||
if preset == nil, let image {
|
if preset == nil, let image {
|
||||||
// Need to save image from string and to save its path
|
// Need to save image from string and to save its path
|
||||||
if let parsed = UIImage(base64Encoded: image),
|
if let parsed = imageFromBase64(image),
|
||||||
let filename = saveWallpaperFile(image: parsed) {
|
let filename = saveWallpaperFile(image: parsed) {
|
||||||
var copy = self
|
var copy = self
|
||||||
copy.image = nil
|
copy.image = nil
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ class ThemeManager {
|
|||||||
return perUserTheme
|
return perUserTheme
|
||||||
}
|
}
|
||||||
let defaultTheme = defaultActiveTheme(appSettingsTheme)
|
let defaultTheme = defaultActiveTheme(appSettingsTheme)
|
||||||
return ThemeModeOverride(mode: CurrentColors.base.mode, colors: defaultTheme?.colors ?? ThemeColors(), wallpaper: defaultTheme?.wallpaper)
|
return ThemeModeOverride(mode: CurrentColors.base.mode, colors: defaultTheme?.colors ?? ThemeColors(), wallpaper: defaultTheme?.wallpaper ?? ThemeWallpaper.from(PresetWallpaper.school.toType(CurrentColors.base), nil, nil))
|
||||||
}
|
}
|
||||||
|
|
||||||
static func currentColors(_ themeOverridesForType: WallpaperType?, _ perChatTheme: ThemeModeOverride?, _ perUserTheme: ThemeModeOverrides?, _ appSettingsTheme: [ThemeOverrides]) -> ActiveTheme {
|
static func currentColors(_ themeOverridesForType: WallpaperType?, _ perChatTheme: ThemeModeOverride?, _ perUserTheme: ThemeModeOverrides?, _ appSettingsTheme: [ThemeOverrides]) -> ActiveTheme {
|
||||||
@@ -197,7 +197,7 @@ class ThemeManager {
|
|||||||
var themeIds = currentThemeIdsDefault.get()
|
var themeIds = currentThemeIdsDefault.get()
|
||||||
themeIds[nonSystemThemeName] = prevValue.themeId
|
themeIds[nonSystemThemeName] = prevValue.themeId
|
||||||
currentThemeIdsDefault.set(themeIds)
|
currentThemeIdsDefault.set(themeIds)
|
||||||
applyTheme(nonSystemThemeName)
|
applyTheme(currentThemeDefault.get())
|
||||||
}
|
}
|
||||||
|
|
||||||
static func copyFromSameThemeOverrides(_ type: WallpaperType?, _ lowerLevelOverride: ThemeModeOverride?, _ pref: Binding<ThemeModeOverride>) -> Bool {
|
static func copyFromSameThemeOverrides(_ type: WallpaperType?, _ lowerLevelOverride: ThemeModeOverride?, _ pref: Binding<ThemeModeOverride>) -> Bool {
|
||||||
|
|||||||
@@ -185,7 +185,7 @@ struct ActiveCallView: View {
|
|||||||
case .ended:
|
case .ended:
|
||||||
closeCallView(client)
|
closeCallView(client)
|
||||||
call.callState = .ended
|
call.callState = .ended
|
||||||
if let uuid = call.callkitUUID {
|
if let uuid = call.callUUID {
|
||||||
CallController.shared.endCall(callUUID: uuid)
|
CallController.shared.endCall(callUUID: uuid)
|
||||||
}
|
}
|
||||||
case .ok:
|
case .ok:
|
||||||
@@ -214,10 +214,12 @@ struct ActiveCallView: View {
|
|||||||
ChatReceiver.shared.messagesChannel = nil
|
ChatReceiver.shared.messagesChannel = nil
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if case let .chatItemStatusUpdated(_, msg) = msg,
|
if case let .chatItemsStatusesUpdated(_, chatItems) = msg,
|
||||||
msg.chatInfo.id == call.contact.id,
|
chatItems.contains(where: { ci in
|
||||||
case .sndCall = msg.chatItem.content,
|
ci.chatInfo.id == call.contact.id &&
|
||||||
case .sndRcvd = msg.chatItem.meta.itemStatus {
|
ci.chatItem.content.isSndCall &&
|
||||||
|
ci.chatItem.meta.itemStatus.isSndRcvd
|
||||||
|
}) {
|
||||||
CallSoundsPlayer.shared.startInCallSound()
|
CallSoundsPlayer.shared.startInCallSound()
|
||||||
ChatReceiver.shared.messagesChannel = nil
|
ChatReceiver.shared.messagesChannel = nil
|
||||||
}
|
}
|
||||||
@@ -382,7 +384,7 @@ struct ActiveCallOverlay: View {
|
|||||||
private func endCallButton() -> some View {
|
private func endCallButton() -> some View {
|
||||||
let cc = CallController.shared
|
let cc = CallController.shared
|
||||||
return callButton("phone.down.fill", width: 60, height: 60) {
|
return callButton("phone.down.fill", width: 60, height: 60) {
|
||||||
if let uuid = call.callkitUUID {
|
if let uuid = call.callUUID {
|
||||||
cc.endCall(callUUID: uuid)
|
cc.endCall(callUUID: uuid)
|
||||||
} else {
|
} else {
|
||||||
cc.endCall(call: call) {}
|
cc.endCall(call: call) {}
|
||||||
@@ -462,9 +464,9 @@ struct ActiveCallOverlay: View {
|
|||||||
struct ActiveCallOverlay_Previews: PreviewProvider {
|
struct ActiveCallOverlay_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
Group{
|
Group{
|
||||||
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callkitUUID: UUID(), callState: .offerSent, localMedia: .video), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
|
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, localMedia: .video), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
|
||||||
.background(.black)
|
.background(.black)
|
||||||
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callkitUUID: UUID(), callState: .offerSent, localMedia: .audio), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
|
ActiveCallOverlay(call: Call(direction: .incoming, contact: Contact.sampleData, callUUID: UUID().uuidString.lowercased(), callState: .offerSent, localMedia: .audio), client: WebRTCClient(Binding.constant(nil), { _ in }, Binding.constant(nil)))
|
||||||
.background(.black)
|
.background(.black)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
|
|
||||||
func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
|
func provider(_ provider: CXProvider, perform action: CXStartCallAction) {
|
||||||
logger.debug("CallController.provider CXStartCallAction")
|
logger.debug("CallController.provider CXStartCallAction")
|
||||||
if callManager.startOutgoingCall(callUUID: action.callUUID) {
|
if callManager.startOutgoingCall(callUUID: action.callUUID.uuidString.lowercased()) {
|
||||||
action.fulfill()
|
action.fulfill()
|
||||||
provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil)
|
provider.reportOutgoingCall(with: action.callUUID, startedConnectingAt: nil)
|
||||||
} else {
|
} else {
|
||||||
@@ -61,12 +61,30 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
|
|
||||||
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
|
func provider(_ provider: CXProvider, perform action: CXAnswerCallAction) {
|
||||||
logger.debug("CallController.provider CXAnswerCallAction")
|
logger.debug("CallController.provider CXAnswerCallAction")
|
||||||
if callManager.answerIncomingCall(callUUID: action.callUUID) {
|
Task {
|
||||||
// WebRTC call should be in connected state to fulfill.
|
let chatIsReady = await waitUntilChatStarted(timeoutMs: 30_000, stepMs: 500)
|
||||||
// Otherwise no audio and mic working on lockscreen
|
logger.debug("CallController chat started \(chatIsReady) \(ChatModel.shared.chatInitialized) \(ChatModel.shared.chatRunning == true) \(String(describing: AppChatState.shared.value))")
|
||||||
fulfillOnConnect = action
|
if !chatIsReady {
|
||||||
} else {
|
action.fail()
|
||||||
action.fail()
|
return
|
||||||
|
}
|
||||||
|
if !ChatModel.shared.callInvitations.values.contains(where: { inv in inv.callUUID == action.callUUID.uuidString.lowercased() }) {
|
||||||
|
try? await justRefreshCallInvitations()
|
||||||
|
logger.debug("CallController: updated call invitations chat")
|
||||||
|
}
|
||||||
|
await MainActor.run {
|
||||||
|
logger.debug("CallController.provider will answer on call")
|
||||||
|
|
||||||
|
if callManager.answerIncomingCall(callUUID: action.callUUID.uuidString.lowercased()) {
|
||||||
|
logger.debug("CallController.provider answered on call")
|
||||||
|
// WebRTC call should be in connected state to fulfill.
|
||||||
|
// Otherwise no audio and mic working on lockscreen
|
||||||
|
fulfillOnConnect = action
|
||||||
|
} else {
|
||||||
|
logger.debug("CallController.provider will fail the call")
|
||||||
|
action.fail()
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +93,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
// Should be nil here if connection was in connected state
|
// Should be nil here if connection was in connected state
|
||||||
fulfillOnConnect?.fail()
|
fulfillOnConnect?.fail()
|
||||||
fulfillOnConnect = nil
|
fulfillOnConnect = nil
|
||||||
callManager.endCall(callUUID: action.callUUID) { ok in
|
callManager.endCall(callUUID: action.callUUID.uuidString.lowercased()) { ok in
|
||||||
if ok {
|
if ok {
|
||||||
action.fulfill()
|
action.fulfill()
|
||||||
} else {
|
} else {
|
||||||
@@ -86,7 +104,7 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
}
|
}
|
||||||
|
|
||||||
func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) {
|
func provider(_ provider: CXProvider, perform action: CXSetMutedCallAction) {
|
||||||
if callManager.enableMedia(media: .audio, enable: !action.isMuted, callUUID: action.callUUID) {
|
if callManager.enableMedia(media: .audio, enable: !action.isMuted, callUUID: action.callUUID.uuidString.lowercased()) {
|
||||||
action.fulfill()
|
action.fulfill()
|
||||||
} else {
|
} else {
|
||||||
action.fail()
|
action.fail()
|
||||||
@@ -156,6 +174,19 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func waitUntilChatStarted(timeoutMs: UInt64, stepMs: UInt64) async -> Bool {
|
||||||
|
logger.debug("CallController waiting until chat started")
|
||||||
|
var t: UInt64 = 0
|
||||||
|
repeat {
|
||||||
|
if ChatModel.shared.chatInitialized, ChatModel.shared.chatRunning == true, case .active = AppChatState.shared.value {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
_ = try? await Task.sleep(nanoseconds: stepMs * 1000000)
|
||||||
|
t += stepMs
|
||||||
|
} while t < timeoutMs
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
@objc(pushRegistry:didUpdatePushCredentials:forType:)
|
@objc(pushRegistry:didUpdatePushCredentials:forType:)
|
||||||
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
|
func pushRegistry(_ registry: PKPushRegistry, didUpdate pushCredentials: PKPushCredentials, for type: PKPushType) {
|
||||||
logger.debug("CallController: didUpdate push credentials for type \(type.rawValue)")
|
logger.debug("CallController: didUpdate push credentials for type \(type.rawValue)")
|
||||||
@@ -171,32 +202,19 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
self.reportExpiredCall(payload: payload, completion)
|
self.reportExpiredCall(payload: payload, completion)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (!ChatModel.shared.chatInitialized) {
|
|
||||||
logger.debug("CallController: initializing chat")
|
|
||||||
do {
|
|
||||||
try initializeChat(start: true, refreshInvitations: false)
|
|
||||||
} catch let error {
|
|
||||||
logger.error("CallController: initializing chat error: \(error)")
|
|
||||||
self.reportExpiredCall(payload: payload, completion)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
logger.debug("CallController: initialized chat")
|
|
||||||
startChatForCall()
|
|
||||||
logger.debug("CallController: started chat")
|
|
||||||
self.shouldSuspendChat = true
|
|
||||||
// There are no invitations in the model, as it was processed by NSE
|
|
||||||
_ = try? justRefreshCallInvitations()
|
|
||||||
logger.debug("CallController: updated call invitations chat")
|
|
||||||
// logger.debug("CallController justRefreshCallInvitations: \(String(describing: m.callInvitations))")
|
|
||||||
// Extract the call information from the push notification payload
|
// Extract the call information from the push notification payload
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
if let contactId = payload.dictionaryPayload["contactId"] as? String,
|
if let contactId = payload.dictionaryPayload["contactId"] as? String,
|
||||||
let invitation = m.callInvitations[contactId] {
|
let displayName = payload.dictionaryPayload["displayName"] as? String,
|
||||||
let update = self.cxCallUpdate(invitation: invitation)
|
let callUUID = payload.dictionaryPayload["callUUID"] as? String,
|
||||||
if let uuid = invitation.callkitUUID {
|
let uuid = UUID(uuidString: callUUID),
|
||||||
|
let callTsInterval = payload.dictionaryPayload["callTs"] as? TimeInterval,
|
||||||
|
let mediaStr = payload.dictionaryPayload["media"] as? String,
|
||||||
|
let media = CallMediaType(rawValue: mediaStr) {
|
||||||
|
let update = self.cxCallUpdate(contactId, displayName, media)
|
||||||
|
let callTs = Date(timeIntervalSince1970: callTsInterval)
|
||||||
|
if callTs.timeIntervalSinceNow >= -180 {
|
||||||
logger.debug("CallController: report pushkit call via CallKit")
|
logger.debug("CallController: report pushkit call via CallKit")
|
||||||
let update = self.cxCallUpdate(invitation: invitation)
|
|
||||||
self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
|
self.provider.reportNewIncomingCall(with: uuid, update: update) { error in
|
||||||
if error != nil {
|
if error != nil {
|
||||||
m.callInvitations.removeValue(forKey: contactId)
|
m.callInvitations.removeValue(forKey: contactId)
|
||||||
@@ -205,11 +223,31 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
completion()
|
completion()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
logger.debug("CallController will expire call 1")
|
||||||
self.reportExpiredCall(update: update, completion)
|
self.reportExpiredCall(update: update, completion)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
logger.debug("CallController will expire call 2")
|
||||||
self.reportExpiredCall(payload: payload, completion)
|
self.reportExpiredCall(payload: payload, completion)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
|
||||||
|
if (!ChatModel.shared.chatInitialized) {
|
||||||
|
logger.debug("CallController: initializing chat")
|
||||||
|
do {
|
||||||
|
try initializeChat(start: true, refreshInvitations: false)
|
||||||
|
} catch let error {
|
||||||
|
logger.error("CallController: initializing chat error: \(error)")
|
||||||
|
if let call = ChatModel.shared.activeCall {
|
||||||
|
self.endCall(call: call, completed: completion)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
logger.debug("CallController: initialized chat")
|
||||||
|
startChatForCall()
|
||||||
|
logger.debug("CallController: started chat")
|
||||||
|
self.shouldSuspendChat = true
|
||||||
}
|
}
|
||||||
|
|
||||||
// This function fulfils the requirement to always report a call when PushKit notification is received,
|
// This function fulfils the requirement to always report a call when PushKit notification is received,
|
||||||
@@ -239,8 +277,8 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
}
|
}
|
||||||
|
|
||||||
func reportNewIncomingCall(invitation: RcvCallInvitation, completion: @escaping (Error?) -> Void) {
|
func reportNewIncomingCall(invitation: RcvCallInvitation, completion: @escaping (Error?) -> Void) {
|
||||||
logger.debug("CallController.reportNewIncomingCall, UUID=\(String(describing: invitation.callkitUUID))")
|
logger.debug("CallController.reportNewIncomingCall, UUID=\(String(describing: invitation.callUUID))")
|
||||||
if CallController.useCallKit(), let uuid = invitation.callkitUUID {
|
if CallController.useCallKit(), let callUUID = invitation.callUUID, let uuid = UUID(uuidString: callUUID) {
|
||||||
if invitation.callTs.timeIntervalSinceNow >= -180 {
|
if invitation.callTs.timeIntervalSinceNow >= -180 {
|
||||||
let update = cxCallUpdate(invitation: invitation)
|
let update = cxCallUpdate(invitation: invitation)
|
||||||
provider.reportNewIncomingCall(with: uuid, update: update, completion: completion)
|
provider.reportNewIncomingCall(with: uuid, update: update, completion: completion)
|
||||||
@@ -261,6 +299,14 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
return update
|
return update
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func cxCallUpdate(_ contactId: String, _ displayName: String, _ media: CallMediaType) -> CXCallUpdate {
|
||||||
|
let update = CXCallUpdate()
|
||||||
|
update.remoteHandle = CXHandle(type: .generic, value: contactId)
|
||||||
|
update.hasVideo = media == .video
|
||||||
|
update.localizedCallerName = displayName
|
||||||
|
return update
|
||||||
|
}
|
||||||
|
|
||||||
func reportIncomingCall(call: Call, connectedAt dateConnected: Date?) {
|
func reportIncomingCall(call: Call, connectedAt dateConnected: Date?) {
|
||||||
logger.debug("CallController: reporting incoming call connected")
|
logger.debug("CallController: reporting incoming call connected")
|
||||||
if CallController.useCallKit() {
|
if CallController.useCallKit() {
|
||||||
@@ -272,14 +318,14 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
|
|
||||||
func reportOutgoingCall(call: Call, connectedAt dateConnected: Date?) {
|
func reportOutgoingCall(call: Call, connectedAt dateConnected: Date?) {
|
||||||
logger.debug("CallController: reporting outgoing call connected")
|
logger.debug("CallController: reporting outgoing call connected")
|
||||||
if CallController.useCallKit(), let uuid = call.callkitUUID {
|
if CallController.useCallKit(), let callUUID = call.callUUID, let uuid = UUID(uuidString: callUUID) {
|
||||||
provider.reportOutgoingCall(with: uuid, connectedAt: dateConnected)
|
provider.reportOutgoingCall(with: uuid, connectedAt: dateConnected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func reportCallRemoteEnded(invitation: RcvCallInvitation) {
|
func reportCallRemoteEnded(invitation: RcvCallInvitation) {
|
||||||
logger.debug("CallController: reporting remote ended")
|
logger.debug("CallController: reporting remote ended")
|
||||||
if CallController.useCallKit(), let uuid = invitation.callkitUUID {
|
if CallController.useCallKit(), let callUUID = invitation.callUUID, let uuid = UUID(uuidString: callUUID) {
|
||||||
provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded)
|
provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded)
|
||||||
} else if invitation.contact.id == activeCallInvitation?.contact.id {
|
} else if invitation.contact.id == activeCallInvitation?.contact.id {
|
||||||
activeCallInvitation = nil
|
activeCallInvitation = nil
|
||||||
@@ -288,14 +334,17 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
|
|
||||||
func reportCallRemoteEnded(call: Call) {
|
func reportCallRemoteEnded(call: Call) {
|
||||||
logger.debug("CallController: reporting remote ended")
|
logger.debug("CallController: reporting remote ended")
|
||||||
if CallController.useCallKit(), let uuid = call.callkitUUID {
|
if CallController.useCallKit(), let callUUID = call.callUUID, let uuid = UUID(uuidString: callUUID) {
|
||||||
provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded)
|
provider.reportCall(with: uuid, endedAt: nil, reason: .remoteEnded)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func startCall(_ contact: Contact, _ media: CallMediaType) {
|
func startCall(_ contact: Contact, _ media: CallMediaType) {
|
||||||
logger.debug("CallController.startCall")
|
logger.debug("CallController.startCall")
|
||||||
let uuid = callManager.newOutgoingCall(contact, media)
|
let callUUID = callManager.newOutgoingCall(contact, media)
|
||||||
|
guard let uuid = UUID(uuidString: callUUID) else {
|
||||||
|
return
|
||||||
|
}
|
||||||
if CallController.useCallKit() {
|
if CallController.useCallKit() {
|
||||||
let handle = CXHandle(type: .generic, value: contact.id)
|
let handle = CXHandle(type: .generic, value: contact.id)
|
||||||
let action = CXStartCallAction(call: uuid, handle: handle)
|
let action = CXStartCallAction(call: uuid, handle: handle)
|
||||||
@@ -307,8 +356,8 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
update.localizedCallerName = contact.displayName
|
update.localizedCallerName = contact.displayName
|
||||||
self.provider.reportCall(with: uuid, updated: update)
|
self.provider.reportCall(with: uuid, updated: update)
|
||||||
}
|
}
|
||||||
} else if callManager.startOutgoingCall(callUUID: uuid) {
|
} else if callManager.startOutgoingCall(callUUID: callUUID) {
|
||||||
if callManager.startOutgoingCall(callUUID: uuid) {
|
if callManager.startOutgoingCall(callUUID: callUUID) {
|
||||||
logger.debug("CallController.startCall: call started")
|
logger.debug("CallController.startCall: call started")
|
||||||
} else {
|
} else {
|
||||||
logger.error("CallController.startCall: no active call")
|
logger.error("CallController.startCall: no active call")
|
||||||
@@ -318,8 +367,8 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
|
|
||||||
func answerCall(invitation: RcvCallInvitation) {
|
func answerCall(invitation: RcvCallInvitation) {
|
||||||
logger.debug("CallController: answering a call")
|
logger.debug("CallController: answering a call")
|
||||||
if CallController.useCallKit(), let callUUID = invitation.callkitUUID {
|
if CallController.useCallKit(), let callUUID = invitation.callUUID, let uuid = UUID(uuidString: callUUID) {
|
||||||
requestTransaction(with: CXAnswerCallAction(call: callUUID))
|
requestTransaction(with: CXAnswerCallAction(call: uuid))
|
||||||
} else {
|
} else {
|
||||||
callManager.answerIncomingCall(invitation: invitation)
|
callManager.answerIncomingCall(invitation: invitation)
|
||||||
}
|
}
|
||||||
@@ -328,10 +377,13 @@ class CallController: NSObject, CXProviderDelegate, PKPushRegistryDelegate, Obse
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func endCall(callUUID: UUID) {
|
func endCall(callUUID: String) {
|
||||||
logger.debug("CallController: ending the call with UUID \(callUUID.uuidString)")
|
let uuid = UUID(uuidString: callUUID)
|
||||||
|
logger.debug("CallController: ending the call with UUID \(callUUID)")
|
||||||
if CallController.useCallKit() {
|
if CallController.useCallKit() {
|
||||||
requestTransaction(with: CXEndCallAction(call: callUUID))
|
if let uuid {
|
||||||
|
requestTransaction(with: CXEndCallAction(call: uuid))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
callManager.endCall(callUUID: callUUID) { ok in
|
callManager.endCall(callUUID: callUUID) { ok in
|
||||||
if ok {
|
if ok {
|
||||||
|
|||||||
@@ -10,17 +10,17 @@ import Foundation
|
|||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
class CallManager {
|
class CallManager {
|
||||||
func newOutgoingCall(_ contact: Contact, _ media: CallMediaType) -> UUID {
|
func newOutgoingCall(_ contact: Contact, _ media: CallMediaType) -> String {
|
||||||
let uuid = UUID()
|
let uuid = UUID().uuidString.lowercased()
|
||||||
let call = Call(direction: .outgoing, contact: contact, callkitUUID: uuid, callState: .waitCapabilities, localMedia: media)
|
let call = Call(direction: .outgoing, contact: contact, callUUID: uuid, callState: .waitCapabilities, localMedia: media)
|
||||||
call.speakerEnabled = media == .video
|
call.speakerEnabled = media == .video
|
||||||
ChatModel.shared.activeCall = call
|
ChatModel.shared.activeCall = call
|
||||||
return uuid
|
return uuid
|
||||||
}
|
}
|
||||||
|
|
||||||
func startOutgoingCall(callUUID: UUID) -> Bool {
|
func startOutgoingCall(callUUID: String) -> Bool {
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
if let call = m.activeCall, call.callkitUUID == callUUID {
|
if let call = m.activeCall, call.callUUID == callUUID {
|
||||||
m.showCallView = true
|
m.showCallView = true
|
||||||
Task { await m.callCommand.processCommand(.capabilities(media: call.localMedia)) }
|
Task { await m.callCommand.processCommand(.capabilities(media: call.localMedia)) }
|
||||||
return true
|
return true
|
||||||
@@ -28,7 +28,7 @@ class CallManager {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func answerIncomingCall(callUUID: UUID) -> Bool {
|
func answerIncomingCall(callUUID: String) -> Bool {
|
||||||
if let invitation = getCallInvitation(callUUID) {
|
if let invitation = getCallInvitation(callUUID) {
|
||||||
answerIncomingCall(invitation: invitation)
|
answerIncomingCall(invitation: invitation)
|
||||||
return true
|
return true
|
||||||
@@ -42,7 +42,7 @@ class CallManager {
|
|||||||
let call = Call(
|
let call = Call(
|
||||||
direction: .incoming,
|
direction: .incoming,
|
||||||
contact: invitation.contact,
|
contact: invitation.contact,
|
||||||
callkitUUID: invitation.callkitUUID,
|
callUUID: invitation.callUUID,
|
||||||
callState: .invitationAccepted,
|
callState: .invitationAccepted,
|
||||||
localMedia: invitation.callType.media,
|
localMedia: invitation.callType.media,
|
||||||
sharedKey: invitation.sharedKey
|
sharedKey: invitation.sharedKey
|
||||||
@@ -68,8 +68,8 @@ class CallManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func enableMedia(media: CallMediaType, enable: Bool, callUUID: UUID) -> Bool {
|
func enableMedia(media: CallMediaType, enable: Bool, callUUID: String) -> Bool {
|
||||||
if let call = ChatModel.shared.activeCall, call.callkitUUID == callUUID {
|
if let call = ChatModel.shared.activeCall, call.callUUID == callUUID {
|
||||||
let m = ChatModel.shared
|
let m = ChatModel.shared
|
||||||
Task { await m.callCommand.processCommand(.media(media: media, enable: enable)) }
|
Task { await m.callCommand.processCommand(.media(media: media, enable: enable)) }
|
||||||
return true
|
return true
|
||||||
@@ -77,8 +77,8 @@ class CallManager {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func endCall(callUUID: UUID, completed: @escaping (Bool) -> Void) {
|
func endCall(callUUID: String, completed: @escaping (Bool) -> Void) {
|
||||||
if let call = ChatModel.shared.activeCall, call.callkitUUID == callUUID {
|
if let call = ChatModel.shared.activeCall, call.callUUID == callUUID {
|
||||||
endCall(call: call) { completed(true) }
|
endCall(call: call) { completed(true) }
|
||||||
} else if let invitation = getCallInvitation(callUUID) {
|
} else if let invitation = getCallInvitation(callUUID) {
|
||||||
endCall(invitation: invitation) { completed(true) }
|
endCall(invitation: invitation) { completed(true) }
|
||||||
@@ -126,8 +126,8 @@ class CallManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func getCallInvitation(_ callUUID: UUID) -> RcvCallInvitation? {
|
private func getCallInvitation(_ callUUID: String) -> RcvCallInvitation? {
|
||||||
if let (_, invitation) = ChatModel.shared.callInvitations.first(where: { (_, inv) in inv.callkitUUID == callUUID }) {
|
if let (_, invitation) = ChatModel.shared.callInvitations.first(where: { (_, inv) in inv.callUUID == callUUID }) {
|
||||||
return invitation
|
return invitation
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ struct IncomingCallView: View {
|
|||||||
}
|
}
|
||||||
HStack {
|
HStack {
|
||||||
ProfilePreview(profileOf: invitation.contact, color: .white)
|
ProfilePreview(profileOf: invitation.contact, color: .white)
|
||||||
|
.padding(.vertical, 6)
|
||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
callButton("Reject", "phone.down.fill", .red) {
|
callButton("Reject", "phone.down.fill", .red) {
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ class Call: ObservableObject, Equatable {
|
|||||||
|
|
||||||
var direction: CallDirection
|
var direction: CallDirection
|
||||||
var contact: Contact
|
var contact: Contact
|
||||||
var callkitUUID: UUID?
|
var callUUID: String?
|
||||||
var localMedia: CallMediaType
|
var localMedia: CallMediaType
|
||||||
@Published var callState: CallState
|
@Published var callState: CallState
|
||||||
@Published var localCapabilities: CallCapabilities?
|
@Published var localCapabilities: CallCapabilities?
|
||||||
@@ -33,14 +33,14 @@ class Call: ObservableObject, Equatable {
|
|||||||
init(
|
init(
|
||||||
direction: CallDirection,
|
direction: CallDirection,
|
||||||
contact: Contact,
|
contact: Contact,
|
||||||
callkitUUID: UUID?,
|
callUUID: String?,
|
||||||
callState: CallState,
|
callState: CallState,
|
||||||
localMedia: CallMediaType,
|
localMedia: CallMediaType,
|
||||||
sharedKey: String? = nil
|
sharedKey: String? = nil
|
||||||
) {
|
) {
|
||||||
self.direction = direction
|
self.direction = direction
|
||||||
self.contact = contact
|
self.contact = contact
|
||||||
self.callkitUUID = callkitUUID
|
self.callUUID = callUUID
|
||||||
self.callState = callState
|
self.callState = callState
|
||||||
self.localMedia = localMedia
|
self.localMedia = localMedia
|
||||||
self.sharedKey = sharedKey
|
self.sharedKey = sharedKey
|
||||||
|
|||||||
@@ -411,6 +411,15 @@ final class WebRTCClient: NSObject, RTCVideoViewDelegate, RTCFrameEncryptorDeleg
|
|||||||
}
|
}
|
||||||
|
|
||||||
func endCall() {
|
func endCall() {
|
||||||
|
if #available(iOS 16.0, *) {
|
||||||
|
_endCall()
|
||||||
|
} else {
|
||||||
|
// Fixes `connection.close()` getting locked up in iOS15
|
||||||
|
DispatchQueue.global(qos: .utility).async { self._endCall() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func _endCall() {
|
||||||
guard let call = activeCall.wrappedValue else { return }
|
guard let call = activeCall.wrappedValue else { return }
|
||||||
logger.debug("WebRTCClient: ending the call")
|
logger.debug("WebRTCClient: ending the call")
|
||||||
activeCall.wrappedValue = nil
|
activeCall.wrappedValue = nil
|
||||||
|
|||||||
@@ -671,7 +671,14 @@ private struct CallButton: View {
|
|||||||
|
|
||||||
InfoViewButton(image: image, title: title, disabledLook: !canCall, width: width) {
|
InfoViewButton(image: image, title: title, disabledLook: !canCall, width: width) {
|
||||||
if canCall {
|
if canCall {
|
||||||
CallController.shared.startCall(contact, mediaType)
|
if CallController.useCallKit() {
|
||||||
|
CallController.shared.startCall(contact, mediaType)
|
||||||
|
} else {
|
||||||
|
// When CallKit is not used, colorscheme will be changed and it will be visible if not hiding sheets first
|
||||||
|
dismissAllSheets(animated: true) {
|
||||||
|
CallController.shared.startCall(contact, mediaType)
|
||||||
|
}
|
||||||
|
}
|
||||||
} else if contact.nextSendGrpInv {
|
} else if contact.nextSendGrpInv {
|
||||||
showAlert(SomeAlert(
|
showAlert(SomeAlert(
|
||||||
alert: mkAlert(
|
alert: mkAlert(
|
||||||
@@ -935,7 +942,7 @@ func syncConnectionForceAlert(_ syncConnectionForce: @escaping () -> Void) -> Al
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func queueInfoText(_ info: (RcvMsgInfo?, QueueInfo)) -> String {
|
func queueInfoText(_ info: (RcvMsgInfo?, ServerQueueInfo)) -> String {
|
||||||
let (rcvMsgInfo, qInfo) = info
|
let (rcvMsgInfo, qInfo) = info
|
||||||
var msgInfo: String
|
var msgInfo: String
|
||||||
if let rcvMsgInfo { msgInfo = encodeJSON(rcvMsgInfo) } else { msgInfo = "none" }
|
if let rcvMsgInfo { msgInfo = encodeJSON(rcvMsgInfo) } else { msgInfo = "none" }
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ import SimpleXChat
|
|||||||
struct CIGroupInvitationView: View {
|
struct CIGroupInvitationView: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
|
@Environment(\.showTimestamp) var showTimestamp: Bool
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var groupInvitation: CIGroupInvitation
|
var groupInvitation: CIGroupInvitation
|
||||||
@@ -45,7 +46,7 @@ struct CIGroupInvitationView: View {
|
|||||||
.foregroundColor(inProgress ? theme.colors.secondary : chatIncognito ? .indigo : theme.colors.primary)
|
.foregroundColor(inProgress ? theme.colors.secondary : chatIncognito ? .indigo : theme.colors.primary)
|
||||||
.font(.callout)
|
.font(.callout)
|
||||||
+ Text(" ")
|
+ Text(" ")
|
||||||
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showStatus: false, showEdited: false, showViaProxy: showSentViaProxy)
|
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, colorMode: .transparent, showStatus: false, showEdited: false, showViaProxy: showSentViaProxy, showTimesamp: showTimestamp)
|
||||||
)
|
)
|
||||||
.overlay(DetermineWidth())
|
.overlay(DetermineWidth())
|
||||||
}
|
}
|
||||||
@@ -53,7 +54,7 @@ struct CIGroupInvitationView: View {
|
|||||||
(
|
(
|
||||||
groupInvitationText()
|
groupInvitationText()
|
||||||
+ Text(" ")
|
+ Text(" ")
|
||||||
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showStatus: false, showEdited: false, showViaProxy: showSentViaProxy)
|
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, colorMode: .transparent, showStatus: false, showEdited: false, showViaProxy: showSentViaProxy, showTimesamp: showTimestamp)
|
||||||
)
|
)
|
||||||
.overlay(DetermineWidth())
|
.overlay(DetermineWidth())
|
||||||
}
|
}
|
||||||
@@ -69,7 +70,7 @@ struct CIGroupInvitationView: View {
|
|||||||
}
|
}
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.padding(.vertical, 6)
|
.padding(.vertical, 6)
|
||||||
.background(chatItemFrameColor(chatItem, theme))
|
.background { chatItemFrameColor(chatItem, theme).modifier(ChatTailPadding()) }
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
.onPreferenceChange(DetermineWidth.Key.self) { frameWidth = $0 }
|
.onPreferenceChange(DetermineWidth.Key.self) { frameWidth = $0 }
|
||||||
.onChange(of: inProgress) { inProgress in
|
.onChange(of: inProgress) { inProgress in
|
||||||
|
|||||||
@@ -165,9 +165,9 @@ struct CIImageView: View {
|
|||||||
private func fileIcon(_ icon: String, _ size: CGFloat, _ padding: CGFloat) -> some View {
|
private func fileIcon(_ icon: String, _ size: CGFloat, _ padding: CGFloat) -> some View {
|
||||||
Image(systemName: icon)
|
Image(systemName: icon)
|
||||||
.resizable()
|
.resizable()
|
||||||
|
.invertedForegroundStyle()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
.frame(width: size, height: size)
|
.frame(width: size, height: size)
|
||||||
.foregroundColor(.white)
|
|
||||||
.padding(padding)
|
.padding(padding)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ struct CILinkView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .center, spacing: 6) {
|
VStack(alignment: .center, spacing: 6) {
|
||||||
if let uiImage = UIImage(base64Encoded: linkPreview.image) {
|
if let uiImage = imageFromBase64(linkPreview.image) {
|
||||||
Image(uiImage: uiImage)
|
Image(uiImage: uiImage)
|
||||||
.resizable()
|
.resizable()
|
||||||
.scaledToFit()
|
.scaledToFit()
|
||||||
|
|||||||
@@ -12,11 +12,13 @@ import SimpleXChat
|
|||||||
struct CIMetaView: View {
|
struct CIMetaView: View {
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
|
@Environment(\.showTimestamp) var showTimestamp: Bool
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var metaColor: Color
|
var metaColor: Color
|
||||||
var paleMetaColor = Color(UIColor.tertiaryLabel)
|
var paleMetaColor = Color(UIColor.tertiaryLabel)
|
||||||
var showStatus = true
|
var showStatus = true
|
||||||
var showEdited = true
|
var showEdited = true
|
||||||
|
var invertedMaterial = false
|
||||||
|
|
||||||
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false
|
@AppStorage(DEFAULT_SHOW_SENT_VIA_RPOXY) private var showSentViaProxy = false
|
||||||
|
|
||||||
@@ -24,93 +26,143 @@ struct CIMetaView: View {
|
|||||||
if chatItem.isDeletedContent {
|
if chatItem.isDeletedContent {
|
||||||
chatItem.timestampText.font(.caption).foregroundColor(metaColor)
|
chatItem.timestampText.font(.caption).foregroundColor(metaColor)
|
||||||
} else {
|
} else {
|
||||||
let meta = chatItem.meta
|
ZStack {
|
||||||
let ttl = chat.chatInfo.timedMessagesTTL
|
ciMetaText(
|
||||||
let encrypted = chatItem.encryptedFile
|
chatItem.meta,
|
||||||
switch meta.itemStatus {
|
chatTTL: chat.chatInfo.timedMessagesTTL,
|
||||||
case let .sndSent(sndProgress):
|
encrypted: chatItem.encryptedFile,
|
||||||
switch sndProgress {
|
color: metaColor,
|
||||||
case .complete: ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .sent, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
|
paleColor: paleMetaColor,
|
||||||
case .partial: ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .sent, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
|
colorMode: invertedMaterial
|
||||||
|
? .invertedMaterial
|
||||||
|
: .normal,
|
||||||
|
showStatus: showStatus,
|
||||||
|
showEdited: showEdited,
|
||||||
|
showViaProxy: showSentViaProxy,
|
||||||
|
showTimesamp: showTimestamp
|
||||||
|
).invertedForegroundStyle(enabled: invertedMaterial)
|
||||||
|
if invertedMaterial {
|
||||||
|
ciMetaText(
|
||||||
|
chatItem.meta,
|
||||||
|
chatTTL: chat.chatInfo.timedMessagesTTL,
|
||||||
|
encrypted: chatItem.encryptedFile,
|
||||||
|
colorMode: .normal,
|
||||||
|
onlyOverrides: true,
|
||||||
|
showStatus: showStatus,
|
||||||
|
showEdited: showEdited,
|
||||||
|
showViaProxy: showSentViaProxy,
|
||||||
|
showTimesamp: showTimestamp
|
||||||
|
)
|
||||||
}
|
}
|
||||||
case let .sndRcvd(_, sndProgress):
|
|
||||||
switch sndProgress {
|
|
||||||
case .complete:
|
|
||||||
ZStack {
|
|
||||||
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .rcvd1, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
|
|
||||||
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, sent: .rcvd2, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
|
|
||||||
}
|
|
||||||
case .partial:
|
|
||||||
ZStack {
|
|
||||||
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .rcvd1, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
|
|
||||||
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: paleMetaColor, sent: .rcvd2, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
ciMetaText(meta, chatTTL: ttl, encrypted: encrypted, color: metaColor, showStatus: showStatus, showEdited: showEdited, showViaProxy: showSentViaProxy)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum SentCheckmark {
|
enum MetaColorMode {
|
||||||
case sent
|
// Renders provided colours
|
||||||
case rcvd1
|
case normal
|
||||||
case rcvd2
|
// Fully transparent meta - used for reserving space
|
||||||
|
case transparent
|
||||||
|
// Renders white on dark backgrounds and black on light ones
|
||||||
|
case invertedMaterial
|
||||||
|
|
||||||
|
func resolve(_ c: Color?) -> Color? {
|
||||||
|
switch self {
|
||||||
|
case .normal: c
|
||||||
|
case .transparent: .clear
|
||||||
|
case .invertedMaterial: nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func statusSpacer(_ sent: Bool) -> Text {
|
||||||
|
switch self {
|
||||||
|
case .normal, .transparent:
|
||||||
|
Text(
|
||||||
|
sent
|
||||||
|
? Image("checkmark.wide")
|
||||||
|
: Image(systemName: "circlebadge.fill")
|
||||||
|
).foregroundColor(.clear)
|
||||||
|
case .invertedMaterial: Text(" ").kerning(13)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func ciMetaText(
|
func ciMetaText(
|
||||||
_ meta: CIMeta,
|
_ meta: CIMeta,
|
||||||
chatTTL: Int?,
|
chatTTL: Int?,
|
||||||
encrypted: Bool?,
|
encrypted: Bool?,
|
||||||
color: Color = .clear,
|
color: Color = .clear, // we use this function to reserve space without rendering meta
|
||||||
|
paleColor: Color? = nil,
|
||||||
primaryColor: Color = .accentColor,
|
primaryColor: Color = .accentColor,
|
||||||
transparent: Bool = false,
|
colorMode: MetaColorMode = .normal,
|
||||||
sent: SentCheckmark? = nil,
|
onlyOverrides: Bool = false, // only render colors that differ from base
|
||||||
showStatus: Bool = true,
|
showStatus: Bool = true,
|
||||||
showEdited: Bool = true,
|
showEdited: Bool = true,
|
||||||
showViaProxy: Bool
|
showViaProxy: Bool,
|
||||||
|
showTimesamp: Bool
|
||||||
) -> Text {
|
) -> Text {
|
||||||
var r = Text("")
|
var r = Text("")
|
||||||
|
var space: Text? = nil
|
||||||
|
let appendSpace = {
|
||||||
|
if let sp = space {
|
||||||
|
r = r + sp
|
||||||
|
space = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let resolved = colorMode.resolve(color)
|
||||||
if showEdited, meta.itemEdited {
|
if showEdited, meta.itemEdited {
|
||||||
r = r + statusIconText("pencil", color)
|
r = r + statusIconText("pencil", resolved)
|
||||||
}
|
}
|
||||||
if meta.disappearing {
|
if meta.disappearing {
|
||||||
r = r + statusIconText("timer", color).font(.caption2)
|
r = r + statusIconText("timer", resolved).font(.caption2)
|
||||||
let ttl = meta.itemTimed?.ttl
|
let ttl = meta.itemTimed?.ttl
|
||||||
if ttl != chatTTL {
|
if ttl != chatTTL {
|
||||||
r = r + Text(shortTimeText(ttl)).foregroundColor(color)
|
r = r + colored(Text(shortTimeText(ttl)), resolved)
|
||||||
}
|
}
|
||||||
r = r + Text(" ")
|
space = Text(" ")
|
||||||
}
|
}
|
||||||
if showViaProxy, meta.sentViaProxy == true {
|
if showViaProxy, meta.sentViaProxy == true {
|
||||||
r = r + statusIconText("arrow.forward", color.opacity(0.67)).font(.caption2)
|
appendSpace()
|
||||||
|
r = r + statusIconText("arrow.forward", resolved?.opacity(0.67)).font(.caption2)
|
||||||
}
|
}
|
||||||
if showStatus {
|
if showStatus {
|
||||||
if let (icon, statusColor) = meta.statusIcon(color, primaryColor) {
|
appendSpace()
|
||||||
let t = Text(Image(systemName: icon)).font(.caption2)
|
if let (image, statusColor) = meta.itemStatus.statusIcon(color, paleColor ?? color, primaryColor) {
|
||||||
let gap = Text(" ").kerning(-1.25)
|
let metaColor = if onlyOverrides && statusColor == color {
|
||||||
let t1 = t.foregroundColor(transparent ? .clear : statusColor.opacity(0.67))
|
Color.clear
|
||||||
switch sent {
|
} else {
|
||||||
case nil: r = r + t1
|
colorMode.resolve(statusColor)
|
||||||
case .sent: r = r + t1 + gap
|
|
||||||
case .rcvd1: r = r + t.foregroundColor(transparent ? .clear : statusColor.opacity(0.67)) + gap
|
|
||||||
case .rcvd2: r = r + gap + t1
|
|
||||||
}
|
}
|
||||||
r = r + Text(" ")
|
r = r + colored(Text(image), metaColor)
|
||||||
} else if !meta.disappearing {
|
} else if !meta.disappearing {
|
||||||
r = r + statusIconText("circlebadge.fill", .clear) + Text(" ")
|
r = r + colorMode.statusSpacer(meta.itemStatus.sent)
|
||||||
}
|
}
|
||||||
|
space = Text(" ")
|
||||||
}
|
}
|
||||||
if let enc = encrypted {
|
if let enc = encrypted {
|
||||||
r = r + statusIconText(enc ? "lock" : "lock.open", color) + Text(" ")
|
appendSpace()
|
||||||
|
r = r + statusIconText(enc ? "lock" : "lock.open", resolved)
|
||||||
|
space = Text(" ")
|
||||||
|
}
|
||||||
|
if showTimesamp {
|
||||||
|
appendSpace()
|
||||||
|
r = r + colored(meta.timestampText, resolved)
|
||||||
}
|
}
|
||||||
r = r + meta.timestampText.foregroundColor(color)
|
|
||||||
return r.font(.caption)
|
return r.font(.caption)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func statusIconText(_ icon: String, _ color: Color) -> Text {
|
private func statusIconText(_ icon: String, _ color: Color?) -> Text {
|
||||||
Text(Image(systemName: icon)).foregroundColor(color)
|
colored(Text(Image(systemName: icon)), color)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Applying `foregroundColor(nil)` breaks `.invertedForegroundStyle` modifier
|
||||||
|
private func colored(_ t: Text, _ color: Color?) -> Text {
|
||||||
|
if let color {
|
||||||
|
t.foregroundColor(color)
|
||||||
|
} else {
|
||||||
|
t
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct CIMetaView_Previews: PreviewProvider {
|
struct CIMetaView_Previews: PreviewProvider {
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
|
@Environment(\.showTimestamp) var showTimestamp: Bool
|
||||||
var msgDecryptError: MsgDecryptError
|
var msgDecryptError: MsgDecryptError
|
||||||
var msgCount: UInt32
|
var msgCount: UInt32
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
@@ -68,37 +69,40 @@ struct CIRcvDecryptionError: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func viewBody() -> some View {
|
@ViewBuilder private func viewBody() -> some View {
|
||||||
if case let .direct(contact) = chat.chatInfo,
|
Group {
|
||||||
let contactStats = contact.activeConn?.connectionStats {
|
if case let .direct(contact) = chat.chatInfo,
|
||||||
if contactStats.ratchetSyncAllowed {
|
let contactStats = contact.activeConn?.connectionStats {
|
||||||
decryptionErrorItemFixButton(syncSupported: true) {
|
if contactStats.ratchetSyncAllowed {
|
||||||
alert = .syncAllowedAlert { syncContactConnection(contact) }
|
decryptionErrorItemFixButton(syncSupported: true) {
|
||||||
|
alert = .syncAllowedAlert { syncContactConnection(contact) }
|
||||||
|
}
|
||||||
|
} else if !contactStats.ratchetSyncSupported {
|
||||||
|
decryptionErrorItemFixButton(syncSupported: false) {
|
||||||
|
alert = .syncNotSupportedContactAlert
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
basicDecryptionErrorItem()
|
||||||
}
|
}
|
||||||
} else if !contactStats.ratchetSyncSupported {
|
} else if case let .group(groupInfo) = chat.chatInfo,
|
||||||
decryptionErrorItemFixButton(syncSupported: false) {
|
case let .groupRcv(groupMember) = chatItem.chatDir,
|
||||||
alert = .syncNotSupportedContactAlert
|
let mem = m.getGroupMember(groupMember.groupMemberId),
|
||||||
|
let memberStats = mem.wrapped.activeConn?.connectionStats {
|
||||||
|
if memberStats.ratchetSyncAllowed {
|
||||||
|
decryptionErrorItemFixButton(syncSupported: true) {
|
||||||
|
alert = .syncAllowedAlert { syncMemberConnection(groupInfo, groupMember) }
|
||||||
|
}
|
||||||
|
} else if !memberStats.ratchetSyncSupported {
|
||||||
|
decryptionErrorItemFixButton(syncSupported: false) {
|
||||||
|
alert = .syncNotSupportedMemberAlert
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
basicDecryptionErrorItem()
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
basicDecryptionErrorItem()
|
basicDecryptionErrorItem()
|
||||||
}
|
}
|
||||||
} else if case let .group(groupInfo) = chat.chatInfo,
|
|
||||||
case let .groupRcv(groupMember) = chatItem.chatDir,
|
|
||||||
let mem = m.getGroupMember(groupMember.groupMemberId),
|
|
||||||
let memberStats = mem.wrapped.activeConn?.connectionStats {
|
|
||||||
if memberStats.ratchetSyncAllowed {
|
|
||||||
decryptionErrorItemFixButton(syncSupported: true) {
|
|
||||||
alert = .syncAllowedAlert { syncMemberConnection(groupInfo, groupMember) }
|
|
||||||
}
|
|
||||||
} else if !memberStats.ratchetSyncSupported {
|
|
||||||
decryptionErrorItemFixButton(syncSupported: false) {
|
|
||||||
alert = .syncNotSupportedMemberAlert
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
basicDecryptionErrorItem()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
basicDecryptionErrorItem()
|
|
||||||
}
|
}
|
||||||
|
.background { chatItemFrameColor(chatItem, theme).modifier(ChatTailPadding()) }
|
||||||
}
|
}
|
||||||
|
|
||||||
private func basicDecryptionErrorItem() -> some View {
|
private func basicDecryptionErrorItem() -> some View {
|
||||||
@@ -122,7 +126,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
.foregroundColor(syncSupported ? theme.colors.primary : theme.colors.secondary)
|
.foregroundColor(syncSupported ? theme.colors.primary : theme.colors.secondary)
|
||||||
.font(.callout)
|
.font(.callout)
|
||||||
+ Text(" ")
|
+ Text(" ")
|
||||||
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showViaProxy: showSentViaProxy)
|
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, colorMode: .transparent, showViaProxy: showSentViaProxy, showTimesamp: showTimestamp)
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
@@ -131,7 +135,6 @@ struct CIRcvDecryptionError: View {
|
|||||||
}
|
}
|
||||||
.onTapGesture(perform: { onClick() })
|
.onTapGesture(perform: { onClick() })
|
||||||
.padding(.vertical, 6)
|
.padding(.vertical, 6)
|
||||||
.background(Color(uiColor: .tertiarySystemGroupedBackground))
|
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -142,7 +145,7 @@ struct CIRcvDecryptionError: View {
|
|||||||
.foregroundColor(.red)
|
.foregroundColor(.red)
|
||||||
.italic()
|
.italic()
|
||||||
+ Text(" ")
|
+ Text(" ")
|
||||||
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, transparent: true, showViaProxy: showSentViaProxy)
|
+ ciMetaText(chatItem.meta, chatTTL: nil, encrypted: nil, colorMode: .transparent, showViaProxy: showSentViaProxy, showTimesamp: showTimestamp)
|
||||||
}
|
}
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
CIMetaView(chat: chat, chatItem: chatItem, metaColor: theme.colors.secondary)
|
CIMetaView(chat: chat, chatItem: chatItem, metaColor: theme.colors.secondary)
|
||||||
@@ -150,7 +153,6 @@ struct CIRcvDecryptionError: View {
|
|||||||
}
|
}
|
||||||
.onTapGesture(perform: { onClick() })
|
.onTapGesture(perform: { onClick() })
|
||||||
.padding(.vertical, 6)
|
.padding(.vertical, 6)
|
||||||
.background(Color(uiColor: .tertiarySystemGroupedBackground))
|
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -292,30 +292,22 @@ struct CIVideoView: View {
|
|||||||
.clipShape(Circle())
|
.clipShape(Circle())
|
||||||
}
|
}
|
||||||
|
|
||||||
private func durationProgress() -> some View {
|
private var fileSizeString: String {
|
||||||
HStack {
|
if let file = chatItem.file, !videoPlaying {
|
||||||
Text("\(durationText(videoPlaying ? progress : duration))")
|
" " + ByteCountFormatter.string(fromByteCount: file.fileSize, countStyle: .binary)
|
||||||
.foregroundColor(.white)
|
} else {
|
||||||
.font(.caption)
|
""
|
||||||
.padding(.vertical, 3)
|
|
||||||
.padding(.horizontal, 6)
|
|
||||||
.background(Color.black.opacity(0.35))
|
|
||||||
.cornerRadius(10)
|
|
||||||
.padding([.top, .leading], 6)
|
|
||||||
|
|
||||||
if let file = chatItem.file, !videoPlaying {
|
|
||||||
Text("\(ByteCountFormatter.string(fromByteCount: file.fileSize, countStyle: .binary))")
|
|
||||||
.foregroundColor(.white)
|
|
||||||
.font(.caption)
|
|
||||||
.padding(.vertical, 3)
|
|
||||||
.padding(.horizontal, 6)
|
|
||||||
.background(Color.black.opacity(0.35))
|
|
||||||
.cornerRadius(10)
|
|
||||||
.padding(.top, 6)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func durationProgress() -> some View {
|
||||||
|
Text((durationText(videoPlaying ? progress : duration)) + fileSizeString)
|
||||||
|
.invertedForegroundStyle()
|
||||||
|
.font(.caption)
|
||||||
|
.padding(.vertical, 6)
|
||||||
|
.padding(.horizontal, 12)
|
||||||
|
}
|
||||||
|
|
||||||
private func imageView(_ img: UIImage) -> some View {
|
private func imageView(_ img: UIImage) -> some View {
|
||||||
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth
|
let w = img.size.width <= img.size.height ? maxWidth * 0.75 : maxWidth
|
||||||
return ZStack(alignment: .topTrailing) {
|
return ZStack(alignment: .topTrailing) {
|
||||||
@@ -411,9 +403,9 @@ struct CIVideoView: View {
|
|||||||
private func fileIcon(_ icon: String, _ size: CGFloat, _ padding: CGFloat) -> some View {
|
private func fileIcon(_ icon: String, _ size: CGFloat, _ padding: CGFloat) -> some View {
|
||||||
Image(systemName: icon)
|
Image(systemName: icon)
|
||||||
.resizable()
|
.resizable()
|
||||||
|
.invertedForegroundStyle()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
.frame(width: size, height: size)
|
.frame(width: size, height: size)
|
||||||
.foregroundColor(.white)
|
|
||||||
.padding(smallView ? 0 : padding)
|
.padding(smallView ? 0 : padding)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -428,10 +420,8 @@ struct CIVideoView: View {
|
|||||||
private func progressCircle(_ progress: Int64, _ total: Int64) -> some View {
|
private func progressCircle(_ progress: Int64, _ total: Int64) -> some View {
|
||||||
Circle()
|
Circle()
|
||||||
.trim(from: 0, to: Double(progress) / Double(total))
|
.trim(from: 0, to: Double(progress) / Double(total))
|
||||||
.stroke(
|
.stroke(style: StrokeStyle(lineWidth: 2))
|
||||||
Color(uiColor: .white),
|
.invertedForegroundStyle()
|
||||||
style: StrokeStyle(lineWidth: 2)
|
|
||||||
)
|
|
||||||
.rotationEffect(.degrees(-90))
|
.rotationEffect(.degrees(-90))
|
||||||
.frame(width: 16, height: 16)
|
.frame(width: 16, height: 16)
|
||||||
.padding([.trailing, .top], smallView ? 0 : 11)
|
.padding([.trailing, .top], smallView ? 0 : 11)
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import SimpleXChat
|
|||||||
struct FramedItemView: View {
|
struct FramedItemView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@EnvironmentObject var scrollModel: ReverseListScrollModel<ChatItem>
|
@EnvironmentObject var scrollModel: ReverseListScrollModel
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var preview: UIImage?
|
var preview: UIImage?
|
||||||
@@ -64,15 +64,20 @@ struct FramedItemView: View {
|
|||||||
.overlay(DetermineWidth())
|
.overlay(DetermineWidth())
|
||||||
}
|
}
|
||||||
|
|
||||||
if chatItem.content.msgContent != nil {
|
if let content = chatItem.content.msgContent {
|
||||||
CIMetaView(chat: chat, chatItem: chatItem, metaColor: useWhiteMetaColor ? Color.white : theme.colors.secondary)
|
CIMetaView(
|
||||||
.padding(.horizontal, 12)
|
chat: chat,
|
||||||
.padding(.bottom, 6)
|
chatItem: chatItem,
|
||||||
.overlay(DetermineWidth())
|
metaColor: theme.colors.secondary,
|
||||||
.accessibilityLabel("")
|
invertedMaterial: useWhiteMetaColor
|
||||||
|
)
|
||||||
|
.padding(.horizontal, 12)
|
||||||
|
.padding(.bottom, 6)
|
||||||
|
.overlay(DetermineWidth())
|
||||||
|
.accessibilityLabel("")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.background(chatItemFrameColorMaybeImageOrVideo(chatItem, theme))
|
.background { chatItemFrameColorMaybeImageOrVideo(chatItem, theme).modifier(ChatTailPadding()) }
|
||||||
.onPreferenceChange(DetermineWidth.Key.self) { msgWidth = $0 }
|
.onPreferenceChange(DetermineWidth.Key.self) { msgWidth = $0 }
|
||||||
|
|
||||||
if let (title, text) = chatItem.meta.itemStatus.statusInfo {
|
if let (title, text) = chatItem.meta.itemStatus.statusInfo {
|
||||||
@@ -185,7 +190,7 @@ struct FramedItemView: View {
|
|||||||
let v = ZStack(alignment: .topTrailing) {
|
let v = ZStack(alignment: .topTrailing) {
|
||||||
switch (qi.content) {
|
switch (qi.content) {
|
||||||
case let .image(_, image):
|
case let .image(_, image):
|
||||||
if let uiImage = UIImage(base64Encoded: image) {
|
if let uiImage = imageFromBase64(image) {
|
||||||
ciQuotedMsgView(qi)
|
ciQuotedMsgView(qi)
|
||||||
.padding(.trailing, 70).frame(minWidth: msgWidth, alignment: .leading)
|
.padding(.trailing, 70).frame(minWidth: msgWidth, alignment: .leading)
|
||||||
Image(uiImage: uiImage)
|
Image(uiImage: uiImage)
|
||||||
@@ -197,7 +202,7 @@ struct FramedItemView: View {
|
|||||||
ciQuotedMsgView(qi)
|
ciQuotedMsgView(qi)
|
||||||
}
|
}
|
||||||
case let .video(_, image, _):
|
case let .video(_, image, _):
|
||||||
if let uiImage = UIImage(base64Encoded: image) {
|
if let uiImage = imageFromBase64(image) {
|
||||||
ciQuotedMsgView(qi)
|
ciQuotedMsgView(qi)
|
||||||
.padding(.trailing, 70).frame(minWidth: msgWidth, alignment: .leading)
|
.padding(.trailing, 70).frame(minWidth: msgWidth, alignment: .leading)
|
||||||
Image(uiImage: uiImage)
|
Image(uiImage: uiImage)
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import AVKit
|
|||||||
|
|
||||||
struct FullScreenMediaView: View {
|
struct FullScreenMediaView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var scrollModel: ReverseListScrollModel<ChatItem>
|
@EnvironmentObject var scrollModel: ReverseListScrollModel
|
||||||
@State var chatItem: ChatItem
|
@State var chatItem: ChatItem
|
||||||
@State var image: UIImage?
|
@State var image: UIImage?
|
||||||
@State var player: AVPlayer? = nil
|
@State var player: AVPlayer? = nil
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ struct CIMsgError: View {
|
|||||||
}
|
}
|
||||||
.padding(.leading, 12)
|
.padding(.leading, 12)
|
||||||
.padding(.vertical, 6)
|
.padding(.vertical, 6)
|
||||||
.background(Color(uiColor: .tertiarySystemGroupedBackground))
|
.background { chatItemFrameColor(chatItem, theme).modifier(ChatTailPadding()) }
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
.onTapGesture(perform: onTap)
|
.onTapGesture(perform: onTap)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ struct MarkedDeletedItemView: View {
|
|||||||
.foregroundColor(theme.colors.secondary)
|
.foregroundColor(theme.colors.secondary)
|
||||||
.padding(.horizontal, 12)
|
.padding(.horizontal, 12)
|
||||||
.padding(.vertical, 6)
|
.padding(.vertical, 6)
|
||||||
.background(chatItemFrameColor(chatItem, theme))
|
.background { chatItemFrameColor(chatItem, theme).modifier(ChatTailPadding()) }
|
||||||
.textSelection(.disabled)
|
.textSelection(.disabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ private func typing(_ w: Font.Weight = .light) -> Text {
|
|||||||
|
|
||||||
struct MsgContentView: View {
|
struct MsgContentView: View {
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
|
@Environment(\.showTimestamp) var showTimestamp: Bool
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
var text: String
|
var text: String
|
||||||
var formattedText: [FormattedText]? = nil
|
var formattedText: [FormattedText]? = nil
|
||||||
@@ -84,7 +85,7 @@ struct MsgContentView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func reserveSpaceForMeta(_ mt: CIMeta) -> Text {
|
private func reserveSpaceForMeta(_ mt: CIMeta) -> Text {
|
||||||
(rightToLeft ? Text("\n") : Text(" ")) + ciMetaText(mt, chatTTL: chat.chatInfo.timedMessagesTTL, encrypted: nil, transparent: true, showViaProxy: showSentViaProxy)
|
(rightToLeft ? Text("\n") : Text(" ")) + ciMetaText(mt, chatTTL: chat.chatInfo.timedMessagesTTL, encrypted: nil, colorMode: .transparent, showViaProxy: showSentViaProxy, showTimesamp: showTimestamp)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -14,12 +14,11 @@ struct ChatItemForwardingView: View {
|
|||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Environment(\.dismiss) var dismiss
|
@Environment(\.dismiss) var dismiss
|
||||||
|
|
||||||
var ci: ChatItem
|
var chatItems: [ChatItem]
|
||||||
var fromChatInfo: ChatInfo
|
var fromChatInfo: ChatInfo
|
||||||
@Binding var composeState: ComposeState
|
@Binding var composeState: ComposeState
|
||||||
|
|
||||||
@State private var searchText: String = ""
|
@State private var searchText: String = ""
|
||||||
@FocusState private var searchFocused
|
|
||||||
@State private var alert: SomeAlert?
|
@State private var alert: SomeAlert?
|
||||||
private let chatsToForwardTo = filterChatsToForwardTo(chats: ChatModel.shared.chats)
|
private let chatsToForwardTo = filterChatsToForwardTo(chats: ChatModel.shared.chats)
|
||||||
|
|
||||||
@@ -46,8 +45,6 @@ struct ChatItemForwardingView: View {
|
|||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
if !chatsToForwardTo.isEmpty {
|
if !chatsToForwardTo.isEmpty {
|
||||||
List {
|
List {
|
||||||
searchFieldView(text: $searchText, focussed: $searchFocused, theme.colors.onBackground, theme.colors.secondary)
|
|
||||||
.padding(.leading, 2)
|
|
||||||
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
|
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
|
||||||
let chats = s == "" ? chatsToForwardTo : chatsToForwardTo.filter { foundChat($0, s) }
|
let chats = s == "" ? chatsToForwardTo : chatsToForwardTo.filter { foundChat($0, s) }
|
||||||
ForEach(chats) { chat in
|
ForEach(chats) { chat in
|
||||||
@@ -55,6 +52,7 @@ struct ChatItemForwardingView: View {
|
|||||||
.disabled(chatModel.deletedChats.contains(chat.chatInfo.id))
|
.disabled(chatModel.deletedChats.contains(chat.chatInfo.id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.searchable(text: $searchText, placement: .navigationBarDrawer(displayMode: .always))
|
||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
} else {
|
} else {
|
||||||
ZStack {
|
ZStack {
|
||||||
@@ -73,11 +71,14 @@ struct ChatItemForwardingView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func forwardListChatView(_ chat: Chat) -> some View {
|
@ViewBuilder private func forwardListChatView(_ chat: Chat) -> some View {
|
||||||
let prohibited = chat.prohibitedByPref(
|
let prohibited = chatItems.map { ci in
|
||||||
hasSimplexLink: hasSimplexLink(ci.content.msgContent?.text),
|
chat.prohibitedByPref(
|
||||||
isMediaOrFileAttachment: ci.content.msgContent?.isMediaOrFileAttachment ?? false,
|
hasSimplexLink: hasSimplexLink(ci.content.msgContent?.text),
|
||||||
isVoice: ci.content.msgContent?.isVoice ?? false
|
isMediaOrFileAttachment: ci.content.msgContent?.isMediaOrFileAttachment ?? false,
|
||||||
)
|
isVoice: ci.content.msgContent?.isVoice ?? false
|
||||||
|
)
|
||||||
|
}.contains(true)
|
||||||
|
|
||||||
Button {
|
Button {
|
||||||
if prohibited {
|
if prohibited {
|
||||||
alert = SomeAlert(
|
alert = SomeAlert(
|
||||||
@@ -93,10 +94,10 @@ struct ChatItemForwardingView: View {
|
|||||||
composeState = ComposeState(
|
composeState = ComposeState(
|
||||||
message: composeState.message,
|
message: composeState.message,
|
||||||
preview: composeState.linkPreview != nil ? composeState.preview : .noPreview,
|
preview: composeState.linkPreview != nil ? composeState.preview : .noPreview,
|
||||||
contextItem: .forwardingItem(chatItem: ci, fromChatInfo: fromChatInfo)
|
contextItem: .forwardingItems(chatItems: chatItems, fromChatInfo: fromChatInfo)
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
composeState = ComposeState.init(forwardingItem: ci, fromChatInfo: fromChatInfo)
|
composeState = ComposeState.init(forwardingItems: chatItems, fromChatInfo: fromChatInfo)
|
||||||
ItemsModel.shared.loadOpenChat(chat.id)
|
ItemsModel.shared.loadOpenChat(chat.id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -123,7 +124,7 @@ struct ChatItemForwardingView: View {
|
|||||||
|
|
||||||
#Preview {
|
#Preview {
|
||||||
ChatItemForwardingView(
|
ChatItemForwardingView(
|
||||||
ci: ChatItem.getSample(1, .directSnd, .now, "hello"),
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello")],
|
||||||
fromChatInfo: .direct(contact: Contact.sampleData),
|
fromChatInfo: .direct(contact: Contact.sampleData),
|
||||||
composeState: Binding.constant(ComposeState(message: "hello"))
|
composeState: Binding.constant(ComposeState(message: "hello"))
|
||||||
).environmentObject(CurrentColors.toAppTheme())
|
).environmentObject(CurrentColors.toAppTheme())
|
||||||
|
|||||||
@@ -450,20 +450,8 @@ struct ChatItemInfoView: View {
|
|||||||
.foregroundColor(theme.colors.secondary).opacity(0.67)
|
.foregroundColor(theme.colors.secondary).opacity(0.67)
|
||||||
}
|
}
|
||||||
let v = Group {
|
let v = Group {
|
||||||
let (icon, statusColor) = status.statusIcon(theme.colors.secondary, theme.colors.primary)
|
let (image, statusColor) = status.statusIcon(theme.colors.secondary, theme.colors.primary)
|
||||||
switch status {
|
image.foregroundColor(statusColor)
|
||||||
case .rcvd:
|
|
||||||
ZStack(alignment: .trailing) {
|
|
||||||
Image(systemName: icon)
|
|
||||||
.foregroundColor(statusColor.opacity(0.67))
|
|
||||||
.padding(.trailing, 6)
|
|
||||||
Image(systemName: icon)
|
|
||||||
.foregroundColor(statusColor.opacity(0.67))
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
Image(systemName: icon)
|
|
||||||
.foregroundColor(statusColor)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if let (title, text) = status.statusInfo {
|
if let (title, text) = status.statusInfo {
|
||||||
|
|||||||
@@ -9,9 +9,21 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
|
extension EnvironmentValues {
|
||||||
|
struct ShowTimestamp: EnvironmentKey {
|
||||||
|
static let defaultValue: Bool = true
|
||||||
|
}
|
||||||
|
|
||||||
|
var showTimestamp: Bool {
|
||||||
|
get { self[ShowTimestamp.self] }
|
||||||
|
set { self[ShowTimestamp.self] = newValue }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct ChatItemView: View {
|
struct ChatItemView: View {
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
|
@Environment(\.showTimestamp) var showTimestamp: Bool
|
||||||
var chatItem: ChatItem
|
var chatItem: ChatItem
|
||||||
var maxWidth: CGFloat = .infinity
|
var maxWidth: CGFloat = .infinity
|
||||||
@Binding var revealed: Bool
|
@Binding var revealed: Bool
|
||||||
@@ -60,7 +72,7 @@ struct ChatItemView: View {
|
|||||||
default: nil
|
default: nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.flatMap { UIImage(base64Encoded: $0) }
|
.flatMap { imageFromBase64($0) }
|
||||||
let adjustedMaxWidth = {
|
let adjustedMaxWidth = {
|
||||||
if let preview, preview.size.width <= preview.size.height {
|
if let preview, preview.size.width <= preview.size.height {
|
||||||
maxWidth * 0.75
|
maxWidth * 0.75
|
||||||
|
|||||||
@@ -22,8 +22,7 @@ struct ChatView: View {
|
|||||||
@Environment(\.presentationMode) var presentationMode
|
@Environment(\.presentationMode) var presentationMode
|
||||||
@Environment(\.scenePhase) var scenePhase
|
@Environment(\.scenePhase) var scenePhase
|
||||||
@State @ObservedObject var chat: Chat
|
@State @ObservedObject var chat: Chat
|
||||||
@StateObject private var scrollModel = ReverseListScrollModel<ChatItem>()
|
@StateObject private var scrollModel = ReverseListScrollModel()
|
||||||
@StateObject private var floatingButtonModel = FloatingButtonModel()
|
|
||||||
@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()
|
||||||
@@ -43,6 +42,7 @@ struct ChatView: View {
|
|||||||
@State private var showGroupLinkSheet: Bool = false
|
@State private var showGroupLinkSheet: Bool = false
|
||||||
@State private var groupLink: String?
|
@State private var groupLink: String?
|
||||||
@State private var groupLinkMemberRole: GroupMemberRole = .member
|
@State private var groupLinkMemberRole: GroupMemberRole = .member
|
||||||
|
@State private var forwardedChatItems: [ChatItem] = []
|
||||||
@State private var selectedChatItems: Set<Int64>? = nil
|
@State private var selectedChatItems: Set<Int64>? = nil
|
||||||
@State private var showDeleteSelectedMessages: Bool = false
|
@State private var showDeleteSelectedMessages: Bool = false
|
||||||
@State private var allowToDeleteSelectedMessagesForAll: Bool = false
|
@State private var allowToDeleteSelectedMessagesForAll: Bool = false
|
||||||
@@ -76,7 +76,7 @@ struct ChatView: View {
|
|||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
ZStack(alignment: .bottomTrailing) {
|
ZStack(alignment: .bottomTrailing) {
|
||||||
chatItemsList()
|
chatItemsList()
|
||||||
floatingButtons(counts: floatingButtonModel.unreadChatItemCounts)
|
FloatingButtons(theme: theme, scrollModel: scrollModel, chat: chat)
|
||||||
}
|
}
|
||||||
connectingText()
|
connectingText()
|
||||||
if selectedChatItems == nil {
|
if selectedChatItems == nil {
|
||||||
@@ -99,7 +99,8 @@ struct ChatView: View {
|
|||||||
if case let .group(groupInfo) = chat.chatInfo {
|
if case let .group(groupInfo) = chat.chatInfo {
|
||||||
showModerateSelectedMessagesAlert(groupInfo)
|
showModerateSelectedMessagesAlert(groupInfo)
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
|
forwardItems: forwardSelectedMessages
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -136,6 +137,22 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.sheet(isPresented: Binding(
|
||||||
|
get: { !forwardedChatItems.isEmpty },
|
||||||
|
set: { isPresented in
|
||||||
|
if !isPresented {
|
||||||
|
forwardedChatItems = []
|
||||||
|
selectedChatItems = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)) {
|
||||||
|
if #available(iOS 16.0, *) {
|
||||||
|
ChatItemForwardingView(chatItems: forwardedChatItems, fromChatInfo: chat.chatInfo, composeState: $composeState)
|
||||||
|
.presentationDetents([.fraction(0.8)])
|
||||||
|
} else {
|
||||||
|
ChatItemForwardingView(chatItems: forwardedChatItems, fromChatInfo: chat.chatInfo, composeState: $composeState)
|
||||||
|
}
|
||||||
|
}
|
||||||
.onAppear {
|
.onAppear {
|
||||||
selectedChatItems = nil
|
selectedChatItems = nil
|
||||||
initChatView()
|
initChatView()
|
||||||
@@ -340,6 +357,7 @@ struct ChatView: View {
|
|||||||
await markChatUnread(chat, unreadChat: false)
|
await markChatUnread(chat, unreadChat: false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
ChatView.FloatingButtonModel.shared.totalUnread = chat.chatStats.unreadCount
|
||||||
}
|
}
|
||||||
|
|
||||||
private func searchToolbar() -> some View {
|
private func searchToolbar() -> some View {
|
||||||
@@ -411,14 +429,9 @@ struct ChatView: View {
|
|||||||
composeState: $composeState,
|
composeState: $composeState,
|
||||||
selectedMember: $selectedMember,
|
selectedMember: $selectedMember,
|
||||||
revealedChatItem: $revealedChatItem,
|
revealedChatItem: $revealedChatItem,
|
||||||
selectedChatItems: $selectedChatItems
|
selectedChatItems: $selectedChatItems,
|
||||||
|
forwardedChatItems: $forwardedChatItems
|
||||||
)
|
)
|
||||||
.onAppear {
|
|
||||||
floatingButtonModel.appeared(viewId: ci.viewId)
|
|
||||||
}
|
|
||||||
.onDisappear {
|
|
||||||
floatingButtonModel.disappeared(viewId: ci.viewId)
|
|
||||||
}
|
|
||||||
.id(ci.id) // Required to trigger `onAppear` on iOS15
|
.id(ci.id) // Required to trigger `onAppear` on iOS15
|
||||||
} loadPage: {
|
} loadPage: {
|
||||||
loadChatItems(cInfo)
|
loadChatItems(cInfo)
|
||||||
@@ -429,13 +442,10 @@ struct ChatView: View {
|
|||||||
.onChange(of: searchText) { _ in
|
.onChange(of: searchText) { _ in
|
||||||
Task { await loadChat(chat: chat, search: searchText) }
|
Task { await loadChat(chat: chat, search: searchText) }
|
||||||
}
|
}
|
||||||
.onChange(of: im.reversedChatItems) { _ in
|
|
||||||
floatingButtonModel.chatItemsChanged()
|
|
||||||
}
|
|
||||||
.onChange(of: im.itemAdded) { added in
|
.onChange(of: im.itemAdded) { added in
|
||||||
if added {
|
if added {
|
||||||
im.itemAdded = false
|
im.itemAdded = false
|
||||||
if floatingButtonModel.unreadChatItemCounts.isReallyNearBottom {
|
if FloatingButtonModel.shared.isReallyNearBottom {
|
||||||
scrollModel.scrollToBottom()
|
scrollModel.scrollToBottom()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -458,103 +468,169 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
class FloatingButtonModel: ObservableObject {
|
class FloatingButtonModel: ObservableObject {
|
||||||
private enum Event {
|
static let shared = FloatingButtonModel()
|
||||||
case appeared(String)
|
@Published var unreadBelow: Int = 0
|
||||||
case disappeared(String)
|
@Published var isNearBottom: Bool = true
|
||||||
case chatItemsChanged
|
@Published var date: Date?
|
||||||
}
|
@Published var isDateVisible: Bool = false
|
||||||
|
var totalUnread: Int = 0
|
||||||
|
var isReallyNearBottom: Bool = true
|
||||||
|
var hideDateWorkItem: DispatchWorkItem?
|
||||||
|
|
||||||
@Published var unreadChatItemCounts: UnreadChatItemCounts
|
func updateOnListChange(_ listState: ListState) {
|
||||||
|
let im = ItemsModel.shared
|
||||||
private let events = PassthroughSubject<Event, Never>()
|
let unreadBelow =
|
||||||
private var bag = Set<AnyCancellable>()
|
if let id = listState.bottomItemId,
|
||||||
|
let index = im.reversedChatItems.firstIndex(where: { $0.id == id })
|
||||||
init() {
|
{
|
||||||
unreadChatItemCounts = UnreadChatItemCounts(
|
im.reversedChatItems[..<index].reduce(into: 0) { unread, chatItem in
|
||||||
isNearBottom: true,
|
if chatItem.isRcvNew { unread += 1 }
|
||||||
isReallyNearBottom: true,
|
}
|
||||||
unreadBelow: 0
|
} else {
|
||||||
)
|
0
|
||||||
events
|
|
||||||
.receive(on: DispatchQueue.global(qos: .background))
|
|
||||||
.scan(Set<String>()) { itemsInView, event in
|
|
||||||
var updated = itemsInView
|
|
||||||
switch event {
|
|
||||||
case let .appeared(viewId): updated.insert(viewId)
|
|
||||||
case let .disappeared(viewId): updated.remove(viewId)
|
|
||||||
case .chatItemsChanged: ()
|
|
||||||
}
|
|
||||||
return updated
|
|
||||||
}
|
}
|
||||||
.map { ChatModel.shared.unreadChatItemCounts(itemsInView: $0) }
|
let date: Date? =
|
||||||
.removeDuplicates()
|
if let topItemDate = listState.topItemDate {
|
||||||
.throttle(for: .seconds(0.2), scheduler: DispatchQueue.main, latest: true)
|
Calendar.current.startOfDay(for: topItemDate)
|
||||||
.assign(to: \.unreadChatItemCounts, on: self)
|
} else {
|
||||||
.store(in: &bag)
|
nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// set the counters and date indicator
|
||||||
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
guard let it = self else { return }
|
||||||
|
it.setDate(visibility: true)
|
||||||
|
it.unreadBelow = unreadBelow
|
||||||
|
it.date = date
|
||||||
|
it.isReallyNearBottom = listState.scrollOffset > 0 && listState.scrollOffset < 500
|
||||||
|
}
|
||||||
|
|
||||||
|
// set floating button indication mode
|
||||||
|
let nearBottom = listState.scrollOffset < 800
|
||||||
|
if nearBottom != self.isNearBottom {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.35) { [weak self] in
|
||||||
|
self?.isNearBottom = nearBottom
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// hide Date indicator after 1 second of no scrolling
|
||||||
|
hideDateWorkItem?.cancel()
|
||||||
|
let workItem = DispatchWorkItem { [weak self] in
|
||||||
|
guard let it = self else { return }
|
||||||
|
it.setDate(visibility: false)
|
||||||
|
it.hideDateWorkItem = nil
|
||||||
|
}
|
||||||
|
DispatchQueue.main.async { [weak self] in
|
||||||
|
self?.hideDateWorkItem = workItem
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: workItem)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func appeared(viewId: String) {
|
func resetDate() {
|
||||||
events.send(.appeared(viewId))
|
date = nil
|
||||||
|
isDateVisible = false
|
||||||
}
|
}
|
||||||
|
|
||||||
func disappeared(viewId: String) {
|
private func setDate(visibility isVisible: Bool) {
|
||||||
events.send(.disappeared(viewId))
|
if isVisible {
|
||||||
|
if !isNearBottom,
|
||||||
|
!isDateVisible,
|
||||||
|
let date, !Calendar.current.isDateInToday(date) {
|
||||||
|
withAnimation { self.isDateVisible = true }
|
||||||
|
}
|
||||||
|
} else if isDateVisible {
|
||||||
|
withAnimation { self.isDateVisible = false }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func chatItemsChanged() {
|
|
||||||
events.send(.chatItemsChanged)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func floatingButtons(counts: UnreadChatItemCounts) -> some View {
|
private struct FloatingButtons: View {
|
||||||
VStack {
|
let theme: AppTheme
|
||||||
let unreadAbove = chat.chatStats.unreadCount - counts.unreadBelow
|
let scrollModel: ReverseListScrollModel
|
||||||
if unreadAbove > 0 {
|
let chat: Chat
|
||||||
circleButton {
|
@ObservedObject var model = FloatingButtonModel.shared
|
||||||
unreadCountText(unreadAbove)
|
|
||||||
.font(.callout)
|
var body: some View {
|
||||||
.foregroundColor(theme.colors.primary)
|
ZStack(alignment: .top) {
|
||||||
|
if let date = model.date {
|
||||||
|
DateSeparator(date: date)
|
||||||
|
.padding(.vertical, 4).padding(.horizontal, 8)
|
||||||
|
.background(.thinMaterial)
|
||||||
|
.clipShape(Capsule())
|
||||||
|
.opacity(model.isDateVisible ? 1 : 0)
|
||||||
}
|
}
|
||||||
.onTapGesture {
|
VStack {
|
||||||
scrollModel.scrollToNextPage()
|
let unreadAbove = model.totalUnread - model.unreadBelow
|
||||||
}
|
if unreadAbove > 0 {
|
||||||
.contextMenu {
|
circleButton {
|
||||||
Button {
|
unreadCountText(unreadAbove)
|
||||||
Task {
|
.font(.callout)
|
||||||
await markChatRead(chat)
|
.foregroundColor(theme.colors.primary)
|
||||||
}
|
}
|
||||||
} label: {
|
.onTapGesture {
|
||||||
Label("Mark read", systemImage: "checkmark")
|
scrollModel.scrollToNextPage()
|
||||||
|
}
|
||||||
|
.contextMenu {
|
||||||
|
Button {
|
||||||
|
Task {
|
||||||
|
await markChatRead(chat)
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
Label("Mark read", systemImage: "checkmark")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Spacer()
|
||||||
|
if model.unreadBelow > 0 {
|
||||||
|
circleButton {
|
||||||
|
unreadCountText(model.unreadBelow)
|
||||||
|
.font(.callout)
|
||||||
|
.foregroundColor(theme.colors.primary)
|
||||||
|
}
|
||||||
|
.onTapGesture {
|
||||||
|
scrollModel.scrollToBottom()
|
||||||
|
}
|
||||||
|
} else if !model.isNearBottom {
|
||||||
|
circleButton {
|
||||||
|
Image(systemName: "chevron.down")
|
||||||
|
.foregroundColor(theme.colors.primary)
|
||||||
|
}
|
||||||
|
.onTapGesture { scrollModel.scrollToBottom() }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.padding()
|
||||||
|
.frame(maxWidth: .infinity, alignment: .trailing)
|
||||||
}
|
}
|
||||||
Spacer()
|
.onDisappear(perform: model.resetDate)
|
||||||
if counts.unreadBelow > 0 {
|
}
|
||||||
circleButton {
|
|
||||||
unreadCountText(counts.unreadBelow)
|
private func circleButton<Content: View>(_ content: @escaping () -> Content) -> some View {
|
||||||
.font(.callout)
|
ZStack {
|
||||||
.foregroundColor(theme.colors.primary)
|
Circle()
|
||||||
}
|
.foregroundColor(Color(uiColor: .tertiarySystemGroupedBackground))
|
||||||
.onTapGesture {
|
.frame(width: 44, height: 44)
|
||||||
scrollModel.scrollToBottom()
|
content()
|
||||||
}
|
|
||||||
} else if !counts.isNearBottom {
|
|
||||||
circleButton {
|
|
||||||
Image(systemName: "chevron.down")
|
|
||||||
.foregroundColor(theme.colors.primary)
|
|
||||||
}
|
|
||||||
.onTapGesture { scrollModel.scrollToBottom() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func circleButton<Content: View>(_ content: @escaping () -> Content) -> some View {
|
private struct DateSeparator: View {
|
||||||
ZStack {
|
let date: Date
|
||||||
Circle()
|
|
||||||
.foregroundColor(Color(uiColor: .tertiarySystemGroupedBackground))
|
var body: some View {
|
||||||
.frame(width: 44, height: 44)
|
Text(String.localizedStringWithFormat(
|
||||||
content()
|
NSLocalizedString("%@, %@", comment: "format for date separator in chat"),
|
||||||
|
date.formatted(.dateTime.weekday(.abbreviated)),
|
||||||
|
date.formatted(
|
||||||
|
Calendar.current.isDate(date, equalTo: .now, toGranularity: .year)
|
||||||
|
? .dateTime.day().month(.abbreviated)
|
||||||
|
: .dateTime.day().month(.abbreviated).year()
|
||||||
|
)
|
||||||
|
))
|
||||||
|
.font(.callout)
|
||||||
|
.fontWeight(.medium)
|
||||||
|
.foregroundStyle(.secondary)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -568,8 +644,8 @@ struct ChatView: View {
|
|||||||
|
|
||||||
private func endCallButton(_ call: Call) -> some View {
|
private func endCallButton(_ call: Call) -> some View {
|
||||||
Button {
|
Button {
|
||||||
if let uuid = call.callkitUUID {
|
if CallController.useCallKit(), let callUUID = call.callUUID {
|
||||||
CallController.shared.endCall(callUUID: uuid)
|
CallController.shared.endCall(callUUID: callUUID)
|
||||||
} else {
|
} else {
|
||||||
CallController.shared.endCall(call: call) {}
|
CallController.shared.endCall(call: call) {}
|
||||||
}
|
}
|
||||||
@@ -648,6 +724,116 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func forwardSelectedMessages() {
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
if let selectedChatItems {
|
||||||
|
let (validItems, confirmation) = try await apiPlanForwardChatItems(
|
||||||
|
type: chat.chatInfo.chatType,
|
||||||
|
id: chat.chatInfo.apiId,
|
||||||
|
itemIds: Array(selectedChatItems)
|
||||||
|
)
|
||||||
|
if let confirmation {
|
||||||
|
if validItems.count > 0 {
|
||||||
|
showAlert(
|
||||||
|
String.localizedStringWithFormat(
|
||||||
|
NSLocalizedString("Forward %d message(s)?", comment: "alert title"),
|
||||||
|
validItems.count
|
||||||
|
),
|
||||||
|
message: forwardConfirmationText(confirmation) + "\n" +
|
||||||
|
NSLocalizedString("Forward messages without files?", comment: "alert message")
|
||||||
|
) {
|
||||||
|
switch confirmation {
|
||||||
|
case let .filesNotAccepted(fileIds):
|
||||||
|
[forwardAction(validItems), downloadAction(fileIds), cancelAlertAction]
|
||||||
|
default:
|
||||||
|
[forwardAction(validItems), cancelAlertAction]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
showAlert(
|
||||||
|
NSLocalizedString("Nothing to forward!", comment: "alert title"),
|
||||||
|
message: forwardConfirmationText(confirmation)
|
||||||
|
) {
|
||||||
|
switch confirmation {
|
||||||
|
case let .filesNotAccepted(fileIds):
|
||||||
|
[downloadAction(fileIds), cancelAlertAction]
|
||||||
|
default:
|
||||||
|
[okAlertAction]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
await openForwardingSheet(validItems)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
logger.error("Plan forward chat items failed: \(error.localizedDescription)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func forwardConfirmationText(_ fc: ForwardConfirmation) -> String {
|
||||||
|
switch fc {
|
||||||
|
case let .filesNotAccepted(fileIds):
|
||||||
|
String.localizedStringWithFormat(
|
||||||
|
NSLocalizedString("%d file(s) were not downloaded.", comment: "forward confirmation reason"),
|
||||||
|
fileIds.count
|
||||||
|
)
|
||||||
|
case let .filesInProgress(filesCount):
|
||||||
|
String.localizedStringWithFormat(
|
||||||
|
NSLocalizedString("%d file(s) are still being downloaded.", comment: "forward confirmation reason"),
|
||||||
|
filesCount
|
||||||
|
)
|
||||||
|
case let .filesMissing(filesCount):
|
||||||
|
String.localizedStringWithFormat(
|
||||||
|
NSLocalizedString("%d file(s) were deleted.", comment: "forward confirmation reason"),
|
||||||
|
filesCount
|
||||||
|
)
|
||||||
|
case let .filesFailed(filesCount):
|
||||||
|
String.localizedStringWithFormat(
|
||||||
|
NSLocalizedString("%d file(s) failed to download.", comment: "forward confirmation reason"),
|
||||||
|
filesCount
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func forwardAction(_ items: [Int64]) -> UIAlertAction {
|
||||||
|
UIAlertAction(
|
||||||
|
title: NSLocalizedString("Forward messages", comment: "alert action"),
|
||||||
|
style: .default,
|
||||||
|
handler: { _ in Task { await openForwardingSheet(items) } }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func downloadAction(_ fileIds: [Int64]) -> UIAlertAction {
|
||||||
|
UIAlertAction(
|
||||||
|
title: NSLocalizedString("Download files", comment: "alert action"),
|
||||||
|
style: .default,
|
||||||
|
handler: { _ in
|
||||||
|
Task {
|
||||||
|
if let user = ChatModel.shared.currentUser {
|
||||||
|
await receiveFiles(user: user, fileIds: fileIds)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func openForwardingSheet(_ items: [Int64]) async {
|
||||||
|
let im = ItemsModel.shared
|
||||||
|
var items = Set(items)
|
||||||
|
var fci = [ChatItem]()
|
||||||
|
for reversedChatItem in im.reversedChatItems {
|
||||||
|
if items.contains(reversedChatItem.id) {
|
||||||
|
items.remove(reversedChatItem.id)
|
||||||
|
fci.insert(reversedChatItem, at: 0)
|
||||||
|
}
|
||||||
|
if items.isEmpty { break }
|
||||||
|
}
|
||||||
|
await MainActor.run { forwardedChatItems = fci }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private func loadChatItems(_ cInfo: ChatInfo) {
|
private func loadChatItems(_ cInfo: ChatInfo) {
|
||||||
Task {
|
Task {
|
||||||
if loadingItems || firstPage { return }
|
if loadingItems || firstPage { return }
|
||||||
@@ -696,6 +882,7 @@ struct ChatView: View {
|
|||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Binding @ObservedObject var chat: Chat
|
@Binding @ObservedObject var chat: Chat
|
||||||
|
@ObservedObject var dummyModel: ChatItemDummyModel = .shared
|
||||||
let chatItem: ChatItem
|
let chatItem: ChatItem
|
||||||
let maxWidth: CGFloat
|
let maxWidth: CGFloat
|
||||||
@Binding var composeState: ComposeState
|
@Binding var composeState: ComposeState
|
||||||
@@ -708,39 +895,66 @@ struct ChatView: View {
|
|||||||
@State private var showDeleteMessages = false
|
@State private var showDeleteMessages = false
|
||||||
@State private var showChatItemInfoSheet: Bool = false
|
@State private var showChatItemInfoSheet: Bool = false
|
||||||
@State private var chatItemInfo: ChatItemInfo?
|
@State private var chatItemInfo: ChatItemInfo?
|
||||||
@State private var showForwardingSheet: Bool = false
|
@State private var msgWidth: CGFloat = 0
|
||||||
|
|
||||||
@Binding var selectedChatItems: Set<Int64>?
|
@Binding var selectedChatItems: Set<Int64>?
|
||||||
|
@Binding var forwardedChatItems: [ChatItem]
|
||||||
|
|
||||||
@State private var allowMenu: Bool = true
|
@State private var allowMenu: Bool = true
|
||||||
|
@State private var markedRead = false
|
||||||
|
|
||||||
var revealed: Bool { chatItem == revealedChatItem }
|
var revealed: Bool { chatItem == revealedChatItem }
|
||||||
|
|
||||||
|
typealias ItemSeparation = (timestamp: Bool, largeGap: Bool, date: Date?)
|
||||||
|
|
||||||
|
func getItemSeparation(_ chatItem: ChatItem, at i: Int?) -> ItemSeparation {
|
||||||
|
let im = ItemsModel.shared
|
||||||
|
if let i, i > 0 && im.reversedChatItems.count >= i {
|
||||||
|
let nextItem = im.reversedChatItems[i - 1]
|
||||||
|
let largeGap = !nextItem.chatDir.sameDirection(chatItem.chatDir) || nextItem.meta.itemTs.timeIntervalSince(chatItem.meta.itemTs) > 60
|
||||||
|
return (
|
||||||
|
timestamp: largeGap || formatTimestampMeta(chatItem.meta.itemTs) != formatTimestampMeta(nextItem.meta.itemTs),
|
||||||
|
largeGap: largeGap,
|
||||||
|
date: Calendar.current.isDate(chatItem.meta.itemTs, inSameDayAs: nextItem.meta.itemTs) ? nil : nextItem.meta.itemTs
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
return (timestamp: true, largeGap: true, date: nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let (currIndex, _) = m.getNextChatItem(chatItem)
|
let currIndex = m.getChatItemIndex(chatItem)
|
||||||
let ciCategory = chatItem.mergeCategory
|
let ciCategory = chatItem.mergeCategory
|
||||||
let (prevHidden, prevItem) = m.getPrevShownChatItem(currIndex, ciCategory)
|
let (prevHidden, prevItem) = m.getPrevShownChatItem(currIndex, ciCategory)
|
||||||
let range = itemsRange(currIndex, prevHidden)
|
let range = itemsRange(currIndex, prevHidden)
|
||||||
|
let timeSeparation = getItemSeparation(chatItem, at: currIndex)
|
||||||
let im = ItemsModel.shared
|
let im = ItemsModel.shared
|
||||||
Group {
|
Group {
|
||||||
if revealed, let range = range {
|
if revealed, let range = range {
|
||||||
let items = Array(zip(Array(range), im.reversedChatItems[range]))
|
let items = Array(zip(Array(range), im.reversedChatItems[range]))
|
||||||
ForEach(items.reversed(), id: \.1.viewId) { (i, ci) in
|
VStack(spacing: 0) {
|
||||||
let prev = i == prevHidden ? prevItem : im.reversedChatItems[i + 1]
|
ForEach(items.reversed(), id: \.1.viewId) { (i: Int, ci: ChatItem) in
|
||||||
chatItemView(ci, nil, prev)
|
let prev = i == prevHidden ? prevItem : im.reversedChatItems[i + 1]
|
||||||
.overlay {
|
chatItemView(ci, nil, prev, getItemSeparation(ci, at: i))
|
||||||
if let selected = selectedChatItems, ci.canBeDeletedForSelf {
|
.overlay {
|
||||||
Color.clear
|
if let selected = selectedChatItems, ci.canBeDeletedForSelf {
|
||||||
.contentShape(Rectangle())
|
Color.clear
|
||||||
.onTapGesture {
|
.contentShape(Rectangle())
|
||||||
let checked = selected.contains(ci.id)
|
.onTapGesture {
|
||||||
selectUnselectChatItem(select: !checked, ci)
|
let checked = selected.contains(ci.id)
|
||||||
|
selectUnselectChatItem(select: !checked, ci)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
chatItemView(chatItem, range, prevItem)
|
VStack(spacing: 0) {
|
||||||
|
chatItemView(chatItem, range, prevItem, timeSeparation)
|
||||||
|
if let date = timeSeparation.date {
|
||||||
|
DateSeparator(date: date).padding(8)
|
||||||
|
}
|
||||||
|
}
|
||||||
.overlay {
|
.overlay {
|
||||||
if let selected = selectedChatItems, chatItem.canBeDeletedForSelf {
|
if let selected = selectedChatItems, chatItem.canBeDeletedForSelf {
|
||||||
Color.clear
|
Color.clear
|
||||||
@@ -754,12 +968,16 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onAppear {
|
.onAppear {
|
||||||
|
if markedRead {
|
||||||
|
return
|
||||||
|
} else {
|
||||||
|
markedRead = true
|
||||||
|
}
|
||||||
if let range {
|
if let range {
|
||||||
if let items = unreadItems(range) {
|
let itemIds = unreadItemIds(range)
|
||||||
|
if !itemIds.isEmpty {
|
||||||
waitToMarkRead {
|
waitToMarkRead {
|
||||||
for ci in items {
|
await apiMarkChatItemsRead(chat.chatInfo, itemIds)
|
||||||
await apiMarkChatItemRead(chat.chatInfo, ci)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if chatItem.isRcvNew {
|
} else if chatItem.isRcvNew {
|
||||||
@@ -769,29 +987,75 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func unreadItems(_ range: ClosedRange<Int>) -> [ChatItem]? {
|
private func unreadItemIds(_ range: ClosedRange<Int>) -> [ChatItem.ID] {
|
||||||
let im = ItemsModel.shared
|
let im = ItemsModel.shared
|
||||||
let items = range.compactMap { i in
|
return range.compactMap { i in
|
||||||
if i >= 0 && i < im.reversedChatItems.count {
|
if i >= 0 && i < im.reversedChatItems.count {
|
||||||
let ci = im.reversedChatItems[i]
|
let ci = im.reversedChatItems[i]
|
||||||
return if ci.isRcvNew { ci } else { nil }
|
return if ci.isRcvNew { ci.id } else { nil }
|
||||||
} else {
|
} else {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return if items.isEmpty { nil } else { items }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func waitToMarkRead(_ op: @Sendable @escaping () async -> Void) {
|
private func waitToMarkRead(_ op: @Sendable @escaping () async -> Void) {
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 0.6) {
|
Task {
|
||||||
|
_ = try? await Task.sleep(nanoseconds: 600_000000)
|
||||||
if m.chatId == chat.chatInfo.id {
|
if m.chatId == chat.chatInfo.id {
|
||||||
Task(operation: op)
|
await op()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ViewBuilder func chatItemView(_ ci: ChatItem, _ range: ClosedRange<Int>?, _ prevItem: ChatItem?) -> some View {
|
@available(iOS 16.0, *)
|
||||||
|
struct MemberLayout: Layout {
|
||||||
|
let spacing: Double
|
||||||
|
let msgWidth: Double
|
||||||
|
|
||||||
|
private func sizes(subviews: Subviews, proposal: ProposedViewSize) -> (CGSize, CGSize) {
|
||||||
|
assert(subviews.count == 2, "member layout must contain exactly two subviews")
|
||||||
|
let roleSize = subviews[1].sizeThatFits(proposal)
|
||||||
|
let memberSize = subviews[0].sizeThatFits(
|
||||||
|
ProposedViewSize(
|
||||||
|
width: (proposal.width ?? msgWidth) - roleSize.width,
|
||||||
|
height: proposal.height
|
||||||
|
)
|
||||||
|
)
|
||||||
|
return (memberSize, roleSize)
|
||||||
|
}
|
||||||
|
|
||||||
|
func sizeThatFits(proposal: ProposedViewSize, subviews: Subviews, cache: inout Void) -> CGSize {
|
||||||
|
let (memberSize, roleSize) = sizes(subviews: subviews, proposal: proposal)
|
||||||
|
return CGSize(
|
||||||
|
width: min(
|
||||||
|
proposal.width ?? msgWidth,
|
||||||
|
max(msgWidth, roleSize.width + spacing + memberSize.width)
|
||||||
|
),
|
||||||
|
height: max(memberSize.height, roleSize.height)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func placeSubviews(in bounds: CGRect, proposal: ProposedViewSize, subviews: Subviews, cache: inout Void) {
|
||||||
|
let (memberSize, roleSize) = sizes(subviews: subviews, proposal: proposal)
|
||||||
|
subviews[0].place(
|
||||||
|
at: CGPoint(x: bounds.minX, y: bounds.midY - memberSize.height / 2),
|
||||||
|
proposal: ProposedViewSize(memberSize)
|
||||||
|
)
|
||||||
|
subviews[1].place(
|
||||||
|
at: CGPoint(
|
||||||
|
x: bounds.minX + max(memberSize.width + spacing, msgWidth - roleSize.width),
|
||||||
|
y: bounds.midY - roleSize.height / 2
|
||||||
|
),
|
||||||
|
proposal: ProposedViewSize(roleSize)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewBuilder func chatItemView(_ ci: ChatItem, _ range: ClosedRange<Int>?, _ prevItem: ChatItem?, _ itemSeparation: ItemSeparation) -> some View {
|
||||||
|
let bottomPadding: Double = itemSeparation.largeGap ? 10 : 2
|
||||||
if case let .groupRcv(member) = ci.chatDir,
|
if case let .groupRcv(member) = ci.chatDir,
|
||||||
case let .group(groupInfo) = chat.chatInfo {
|
case let .group(groupInfo) = chat.chatInfo {
|
||||||
let (prevMember, memCount): (GroupMember?, Int) =
|
let (prevMember, memCount): (GroupMember?, Int) =
|
||||||
@@ -803,24 +1067,49 @@ struct ChatView: View {
|
|||||||
if prevItem == nil || showMemberImage(member, prevItem) || prevMember != nil {
|
if prevItem == nil || showMemberImage(member, prevItem) || prevMember != nil {
|
||||||
VStack(alignment: .leading, spacing: 4) {
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
if ci.content.showMemberName {
|
if ci.content.showMemberName {
|
||||||
let t = if memCount == 1 && member.memberRole > .member {
|
Group {
|
||||||
Text(member.memberRole.text + " ").fontWeight(.semibold) + Text(member.displayName)
|
if memCount == 1 && member.memberRole > .member {
|
||||||
} else {
|
Group {
|
||||||
Text(memberNames(member, prevMember, memCount))
|
if #available(iOS 16.0, *) {
|
||||||
|
MemberLayout(spacing: 16, msgWidth: msgWidth) {
|
||||||
|
Text(member.chatViewName)
|
||||||
|
.lineLimit(1)
|
||||||
|
Text(member.memberRole.text)
|
||||||
|
.fontWeight(.semibold)
|
||||||
|
.lineLimit(1)
|
||||||
|
.padding(.trailing, 8)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
HStack(spacing: 16) {
|
||||||
|
Text(member.chatViewName)
|
||||||
|
.lineLimit(1)
|
||||||
|
Text(member.memberRole.text)
|
||||||
|
.fontWeight(.semibold)
|
||||||
|
.lineLimit(1)
|
||||||
|
.layoutPriority(1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.frame(
|
||||||
|
maxWidth: maxWidth,
|
||||||
|
alignment: chatItem.chatDir.sent ? .trailing : .leading
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
Text(memberNames(member, prevMember, memCount))
|
||||||
|
.lineLimit(2)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
t
|
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
.foregroundStyle(.secondary)
|
.foregroundStyle(.secondary)
|
||||||
.lineLimit(2)
|
|
||||||
.padding(.leading, memberImageSize + 14 + (selectedChatItems != nil && ci.canBeDeletedForSelf ? 12 + 24 : 0))
|
.padding(.leading, memberImageSize + 14 + (selectedChatItems != nil && ci.canBeDeletedForSelf ? 12 + 24 : 0))
|
||||||
.padding(.top, 7)
|
.padding(.top, 3) // this is in addition to message sequence gap
|
||||||
}
|
}
|
||||||
HStack(alignment: .center, spacing: 0) {
|
HStack(alignment: .center, spacing: 0) {
|
||||||
if selectedChatItems != nil && ci.canBeDeletedForSelf {
|
if selectedChatItems != nil && ci.canBeDeletedForSelf {
|
||||||
SelectedChatItem(ciId: ci.id, selectedChatItems: $selectedChatItems)
|
SelectedChatItem(ciId: ci.id, selectedChatItems: $selectedChatItems)
|
||||||
.padding(.trailing, 12)
|
.padding(.trailing, 12)
|
||||||
}
|
}
|
||||||
HStack(alignment: .top, spacing: 8) {
|
HStack(alignment: .top, spacing: 10) {
|
||||||
MemberProfileImage(member, size: memberImageSize, backgroundColor: theme.colors.background)
|
MemberProfileImage(member, size: memberImageSize, backgroundColor: theme.colors.background)
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
if let member = m.getGroupMember(member.groupMemberId) {
|
if let member = m.getGroupMember(member.groupMemberId) {
|
||||||
@@ -833,11 +1122,12 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chatItemWithMenu(ci, range, maxWidth)
|
chatItemWithMenu(ci, range, maxWidth, itemSeparation)
|
||||||
|
.onPreferenceChange(DetermineWidth.Key.self) { msgWidth = $0 }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.bottom, 5)
|
.padding(.bottom, bottomPadding)
|
||||||
.padding(.trailing)
|
.padding(.trailing)
|
||||||
.padding(.leading, 12)
|
.padding(.leading, 12)
|
||||||
} else {
|
} else {
|
||||||
@@ -846,11 +1136,11 @@ struct ChatView: View {
|
|||||||
SelectedChatItem(ciId: ci.id, selectedChatItems: $selectedChatItems)
|
SelectedChatItem(ciId: ci.id, selectedChatItems: $selectedChatItems)
|
||||||
.padding(.leading, 12)
|
.padding(.leading, 12)
|
||||||
}
|
}
|
||||||
chatItemWithMenu(ci, range, maxWidth)
|
chatItemWithMenu(ci, range, maxWidth, itemSeparation)
|
||||||
.padding(.trailing)
|
.padding(.trailing)
|
||||||
.padding(.leading, memberImageSize + 8 + 12)
|
.padding(.leading, 10 + memberImageSize + 12)
|
||||||
}
|
}
|
||||||
.padding(.bottom, 5)
|
.padding(.bottom, bottomPadding)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
HStack(alignment: .center, spacing: 0) {
|
HStack(alignment: .center, spacing: 0) {
|
||||||
@@ -863,10 +1153,10 @@ struct ChatView: View {
|
|||||||
.padding(.leading)
|
.padding(.leading)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
chatItemWithMenu(ci, range, maxWidth)
|
chatItemWithMenu(ci, range, maxWidth, itemSeparation)
|
||||||
.padding(.horizontal)
|
.padding(.horizontal)
|
||||||
}
|
}
|
||||||
.padding(.bottom, 5)
|
.padding(.bottom, bottomPadding)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -881,7 +1171,7 @@ struct ChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder func chatItemWithMenu(_ ci: ChatItem, _ range: ClosedRange<Int>?, _ maxWidth: CGFloat) -> some View {
|
@ViewBuilder func chatItemWithMenu(_ ci: ChatItem, _ range: ClosedRange<Int>?, _ maxWidth: CGFloat, _ itemSeparation: ItemSeparation) -> some View {
|
||||||
let alignment: Alignment = ci.chatDir.sent ? .trailing : .leading
|
let alignment: Alignment = ci.chatDir.sent ? .trailing : .leading
|
||||||
VStack(alignment: alignment.horizontal, spacing: 3) {
|
VStack(alignment: alignment.horizontal, spacing: 3) {
|
||||||
ChatItemView(
|
ChatItemView(
|
||||||
@@ -891,7 +1181,8 @@ struct ChatView: View {
|
|||||||
revealed: .constant(revealed),
|
revealed: .constant(revealed),
|
||||||
allowMenu: $allowMenu
|
allowMenu: $allowMenu
|
||||||
)
|
)
|
||||||
.modifier(ChatItemClipped(ci))
|
.environment(\.showTimestamp, itemSeparation.timestamp)
|
||||||
|
.modifier(ChatItemClipped(ci, tailVisible: itemSeparation.largeGap))
|
||||||
.contextMenu { menu(ci, range, live: composeState.liveMessage != nil) }
|
.contextMenu { menu(ci, range, live: composeState.liveMessage != nil) }
|
||||||
.accessibilityLabel("")
|
.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 {
|
||||||
@@ -921,14 +1212,6 @@ struct ChatView: View {
|
|||||||
}) {
|
}) {
|
||||||
ChatItemInfoView(ci: ci, chatItemInfo: $chatItemInfo)
|
ChatItemInfoView(ci: ci, chatItemInfo: $chatItemInfo)
|
||||||
}
|
}
|
||||||
.sheet(isPresented: $showForwardingSheet) {
|
|
||||||
if #available(iOS 16.0, *) {
|
|
||||||
ChatItemForwardingView(ci: ci, fromChatInfo: chat.chatInfo, composeState: $composeState)
|
|
||||||
.presentationDetents([.fraction(0.8)])
|
|
||||||
} else {
|
|
||||||
ChatItemForwardingView(ci: ci, fromChatInfo: chat.chatInfo, composeState: $composeState)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func showMemberImage(_ member: GroupMember, _ prevItem: ChatItem?) -> Bool {
|
private func showMemberImage(_ member: GroupMember, _ prevItem: ChatItem?) -> Bool {
|
||||||
@@ -1069,7 +1352,7 @@ struct ChatView: View {
|
|||||||
|
|
||||||
var forwardButton: Button<some View> {
|
var forwardButton: Button<some View> {
|
||||||
Button {
|
Button {
|
||||||
showForwardingSheet = true
|
forwardedChatItems = [chatItem]
|
||||||
} label: {
|
} label: {
|
||||||
Label(
|
Label(
|
||||||
NSLocalizedString("Forward", comment: "chat item action"),
|
NSLocalizedString("Forward", comment: "chat item action"),
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ struct ComposeImageView: View {
|
|||||||
var body: some View {
|
var body: some View {
|
||||||
HStack(alignment: .center, spacing: 8) {
|
HStack(alignment: .center, spacing: 8) {
|
||||||
let imgs: [UIImage] = images.compactMap { image in
|
let imgs: [UIImage] = images.compactMap { image in
|
||||||
UIImage(base64Encoded: image)
|
imageFromBase64(image)
|
||||||
}
|
}
|
||||||
if imgs.count == 0 {
|
if imgs.count == 0 {
|
||||||
ProgressView()
|
ProgressView()
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ struct ComposeLinkView: View {
|
|||||||
|
|
||||||
private func linkPreviewView(_ linkPreview: LinkPreview) -> some View {
|
private func linkPreviewView(_ linkPreview: LinkPreview) -> some View {
|
||||||
HStack(alignment: .center, spacing: 8) {
|
HStack(alignment: .center, spacing: 8) {
|
||||||
if let uiImage = UIImage(base64Encoded: linkPreview.image) {
|
if let uiImage = imageFromBase64(linkPreview.image) {
|
||||||
Image(uiImage: uiImage)
|
Image(uiImage: uiImage)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ enum ComposeContextItem {
|
|||||||
case noContextItem
|
case noContextItem
|
||||||
case quotedItem(chatItem: ChatItem)
|
case quotedItem(chatItem: ChatItem)
|
||||||
case editingItem(chatItem: ChatItem)
|
case editingItem(chatItem: ChatItem)
|
||||||
case forwardingItem(chatItem: ChatItem, fromChatInfo: ChatInfo)
|
case forwardingItems(chatItems: [ChatItem], fromChatInfo: ChatInfo)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum VoiceMessageRecordingState {
|
enum VoiceMessageRecordingState {
|
||||||
@@ -73,10 +73,10 @@ struct ComposeState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init(forwardingItem: ChatItem, fromChatInfo: ChatInfo) {
|
init(forwardingItems: [ChatItem], fromChatInfo: ChatInfo) {
|
||||||
self.message = ""
|
self.message = ""
|
||||||
self.preview = .noPreview
|
self.preview = .noPreview
|
||||||
self.contextItem = .forwardingItem(chatItem: forwardingItem, fromChatInfo: fromChatInfo)
|
self.contextItem = .forwardingItems(chatItems: forwardingItems, fromChatInfo: fromChatInfo)
|
||||||
self.voiceMessageRecordingState = .noRecording
|
self.voiceMessageRecordingState = .noRecording
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -112,7 +112,7 @@ struct ComposeState {
|
|||||||
|
|
||||||
var forwarding: Bool {
|
var forwarding: Bool {
|
||||||
switch contextItem {
|
switch contextItem {
|
||||||
case .forwardingItem: return true
|
case .forwardingItems: return true
|
||||||
default: return false
|
default: return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -167,6 +167,13 @@ struct ComposeState {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var manyMediaPreviews: Bool {
|
||||||
|
switch preview {
|
||||||
|
case let .mediaPreviews(mediaPreviews): return mediaPreviews.count > 1
|
||||||
|
default: return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var attachmentDisabled: Bool {
|
var attachmentDisabled: Bool {
|
||||||
if editing || forwarding || liveMessage != nil || inProgress { return true }
|
if editing || forwarding || liveMessage != nil || inProgress { return true }
|
||||||
switch preview {
|
switch preview {
|
||||||
@@ -687,7 +694,7 @@ struct ComposeView: View {
|
|||||||
case let .quotedItem(chatItem: quotedItem):
|
case let .quotedItem(chatItem: quotedItem):
|
||||||
ContextItemView(
|
ContextItemView(
|
||||||
chat: chat,
|
chat: chat,
|
||||||
contextItem: quotedItem,
|
contextItems: [quotedItem],
|
||||||
contextIcon: "arrowshape.turn.up.left",
|
contextIcon: "arrowshape.turn.up.left",
|
||||||
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
|
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
|
||||||
)
|
)
|
||||||
@@ -695,18 +702,17 @@ struct ComposeView: View {
|
|||||||
case let .editingItem(chatItem: editingItem):
|
case let .editingItem(chatItem: editingItem):
|
||||||
ContextItemView(
|
ContextItemView(
|
||||||
chat: chat,
|
chat: chat,
|
||||||
contextItem: editingItem,
|
contextItems: [editingItem],
|
||||||
contextIcon: "pencil",
|
contextIcon: "pencil",
|
||||||
cancelContextItem: { clearState() }
|
cancelContextItem: { clearState() }
|
||||||
)
|
)
|
||||||
Divider()
|
Divider()
|
||||||
case let .forwardingItem(chatItem: forwardedItem, _):
|
case let .forwardingItems(chatItems, _):
|
||||||
ContextItemView(
|
ContextItemView(
|
||||||
chat: chat,
|
chat: chat,
|
||||||
contextItem: forwardedItem,
|
contextItems: chatItems,
|
||||||
contextIcon: "arrowshape.turn.up.forward",
|
contextIcon: "arrowshape.turn.up.forward",
|
||||||
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) },
|
cancelContextItem: { composeState = composeState.copy(contextItem: .noContextItem) }
|
||||||
showSender: false
|
|
||||||
)
|
)
|
||||||
Divider()
|
Divider()
|
||||||
}
|
}
|
||||||
@@ -730,10 +736,11 @@ struct ComposeView: View {
|
|||||||
}
|
}
|
||||||
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
|
if chat.chatInfo.contact?.nextSendGrpInv ?? false {
|
||||||
await sendMemberContactInvitation()
|
await sendMemberContactInvitation()
|
||||||
} else if case let .forwardingItem(ci, fromChatInfo) = composeState.contextItem {
|
} else if case let .forwardingItems(chatItems, fromChatInfo) = composeState.contextItem {
|
||||||
sent = await forwardItem(ci, fromChatInfo, ttl)
|
// Composed text is send as a reply to the last forwarded item
|
||||||
|
sent = await forwardItems(chatItems, fromChatInfo, ttl).last
|
||||||
if !composeState.message.isEmpty {
|
if !composeState.message.isEmpty {
|
||||||
sent = await send(checkLinkPreview(), quoted: sent?.id, live: false, ttl: ttl)
|
_ = await send(checkLinkPreview(), quoted: sent?.id, live: false, ttl: ttl)
|
||||||
}
|
}
|
||||||
} else if case let .editingItem(ci) = composeState.contextItem {
|
} else if case let .editingItem(ci) = composeState.contextItem {
|
||||||
sent = await updateMessage(ci, live: live)
|
sent = await updateMessage(ci, live: live)
|
||||||
@@ -750,26 +757,28 @@ struct ComposeView: View {
|
|||||||
sent = await send(.text(msgText), quoted: quoted, live: live, ttl: ttl)
|
sent = await send(.text(msgText), quoted: quoted, live: live, ttl: ttl)
|
||||||
case .linkPreview:
|
case .linkPreview:
|
||||||
sent = await send(checkLinkPreview(), quoted: quoted, live: live, ttl: ttl)
|
sent = await send(checkLinkPreview(), quoted: quoted, live: live, ttl: ttl)
|
||||||
case let .mediaPreviews(mediaPreviews: media):
|
case let .mediaPreviews(media):
|
||||||
let last = media.count - 1
|
let last = media.count - 1
|
||||||
|
var msgs: [ComposedMessage] = []
|
||||||
if last >= 0 {
|
if last >= 0 {
|
||||||
for i in 0..<last {
|
for i in 0..<last {
|
||||||
if case (_, .video(_, _, _)) = media[i] {
|
if i > 0 {
|
||||||
sent = await sendVideo(media[i], ttl: ttl)
|
// Sleep to allow `progressByTimeout` update be rendered
|
||||||
} else {
|
try? await Task.sleep(nanoseconds: 100_000000)
|
||||||
sent = await sendImage(media[i], ttl: ttl)
|
}
|
||||||
|
if let (fileSource, msgContent) = mediaContent(media[i], text: "") {
|
||||||
|
msgs.append(ComposedMessage(fileSource: fileSource, msgContent: msgContent))
|
||||||
}
|
}
|
||||||
_ = try? await Task.sleep(nanoseconds: 100_000000)
|
|
||||||
}
|
}
|
||||||
if case (_, .video(_, _, _)) = media[last] {
|
if let (fileSource, msgContent) = mediaContent(media[last], text: msgText) {
|
||||||
sent = await sendVideo(media[last], text: msgText, quoted: quoted, live: live, ttl: ttl)
|
msgs.append(ComposedMessage(fileSource: fileSource, quotedItemId: quoted, msgContent: msgContent))
|
||||||
} else {
|
|
||||||
sent = await sendImage(media[last], text: msgText, quoted: quoted, live: live, ttl: ttl)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if sent == nil {
|
if msgs.isEmpty {
|
||||||
sent = await send(.text(msgText), quoted: quoted, live: live, ttl: ttl)
|
msgs = [ComposedMessage(quotedItemId: quoted, msgContent: .text(msgText))]
|
||||||
}
|
}
|
||||||
|
sent = await send(msgs, live: live, ttl: ttl).last
|
||||||
|
|
||||||
case let .voicePreview(recordingFileName, duration):
|
case let .voicePreview(recordingFileName, duration):
|
||||||
stopPlayback.toggle()
|
stopPlayback.toggle()
|
||||||
let file = voiceCryptoFile(recordingFileName)
|
let file = voiceCryptoFile(recordingFileName)
|
||||||
@@ -791,6 +800,20 @@ struct ComposeView: View {
|
|||||||
}
|
}
|
||||||
return sent
|
return sent
|
||||||
|
|
||||||
|
func mediaContent(_ media: (String, UploadContent?), text: String) -> (CryptoFile?, MsgContent)? {
|
||||||
|
let (previewImage, uploadContent) = media
|
||||||
|
return switch uploadContent {
|
||||||
|
case let .simpleImage(image):
|
||||||
|
(saveImage(image), .image(text: text, image: previewImage))
|
||||||
|
case let .animatedImage(image):
|
||||||
|
(saveAnimImage(image), .image(text: text, image: previewImage))
|
||||||
|
case let .video(_, url, duration):
|
||||||
|
(moveTempFileFromURL(url), .video(text: text, image: previewImage, duration: duration))
|
||||||
|
case .none:
|
||||||
|
nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func sending() async {
|
func sending() async {
|
||||||
await MainActor.run { composeState.inProgress = true }
|
await MainActor.run { composeState.inProgress = true }
|
||||||
}
|
}
|
||||||
@@ -854,23 +877,6 @@ struct ComposeView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func sendImage(_ imageData: (String, UploadContent?), text: String = "", quoted: Int64? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
|
|
||||||
let (image, data) = imageData
|
|
||||||
if let data = data, let savedFile = saveAnyImage(data) {
|
|
||||||
return await send(.image(text: text, image: image), quoted: quoted, file: savedFile, live: live, ttl: ttl)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func sendVideo(_ imageData: (String, UploadContent?), text: String = "", quoted: Int64? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
|
|
||||||
let (image, data) = imageData
|
|
||||||
if case let .video(_, url, duration) = data, let savedFile = moveTempFileFromURL(url) {
|
|
||||||
ChatModel.shared.filesToDelete.remove(url)
|
|
||||||
return await send(.video(text: text, image: image, duration: duration), quoted: quoted, file: savedFile, live: live, ttl: ttl)
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func voiceCryptoFile(_ fileName: String) -> CryptoFile? {
|
func voiceCryptoFile(_ fileName: String) -> CryptoFile? {
|
||||||
if !privacyEncryptLocalFilesGroupDefault.get() {
|
if !privacyEncryptLocalFilesGroupDefault.get() {
|
||||||
return CryptoFile.plain(fileName)
|
return CryptoFile.plain(fileName)
|
||||||
@@ -887,44 +893,66 @@ struct ComposeView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func send(_ mc: MsgContent, quoted: Int64?, file: CryptoFile? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
|
func send(_ mc: MsgContent, quoted: Int64?, file: CryptoFile? = nil, live: Bool = false, ttl: Int?) async -> ChatItem? {
|
||||||
if let chatItem = chat.chatInfo.chatType == .local
|
await send(
|
||||||
? await apiCreateChatItem(noteFolderId: chat.chatInfo.apiId, file: file, msg: mc)
|
[ComposedMessage(fileSource: file, quotedItemId: quoted, msgContent: mc)],
|
||||||
: await apiSendMessage(
|
live: live,
|
||||||
|
ttl: ttl
|
||||||
|
).first
|
||||||
|
}
|
||||||
|
|
||||||
|
func send(_ msgs: [ComposedMessage], live: Bool, ttl: Int?) async -> [ChatItem] {
|
||||||
|
if let chatItems = chat.chatInfo.chatType == .local
|
||||||
|
? await apiCreateChatItems(noteFolderId: chat.chatInfo.apiId, composedMessages: msgs)
|
||||||
|
: await apiSendMessages(
|
||||||
type: chat.chatInfo.chatType,
|
type: chat.chatInfo.chatType,
|
||||||
id: chat.chatInfo.apiId,
|
id: chat.chatInfo.apiId,
|
||||||
file: file,
|
|
||||||
quotedItemId: quoted,
|
|
||||||
msg: mc,
|
|
||||||
live: live,
|
live: live,
|
||||||
ttl: ttl
|
ttl: ttl,
|
||||||
|
composedMessages: msgs
|
||||||
) {
|
) {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
chatModel.removeLiveDummy(animated: false)
|
chatModel.removeLiveDummy(animated: false)
|
||||||
chatModel.addChatItem(chat.chatInfo, chatItem)
|
for chatItem in chatItems {
|
||||||
|
chatModel.addChatItem(chat.chatInfo, chatItem)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return chatItem
|
return chatItems
|
||||||
}
|
}
|
||||||
if let file = file {
|
for msg in msgs {
|
||||||
removeFile(file.filePath)
|
if let file = msg.fileSource {
|
||||||
|
removeFile(file.filePath)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return nil
|
return []
|
||||||
}
|
}
|
||||||
|
|
||||||
func forwardItem(_ forwardedItem: ChatItem, _ fromChatInfo: ChatInfo, _ ttl: Int?) async -> ChatItem? {
|
func forwardItems(_ forwardedItems: [ChatItem], _ fromChatInfo: ChatInfo, _ ttl: Int?) async -> [ChatItem] {
|
||||||
if let chatItem = await apiForwardChatItem(
|
if let chatItems = await apiForwardChatItems(
|
||||||
toChatType: chat.chatInfo.chatType,
|
toChatType: chat.chatInfo.chatType,
|
||||||
toChatId: chat.chatInfo.apiId,
|
toChatId: chat.chatInfo.apiId,
|
||||||
fromChatType: fromChatInfo.chatType,
|
fromChatType: fromChatInfo.chatType,
|
||||||
fromChatId: fromChatInfo.apiId,
|
fromChatId: fromChatInfo.apiId,
|
||||||
itemId: forwardedItem.id,
|
itemIds: forwardedItems.map { $0.id },
|
||||||
ttl: ttl
|
ttl: ttl
|
||||||
) {
|
) {
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
chatModel.addChatItem(chat.chatInfo, chatItem)
|
for chatItem in chatItems {
|
||||||
|
chatModel.addChatItem(chat.chatInfo, chatItem)
|
||||||
|
}
|
||||||
|
if forwardedItems.count != chatItems.count {
|
||||||
|
showAlert(
|
||||||
|
String.localizedStringWithFormat(
|
||||||
|
NSLocalizedString("%d messages not forwarded", comment: "alert title"),
|
||||||
|
forwardedItems.count - chatItems.count
|
||||||
|
),
|
||||||
|
message: NSLocalizedString("Messages were deleted after you selected them.", comment: "alert message")
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return chatItem
|
return chatItems
|
||||||
|
} else {
|
||||||
|
return []
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkLinkPreview() -> MsgContent {
|
func checkLinkPreview() -> MsgContent {
|
||||||
@@ -941,14 +969,6 @@ struct ComposeView: View {
|
|||||||
return .text(msgText)
|
return .text(msgText)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func saveAnyImage(_ img: UploadContent) -> CryptoFile? {
|
|
||||||
switch img {
|
|
||||||
case let .simpleImage(image): return saveImage(image)
|
|
||||||
case let .animatedImage(image): return saveAnimImage(image)
|
|
||||||
default: return nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func startVoiceMessageRecording() async {
|
private func startVoiceMessageRecording() async {
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import SimpleXChat
|
|||||||
struct ContextItemView: View {
|
struct ContextItemView: View {
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@ObservedObject var chat: Chat
|
@ObservedObject var chat: Chat
|
||||||
let contextItem: ChatItem
|
let contextItems: [ChatItem]
|
||||||
let contextIcon: String
|
let contextIcon: String
|
||||||
let cancelContextItem: () -> Void
|
let cancelContextItem: () -> Void
|
||||||
var showSender: Bool = true
|
var showSender: Bool = true
|
||||||
@@ -24,13 +24,22 @@ struct ContextItemView: View {
|
|||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
.frame(width: 16, height: 16)
|
.frame(width: 16, height: 16)
|
||||||
.foregroundColor(theme.colors.secondary)
|
.foregroundColor(theme.colors.secondary)
|
||||||
if showSender, let sender = contextItem.memberDisplayName {
|
if let singleItem = contextItems.first, contextItems.count == 1 {
|
||||||
VStack(alignment: .leading, spacing: 4) {
|
if showSender, let sender = singleItem.memberDisplayName {
|
||||||
Text(sender).font(.caption).foregroundColor(theme.colors.secondary)
|
VStack(alignment: .leading, spacing: 4) {
|
||||||
msgContentView(lines: 2)
|
Text(sender).font(.caption).foregroundColor(theme.colors.secondary)
|
||||||
}
|
msgContentView(lines: 2, contextItem: singleItem)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
msgContentView(lines: 3, contextItem: singleItem)
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
msgContentView(lines: 3)
|
Text(
|
||||||
|
chat.chatInfo.chatType == .local
|
||||||
|
? "Saving \(contextItems.count) messages"
|
||||||
|
: "Forwarding \(contextItems.count) messages"
|
||||||
|
)
|
||||||
|
.italic()
|
||||||
}
|
}
|
||||||
Spacer()
|
Spacer()
|
||||||
Button {
|
Button {
|
||||||
@@ -45,23 +54,32 @@ struct ContextItemView: View {
|
|||||||
.padding(12)
|
.padding(12)
|
||||||
.frame(minHeight: 54)
|
.frame(minHeight: 54)
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
.background(chatItemFrameColor(contextItem, theme))
|
.background(background)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func msgContentView(lines: Int) -> some View {
|
private var background: Color {
|
||||||
contextMsgPreview()
|
contextItems.first
|
||||||
|
.map { chatItemFrameColor($0, theme) }
|
||||||
|
?? Color(uiColor: .tertiarySystemBackground)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func msgContentView(lines: Int, contextItem: ChatItem) -> some View {
|
||||||
|
contextMsgPreview(contextItem)
|
||||||
.multilineTextAlignment(isRightToLeft(contextItem.text) ? .trailing : .leading)
|
.multilineTextAlignment(isRightToLeft(contextItem.text) ? .trailing : .leading)
|
||||||
.lineLimit(lines)
|
.lineLimit(lines)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func contextMsgPreview() -> Text {
|
private func contextMsgPreview(_ contextItem: ChatItem) -> Text {
|
||||||
return attachment() + messageText(contextItem.text, contextItem.formattedText, nil, preview: true, showSecrets: false, secondaryColor: theme.colors.secondary)
|
return attachment() + messageText(contextItem.text, contextItem.formattedText, nil, preview: true, showSecrets: false, secondaryColor: theme.colors.secondary)
|
||||||
|
|
||||||
func attachment() -> Text {
|
func attachment() -> Text {
|
||||||
|
let isFileLoaded = if let fileSource = getLoadedFileSource(contextItem.file) {
|
||||||
|
FileManager.default.fileExists(atPath: getAppFilePath(fileSource.filePath).path)
|
||||||
|
} else { false }
|
||||||
switch contextItem.content.msgContent {
|
switch contextItem.content.msgContent {
|
||||||
case .file: return image("doc.fill")
|
case .file: return isFileLoaded ? image("doc.fill") : Text("")
|
||||||
case .image: return image("photo")
|
case .image: return image("photo")
|
||||||
case .voice: return image("play.fill")
|
case .voice: return isFileLoaded ? image("play.fill") : Text("")
|
||||||
default: return Text("")
|
default: return Text("")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -75,6 +93,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(chat: Chat.sampleData, contextItem: contextItem, contextIcon: "pencil.circle", cancelContextItem: {})
|
return ContextItemView(chat: Chat.sampleData, contextItems: [contextItem], contextIcon: "pencil.circle", cancelContextItem: {})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -227,6 +227,7 @@ struct SendMessageView: View {
|
|||||||
!composeState.editing {
|
!composeState.editing {
|
||||||
if case .noContextItem = composeState.contextItem,
|
if case .noContextItem = composeState.contextItem,
|
||||||
!composeState.voicePreview,
|
!composeState.voicePreview,
|
||||||
|
!composeState.manyMediaPreviews,
|
||||||
let send = sendLiveMessage,
|
let send = sendLiveMessage,
|
||||||
let update = updateLiveMessage {
|
let update = updateLiveMessage {
|
||||||
Button {
|
Button {
|
||||||
|
|||||||
@@ -105,8 +105,10 @@ struct AddGroupMembersViewCommon: View {
|
|||||||
.padding(.leading, 2)
|
.padding(.leading, 2)
|
||||||
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
|
let s = searchText.trimmingCharacters(in: .whitespaces).localizedLowercase
|
||||||
let members = s == "" ? membersToAdd : membersToAdd.filter { $0.chatViewName.localizedLowercase.contains(s) }
|
let members = s == "" ? membersToAdd : membersToAdd.filter { $0.chatViewName.localizedLowercase.contains(s) }
|
||||||
ForEach(members) { contact in
|
ForEach(members + [dummyContact]) { contact in
|
||||||
contactCheckView(contact)
|
if contact.contactId != dummyContact.contactId {
|
||||||
|
contactCheckView(contact)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -130,6 +132,14 @@ struct AddGroupMembersViewCommon: View {
|
|||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Resolves keyboard losing focus bug in iOS16 and iOS17,
|
||||||
|
// when there are no items inside `ForEach(memebers)` loop
|
||||||
|
private let dummyContact: Contact = {
|
||||||
|
var dummy = Contact.sampleData
|
||||||
|
dummy.contactId = -1
|
||||||
|
return dummy
|
||||||
|
}()
|
||||||
|
|
||||||
private func inviteMembersButton() -> some View {
|
private func inviteMembersButton() -> some View {
|
||||||
Button {
|
Button {
|
||||||
inviteMembers()
|
inviteMembers()
|
||||||
|
|||||||
@@ -8,15 +8,16 @@
|
|||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
import Combine
|
import Combine
|
||||||
|
import SimpleXChat
|
||||||
|
|
||||||
/// A List, which displays it's items in reverse order - from bottom to top
|
/// A List, which displays it's items in reverse order - from bottom to top
|
||||||
struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIViewControllerRepresentable {
|
struct ReverseList<Content: View>: UIViewControllerRepresentable {
|
||||||
let items: Array<Item>
|
let items: Array<ChatItem>
|
||||||
|
|
||||||
@Binding var scrollState: ReverseListScrollModel<Item>.State
|
@Binding var scrollState: ReverseListScrollModel.State
|
||||||
|
|
||||||
/// Closure, that returns user interface for a given item
|
/// Closure, that returns user interface for a given item
|
||||||
let content: (Item) -> Content
|
let content: (ChatItem) -> Content
|
||||||
|
|
||||||
let loadPage: () -> Void
|
let loadPage: () -> Void
|
||||||
|
|
||||||
@@ -25,7 +26,9 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
|
|||||||
}
|
}
|
||||||
|
|
||||||
func updateUIViewController(_ controller: Controller, context: Context) {
|
func updateUIViewController(_ controller: Controller, context: Context) {
|
||||||
|
controller.representer = self
|
||||||
if case let .scrollingTo(destination) = scrollState, !items.isEmpty {
|
if case let .scrollingTo(destination) = scrollState, !items.isEmpty {
|
||||||
|
controller.view.layer.removeAllAnimations()
|
||||||
switch destination {
|
switch destination {
|
||||||
case .nextPage:
|
case .nextPage:
|
||||||
controller.scrollToNextPage()
|
controller.scrollToNextPage()
|
||||||
@@ -42,9 +45,10 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
|
|||||||
/// Controller, which hosts SwiftUI cells
|
/// Controller, which hosts SwiftUI cells
|
||||||
class Controller: UITableViewController {
|
class Controller: UITableViewController {
|
||||||
private enum Section { case main }
|
private enum Section { case main }
|
||||||
private let representer: ReverseList
|
var representer: ReverseList
|
||||||
private var dataSource: UITableViewDiffableDataSource<Section, Item>!
|
private var dataSource: UITableViewDiffableDataSource<Section, ChatItem>!
|
||||||
private var itemCount: Int = 0
|
private var itemCount: Int = 0
|
||||||
|
private let updateFloatingButtons = PassthroughSubject<Void, Never>()
|
||||||
private var bag = Set<AnyCancellable>()
|
private var bag = Set<AnyCancellable>()
|
||||||
|
|
||||||
init(representer: ReverseList) {
|
init(representer: ReverseList) {
|
||||||
@@ -71,7 +75,7 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 3. Configure data source
|
// 3. Configure data source
|
||||||
self.dataSource = UITableViewDiffableDataSource<Section, Item>(
|
self.dataSource = UITableViewDiffableDataSource<Section, ChatItem>(
|
||||||
tableView: tableView
|
tableView: tableView
|
||||||
) { (tableView, indexPath, item) -> UITableViewCell? in
|
) { (tableView, indexPath, item) -> UITableViewCell? in
|
||||||
if indexPath.item > self.itemCount - 8, self.itemCount > 8 {
|
if indexPath.item > self.itemCount - 8, self.itemCount > 8 {
|
||||||
@@ -103,6 +107,15 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
|
|||||||
name: notificationName,
|
name: notificationName,
|
||||||
object: nil
|
object: nil
|
||||||
)
|
)
|
||||||
|
|
||||||
|
updateFloatingButtons
|
||||||
|
.throttle(for: 0.2, scheduler: DispatchQueue.global(qos: .background), latest: true)
|
||||||
|
.sink {
|
||||||
|
if let listState = DispatchQueue.main.sync(execute: { [weak self] in self?.getListState() }) {
|
||||||
|
ChatView.FloatingButtonModel.shared.updateOnListChange(listState)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.store(in: &bag)
|
||||||
}
|
}
|
||||||
|
|
||||||
@available(*, unavailable)
|
@available(*, unavailable)
|
||||||
@@ -171,8 +184,8 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
|
|||||||
Task { representer.scrollState = .atDestination }
|
Task { representer.scrollState = .atDestination }
|
||||||
}
|
}
|
||||||
|
|
||||||
func update(items: Array<Item>) {
|
func update(items: [ChatItem]) {
|
||||||
var snapshot = NSDiffableDataSourceSnapshot<Section, Item>()
|
var snapshot = NSDiffableDataSourceSnapshot<Section, ChatItem>()
|
||||||
snapshot.appendSections([.main])
|
snapshot.appendSections([.main])
|
||||||
snapshot.appendItems(items)
|
snapshot.appendItems(items)
|
||||||
dataSource.defaultRowAnimation = .none
|
dataSource.defaultRowAnimation = .none
|
||||||
@@ -180,7 +193,50 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
|
|||||||
snapshot,
|
snapshot,
|
||||||
animatingDifferences: itemCount != 0 && abs(items.count - itemCount) == 1
|
animatingDifferences: itemCount != 0 && abs(items.count - itemCount) == 1
|
||||||
)
|
)
|
||||||
|
// Sets content offset on initial load
|
||||||
|
if itemCount == 0 {
|
||||||
|
tableView.setContentOffset(
|
||||||
|
CGPoint(x: 0, y: -InvertedTableView.inset),
|
||||||
|
animated: false
|
||||||
|
)
|
||||||
|
}
|
||||||
itemCount = items.count
|
itemCount = items.count
|
||||||
|
updateFloatingButtons.send()
|
||||||
|
}
|
||||||
|
|
||||||
|
override func scrollViewDidScroll(_ scrollView: UIScrollView) {
|
||||||
|
updateFloatingButtons.send()
|
||||||
|
}
|
||||||
|
|
||||||
|
func getListState() -> ListState? {
|
||||||
|
if let visibleRows = tableView.indexPathsForVisibleRows,
|
||||||
|
visibleRows.last?.item ?? 0 < representer.items.count {
|
||||||
|
let scrollOffset: Double = tableView.contentOffset.y + InvertedTableView.inset
|
||||||
|
let topItemDate: Date? =
|
||||||
|
if let lastVisible = visibleRows.last(where: { isVisible(indexPath: $0) }) {
|
||||||
|
representer.items[lastVisible.item].meta.itemTs
|
||||||
|
} else {
|
||||||
|
nil
|
||||||
|
}
|
||||||
|
let bottomItemId: ChatItem.ID? =
|
||||||
|
if let firstVisible = visibleRows.first(where: { isVisible(indexPath: $0) }) {
|
||||||
|
representer.items[firstVisible.item].id
|
||||||
|
} else {
|
||||||
|
nil
|
||||||
|
}
|
||||||
|
return (scrollOffset: scrollOffset, topItemDate: topItemDate, bottomItemId: bottomItemId)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
private func isVisible(indexPath: IndexPath) -> Bool {
|
||||||
|
if let relativeFrame = tableView.superview?.convert(
|
||||||
|
tableView.rectForRow(at: indexPath),
|
||||||
|
from: tableView
|
||||||
|
) {
|
||||||
|
relativeFrame.maxY > InvertedTableView.inset &&
|
||||||
|
relativeFrame.minY < tableView.frame.height - InvertedTableView.inset
|
||||||
|
} else { false }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,13 +280,19 @@ struct ReverseList<Item: Identifiable & Hashable & Sendable, Content: View>: UIV
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typealias ListState = (
|
||||||
|
scrollOffset: Double,
|
||||||
|
topItemDate: Date?,
|
||||||
|
bottomItemId: ChatItem.ID?
|
||||||
|
)
|
||||||
|
|
||||||
/// Manages ``ReverseList`` scrolling
|
/// Manages ``ReverseList`` scrolling
|
||||||
class ReverseListScrollModel<Item: Identifiable>: ObservableObject {
|
class ReverseListScrollModel: ObservableObject {
|
||||||
/// Represents Scroll State of ``ReverseList``
|
/// Represents Scroll State of ``ReverseList``
|
||||||
enum State: Equatable {
|
enum State: Equatable {
|
||||||
enum Destination: Equatable {
|
enum Destination: Equatable {
|
||||||
case nextPage
|
case nextPage
|
||||||
case item(Item.ID)
|
case item(ChatItem.ID)
|
||||||
case bottom
|
case bottom
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -248,7 +310,7 @@ class ReverseListScrollModel<Item: Identifiable>: ObservableObject {
|
|||||||
state = .scrollingTo(.bottom)
|
state = .scrollingTo(.bottom)
|
||||||
}
|
}
|
||||||
|
|
||||||
func scrollToItem(id: Item.ID) {
|
func scrollToItem(id: ChatItem.ID) {
|
||||||
state = .scrollingTo(.item(id))
|
state = .scrollingTo(.item(id))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,12 +32,15 @@ struct SelectedItemsBottomToolbar: View {
|
|||||||
var deleteItems: (Bool) -> Void
|
var deleteItems: (Bool) -> Void
|
||||||
var moderateItems: () -> Void
|
var moderateItems: () -> Void
|
||||||
//var shareItems: () -> Void
|
//var shareItems: () -> Void
|
||||||
|
var forwardItems: () -> Void
|
||||||
@State var deleteEnabled: Bool = false
|
@State var deleteEnabled: Bool = false
|
||||||
@State var deleteForEveryoneEnabled: Bool = false
|
@State var deleteForEveryoneEnabled: Bool = false
|
||||||
|
|
||||||
@State var canModerate: Bool = false
|
@State var canModerate: Bool = false
|
||||||
@State var moderateEnabled: Bool = false
|
@State var moderateEnabled: Bool = false
|
||||||
|
|
||||||
|
@State var forwardEnabled: Bool = false
|
||||||
|
|
||||||
@State var allButtonsDisabled = false
|
@State var allButtonsDisabled = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -50,6 +53,7 @@ struct SelectedItemsBottomToolbar: View {
|
|||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "trash")
|
Image(systemName: "trash")
|
||||||
.resizable()
|
.resizable()
|
||||||
|
.scaledToFit()
|
||||||
.frame(width: 20, height: 20, alignment: .center)
|
.frame(width: 20, height: 20, alignment: .center)
|
||||||
.foregroundColor(!deleteEnabled || allButtonsDisabled ? theme.colors.secondary: .red)
|
.foregroundColor(!deleteEnabled || allButtonsDisabled ? theme.colors.secondary: .red)
|
||||||
}
|
}
|
||||||
@@ -61,24 +65,24 @@ struct SelectedItemsBottomToolbar: View {
|
|||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "flag")
|
Image(systemName: "flag")
|
||||||
.resizable()
|
.resizable()
|
||||||
|
.scaledToFit()
|
||||||
.frame(width: 20, height: 20, alignment: .center)
|
.frame(width: 20, height: 20, alignment: .center)
|
||||||
.foregroundColor(!moderateEnabled || allButtonsDisabled ? theme.colors.secondary : .red)
|
.foregroundColor(!moderateEnabled || allButtonsDisabled ? theme.colors.secondary : .red)
|
||||||
}
|
}
|
||||||
.disabled(!moderateEnabled || allButtonsDisabled)
|
.disabled(!moderateEnabled || allButtonsDisabled)
|
||||||
.opacity(canModerate ? 1 : 0)
|
.opacity(canModerate ? 1 : 0)
|
||||||
|
|
||||||
|
|
||||||
Spacer()
|
Spacer()
|
||||||
Button {
|
Button {
|
||||||
//shareItems()
|
forwardItems()
|
||||||
} label: {
|
} label: {
|
||||||
Image(systemName: "square.and.arrow.up")
|
Image(systemName: "arrowshape.turn.up.forward")
|
||||||
.resizable()
|
.resizable()
|
||||||
|
.scaledToFit()
|
||||||
.frame(width: 20, height: 20, alignment: .center)
|
.frame(width: 20, height: 20, alignment: .center)
|
||||||
.foregroundColor(allButtonsDisabled ? theme.colors.secondary : theme.colors.primary)
|
.foregroundColor(!forwardEnabled || allButtonsDisabled ? theme.colors.secondary : theme.colors.primary)
|
||||||
}
|
}
|
||||||
.disabled(allButtonsDisabled)
|
.disabled(!forwardEnabled || allButtonsDisabled)
|
||||||
.opacity(0)
|
|
||||||
}
|
}
|
||||||
.frame(maxHeight: .infinity)
|
.frame(maxHeight: .infinity)
|
||||||
.padding([.leading, .trailing], 12)
|
.padding([.leading, .trailing], 12)
|
||||||
@@ -106,15 +110,16 @@ struct SelectedItemsBottomToolbar: View {
|
|||||||
if let selected = selectedItems {
|
if let selected = selectedItems {
|
||||||
let me: Bool
|
let me: Bool
|
||||||
let onlyOwnGroupItems: Bool
|
let onlyOwnGroupItems: Bool
|
||||||
(deleteEnabled, deleteForEveryoneEnabled, me, onlyOwnGroupItems, selectedChatItems) = chatItems.reduce((true, true, true, true, [])) { (r, ci) in
|
(deleteEnabled, deleteForEveryoneEnabled, me, onlyOwnGroupItems, forwardEnabled, selectedChatItems) = chatItems.reduce((true, true, true, true, true, [])) { (r, ci) in
|
||||||
if selected.contains(ci.id) {
|
if selected.contains(ci.id) {
|
||||||
var (de, dee, me, onlyOwnGroupItems, sel) = r
|
var (de, dee, me, onlyOwnGroupItems, fe, sel) = r
|
||||||
de = de && ci.canBeDeletedForSelf
|
de = de && ci.canBeDeletedForSelf
|
||||||
dee = dee && ci.meta.deletable && !ci.localNote
|
dee = dee && ci.meta.deletable && !ci.localNote
|
||||||
onlyOwnGroupItems = onlyOwnGroupItems && ci.chatDir == .groupSnd
|
onlyOwnGroupItems = onlyOwnGroupItems && ci.chatDir == .groupSnd
|
||||||
me = me && ci.content.msgContent != nil && ci.memberToModerate(chatInfo) != nil
|
me = me && ci.content.msgContent != nil && ci.memberToModerate(chatInfo) != nil
|
||||||
|
fe = fe && ci.content.msgContent != nil && ci.meta.itemDeleted == nil && !ci.isLiveDummy
|
||||||
sel.insert(ci.id) // we are collecting new selected items here to account for any changes in chat items list
|
sel.insert(ci.id) // we are collecting new selected items here to account for any changes in chat items list
|
||||||
return (de, dee, me, onlyOwnGroupItems, sel)
|
return (de, dee, me, onlyOwnGroupItems, fe, sel)
|
||||||
} else {
|
} else {
|
||||||
return r
|
return r
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import SwiftUI
|
|||||||
|
|
||||||
struct ChatHelp: View {
|
struct ChatHelp: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@Binding var showSettings: Bool
|
let dismissSettingsSheet: DismissAction
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ScrollView { chatHelp() }
|
ScrollView { chatHelp() }
|
||||||
@@ -23,7 +23,7 @@ struct ChatHelp: View {
|
|||||||
VStack(alignment: .leading, spacing: 0) {
|
VStack(alignment: .leading, spacing: 0) {
|
||||||
Text("To ask any questions and to receive updates:")
|
Text("To ask any questions and to receive updates:")
|
||||||
Button("connect to SimpleX Chat developers.") {
|
Button("connect to SimpleX Chat developers.") {
|
||||||
showSettings = false
|
dismissSettingsSheet()
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
UIApplication.shared.open(simplexTeamURL)
|
UIApplication.shared.open(simplexTeamURL)
|
||||||
}
|
}
|
||||||
@@ -61,8 +61,9 @@ struct ChatHelp: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ChatHelp_Previews: PreviewProvider {
|
struct ChatHelp_Previews: PreviewProvider {
|
||||||
|
@Environment(\.dismiss) static var mockDismiss
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
@State var showSettings = false
|
ChatHelp(dismissSettingsSheet: mockDismiss)
|
||||||
return ChatHelp(showSettings: $showSettings)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,18 +9,87 @@
|
|||||||
import SwiftUI
|
import SwiftUI
|
||||||
import SimpleXChat
|
import SimpleXChat
|
||||||
|
|
||||||
|
enum UserPickerSheet: Identifiable {
|
||||||
|
case address
|
||||||
|
case chatPreferences
|
||||||
|
case chatProfiles
|
||||||
|
case currentProfile
|
||||||
|
case useFromDesktop
|
||||||
|
case settings
|
||||||
|
|
||||||
|
var id: Self { self }
|
||||||
|
|
||||||
|
var navigationTitle: LocalizedStringKey {
|
||||||
|
switch self {
|
||||||
|
case .address: "SimpleX address"
|
||||||
|
case .chatPreferences: "Your preferences"
|
||||||
|
case .chatProfiles: "Your chat profiles"
|
||||||
|
case .currentProfile: "Your current profile"
|
||||||
|
case .useFromDesktop: "Connect to desktop"
|
||||||
|
case .settings: "Your settings"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct UserPickerSheetView: View {
|
||||||
|
let sheet: UserPickerSheet
|
||||||
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
|
@State private var loaded = false
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
NavigationView {
|
||||||
|
ZStack {
|
||||||
|
if loaded, let currentUser = chatModel.currentUser {
|
||||||
|
switch sheet {
|
||||||
|
case .address:
|
||||||
|
UserAddressView(shareViaProfile: currentUser.addressShared)
|
||||||
|
case .chatPreferences:
|
||||||
|
PreferencesView(
|
||||||
|
profile: currentUser.profile,
|
||||||
|
preferences: currentUser.fullPreferences,
|
||||||
|
currentPreferences: currentUser.fullPreferences
|
||||||
|
)
|
||||||
|
case .chatProfiles:
|
||||||
|
UserProfilesView()
|
||||||
|
case .currentProfile:
|
||||||
|
UserProfile()
|
||||||
|
case .useFromDesktop:
|
||||||
|
ConnectDesktopView()
|
||||||
|
case .settings:
|
||||||
|
SettingsView()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Color.clear // Required for list background to be rendered during loading
|
||||||
|
}
|
||||||
|
.navigationTitle(sheet.navigationTitle)
|
||||||
|
.navigationBarTitleDisplayMode(.large)
|
||||||
|
.modifier(ThemedBackground(grouped: true))
|
||||||
|
}
|
||||||
|
.overlay {
|
||||||
|
if let la = chatModel.laRequest {
|
||||||
|
LocalAuthView(authRequest: la)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.task {
|
||||||
|
withAnimation(
|
||||||
|
.easeOut(duration: 0.1),
|
||||||
|
{ loaded = true }
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct ChatListView: View {
|
struct ChatListView: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Binding var showSettings: Bool
|
@Binding var activeUserPickerSheet: UserPickerSheet?
|
||||||
@State private var searchMode = false
|
@State private var searchMode = false
|
||||||
@FocusState private var searchFocussed
|
@FocusState private var searchFocussed
|
||||||
@State private var searchText = ""
|
@State private var searchText = ""
|
||||||
@State private var searchShowingSimplexLink = false
|
@State private var searchShowingSimplexLink = false
|
||||||
@State private var searchChatFilteredBySimplexLink: String? = nil
|
@State private var searchChatFilteredBySimplexLink: String? = nil
|
||||||
@State private var userPickerVisible = false
|
|
||||||
@State private var showConnectDesktop = false
|
|
||||||
@State private var scrollToSearchBar = false
|
@State private var scrollToSearchBar = false
|
||||||
|
@State private var userPickerShown: Bool = false
|
||||||
|
|
||||||
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
|
@AppStorage(DEFAULT_SHOW_UNREAD_AND_FAVORITES) private var showUnreadAndFavorites = false
|
||||||
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
|
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
|
||||||
@@ -46,21 +115,21 @@ struct ChatListView: View {
|
|||||||
),
|
),
|
||||||
destination: chatView
|
destination: chatView
|
||||||
) { chatListView }
|
) { chatListView }
|
||||||
if userPickerVisible {
|
}
|
||||||
Rectangle().fill(.white.opacity(0.001)).onTapGesture {
|
.modifier(
|
||||||
withAnimation {
|
Sheet(isPresented: $userPickerShown) {
|
||||||
userPickerVisible.toggle()
|
UserPicker(userPickerShown: $userPickerShown, activeSheet: $activeUserPickerSheet)
|
||||||
}
|
}
|
||||||
|
)
|
||||||
|
.sheet(item: $activeUserPickerSheet) {
|
||||||
|
UserPickerSheetView(sheet: $0)
|
||||||
|
}
|
||||||
|
.onChange(of: activeUserPickerSheet) {
|
||||||
|
if $0 != nil {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.3) {
|
||||||
|
userPickerShown = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
UserPicker(
|
|
||||||
showSettings: $showSettings,
|
|
||||||
showConnectDesktop: $showConnectDesktop,
|
|
||||||
userPickerVisible: $userPickerVisible
|
|
||||||
)
|
|
||||||
}
|
|
||||||
.sheet(isPresented: $showConnectDesktop) {
|
|
||||||
ConnectDesktopView()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -73,7 +142,7 @@ struct ChatListView: View {
|
|||||||
.navigationBarHidden(searchMode || oneHandUI)
|
.navigationBarHidden(searchMode || oneHandUI)
|
||||||
}
|
}
|
||||||
.scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center)
|
.scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center)
|
||||||
.onDisappear() { withAnimation { userPickerVisible = false } }
|
.onDisappear() { activeUserPickerSheet = nil }
|
||||||
.refreshable {
|
.refreshable {
|
||||||
AlertManager.shared.showAlert(Alert(
|
AlertManager.shared.showAlert(Alert(
|
||||||
title: Text("Reconnect servers?"),
|
title: Text("Reconnect servers?"),
|
||||||
@@ -164,7 +233,7 @@ struct ChatListView: View {
|
|||||||
let user = chatModel.currentUser ?? User.sampleData
|
let user = chatModel.currentUser ?? User.sampleData
|
||||||
ZStack(alignment: .topTrailing) {
|
ZStack(alignment: .topTrailing) {
|
||||||
ProfileImage(imageStr: user.image, size: 32, color: Color(uiColor: .quaternaryLabel))
|
ProfileImage(imageStr: user.image, size: 32, color: Color(uiColor: .quaternaryLabel))
|
||||||
.padding(.trailing, 4)
|
.padding([.top, .trailing], 3)
|
||||||
let allRead = chatModel.users
|
let allRead = chatModel.users
|
||||||
.filter { u in !u.user.activeUser && !u.user.hidden }
|
.filter { u in !u.user.activeUser && !u.user.hidden }
|
||||||
.allSatisfy { u in u.unreadCount == 0 }
|
.allSatisfy { u in u.unreadCount == 0 }
|
||||||
@@ -173,13 +242,7 @@ struct ChatListView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onTapGesture {
|
.onTapGesture {
|
||||||
if chatModel.users.filter({ u in u.user.activeUser || !u.user.hidden }).count > 1 {
|
userPickerShown = true
|
||||||
withAnimation {
|
|
||||||
userPickerVisible.toggle()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
showSettings = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -217,14 +280,31 @@ struct ChatListView: View {
|
|||||||
.listRowSeparator(.hidden)
|
.listRowSeparator(.hidden)
|
||||||
.listRowBackground(Color.clear)
|
.listRowBackground(Color.clear)
|
||||||
}
|
}
|
||||||
ForEach(cs, id: \.viewId) { chat in
|
if #available(iOS 16.0, *) {
|
||||||
ChatListNavLink(chat: chat)
|
ForEach(cs, id: \.viewId) { chat in
|
||||||
|
ChatListNavLink(chat: chat)
|
||||||
|
.scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center)
|
||||||
|
.padding(.trailing, -16)
|
||||||
|
.disabled(chatModel.chatRunning != true || chatModel.deletedChats.contains(chat.chatInfo.id))
|
||||||
|
.listRowBackground(Color.clear)
|
||||||
|
}
|
||||||
|
.offset(x: -8)
|
||||||
|
} else {
|
||||||
|
ForEach(cs, id: \.viewId) { chat in
|
||||||
|
VStack(spacing: .zero) {
|
||||||
|
Divider()
|
||||||
|
.padding(.leading, 16)
|
||||||
|
ChatListNavLink(chat: chat)
|
||||||
|
.padding(.horizontal, 8)
|
||||||
|
.padding(.vertical, 6)
|
||||||
|
}
|
||||||
.scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center)
|
.scaleEffect(x: 1, y: oneHandUI ? -1 : 1, anchor: .center)
|
||||||
.padding(.trailing, -16)
|
.listRowSeparator(.hidden)
|
||||||
|
.listRowInsets(EdgeInsets())
|
||||||
|
.background { theme.colors.background } // Hides default list selection colour
|
||||||
.disabled(chatModel.chatRunning != true || chatModel.deletedChats.contains(chat.chatInfo.id))
|
.disabled(chatModel.chatRunning != true || chatModel.deletedChats.contains(chat.chatInfo.id))
|
||||||
.listRowBackground(Color.clear)
|
}
|
||||||
}
|
}
|
||||||
.offset(x: -8)
|
|
||||||
}
|
}
|
||||||
.listStyle(.plain)
|
.listStyle(.plain)
|
||||||
.onChange(of: chatModel.chatId) { currentChatId in
|
.onChange(of: chatModel.chatId) { currentChatId in
|
||||||
@@ -252,7 +332,7 @@ struct ChatListView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func unreadBadge(_ text: Text? = Text(" "), size: CGFloat = 18) -> some View {
|
private func unreadBadge(size: CGFloat = 18) -> some View {
|
||||||
Circle()
|
Circle()
|
||||||
.frame(width: size, height: size)
|
.frame(width: size, height: size)
|
||||||
.foregroundColor(theme.colors.primary)
|
.foregroundColor(theme.colors.primary)
|
||||||
@@ -499,27 +579,29 @@ func chatStoppedIcon() -> some View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct ChatListView_Previews: PreviewProvider {
|
struct ChatListView_Previews: PreviewProvider {
|
||||||
|
@State static var userPickerSheet: UserPickerSheet? = .none
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let chatModel = ChatModel()
|
let chatModel = ChatModel()
|
||||||
chatModel.chats = [
|
chatModel.updateChats([
|
||||||
Chat(
|
ChatData(
|
||||||
chatInfo: ChatInfo.sampleData.direct,
|
chatInfo: ChatInfo.sampleData.direct,
|
||||||
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello")]
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "hello")]
|
||||||
),
|
),
|
||||||
Chat(
|
ChatData(
|
||||||
chatInfo: ChatInfo.sampleData.group,
|
chatInfo: ChatInfo.sampleData.group,
|
||||||
chatItems: [ChatItem.getSample(1, .directSnd, .now, "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.")]
|
chatItems: [ChatItem.getSample(1, .directSnd, .now, "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.")]
|
||||||
),
|
),
|
||||||
Chat(
|
ChatData(
|
||||||
chatInfo: ChatInfo.sampleData.contactRequest,
|
chatInfo: ChatInfo.sampleData.contactRequest,
|
||||||
chatItems: []
|
chatItems: []
|
||||||
)
|
)
|
||||||
|
|
||||||
]
|
])
|
||||||
return Group {
|
return Group {
|
||||||
ChatListView(showSettings: Binding.constant(false))
|
ChatListView(activeUserPickerSheet: $userPickerSheet)
|
||||||
.environmentObject(chatModel)
|
.environmentObject(chatModel)
|
||||||
ChatListView(showSettings: Binding.constant(false))
|
ChatListView(activeUserPickerSheet: $userPickerSheet)
|
||||||
.environmentObject(ChatModel())
|
.environmentObject(ChatModel())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,11 +35,16 @@ struct ChatPreviewView: View {
|
|||||||
}
|
}
|
||||||
.padding(.leading, 4)
|
.padding(.leading, 4)
|
||||||
|
|
||||||
|
let chatTs = if let cItem {
|
||||||
|
cItem.meta.itemTs
|
||||||
|
} else {
|
||||||
|
chat.chatInfo.chatTs
|
||||||
|
}
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
HStack(alignment: .top) {
|
HStack(alignment: .top) {
|
||||||
chatPreviewTitle()
|
chatPreviewTitle()
|
||||||
Spacer()
|
Spacer()
|
||||||
(cItem?.timestampText ?? formatTimestampText(chat.chatInfo.chatTs))
|
(formatTimestampText(chatTs))
|
||||||
.font(.subheadline)
|
.font(.subheadline)
|
||||||
.frame(minWidth: 60, alignment: .trailing)
|
.frame(minWidth: 60, alignment: .trailing)
|
||||||
.foregroundColor(theme.colors.secondary)
|
.foregroundColor(theme.colors.secondary)
|
||||||
@@ -302,7 +307,7 @@ struct ChatPreviewView: View {
|
|||||||
case let .link(_, preview):
|
case let .link(_, preview):
|
||||||
smallContentPreview(size: dynamicMediaSize) {
|
smallContentPreview(size: dynamicMediaSize) {
|
||||||
ZStack(alignment: .topTrailing) {
|
ZStack(alignment: .topTrailing) {
|
||||||
Image(uiImage: UIImage(base64Encoded: preview.image) ?? UIImage(systemName: "arrow.up.right")!)
|
Image(uiImage: imageFromBase64(preview.image) ?? UIImage(systemName: "arrow.up.right")!)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fill)
|
.aspectRatio(contentMode: .fill)
|
||||||
.frame(width: dynamicMediaSize, height: dynamicMediaSize)
|
.frame(width: dynamicMediaSize, height: dynamicMediaSize)
|
||||||
@@ -323,13 +328,13 @@ struct ChatPreviewView: View {
|
|||||||
}
|
}
|
||||||
case let .image(_, image):
|
case let .image(_, image):
|
||||||
smallContentPreview(size: dynamicMediaSize) {
|
smallContentPreview(size: dynamicMediaSize) {
|
||||||
CIImageView(chatItem: ci, preview: UIImage(base64Encoded: image), maxWidth: dynamicMediaSize, smallView: true, showFullScreenImage: $showFullscreenGallery)
|
CIImageView(chatItem: ci, preview: imageFromBase64(image), maxWidth: dynamicMediaSize, smallView: true, showFullScreenImage: $showFullscreenGallery)
|
||||||
.environmentObject(ReverseListScrollModel<ChatItem>())
|
.environmentObject(ReverseListScrollModel())
|
||||||
}
|
}
|
||||||
case let .video(_,image, duration):
|
case let .video(_,image, duration):
|
||||||
smallContentPreview(size: dynamicMediaSize) {
|
smallContentPreview(size: dynamicMediaSize) {
|
||||||
CIVideoView(chatItem: ci, preview: UIImage(base64Encoded: image), duration: duration, maxWidth: dynamicMediaSize, videoWidth: nil, smallView: true, showFullscreenPlayer: $showFullscreenGallery)
|
CIVideoView(chatItem: ci, preview: imageFromBase64(image), duration: duration, maxWidth: dynamicMediaSize, videoWidth: nil, smallView: true, showFullscreenPlayer: $showFullscreenGallery)
|
||||||
.environmentObject(ReverseListScrollModel<ChatItem>())
|
.environmentObject(ReverseListScrollModel())
|
||||||
}
|
}
|
||||||
case let .voice(_, duration):
|
case let .voice(_, duration):
|
||||||
smallContentPreviewVoice(size: dynamicMediaSize) {
|
smallContentPreviewVoice(size: dynamicMediaSize) {
|
||||||
|
|||||||
@@ -407,12 +407,18 @@ struct ServersSummaryView: View {
|
|||||||
|
|
||||||
struct SubscriptionStatusIndicatorView: View {
|
struct SubscriptionStatusIndicatorView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
|
@EnvironmentObject var theme: AppTheme
|
||||||
var subs: SMPServerSubs
|
var subs: SMPServerSubs
|
||||||
var hasSess: Bool
|
var hasSess: Bool
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let onionHosts = networkUseOnionHostsGroupDefault.get()
|
let (color, variableValue, opacity, _) = subscriptionStatusColorAndPercentage(
|
||||||
let (color, variableValue, opacity, _) = subscriptionStatusColorAndPercentage(m.networkInfo.online, onionHosts, subs, hasSess)
|
online: m.networkInfo.online,
|
||||||
|
usesProxy: networkUseOnionHostsGroupDefault.get() != .no || groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY) != nil,
|
||||||
|
subs: subs,
|
||||||
|
hasSess: hasSess,
|
||||||
|
primaryColor: theme.colors.primary
|
||||||
|
)
|
||||||
if #available(iOS 16.0, *) {
|
if #available(iOS 16.0, *) {
|
||||||
Image(systemName: "dot.radiowaves.up.forward", variableValue: variableValue)
|
Image(systemName: "dot.radiowaves.up.forward", variableValue: variableValue)
|
||||||
.foregroundColor(color)
|
.foregroundColor(color)
|
||||||
@@ -425,26 +431,32 @@ struct SubscriptionStatusIndicatorView: View {
|
|||||||
|
|
||||||
struct SubscriptionStatusPercentageView: View {
|
struct SubscriptionStatusPercentageView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
|
@EnvironmentObject var theme: AppTheme
|
||||||
var subs: SMPServerSubs
|
var subs: SMPServerSubs
|
||||||
var hasSess: Bool
|
var hasSess: Bool
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let onionHosts = networkUseOnionHostsGroupDefault.get()
|
let (_, _, _, statusPercent) = subscriptionStatusColorAndPercentage(
|
||||||
let (_, _, _, statusPercent) = subscriptionStatusColorAndPercentage(m.networkInfo.online, onionHosts, subs, hasSess)
|
online: m.networkInfo.online,
|
||||||
|
usesProxy: networkUseOnionHostsGroupDefault.get() != .no || groupDefaults.string(forKey: GROUP_DEFAULT_NETWORK_SOCKS_PROXY) != nil,
|
||||||
|
subs: subs,
|
||||||
|
hasSess: hasSess,
|
||||||
|
primaryColor: theme.colors.primary
|
||||||
|
)
|
||||||
Text(verbatim: "\(Int(floor(statusPercent * 100)))%")
|
Text(verbatim: "\(Int(floor(statusPercent * 100)))%")
|
||||||
.foregroundColor(.secondary)
|
.foregroundColor(.secondary)
|
||||||
.font(.caption)
|
.font(.caption)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func subscriptionStatusColorAndPercentage(_ online: Bool, _ onionHosts: OnionHosts, _ subs: SMPServerSubs, _ hasSess: Bool) -> (Color, Double, Double, Double) {
|
func subscriptionStatusColorAndPercentage(online: Bool, usesProxy: Bool, subs: SMPServerSubs, hasSess: Bool, primaryColor: Color) -> (Color, Double, Double, Double) {
|
||||||
func roundedToQuarter(_ n: Double) -> Double {
|
func roundedToQuarter(_ n: Double) -> Double {
|
||||||
n >= 1 ? 1
|
n >= 1 ? 1
|
||||||
: n <= 0 ? 0
|
: n <= 0 ? 0
|
||||||
: (n * 4).rounded() / 4
|
: (n * 4).rounded() / 4
|
||||||
}
|
}
|
||||||
|
|
||||||
let activeColor: Color = onionHosts == .require ? .indigo : .accentColor
|
let activeColor: Color = usesProxy ? .indigo : primaryColor
|
||||||
let noConnColorAndPercent: (Color, Double, Double, Double) = (Color(uiColor: .tertiaryLabel), 1, 1, 0)
|
let noConnColorAndPercent: (Color, Double, Double, Double) = (Color(uiColor: .tertiaryLabel), 1, 1, 0)
|
||||||
let activeSubsRounded = roundedToQuarter(subs.shareOfActive)
|
let activeSubsRounded = roundedToQuarter(subs.shareOfActive)
|
||||||
|
|
||||||
|
|||||||
@@ -8,176 +8,269 @@ import SimpleXChat
|
|||||||
|
|
||||||
struct UserPicker: View {
|
struct UserPicker: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@Environment(\.scenePhase) var scenePhase
|
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Binding var showSettings: Bool
|
@Environment(\.dynamicTypeSize) private var userFont: DynamicTypeSize
|
||||||
@Binding var showConnectDesktop: Bool
|
@Environment(\.scenePhase) private var scenePhase: ScenePhase
|
||||||
@Binding var userPickerVisible: Bool
|
@Environment(\.colorScheme) private var colorScheme: ColorScheme
|
||||||
@State var scrollViewContentSize: CGSize = .zero
|
@Binding var userPickerShown: Bool
|
||||||
@State var disableScrolling: Bool = true
|
@Binding var activeSheet: UserPickerSheet?
|
||||||
private let menuButtonHeight: CGFloat = 68
|
@State private var currentUser: Int64?
|
||||||
@State var chatViewNameWidth: CGFloat = 0
|
@State private var switchingProfile = false
|
||||||
|
@State private var frameWidth: CGFloat = 0
|
||||||
|
@State private var resetScroll = ResetScrollAction()
|
||||||
|
|
||||||
|
// Inset grouped list dimensions
|
||||||
|
private let imageSize: CGFloat = 44
|
||||||
|
private let rowPadding: CGFloat = 16
|
||||||
|
private let rowVerticalPadding: CGFloat = 11
|
||||||
|
private let sectionSpacing: CGFloat = 35
|
||||||
|
private var sectionHorizontalPadding: CGFloat { frameWidth > 375 ? 20 : 16 }
|
||||||
|
private let sectionShape = RoundedRectangle(cornerRadius: 10, style: .continuous)
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
let otherUsers: [UserInfo] = m.users
|
||||||
Spacer().frame(height: 1)
|
.filter { u in !u.user.hidden && u.user.userId != m.currentUser?.userId }
|
||||||
|
.sorted(using: KeyPathComparator<UserInfo>(\.user.activeOrder, order: .reverse))
|
||||||
|
let sectionWidth = max(frameWidth - sectionHorizontalPadding * 2, 0)
|
||||||
|
let currentUserWidth = max(frameWidth - sectionHorizontalPadding - rowPadding * 2 - 14 - imageSize, 0)
|
||||||
|
VStack(spacing: sectionSpacing) {
|
||||||
|
if let user = m.currentUser {
|
||||||
|
StickyScrollView(resetScroll: $resetScroll) {
|
||||||
|
HStack(spacing: rowPadding) {
|
||||||
|
HStack {
|
||||||
|
ProfileImage(imageStr: user.image, size: imageSize, color: Color(uiColor: .tertiarySystemGroupedBackground))
|
||||||
|
.padding(.trailing, 6)
|
||||||
|
profileName(user).lineLimit(1)
|
||||||
|
}
|
||||||
|
.padding(rowPadding)
|
||||||
|
.frame(width: otherUsers.isEmpty ? sectionWidth : currentUserWidth, alignment: .leading)
|
||||||
|
.modifier(ListRow { activeSheet = .currentProfile })
|
||||||
|
.clipShape(sectionShape)
|
||||||
|
ForEach(otherUsers) { u in
|
||||||
|
userView(u, size: imageSize)
|
||||||
|
.frame(maxWidth: sectionWidth * 0.618)
|
||||||
|
.fixedSize()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.padding(.horizontal, sectionHorizontalPadding)
|
||||||
|
}
|
||||||
|
.frame(height: 2 * rowPadding + imageSize)
|
||||||
|
.padding(.top, sectionSpacing)
|
||||||
|
.overlay(DetermineWidth())
|
||||||
|
.onPreferenceChange(DetermineWidth.Key.self) { frameWidth = $0 }
|
||||||
|
}
|
||||||
VStack(spacing: 0) {
|
VStack(spacing: 0) {
|
||||||
ScrollView {
|
openSheetOnTap("qrcode", title: m.userAddress == nil ? "Create SimpleX address" : "Your SimpleX address", sheet: .address)
|
||||||
ScrollViewReader { sp in
|
openSheetOnTap("switch.2", title: "Chat preferences", sheet: .chatPreferences)
|
||||||
let users = m.users
|
openSheetOnTap("person.crop.rectangle.stack", title: "Your chat profiles", sheet: .chatProfiles)
|
||||||
.filter({ u in u.user.activeUser || !u.user.hidden })
|
openSheetOnTap("desktopcomputer", title: "Use from desktop", sheet: .useFromDesktop)
|
||||||
.sorted { u, _ in u.user.activeUser }
|
ZStack(alignment: .trailing) {
|
||||||
VStack(spacing: 0) {
|
openSheetOnTap("gearshape", title: "Settings", sheet: .settings, showDivider: false)
|
||||||
ForEach(users) { u in
|
Image(systemName: colorScheme == .light ? "sun.max" : "moon.fill")
|
||||||
userView(u)
|
.resizable()
|
||||||
Divider()
|
.scaledToFit()
|
||||||
if u.user.activeUser { Divider() }
|
.symbolRenderingMode(.monochrome)
|
||||||
|
.foregroundColor(theme.colors.secondary)
|
||||||
|
.frame(maxWidth: 20, maxHeight: .infinity)
|
||||||
|
.padding(.horizontal, rowPadding)
|
||||||
|
.background(Color(.systemBackground).opacity(0.01))
|
||||||
|
.onTapGesture {
|
||||||
|
if (colorScheme == .light) {
|
||||||
|
ThemeManager.applyTheme(systemDarkThemeDefault.get())
|
||||||
|
} else {
|
||||||
|
ThemeManager.applyTheme(DefaultTheme.LIGHT.themeName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.overlay {
|
.onLongPressGesture {
|
||||||
GeometryReader { geo -> Color in
|
ThemeManager.applyTheme(DefaultTheme.SYSTEM_THEME_NAME)
|
||||||
DispatchQueue.main.async {
|
|
||||||
scrollViewContentSize = geo.size
|
|
||||||
let scenes = UIApplication.shared.connectedScenes
|
|
||||||
if let windowScene = scenes.first as? UIWindowScene {
|
|
||||||
let layoutFrame = windowScene.windows[0].safeAreaLayoutGuide.layoutFrame
|
|
||||||
disableScrolling = scrollViewContentSize.height + menuButtonHeight + 10 < layoutFrame.height
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return Color.clear
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
.onChange(of: userPickerVisible) { visible in
|
|
||||||
if visible, let u = users.first {
|
|
||||||
sp.scrollTo(u.id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.simultaneousGesture(DragGesture(minimumDistance: disableScrolling ? 0 : 10000000))
|
|
||||||
.frame(maxHeight: scrollViewContentSize.height)
|
|
||||||
|
|
||||||
menuButton("Use from desktop", icon: "desktopcomputer") {
|
|
||||||
showConnectDesktop = true
|
|
||||||
withAnimation {
|
|
||||||
userPickerVisible.toggle()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Divider()
|
|
||||||
menuButton("Settings", icon: "gearshape") {
|
|
||||||
showSettings = true
|
|
||||||
withAnimation {
|
|
||||||
userPickerVisible.toggle()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.clipShape(sectionShape)
|
||||||
|
.padding(.horizontal, sectionHorizontalPadding)
|
||||||
|
.padding(.bottom, sectionSpacing)
|
||||||
}
|
}
|
||||||
.clipShape(RoundedRectangle(cornerRadius: 16))
|
|
||||||
.background(
|
|
||||||
Rectangle()
|
|
||||||
.fill(theme.colors.surface)
|
|
||||||
.cornerRadius(16)
|
|
||||||
.shadow(color: .black.opacity(0.12), radius: 24, x: 0, y: 0)
|
|
||||||
)
|
|
||||||
.onPreferenceChange(DetermineWidth.Key.self) { chatViewNameWidth = $0 }
|
|
||||||
.frame(maxWidth: chatViewNameWidth > 0 ? min(300, chatViewNameWidth + 130) : 300)
|
|
||||||
.padding(8)
|
|
||||||
.opacity(userPickerVisible ? 1.0 : 0.0)
|
|
||||||
.onAppear {
|
.onAppear {
|
||||||
do {
|
// This check prevents the call of listUsers after the app is suspended, and the database is closed.
|
||||||
// This check prevents the call of listUsers after the app is suspended, and the database is closed.
|
if case .active = scenePhase {
|
||||||
if case .active = scenePhase {
|
currentUser = m.currentUser?.userId
|
||||||
m.users = try listUsers()
|
|
||||||
}
|
|
||||||
} catch let error {
|
|
||||||
logger.error("Error loading users \(responseError(error))")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func userView(_ u: UserInfo) -> some View {
|
|
||||||
let user = u.user
|
|
||||||
return Button(action: {
|
|
||||||
if user.activeUser {
|
|
||||||
showSettings = true
|
|
||||||
withAnimation {
|
|
||||||
userPickerVisible.toggle()
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
try await changeActiveUserAsync_(user.userId, viewPwd: nil)
|
let users = try await listUsersAsync()
|
||||||
await MainActor.run { userPickerVisible = false }
|
|
||||||
} catch {
|
|
||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
AlertManager.shared.showAlertMsg(
|
m.users = users
|
||||||
title: "Error switching profile!",
|
currentUser = m.currentUser?.userId
|
||||||
message: "Error: \(responseError(error))"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
} catch {
|
||||||
|
logger.error("Error loading users \(responseError(error))")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, label: {
|
}
|
||||||
HStack(spacing: 0) {
|
.onChange(of: userPickerShown) {
|
||||||
ProfileImage(imageStr: user.image, size: 44, color: Color(uiColor: .tertiarySystemFill))
|
if !$0 { resetScroll() }
|
||||||
.padding(.trailing, 12)
|
}
|
||||||
Text(user.chatViewName)
|
.modifier(ThemedBackground(grouped: true))
|
||||||
.fontWeight(user.activeUser ? .medium : .regular)
|
.disabled(switchingProfile)
|
||||||
.foregroundColor(theme.colors.onBackground)
|
}
|
||||||
.overlay(DetermineWidth())
|
|
||||||
Spacer()
|
private func userView(_ u: UserInfo, size: CGFloat) -> some View {
|
||||||
if user.activeUser {
|
HStack {
|
||||||
Image(systemName: "checkmark")
|
ZStack(alignment: .topTrailing) {
|
||||||
} else if u.unreadCount > 0 {
|
ProfileImage(imageStr: u.user.image, size: size, color: Color(uiColor: .tertiarySystemGroupedBackground))
|
||||||
unreadCounter(u.unreadCount, color: user.showNtfs ? theme.colors.primary : theme.colors.secondary)
|
if (u.unreadCount > 0) {
|
||||||
} else if !user.showNtfs {
|
unreadBadge(u).offset(x: 4, y: -4)
|
||||||
Image(systemName: "speaker.slash")
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(.trailing)
|
.padding(.trailing, 6)
|
||||||
.padding([.leading, .vertical], 12)
|
Text(u.user.displayName).font(.title2).lineLimit(1)
|
||||||
})
|
|
||||||
.buttonStyle(PressedButtonStyle(defaultColor: theme.colors.surface, pressedColor: Color(uiColor: .secondarySystemFill)))
|
|
||||||
}
|
|
||||||
|
|
||||||
private func menuButton(_ title: LocalizedStringKey, icon: String, action: @escaping () -> Void) -> some View {
|
|
||||||
Button(action: action) {
|
|
||||||
HStack(spacing: 0) {
|
|
||||||
Text(title)
|
|
||||||
.overlay(DetermineWidth())
|
|
||||||
Spacer()
|
|
||||||
Image(systemName: icon)
|
|
||||||
.symbolRenderingMode(.monochrome)
|
|
||||||
.foregroundColor(theme.colors.secondary)
|
|
||||||
}
|
|
||||||
.padding(.horizontal)
|
|
||||||
.padding(.vertical, 22)
|
|
||||||
.frame(height: menuButtonHeight)
|
|
||||||
}
|
}
|
||||||
.buttonStyle(PressedButtonStyle(defaultColor: theme.colors.surface, pressedColor: Color(uiColor: .secondarySystemFill)))
|
.padding(rowPadding)
|
||||||
|
.modifier(ListRow {
|
||||||
|
switchingProfile = true
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
try await changeActiveUserAsync_(u.user.userId, viewPwd: nil)
|
||||||
|
await MainActor.run {
|
||||||
|
switchingProfile = false
|
||||||
|
userPickerShown = false
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
await MainActor.run {
|
||||||
|
switchingProfile = false
|
||||||
|
showAlert(
|
||||||
|
NSLocalizedString("Error switching profile!", comment: "alertTitle"),
|
||||||
|
message: String.localizedStringWithFormat(NSLocalizedString("Error: %@", comment: "alert message"), responseError(error))
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.clipShape(sectionShape)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func openSheetOnTap(_ icon: String, title: LocalizedStringKey, sheet: UserPickerSheet, showDivider: Bool = true) -> some View {
|
||||||
|
ZStack(alignment: .bottom) {
|
||||||
|
settingsRow(icon, color: theme.colors.secondary) {
|
||||||
|
Text(title).foregroundColor(.primary)
|
||||||
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
|
.padding(.horizontal, rowPadding)
|
||||||
|
.padding(.vertical, rowVerticalPadding)
|
||||||
|
.modifier(ListRow { activeSheet = sheet })
|
||||||
|
if showDivider {
|
||||||
|
Divider().padding(.leading, 52)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func unreadBadge(_ u: UserInfo) -> some View {
|
||||||
|
let size = dynamicSize(userFont).chatInfoSize
|
||||||
|
return unreadCountText(u.unreadCount)
|
||||||
|
.font(userFont <= .xxxLarge ? .caption : .caption2)
|
||||||
|
.foregroundColor(.white)
|
||||||
|
.padding(.horizontal, dynamicSize(userFont).unreadPadding)
|
||||||
|
.frame(minWidth: size, minHeight: size)
|
||||||
|
.background(u.user.showNtfs ? theme.colors.primary : theme.colors.secondary)
|
||||||
|
.cornerRadius(dynamicSize(userFont).unreadCorner)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func unreadCounter(_ unread: Int, color: Color) -> some View {
|
struct ListRow: ViewModifier {
|
||||||
unreadCountText(unread)
|
@Environment(\.colorScheme) private var colorScheme: ColorScheme
|
||||||
.font(.caption)
|
@State private var touchDown = false
|
||||||
.foregroundColor(.white)
|
let action: () -> Void
|
||||||
.padding(.horizontal, 4)
|
|
||||||
.frame(minWidth: 18, minHeight: 18)
|
func body(content: Content) -> some View {
|
||||||
.background(color)
|
ZStack {
|
||||||
.cornerRadius(10)
|
elevatedSecondarySystemGroupedBackground
|
||||||
|
Color(.systemGray4).opacity(touchDown ? 1 : 0)
|
||||||
|
content
|
||||||
|
TouchOverlay(touchDown: $touchDown, action: action)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var elevatedSecondarySystemGroupedBackground: Color {
|
||||||
|
switch colorScheme {
|
||||||
|
case .dark: Color(0xFF2C2C2E)
|
||||||
|
default: Color(0xFFFFFFFF)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct TouchOverlay: UIViewRepresentable {
|
||||||
|
@Binding var touchDown: Bool
|
||||||
|
let action: () -> Void
|
||||||
|
|
||||||
|
func makeUIView(context: Context) -> TouchView {
|
||||||
|
let touchView = TouchView()
|
||||||
|
let gesture = UILongPressGestureRecognizer(
|
||||||
|
target: touchView,
|
||||||
|
action: #selector(touchView.longPress(gesture:))
|
||||||
|
)
|
||||||
|
gesture.delegate = touchView
|
||||||
|
gesture.minimumPressDuration = 0
|
||||||
|
touchView.addGestureRecognizer(gesture)
|
||||||
|
return touchView
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateUIView(_ touchView: TouchView, context: Context) {
|
||||||
|
touchView.representer = self
|
||||||
|
}
|
||||||
|
|
||||||
|
class TouchView: UIView, UIGestureRecognizerDelegate {
|
||||||
|
var representer: TouchOverlay?
|
||||||
|
private var startLocation: CGPoint?
|
||||||
|
private var task: Task<Void, Never>?
|
||||||
|
|
||||||
|
@objc
|
||||||
|
func longPress(gesture: UILongPressGestureRecognizer) {
|
||||||
|
switch gesture.state {
|
||||||
|
case .began:
|
||||||
|
startLocation = gesture.location(in: nil)
|
||||||
|
task = Task {
|
||||||
|
do {
|
||||||
|
try await Task.sleep(nanoseconds: 200_000000)
|
||||||
|
await MainActor.run { representer?.touchDown = true }
|
||||||
|
} catch { }
|
||||||
|
}
|
||||||
|
case .ended:
|
||||||
|
if hitTest(gesture.location(in: self), with: nil) == self {
|
||||||
|
representer?.action()
|
||||||
|
}
|
||||||
|
task?.cancel()
|
||||||
|
representer?.touchDown = false
|
||||||
|
case .changed:
|
||||||
|
if let startLocation {
|
||||||
|
let location = gesture.location(in: nil)
|
||||||
|
let dx = location.x - startLocation.x
|
||||||
|
let dy = location.y - startLocation.y
|
||||||
|
if sqrt(pow(dx, 2) + pow(dy, 2)) > 10 { gesture.state = .failed }
|
||||||
|
}
|
||||||
|
case .cancelled, .failed:
|
||||||
|
task?.cancel()
|
||||||
|
representer?.touchDown = false
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func gestureRecognizer(
|
||||||
|
_: UIGestureRecognizer,
|
||||||
|
shouldRecognizeSimultaneouslyWith: UIGestureRecognizer
|
||||||
|
) -> Bool { true }
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
struct UserPicker_Previews: PreviewProvider {
|
struct UserPicker_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
|
@State var activeSheet: UserPickerSheet?
|
||||||
|
|
||||||
let m = ChatModel()
|
let m = ChatModel()
|
||||||
m.users = [UserInfo.sampleData, UserInfo.sampleData]
|
m.users = [UserInfo.sampleData, UserInfo.sampleData]
|
||||||
return UserPicker(
|
return UserPicker(
|
||||||
showSettings: Binding.constant(false),
|
userPickerShown: .constant(true),
|
||||||
showConnectDesktop: Binding.constant(false),
|
activeSheet: $activeSheet
|
||||||
userPickerVisible: Binding.constant(true)
|
|
||||||
)
|
)
|
||||||
.environmentObject(m)
|
.environmentObject(m)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ enum DatabaseAlert: Identifiable {
|
|||||||
struct DatabaseView: View {
|
struct DatabaseView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Binding var showSettings: Bool
|
let dismissSettingsSheet: DismissAction
|
||||||
@State private var runChat = false
|
@State private var runChat = false
|
||||||
@State private var alert: DatabaseAlert? = nil
|
@State private var alert: DatabaseAlert? = nil
|
||||||
@State private var showFileImporter = false
|
@State private var showFileImporter = false
|
||||||
@@ -270,12 +270,12 @@ struct DatabaseView: View {
|
|||||||
case let .archiveImportedWithErrors(errs):
|
case let .archiveImportedWithErrors(errs):
|
||||||
return Alert(
|
return Alert(
|
||||||
title: Text("Chat database imported"),
|
title: Text("Chat database imported"),
|
||||||
message: Text("Restart the app to use imported chat database") + Text(verbatim: "\n\n") + Text("Some non-fatal errors occurred during import:") + archiveErrorsText(errs)
|
message: Text("Restart the app to use imported chat database") + Text(verbatim: "\n") + Text("Some non-fatal errors occurred during import:") + archiveErrorsText(errs)
|
||||||
)
|
)
|
||||||
case let .archiveExportedWithErrors(archivePath, errs):
|
case let .archiveExportedWithErrors(archivePath, errs):
|
||||||
return Alert(
|
return Alert(
|
||||||
title: Text("Chat database exported"),
|
title: Text("Chat database exported"),
|
||||||
message: Text("You may save the exported archive.") + Text(verbatim: "\n\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
|
message: Text("You may save the exported archive.") + Text(verbatim: "\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
|
||||||
dismissButton: .default(Text("Continue")) {
|
dismissButton: .default(Text("Continue")) {
|
||||||
showShareSheet(items: [archivePath])
|
showShareSheet(items: [archivePath])
|
||||||
}
|
}
|
||||||
@@ -439,7 +439,7 @@ struct DatabaseView: View {
|
|||||||
|
|
||||||
private func startChat() {
|
private func startChat() {
|
||||||
if m.chatDbChanged {
|
if m.chatDbChanged {
|
||||||
showSettings = false
|
dismissSettingsSheet()
|
||||||
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
|
||||||
resetChatCtrl()
|
resetChatCtrl()
|
||||||
do {
|
do {
|
||||||
@@ -491,7 +491,7 @@ struct DatabaseView: View {
|
|||||||
appFilesCountAndSize = directoryFileCountAndSize(getAppFilesDirectory())
|
appFilesCountAndSize = directoryFileCountAndSize(getAppFilesDirectory())
|
||||||
do {
|
do {
|
||||||
let chats = try apiGetChats()
|
let chats = try apiGetChats()
|
||||||
m.updateChats(with: chats)
|
m.updateChats(chats)
|
||||||
} catch let error {
|
} catch let error {
|
||||||
logger.error("apiGetChats: cannot update chats \(responseError(error))")
|
logger.error("apiGetChats: cannot update chats \(responseError(error))")
|
||||||
}
|
}
|
||||||
@@ -533,7 +533,9 @@ func deleteChatAsync() async throws {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct DatabaseView_Previews: PreviewProvider {
|
struct DatabaseView_Previews: PreviewProvider {
|
||||||
|
@Environment(\.dismiss) static var mockDismiss
|
||||||
|
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
DatabaseView(showSettings: Binding.constant(false), chatItemTTL: .none)
|
DatabaseView(dismissSettingsSheet: mockDismiss, chatItemTTL: .none)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,50 +14,60 @@ import SimpleXChat
|
|||||||
/// Supports [Dynamic Type](https://developer.apple.com/documentation/uikit/uifont/scaling_fonts_automatically)
|
/// Supports [Dynamic Type](https://developer.apple.com/documentation/uikit/uifont/scaling_fonts_automatically)
|
||||||
/// by retaining pill shape, even when ``ChatItem``'s height is less that twice its corner radius
|
/// by retaining pill shape, even when ``ChatItem``'s height is less that twice its corner radius
|
||||||
struct ChatItemClipped: ViewModifier {
|
struct ChatItemClipped: ViewModifier {
|
||||||
struct ClipShape: Shape {
|
@AppStorage(DEFAULT_CHAT_ITEM_ROUNDNESS) private var roundness = defaultChatItemRoundness
|
||||||
let maxCornerRadius: Double
|
@AppStorage(DEFAULT_CHAT_ITEM_TAIL) private var tailEnabled = true
|
||||||
|
private let chatItem: (content: CIContent, chatDir: CIDirection)?
|
||||||
func path(in rect: CGRect) -> Path {
|
private let tailVisible: Bool
|
||||||
Path(
|
|
||||||
roundedRect: rect,
|
|
||||||
cornerRadius: min((rect.height / 2), maxCornerRadius),
|
|
||||||
style: .circular
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init() {
|
init() {
|
||||||
clipShape = ClipShape(
|
self.chatItem = nil
|
||||||
maxCornerRadius: 18
|
self.tailVisible = false
|
||||||
)
|
}
|
||||||
|
|
||||||
|
init(_ ci: ChatItem, tailVisible: Bool) {
|
||||||
|
self.chatItem = (ci.content, ci.chatDir)
|
||||||
|
self.tailVisible = tailVisible
|
||||||
}
|
}
|
||||||
|
|
||||||
init(_ chatItem: ChatItem) {
|
private func shapeStyle() -> ChatItemShape.Style {
|
||||||
clipShape = ClipShape(
|
if let ci = chatItem {
|
||||||
maxCornerRadius: {
|
switch ci.content {
|
||||||
switch chatItem.content {
|
case
|
||||||
case
|
.sndMsgContent,
|
||||||
.sndMsgContent,
|
|
||||||
.rcvMsgContent,
|
.rcvMsgContent,
|
||||||
.rcvDecryptionError,
|
.rcvDecryptionError,
|
||||||
.rcvGroupInvitation,
|
.sndDeleted,
|
||||||
.sndGroupInvitation,
|
|
||||||
.sndDeleted,
|
|
||||||
.rcvDeleted,
|
.rcvDeleted,
|
||||||
.rcvIntegrityError,
|
.rcvIntegrityError,
|
||||||
.sndModerated,
|
.sndModerated,
|
||||||
.rcvModerated,
|
.rcvModerated,
|
||||||
.rcvBlocked,
|
.rcvBlocked,
|
||||||
.invalidJSON: 18
|
.invalidJSON:
|
||||||
default: 8
|
let tail = if let mc = ci.content.msgContent, mc.isImageOrVideo && mc.text.isEmpty {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
tailVisible
|
||||||
}
|
}
|
||||||
}()
|
return tailEnabled
|
||||||
)
|
? .bubble(
|
||||||
|
padding: ci.chatDir.sent ? .trailing : .leading,
|
||||||
|
tailVisible: tail
|
||||||
|
)
|
||||||
|
: .roundRect(radius: msgRectMaxRadius)
|
||||||
|
case .rcvGroupInvitation, .sndGroupInvitation:
|
||||||
|
return .roundRect(radius: msgRectMaxRadius)
|
||||||
|
default: return .roundRect(radius: 8)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return .roundRect(radius: msgRectMaxRadius)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private let clipShape: ClipShape
|
|
||||||
|
|
||||||
func body(content: Content) -> some View {
|
func body(content: Content) -> some View {
|
||||||
|
let clipShape = ChatItemShape(
|
||||||
|
roundness: roundness,
|
||||||
|
style: shapeStyle()
|
||||||
|
)
|
||||||
content
|
content
|
||||||
.contentShape(.dragPreview, clipShape)
|
.contentShape(.dragPreview, clipShape)
|
||||||
.contentShape(.contextMenuPreview, clipShape)
|
.contentShape(.contextMenuPreview, clipShape)
|
||||||
@@ -65,4 +75,106 @@ struct ChatItemClipped: ViewModifier {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ChatTailPadding: ViewModifier {
|
||||||
|
func body(content: Content) -> some View {
|
||||||
|
content.padding(.horizontal, -msgTailWidth)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private let msgRectMaxRadius: Double = 18
|
||||||
|
private let msgBubbleMaxRadius: Double = msgRectMaxRadius * 1.2
|
||||||
|
private let msgTailWidth: Double = 9
|
||||||
|
private let msgTailMinHeight: Double = msgTailWidth * 1.254 // ~56deg
|
||||||
|
private let msgTailMaxHeight: Double = msgTailWidth * 1.732 // 60deg
|
||||||
|
|
||||||
|
struct ChatItemShape: Shape {
|
||||||
|
fileprivate enum Style {
|
||||||
|
case bubble(padding: HorizontalEdge, tailVisible: Bool)
|
||||||
|
case roundRect(radius: Double)
|
||||||
|
}
|
||||||
|
|
||||||
|
fileprivate let roundness: Double
|
||||||
|
fileprivate let style: Style
|
||||||
|
|
||||||
|
func path(in rect: CGRect) -> Path {
|
||||||
|
switch style {
|
||||||
|
case let .bubble(padding, tailVisible):
|
||||||
|
let w = rect.width
|
||||||
|
let h = rect.height
|
||||||
|
let rxMax = min(msgBubbleMaxRadius, w / 2)
|
||||||
|
let ryMax = min(msgBubbleMaxRadius, h / 2)
|
||||||
|
let rx = roundness * rxMax
|
||||||
|
let ry = roundness * ryMax
|
||||||
|
let tailHeight = min(msgTailMinHeight + roundness * (msgTailMaxHeight - msgTailMinHeight), h / 2)
|
||||||
|
var path = Path()
|
||||||
|
// top side
|
||||||
|
path.move(to: CGPoint(x: rx, y: 0))
|
||||||
|
path.addLine(to: CGPoint(x: w - rx, y: 0))
|
||||||
|
if roundness > 0 {
|
||||||
|
// top-right corner
|
||||||
|
path.addQuadCurve(to: CGPoint(x: w, y: ry), control: CGPoint(x: w, y: 0))
|
||||||
|
}
|
||||||
|
if rect.height > 2 * ry {
|
||||||
|
// right side
|
||||||
|
path.addLine(to: CGPoint(x: w, y: h - ry))
|
||||||
|
}
|
||||||
|
if roundness > 0 {
|
||||||
|
// bottom-right corner
|
||||||
|
path.addQuadCurve(to: CGPoint(x: w - rx, y: h), control: CGPoint(x: w, y: h))
|
||||||
|
}
|
||||||
|
// bottom side
|
||||||
|
if tailVisible {
|
||||||
|
path.addLine(to: CGPoint(x: -msgTailWidth, y: h))
|
||||||
|
if roundness > 0 {
|
||||||
|
// bottom-left tail
|
||||||
|
// distance of control point from touch point, calculated via ratios
|
||||||
|
let d = tailHeight - msgTailWidth * msgTailWidth / tailHeight
|
||||||
|
// tail control point
|
||||||
|
let tc = CGPoint(x: 0, y: h - tailHeight + d * sqrt(roundness))
|
||||||
|
// bottom-left tail curve
|
||||||
|
path.addQuadCurve(to: CGPoint(x: 0, y: h - tailHeight), control: tc)
|
||||||
|
} else {
|
||||||
|
path.addLine(to: CGPoint(x: 0, y: h - tailHeight))
|
||||||
|
}
|
||||||
|
if rect.height > ry + tailHeight {
|
||||||
|
// left side
|
||||||
|
path.addLine(to: CGPoint(x: 0, y: ry))
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
path.addLine(to: CGPoint(x: rx, y: h))
|
||||||
|
path.addQuadCurve(to: CGPoint(x: 0, y: h - ry), control: CGPoint(x: 0 , y: h))
|
||||||
|
if rect.height > 2 * ry {
|
||||||
|
// left side
|
||||||
|
path.addLine(to: CGPoint(x: 0, y: ry))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if roundness > 0 {
|
||||||
|
// top-left corner
|
||||||
|
path.addQuadCurve(to: CGPoint(x: rx, y: 0), control: CGPoint(x: 0, y: 0))
|
||||||
|
}
|
||||||
|
path.closeSubpath()
|
||||||
|
return switch padding {
|
||||||
|
case .leading: path
|
||||||
|
case .trailing: path
|
||||||
|
.scale(x: -1, y: 1, anchor: .center)
|
||||||
|
.path(in: rect)
|
||||||
|
}
|
||||||
|
case let .roundRect(radius):
|
||||||
|
return Path(roundedRect: rect, cornerRadius: radius * roundness)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var offset: Double? {
|
||||||
|
switch style {
|
||||||
|
case let .bubble(padding, isTailVisible):
|
||||||
|
if isTailVisible {
|
||||||
|
switch padding {
|
||||||
|
case .leading: -msgTailWidth
|
||||||
|
case .trailing: msgTailWidth
|
||||||
|
}
|
||||||
|
} else { 0 }
|
||||||
|
case .roundRect: 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ extension PresetWallpaper {
|
|||||||
scale
|
scale
|
||||||
} else if let type = ChatModel.shared.currentUser?.uiThemes?.preferredMode(base.mode == DefaultThemeMode.dark)?.wallpaper?.toAppWallpaper().type, type.sameType(WallpaperType.preset(filename, nil)) {
|
} else if let type = ChatModel.shared.currentUser?.uiThemes?.preferredMode(base.mode == DefaultThemeMode.dark)?.wallpaper?.toAppWallpaper().type, type.sameType(WallpaperType.preset(filename, nil)) {
|
||||||
type.scale
|
type.scale
|
||||||
} else if let scale = themeOverridesDefault.get().first(where: { $0.wallpaper != nil && $0.wallpaper!.preset == filename })?.wallpaper?.scale {
|
} else if let scale = themeOverridesDefault.get().first(where: { $0.wallpaper != nil && $0.wallpaper!.preset == filename && $0.base == base })?.wallpaper?.scale {
|
||||||
scale
|
scale
|
||||||
} else {
|
} else {
|
||||||
Float(1.0)
|
Float(1.0)
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// Test.swift
|
||||||
|
// SimpleX (iOS)
|
||||||
|
//
|
||||||
|
// Created by Levitating Pineapple on 31/08/2024.
|
||||||
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
extension View {
|
||||||
|
@ViewBuilder
|
||||||
|
func invertedForegroundStyle(enabled: Bool = true) -> some View {
|
||||||
|
if enabled {
|
||||||
|
foregroundStyle(Material.ultraThin)
|
||||||
|
.environment(\.colorScheme, .dark)
|
||||||
|
.grayscale(1)
|
||||||
|
.contrast(-20)
|
||||||
|
} else { self }
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -20,7 +20,7 @@ struct ProfileImage: View {
|
|||||||
@AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var radius = defaultProfileImageCorner
|
@AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var radius = defaultProfileImageCorner
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
if let uiImage = UIImage(base64Encoded: imageStr) {
|
if let uiImage = imageFromBase64(imageStr) {
|
||||||
clipProfileImage(Image(uiImage: uiImage), size: size, radius: radius, blurred: blurred)
|
clipProfileImage(Image(uiImage: uiImage), size: size, radius: radius, blurred: blurred)
|
||||||
} else {
|
} else {
|
||||||
let c = color.asAnotherColorFromSecondaryVariant(theme)
|
let c = color.asAnotherColorFromSecondaryVariant(theme)
|
||||||
|
|||||||
@@ -8,15 +8,63 @@
|
|||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
func showShareSheet(items: [Any], completed: (() -> Void)? = nil) {
|
func getTopViewController() -> UIViewController? {
|
||||||
let keyWindowScene = UIApplication.shared.connectedScenes.first { $0.activationState == .foregroundActive } as? UIWindowScene
|
let keyWindowScene = UIApplication.shared.connectedScenes.first { $0.activationState == .foregroundActive } as? UIWindowScene
|
||||||
if let keyWindow = keyWindowScene?.windows.filter(\.isKeyWindow).first,
|
if let keyWindow = keyWindowScene?.windows.filter(\.isKeyWindow).first,
|
||||||
let presentedViewController = keyWindow.rootViewController?.presentedViewController ?? keyWindow.rootViewController {
|
let rootViewController = keyWindow.rootViewController {
|
||||||
|
// Find the top-most presented view controller
|
||||||
|
var topController = rootViewController
|
||||||
|
while let presentedViewController = topController.presentedViewController {
|
||||||
|
topController = presentedViewController
|
||||||
|
}
|
||||||
|
return topController
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func showShareSheet(items: [Any], completed: (() -> Void)? = nil) {
|
||||||
|
if let topController = getTopViewController() {
|
||||||
let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
|
let activityViewController = UIActivityViewController(activityItems: items, applicationActivities: nil)
|
||||||
if let completed = completed {
|
if let completed = completed {
|
||||||
let handler: UIActivityViewController.CompletionWithItemsHandler = { _,_,_,_ in completed() }
|
activityViewController.completionWithItemsHandler = { _, _, _, _ in
|
||||||
activityViewController.completionWithItemsHandler = handler
|
completed()
|
||||||
}
|
}
|
||||||
presentedViewController.present(activityViewController, animated: true)
|
}
|
||||||
|
topController.present(activityViewController, animated: true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func showAlert(
|
||||||
|
title: String,
|
||||||
|
message: String? = nil,
|
||||||
|
buttonTitle: String,
|
||||||
|
buttonAction: @escaping () -> Void,
|
||||||
|
cancelButton: Bool
|
||||||
|
) -> Void {
|
||||||
|
if let topController = getTopViewController() {
|
||||||
|
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||||
|
alert.addAction(UIAlertAction(title: buttonTitle, style: .default) { _ in
|
||||||
|
buttonAction()
|
||||||
|
})
|
||||||
|
if cancelButton {
|
||||||
|
alert.addAction(cancelAlertAction)
|
||||||
|
}
|
||||||
|
topController.present(alert, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func showAlert(
|
||||||
|
_ title: String,
|
||||||
|
message: String? = nil,
|
||||||
|
actions: () -> [UIAlertAction] = { [okAlertAction] }
|
||||||
|
) {
|
||||||
|
if let topController = getTopViewController() {
|
||||||
|
let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
|
||||||
|
for action in actions() { alert.addAction(action) }
|
||||||
|
topController.present(alert, animated: true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let okAlertAction = UIAlertAction(title: NSLocalizedString("Ok", comment: "alert button"), style: .default)
|
||||||
|
|
||||||
|
let cancelAlertAction = UIAlertAction(title: NSLocalizedString("Cancel", comment: "alert button"), style: .cancel)
|
||||||
|
|||||||
@@ -0,0 +1,188 @@
|
|||||||
|
//
|
||||||
|
// SwiftUISheet.swift
|
||||||
|
// SimpleX (iOS)
|
||||||
|
//
|
||||||
|
// Created by user on 23/09/2024.
|
||||||
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
private let sheetAnimationDuration: Double = 0.35
|
||||||
|
|
||||||
|
// Refrence: https://easings.net/
|
||||||
|
private let easeOutCubic = UICubicTimingParameters(
|
||||||
|
controlPoint1: CGPoint(x: 0.215, y: 0.61),
|
||||||
|
controlPoint2: CGPoint(x: 0.355, y: 1)
|
||||||
|
)
|
||||||
|
|
||||||
|
struct Sheet<SheetContent: View>: ViewModifier {
|
||||||
|
@Binding var isPresented: Bool
|
||||||
|
@ViewBuilder let sheetContent: () -> SheetContent
|
||||||
|
|
||||||
|
func body(content: Content) -> some View {
|
||||||
|
ZStack {
|
||||||
|
content
|
||||||
|
SheetRepresentable(isPresented: $isPresented, content: sheetContent())
|
||||||
|
.allowsHitTesting(isPresented)
|
||||||
|
.ignoresSafeArea()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct SheetRepresentable<Content: View>: UIViewControllerRepresentable {
|
||||||
|
@Binding var isPresented: Bool
|
||||||
|
let content: Content
|
||||||
|
|
||||||
|
func makeUIViewController(context: Context) -> Controller<Content> {
|
||||||
|
Controller(content: content, representer: self)
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateUIViewController(_ sheetController: Controller<Content>, context: Context) {
|
||||||
|
sheetController.animate(isPresented: isPresented)
|
||||||
|
}
|
||||||
|
|
||||||
|
class Controller<C: View>: UIViewController {
|
||||||
|
let hostingController: UIHostingController<C>
|
||||||
|
private let animator = UIViewPropertyAnimator(
|
||||||
|
duration: sheetAnimationDuration,
|
||||||
|
timingParameters: easeOutCubic
|
||||||
|
)
|
||||||
|
private let representer: SheetRepresentable<C>
|
||||||
|
private var retainedFraction: CGFloat = 0
|
||||||
|
private var sheetHeight: Double { hostingController.view.frame.height }
|
||||||
|
private var task: Task<Void, Never>?
|
||||||
|
|
||||||
|
init(content: C, representer: SheetRepresentable<C>) {
|
||||||
|
self.representer = representer
|
||||||
|
self.hostingController = UIHostingController(rootView: content)
|
||||||
|
super.init(nibName: nil, bundle: nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
@available(*, unavailable)
|
||||||
|
required init?(coder: NSCoder) { fatalError("init(coder:) missing") }
|
||||||
|
|
||||||
|
deinit {
|
||||||
|
animator.stopAnimation(true)
|
||||||
|
animator.finishAnimation(at: .current)
|
||||||
|
}
|
||||||
|
|
||||||
|
func animate(isPresented: Bool) {
|
||||||
|
let alreadyAnimating = animator.isRunning && isPresented != animator.isReversed
|
||||||
|
let sheetFullyDismissed = animator.fractionComplete == (animator.isReversed ? 1 : 0)
|
||||||
|
let sheetFullyPresented = animator.fractionComplete == (animator.isReversed ? 0 : 1)
|
||||||
|
|
||||||
|
if !isPresented && sheetFullyDismissed ||
|
||||||
|
isPresented && sheetFullyPresented ||
|
||||||
|
alreadyAnimating {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
animator.pauseAnimation()
|
||||||
|
animator.isReversed = !isPresented
|
||||||
|
animator.continueAnimation(
|
||||||
|
withTimingParameters: isPresented
|
||||||
|
? easeOutCubic
|
||||||
|
: UICubicTimingParameters(animationCurve: .easeIn),
|
||||||
|
durationFactor: 1 - animator.fractionComplete
|
||||||
|
)
|
||||||
|
handleVisibility()
|
||||||
|
}
|
||||||
|
|
||||||
|
func handleVisibility() {
|
||||||
|
if animator.isReversed {
|
||||||
|
task = Task {
|
||||||
|
do {
|
||||||
|
let sleepDuration = UInt64(sheetAnimationDuration * Double(NSEC_PER_SEC))
|
||||||
|
try await Task.sleep(nanoseconds: sleepDuration)
|
||||||
|
view.isHidden = true
|
||||||
|
} catch { }
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
task?.cancel()
|
||||||
|
task = nil
|
||||||
|
view.isHidden = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidLoad() {
|
||||||
|
view.isHidden = true
|
||||||
|
view.backgroundColor = .clear
|
||||||
|
view.addGestureRecognizer(
|
||||||
|
UITapGestureRecognizer(target: self, action: #selector(tap(gesture:)))
|
||||||
|
)
|
||||||
|
addChild(hostingController)
|
||||||
|
hostingController.didMove(toParent: self)
|
||||||
|
if let sheet = hostingController.view {
|
||||||
|
sheet.isHidden = true
|
||||||
|
sheet.clipsToBounds = true
|
||||||
|
sheet.layer.cornerRadius = 10
|
||||||
|
sheet.layer.maskedCorners = [.layerMaxXMinYCorner, .layerMinXMinYCorner]
|
||||||
|
sheet.addGestureRecognizer(UIPanGestureRecognizer(target: self, action: #selector(pan(gesture:))))
|
||||||
|
sheet.translatesAutoresizingMaskIntoConstraints = false
|
||||||
|
view.addSubview(sheet)
|
||||||
|
NSLayoutConstraint.activate([
|
||||||
|
hostingController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor),
|
||||||
|
hostingController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor),
|
||||||
|
hostingController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor),
|
||||||
|
])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override func viewDidAppear(_ animated: Bool) {
|
||||||
|
// Ensures animations are only setup once
|
||||||
|
// on some iOS version `viewDidAppear` can get called on each state change.
|
||||||
|
if hostingController.view.isHidden {
|
||||||
|
hostingController.view.transform = CGAffineTransform(translationX: 0, y: self.sheetHeight)
|
||||||
|
hostingController.view.isHidden = false
|
||||||
|
animator.pausesOnCompletion = true
|
||||||
|
animator.addAnimations {
|
||||||
|
self.hostingController.view.transform = .identity
|
||||||
|
self.view.backgroundColor = UIColor {
|
||||||
|
switch $0.userInterfaceStyle {
|
||||||
|
case .dark: .black.withAlphaComponent(0.290)
|
||||||
|
default: .black.withAlphaComponent(0.121)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
animator.startAnimation()
|
||||||
|
animator.pauseAnimation()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
func pan(gesture: UIPanGestureRecognizer) {
|
||||||
|
switch gesture.state {
|
||||||
|
case .began:
|
||||||
|
animator.isReversed = false
|
||||||
|
animator.pauseAnimation()
|
||||||
|
retainedFraction = animator.fractionComplete
|
||||||
|
case .changed:
|
||||||
|
animator.fractionComplete = retainedFraction - gesture.translation(in: view).y / sheetHeight
|
||||||
|
case .ended, .cancelled:
|
||||||
|
let velocity = gesture.velocity(in: view).y
|
||||||
|
animator.isReversed = (velocity - (animator.fractionComplete - 0.5) * 100).sign == .plus
|
||||||
|
let defaultVelocity = sheetHeight / sheetAnimationDuration
|
||||||
|
let fractionRemaining = 1 - animator.fractionComplete
|
||||||
|
let durationFactor = min(max(fractionRemaining / (abs(velocity) / defaultVelocity), 0.5), 1)
|
||||||
|
animator.continueAnimation(withTimingParameters: nil, durationFactor: durationFactor * fractionRemaining)
|
||||||
|
handleVisibility()
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + sheetAnimationDuration) {
|
||||||
|
self.representer.isPresented = !self.animator.isReversed
|
||||||
|
}
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc
|
||||||
|
func tap(gesture: UITapGestureRecognizer) {
|
||||||
|
switch gesture.state {
|
||||||
|
case .ended:
|
||||||
|
if gesture.location(in: view).y < view.frame.height - sheetHeight {
|
||||||
|
representer.isPresented = false
|
||||||
|
}
|
||||||
|
default: break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
//
|
||||||
|
// StickyScrollView.swift
|
||||||
|
// SimpleX (iOS)
|
||||||
|
//
|
||||||
|
// Created by user on 20/09/2024.
|
||||||
|
// Copyright © 2024 SimpleX Chat. All rights reserved.
|
||||||
|
//
|
||||||
|
|
||||||
|
import SwiftUI
|
||||||
|
|
||||||
|
struct StickyScrollView<Content: View>: UIViewRepresentable {
|
||||||
|
@Binding var resetScroll: ResetScrollAction
|
||||||
|
@ViewBuilder let content: () -> Content
|
||||||
|
|
||||||
|
func makeUIView(context: Context) -> UIScrollView {
|
||||||
|
let hc = context.coordinator.hostingController
|
||||||
|
hc.view.backgroundColor = .clear
|
||||||
|
let sv = UIScrollView()
|
||||||
|
sv.showsHorizontalScrollIndicator = false
|
||||||
|
sv.addSubview(hc.view)
|
||||||
|
sv.delegate = context.coordinator
|
||||||
|
DispatchQueue.main.async {
|
||||||
|
resetScroll = ResetScrollAction { sv.setContentOffset(.zero, animated: false) }
|
||||||
|
}
|
||||||
|
return sv
|
||||||
|
}
|
||||||
|
|
||||||
|
func updateUIView(_ scrollView: UIScrollView, context: Context) {
|
||||||
|
let hc = context.coordinator.hostingController
|
||||||
|
hc.rootView = content()
|
||||||
|
hc.view.frame.size = hc.view.intrinsicContentSize
|
||||||
|
scrollView.contentSize = hc.view.intrinsicContentSize
|
||||||
|
}
|
||||||
|
|
||||||
|
func makeCoordinator() -> Coordinator {
|
||||||
|
Coordinator(content: content())
|
||||||
|
}
|
||||||
|
|
||||||
|
class Coordinator: NSObject, UIScrollViewDelegate {
|
||||||
|
let hostingController: UIHostingController<Content>
|
||||||
|
|
||||||
|
init(content: Content) {
|
||||||
|
self.hostingController = UIHostingController(rootView: content)
|
||||||
|
}
|
||||||
|
|
||||||
|
func scrollViewWillEndDragging(
|
||||||
|
_ scrollView: UIScrollView,
|
||||||
|
withVelocity velocity: CGPoint,
|
||||||
|
targetContentOffset: UnsafeMutablePointer<CGPoint>
|
||||||
|
) {
|
||||||
|
if targetContentOffset.pointee.x < 32 {
|
||||||
|
targetContentOffset.pointee.x = 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ResetScrollAction {
|
||||||
|
var action = { }
|
||||||
|
func callAsFunction() { action() }
|
||||||
|
}
|
||||||
@@ -65,8 +65,7 @@ struct LocalAuthView: View {
|
|||||||
// Clear sensitive data on screen just in case app fails to hide its views while new database is created
|
// Clear sensitive data on screen just in case app fails to hide its views while new database is created
|
||||||
m.chatId = nil
|
m.chatId = nil
|
||||||
ItemsModel.shared.reversedChatItems = []
|
ItemsModel.shared.reversedChatItems = []
|
||||||
m.chats = []
|
m.updateChats([])
|
||||||
m.popChatCollector.clear()
|
|
||||||
m.users = []
|
m.users = []
|
||||||
_ = kcAppPassword.set(password)
|
_ = kcAppPassword.set(password)
|
||||||
_ = kcSelfDestructPassword.remove()
|
_ = kcSelfDestructPassword.remove()
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ private enum MigrationFromState: Equatable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private enum MigrateFromDeviceViewAlert: Identifiable {
|
private enum MigrateFromDeviceViewAlert: Identifiable {
|
||||||
|
case finishMigration(_ fileId: Int64, _ ctrl: chat_ctrl)
|
||||||
case deleteChat(_ title: LocalizedStringKey = "Delete chat profile?", _ text: LocalizedStringKey = "This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost.")
|
case deleteChat(_ title: LocalizedStringKey = "Delete chat profile?", _ text: LocalizedStringKey = "This action cannot be undone - your profile, contacts, messages and files will be irreversibly lost.")
|
||||||
case startChat(_ title: LocalizedStringKey = "Start chat?", _ text: LocalizedStringKey = "Warning: starting chat on multiple devices is not supported and will cause message delivery failures")
|
case startChat(_ title: LocalizedStringKey = "Start chat?", _ text: LocalizedStringKey = "Warning: starting chat on multiple devices is not supported and will cause message delivery failures")
|
||||||
|
|
||||||
@@ -38,6 +39,7 @@ private enum MigrateFromDeviceViewAlert: Identifiable {
|
|||||||
|
|
||||||
var id: String {
|
var id: String {
|
||||||
switch self {
|
switch self {
|
||||||
|
case .finishMigration: return "finishMigration"
|
||||||
case let .deleteChat(title, text): return "\(title) \(text)"
|
case let .deleteChat(title, text): return "\(title) \(text)"
|
||||||
case let .startChat(title, text): return "\(title) \(text)"
|
case let .startChat(title, text): return "\(title) \(text)"
|
||||||
|
|
||||||
@@ -56,8 +58,6 @@ private enum MigrateFromDeviceViewAlert: Identifiable {
|
|||||||
struct MigrateFromDevice: View {
|
struct MigrateFromDevice: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
|
||||||
@Binding var showSettings: Bool
|
|
||||||
@Binding var showProgressOnSettings: Bool
|
@Binding var showProgressOnSettings: Bool
|
||||||
@State private var migrationState: MigrationFromState = .chatStopInProgress
|
@State private var migrationState: MigrationFromState = .chatStopInProgress
|
||||||
@State private var useKeychain = storeDBPassphraseGroupDefault.get()
|
@State private var useKeychain = storeDBPassphraseGroupDefault.get()
|
||||||
@@ -106,9 +106,6 @@ struct MigrateFromDevice: View {
|
|||||||
finishedView(chatDeletion)
|
finishedView(chatDeletion)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.modifier(BackButton(label: "Back", disabled: $backDisabled) {
|
|
||||||
dismiss()
|
|
||||||
})
|
|
||||||
.onChange(of: migrationState) { state in
|
.onChange(of: migrationState) { state in
|
||||||
backDisabled = switch migrationState {
|
backDisabled = switch migrationState {
|
||||||
case .chatStopInProgress, .archiving, .linkShown, .finished: true
|
case .chatStopInProgress, .archiving, .linkShown, .finished: true
|
||||||
@@ -138,6 +135,15 @@ struct MigrateFromDevice: View {
|
|||||||
}
|
}
|
||||||
.alert(item: $alert) { alert in
|
.alert(item: $alert) { alert in
|
||||||
switch alert {
|
switch alert {
|
||||||
|
case let .finishMigration(fileId, ctrl):
|
||||||
|
return Alert(
|
||||||
|
title: Text("Remove archive?"),
|
||||||
|
message: Text("The uploaded database archive will be permanently removed from the servers."),
|
||||||
|
primaryButton: .destructive(Text("Continue")) {
|
||||||
|
finishMigration(fileId, ctrl)
|
||||||
|
},
|
||||||
|
secondaryButton: .cancel()
|
||||||
|
)
|
||||||
case let .startChat(title, text):
|
case let .startChat(title, text):
|
||||||
return Alert(
|
return Alert(
|
||||||
title: Text(title),
|
title: Text(title),
|
||||||
@@ -171,7 +177,7 @@ struct MigrateFromDevice: View {
|
|||||||
case let .archiveExportedWithErrors(archivePath, errs):
|
case let .archiveExportedWithErrors(archivePath, errs):
|
||||||
return Alert(
|
return Alert(
|
||||||
title: Text("Chat database exported"),
|
title: Text("Chat database exported"),
|
||||||
message: Text("You may migrate the exported database.") + Text(verbatim: "\n\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
|
message: Text("You may migrate the exported database.") + Text(verbatim: "\n") + Text("Some file(s) were not exported:") + archiveErrorsText(errs),
|
||||||
dismissButton: .default(Text("Continue")) {
|
dismissButton: .default(Text("Continue")) {
|
||||||
Task { await uploadArchive(path: archivePath) }
|
Task { await uploadArchive(path: archivePath) }
|
||||||
}
|
}
|
||||||
@@ -318,7 +324,7 @@ struct MigrateFromDevice: View {
|
|||||||
Text("Cancel migration").foregroundColor(.red)
|
Text("Cancel migration").foregroundColor(.red)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Button(action: { finishMigration(fileId, ctrl) }) {
|
Button(action: { alert = .finishMigration(fileId, ctrl) }) {
|
||||||
settingsRow("checkmark", color: theme.colors.secondary) {
|
settingsRow("checkmark", color: theme.colors.secondary) {
|
||||||
Text("Finalize migration").foregroundColor(theme.colors.primary)
|
Text("Finalize migration").foregroundColor(theme.colors.primary)
|
||||||
}
|
}
|
||||||
@@ -523,9 +529,15 @@ struct MigrateFromDevice: View {
|
|||||||
}
|
}
|
||||||
case let .sndStandaloneFileComplete(_, fileTransferMeta, rcvURIs):
|
case let .sndStandaloneFileComplete(_, fileTransferMeta, rcvURIs):
|
||||||
let cfg = getNetCfg()
|
let cfg = getNetCfg()
|
||||||
|
let proxy: NetworkProxy? = if cfg.socksProxy == nil {
|
||||||
|
nil
|
||||||
|
} else {
|
||||||
|
networkProxyDefault.get()
|
||||||
|
}
|
||||||
let data = MigrationFileLinkData.init(
|
let data = MigrationFileLinkData.init(
|
||||||
networkConfig: MigrationFileLinkData.NetworkConfig(
|
networkConfig: MigrationFileLinkData.NetworkConfig(
|
||||||
socksProxy: cfg.socksProxy,
|
socksProxy: cfg.socksProxy,
|
||||||
|
networkProxy: proxy,
|
||||||
hostMode: cfg.hostMode,
|
hostMode: cfg.hostMode,
|
||||||
requiredHostMode: cfg.requiredHostMode
|
requiredHostMode: cfg.requiredHostMode
|
||||||
)
|
)
|
||||||
@@ -590,7 +602,7 @@ struct MigrateFromDevice: View {
|
|||||||
} catch let error {
|
} catch let error {
|
||||||
fatalError("Error starting chat \(responseError(error))")
|
fatalError("Error starting chat \(responseError(error))")
|
||||||
}
|
}
|
||||||
showSettings = false
|
dismissAllSheets(animated: true)
|
||||||
}
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
alert = .error(title: "Error deleting database", error: responseError(error))
|
alert = .error(title: "Error deleting database", error: responseError(error))
|
||||||
@@ -613,9 +625,7 @@ struct MigrateFromDevice: View {
|
|||||||
}
|
}
|
||||||
// Hide settings anyway if chatDbStatus is not ok, probably passphrase needs to be entered
|
// Hide settings anyway if chatDbStatus is not ok, probably passphrase needs to be entered
|
||||||
if dismiss || m.chatDbStatus != .ok {
|
if dismiss || m.chatDbStatus != .ok {
|
||||||
await MainActor.run {
|
dismissAllSheets(animated: true)
|
||||||
showSettings = false
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -767,6 +777,6 @@ private class MigrationChatReceiver {
|
|||||||
|
|
||||||
struct MigrateFromDevice_Previews: PreviewProvider {
|
struct MigrateFromDevice_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
MigrateFromDevice(showSettings: Binding.constant(true), showProgressOnSettings: Binding.constant(false))
|
MigrateFromDevice(showProgressOnSettings: Binding.constant(false))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,7 +93,6 @@ struct MigrateToDevice: View {
|
|||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
@AppStorage(DEFAULT_DEVELOPER_TOOLS) private var developerTools = false
|
|
||||||
@Binding var migrationState: MigrationToState?
|
@Binding var migrationState: MigrationToState?
|
||||||
@State private var useKeychain = storeDBPassphraseGroupDefault.get()
|
@State private var useKeychain = storeDBPassphraseGroupDefault.get()
|
||||||
@State private var alert: MigrateToDeviceViewAlert?
|
@State private var alert: MigrateToDeviceViewAlert?
|
||||||
@@ -102,6 +101,7 @@ struct MigrateToDevice: View {
|
|||||||
// Prevent from hiding the view until migration is finished or app deleted
|
// Prevent from hiding the view until migration is finished or app deleted
|
||||||
@State private var backDisabled: Bool = false
|
@State private var backDisabled: Bool = false
|
||||||
@State private var showQRCodeScanner: Bool = true
|
@State private var showQRCodeScanner: Bool = true
|
||||||
|
@State private var pasteboardHasStrings = UIPasteboard.general.hasStrings
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
@@ -197,10 +197,8 @@ struct MigrateToDevice: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if developerTools {
|
Section(header: Text("Or paste archive link").foregroundColor(theme.colors.secondary)) {
|
||||||
Section(header: Text("Or paste archive link").foregroundColor(theme.colors.secondary)) {
|
pasteLinkView()
|
||||||
pasteLinkView()
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -218,7 +216,7 @@ struct MigrateToDevice: View {
|
|||||||
} label: {
|
} label: {
|
||||||
Text("Tap to paste link")
|
Text("Tap to paste link")
|
||||||
}
|
}
|
||||||
.disabled(!ChatModel.shared.pasteboardHasStrings)
|
.disabled(!pasteboardHasStrings)
|
||||||
.frame(maxWidth: .infinity, alignment: .center)
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -487,6 +485,9 @@ struct MigrateToDevice: View {
|
|||||||
do {
|
do {
|
||||||
if !hasChatCtrl() {
|
if !hasChatCtrl() {
|
||||||
chatInitControllerRemovingDatabases()
|
chatInitControllerRemovingDatabases()
|
||||||
|
} else if ChatModel.shared.chatRunning == true {
|
||||||
|
// cannot delete storage if chat is running
|
||||||
|
try await apiStopChat()
|
||||||
}
|
}
|
||||||
try await apiDeleteStorage()
|
try await apiDeleteStorage()
|
||||||
try? FileManager.default.createDirectory(at: getWallpaperDirectory(), withIntermediateDirectories: true)
|
try? FileManager.default.createDirectory(at: getWallpaperDirectory(), withIntermediateDirectories: true)
|
||||||
@@ -556,11 +557,22 @@ struct MigrateToDevice: View {
|
|||||||
do {
|
do {
|
||||||
try? FileManager.default.removeItem(at: getMigrationTempFilesDirectory())
|
try? FileManager.default.removeItem(at: getMigrationTempFilesDirectory())
|
||||||
MigrationToDeviceState.save(nil)
|
MigrationToDeviceState.save(nil)
|
||||||
appSettings.importIntoApp()
|
try ObjC.catchException {
|
||||||
try SimpleX.startChat(refreshInvitations: true)
|
appSettings.importIntoApp()
|
||||||
AlertManager.shared.showAlertMsg(title: "Chat migrated!", message: "Finalize migration on another device.")
|
}
|
||||||
|
do {
|
||||||
|
try SimpleX.startChat(refreshInvitations: true)
|
||||||
|
AlertManager.shared.showAlertMsg(title: "Chat migrated!", message: "Finalize migration on another device.")
|
||||||
|
} catch let error {
|
||||||
|
AlertManager.shared.showAlert(Alert(title: Text("Error starting chat"), message: Text(responseError(error))))
|
||||||
|
}
|
||||||
} catch let error {
|
} catch let error {
|
||||||
AlertManager.shared.showAlert(Alert(title: Text("Error starting chat"), message: Text(responseError(error))))
|
logger.error("Error importing settings: \(error.localizedDescription)")
|
||||||
|
AlertManager.shared.showAlert(
|
||||||
|
Alert(
|
||||||
|
title: Text("Error migrating settings"),
|
||||||
|
message: Text ("Some app settings were not migrated.") + Text("\n") + Text(responseError(error)))
|
||||||
|
)
|
||||||
}
|
}
|
||||||
hideView()
|
hideView()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ struct AddContactLearnMore: View {
|
|||||||
Text("If you can't meet in person, show QR code in a video call, or share the link.")
|
Text("If you can't meet in person, show QR code in a video call, or share the link.")
|
||||||
Text("Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends).")
|
Text("Read more in [User Guide](https://simplex.chat/docs/guide/readme.html#connect-to-friends).")
|
||||||
}
|
}
|
||||||
|
.frame(maxWidth: .infinity, alignment: .leading)
|
||||||
.listRowBackground(Color.clear)
|
.listRowBackground(Color.clear)
|
||||||
|
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
|
||||||
}
|
}
|
||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,9 +14,10 @@ enum ContactType: Int {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct NewChatMenuButton: View {
|
struct NewChatMenuButton: View {
|
||||||
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@State private var showNewChatSheet = false
|
@State private var showNewChatSheet = false
|
||||||
@State private var alert: SomeAlert? = nil
|
@State private var alert: SomeAlert? = nil
|
||||||
@State private var globalAlert: SomeAlert? = nil
|
@State private var pendingConnection: PendingContactConnection? = nil
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
Button {
|
Button {
|
||||||
@@ -28,22 +29,14 @@ struct NewChatMenuButton: View {
|
|||||||
.frame(width: 24, height: 24)
|
.frame(width: 24, height: 24)
|
||||||
}
|
}
|
||||||
.appSheet(isPresented: $showNewChatSheet) {
|
.appSheet(isPresented: $showNewChatSheet) {
|
||||||
NewChatSheet(alert: $alert)
|
NewChatSheet(pendingConnection: $pendingConnection)
|
||||||
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
|
.environment(\EnvironmentValues.refresh as! WritableKeyPath<EnvironmentValues, RefreshAction?>, nil)
|
||||||
.alert(item: $alert) { a in
|
.onDisappear {
|
||||||
return a.alert
|
alert = cleanupPendingConnection(chatModel: chatModel, contactConnection: pendingConnection)
|
||||||
|
pendingConnection = nil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// This is a workaround to show "Keep unused invitation" alert in both following cases:
|
.alert(item: $alert) { a in
|
||||||
// - on going back from NewChatView to NewChatSheet,
|
|
||||||
// - on dismissing NewChatMenuButton sheet while on NewChatView (skipping NewChatSheet)
|
|
||||||
.onChange(of: alert?.id) { a in
|
|
||||||
if !showNewChatSheet && alert != nil {
|
|
||||||
globalAlert = alert
|
|
||||||
alert = nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.alert(item: $globalAlert) { a in
|
|
||||||
return a.alert
|
return a.alert
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -60,7 +53,8 @@ struct NewChatSheet: View {
|
|||||||
@State private var searchText = ""
|
@State private var searchText = ""
|
||||||
@State private var searchShowingSimplexLink = false
|
@State private var searchShowingSimplexLink = false
|
||||||
@State private var searchChatFilteredBySimplexLink: String? = nil
|
@State private var searchChatFilteredBySimplexLink: String? = nil
|
||||||
@Binding var alert: SomeAlert?
|
@State private var alert: SomeAlert?
|
||||||
|
@Binding var pendingConnection: PendingContactConnection?
|
||||||
|
|
||||||
// Sheet height management
|
// Sheet height management
|
||||||
@State private var isAddContactActive = false
|
@State private var isAddContactActive = false
|
||||||
@@ -78,6 +72,9 @@ struct NewChatSheet: View {
|
|||||||
.navigationBarTitleDisplayMode(.large)
|
.navigationBarTitleDisplayMode(.large)
|
||||||
.navigationBarHidden(searchMode)
|
.navigationBarHidden(searchMode)
|
||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
|
.alert(item: $alert) { a in
|
||||||
|
return a.alert
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if #available(iOS 16.0, *), oneHandUI {
|
if #available(iOS 16.0, *), oneHandUI {
|
||||||
let sheetHeight: CGFloat = showArchive ? 575 : 500
|
let sheetHeight: CGFloat = showArchive ? 575 : 500
|
||||||
@@ -112,7 +109,7 @@ struct NewChatSheet: View {
|
|||||||
if (searchText.isEmpty) {
|
if (searchText.isEmpty) {
|
||||||
Section {
|
Section {
|
||||||
NavigationLink(isActive: $isAddContactActive) {
|
NavigationLink(isActive: $isAddContactActive) {
|
||||||
NewChatView(selection: .invite, parentAlert: $alert)
|
NewChatView(selection: .invite, parentAlert: $alert, contactConnection: $pendingConnection)
|
||||||
.navigationTitle("New chat")
|
.navigationTitle("New chat")
|
||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
.navigationBarTitleDisplayMode(.large)
|
.navigationBarTitleDisplayMode(.large)
|
||||||
@@ -122,7 +119,7 @@ struct NewChatSheet: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
NavigationLink(isActive: $isScanPasteLinkActive) {
|
NavigationLink(isActive: $isScanPasteLinkActive) {
|
||||||
NewChatView(selection: .connect, showQRCodeScanner: true, parentAlert: $alert)
|
NewChatView(selection: .connect, showQRCodeScanner: true, parentAlert: $alert, contactConnection: $pendingConnection)
|
||||||
.navigationTitle("New chat")
|
.navigationTitle("New chat")
|
||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
.navigationBarTitleDisplayMode(.large)
|
.navigationBarTitleDisplayMode(.large)
|
||||||
@@ -199,7 +196,7 @@ func chatContactType(chat: Chat) -> ContactType {
|
|||||||
case .contactRequest:
|
case .contactRequest:
|
||||||
return .request
|
return .request
|
||||||
case let .direct(contact):
|
case let .direct(contact):
|
||||||
if contact.activeConn == nil && contact.profile.contactLink != nil {
|
if contact.activeConn == nil && contact.profile.contactLink != nil && contact.active {
|
||||||
return .card
|
return .card
|
||||||
} else if contact.chatDeleted {
|
} else if contact.chatDeleted {
|
||||||
return .chatDeleted
|
return .chatDeleted
|
||||||
|
|||||||
@@ -45,18 +45,47 @@ enum NewChatOption: Identifiable {
|
|||||||
var id: Self { self }
|
var id: Self { self }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func cleanupPendingConnection(chatModel: ChatModel, contactConnection: PendingContactConnection?) -> SomeAlert? {
|
||||||
|
var alert: SomeAlert? = nil
|
||||||
|
|
||||||
|
if !(chatModel.showingInvitation?.connChatUsed ?? true),
|
||||||
|
let conn = contactConnection {
|
||||||
|
alert = SomeAlert(
|
||||||
|
alert: Alert(
|
||||||
|
title: Text("Keep unused invitation?"),
|
||||||
|
message: Text("You can view invitation link again in connection details."),
|
||||||
|
primaryButton: .default(Text("Keep")) {},
|
||||||
|
secondaryButton: .destructive(Text("Delete")) {
|
||||||
|
Task {
|
||||||
|
await deleteChat(Chat(
|
||||||
|
chatInfo: .contactConnection(contactConnection: conn),
|
||||||
|
chatItems: []
|
||||||
|
))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
id: "keepUnusedInvitation"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
chatModel.showingInvitation = nil
|
||||||
|
|
||||||
|
return alert
|
||||||
|
}
|
||||||
|
|
||||||
struct NewChatView: View {
|
struct NewChatView: View {
|
||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@State var selection: NewChatOption
|
@State var selection: NewChatOption
|
||||||
@State var showQRCodeScanner = false
|
@State var showQRCodeScanner = false
|
||||||
@State private var invitationUsed: Bool = false
|
@State private var invitationUsed: Bool = false
|
||||||
@State private var contactConnection: PendingContactConnection? = nil
|
|
||||||
@State private var connReqInvitation: String = ""
|
@State private var connReqInvitation: String = ""
|
||||||
@State private var creatingConnReq = false
|
@State private var creatingConnReq = false
|
||||||
|
@State var choosingProfile = false
|
||||||
@State private var pastedLink: String = ""
|
@State private var pastedLink: String = ""
|
||||||
@State private var alert: NewChatViewAlert?
|
@State private var alert: NewChatViewAlert?
|
||||||
@Binding var parentAlert: SomeAlert?
|
@Binding var parentAlert: SomeAlert?
|
||||||
|
@Binding var contactConnection: PendingContactConnection?
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack(alignment: .leading) {
|
VStack(alignment: .leading) {
|
||||||
@@ -122,26 +151,10 @@ struct NewChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onDisappear {
|
.onDisappear {
|
||||||
if !(m.showingInvitation?.connChatUsed ?? true),
|
if !choosingProfile {
|
||||||
let conn = contactConnection {
|
parentAlert = cleanupPendingConnection(chatModel: m, contactConnection: contactConnection)
|
||||||
parentAlert = SomeAlert(
|
contactConnection = nil
|
||||||
alert: Alert(
|
|
||||||
title: Text("Keep unused invitation?"),
|
|
||||||
message: Text("You can view invitation link again in connection details."),
|
|
||||||
primaryButton: .default(Text("Keep")) {},
|
|
||||||
secondaryButton: .destructive(Text("Delete")) {
|
|
||||||
Task {
|
|
||||||
await deleteChat(Chat(
|
|
||||||
chatInfo: .contactConnection(contactConnection: conn),
|
|
||||||
chatItems: []
|
|
||||||
))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
),
|
|
||||||
id: "keepUnusedInvitation"
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
m.showingInvitation = nil
|
|
||||||
}
|
}
|
||||||
.alert(item: $alert) { a in
|
.alert(item: $alert) { a in
|
||||||
switch(a) {
|
switch(a) {
|
||||||
@@ -159,7 +172,8 @@ struct NewChatView: View {
|
|||||||
InviteView(
|
InviteView(
|
||||||
invitationUsed: $invitationUsed,
|
invitationUsed: $invitationUsed,
|
||||||
contactConnection: $contactConnection,
|
contactConnection: $contactConnection,
|
||||||
connReqInvitation: connReqInvitation
|
connReqInvitation: $connReqInvitation,
|
||||||
|
choosingProfile: $choosingProfile
|
||||||
)
|
)
|
||||||
} else if creatingConnReq {
|
} else if creatingConnReq {
|
||||||
creatingLinkProgressView()
|
creatingLinkProgressView()
|
||||||
@@ -210,12 +224,22 @@ struct NewChatView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func incognitoProfileImage() -> some View {
|
||||||
|
Image(systemName: "theatermasks.fill")
|
||||||
|
.resizable()
|
||||||
|
.scaledToFit()
|
||||||
|
.frame(width: 30)
|
||||||
|
.foregroundColor(.indigo)
|
||||||
|
}
|
||||||
|
|
||||||
private struct InviteView: View {
|
private struct InviteView: View {
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Binding var invitationUsed: Bool
|
@Binding var invitationUsed: Bool
|
||||||
@Binding var contactConnection: PendingContactConnection?
|
@Binding var contactConnection: PendingContactConnection?
|
||||||
var connReqInvitation: String
|
@Binding var connReqInvitation: String
|
||||||
|
@Binding var choosingProfile: Bool
|
||||||
|
|
||||||
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
@AppStorage(GROUP_DEFAULT_INCOGNITO, store: groupDefaults) private var incognitoDefault = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -226,28 +250,40 @@ private struct InviteView: View {
|
|||||||
.listRowInsets(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10))
|
.listRowInsets(EdgeInsets(top: 0, leading: 20, bottom: 0, trailing: 10))
|
||||||
|
|
||||||
qrCodeView()
|
qrCodeView()
|
||||||
|
if let selectedProfile = chatModel.currentUser {
|
||||||
Section {
|
Section {
|
||||||
IncognitoToggle(incognitoEnabled: $incognitoDefault)
|
NavigationLink {
|
||||||
} footer: {
|
ActiveProfilePicker(
|
||||||
sharedProfileInfo(incognitoDefault)
|
contactConnection: $contactConnection,
|
||||||
.foregroundColor(theme.colors.secondary)
|
connReqInvitation: $connReqInvitation,
|
||||||
|
incognitoEnabled: $incognitoDefault,
|
||||||
|
choosingProfile: $choosingProfile,
|
||||||
|
selectedProfile: selectedProfile
|
||||||
|
)
|
||||||
|
} label: {
|
||||||
|
HStack {
|
||||||
|
if incognitoDefault {
|
||||||
|
incognitoProfileImage()
|
||||||
|
Text("Incognito")
|
||||||
|
} else {
|
||||||
|
ProfileImage(imageStr: chatModel.currentUser?.image, size: 30)
|
||||||
|
Text(chatModel.currentUser?.chatViewName ?? "")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} header: {
|
||||||
|
Text("Share profile").foregroundColor(theme.colors.secondary)
|
||||||
|
} footer: {
|
||||||
|
if incognitoDefault {
|
||||||
|
Text("A new random profile will be shared.")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onChange(of: incognitoDefault) { incognito in
|
.onChange(of: incognitoDefault) { incognito in
|
||||||
Task {
|
setInvitationUsed()
|
||||||
do {
|
}
|
||||||
if let contactConn = contactConnection,
|
.onChange(of: chatModel.currentUser) { u in
|
||||||
let conn = try await apiSetConnectionIncognito(connId: contactConn.pccConnId, incognito: incognito) {
|
|
||||||
await MainActor.run {
|
|
||||||
contactConnection = conn
|
|
||||||
chatModel.updateContactConnection(conn)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} catch {
|
|
||||||
logger.error("apiSetConnectionIncognito error: \(responseError(error))")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setInvitationUsed()
|
setInvitationUsed()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -270,6 +306,7 @@ private struct InviteView: View {
|
|||||||
private func qrCodeView() -> some View {
|
private func qrCodeView() -> some View {
|
||||||
Section(header: Text("Or show this code").foregroundColor(theme.colors.secondary)) {
|
Section(header: Text("Or show this code").foregroundColor(theme.colors.secondary)) {
|
||||||
SimpleXLinkQRCode(uri: connReqInvitation, onShare: setInvitationUsed)
|
SimpleXLinkQRCode(uri: connReqInvitation, onShare: setInvitationUsed)
|
||||||
|
.id("simplex-qrcode-view-for-\(connReqInvitation)")
|
||||||
.padding()
|
.padding()
|
||||||
.background(
|
.background(
|
||||||
RoundedRectangle(cornerRadius: 12, style: .continuous)
|
RoundedRectangle(cornerRadius: 12, style: .continuous)
|
||||||
@@ -289,6 +326,257 @@ private struct InviteView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private enum ProfileSwitchStatus {
|
||||||
|
case switchingUser
|
||||||
|
case switchingIncognito
|
||||||
|
case idle
|
||||||
|
}
|
||||||
|
|
||||||
|
private struct ActiveProfilePicker: View {
|
||||||
|
@Environment(\.dismiss) var dismiss
|
||||||
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
|
@EnvironmentObject var theme: AppTheme
|
||||||
|
@Binding var contactConnection: PendingContactConnection?
|
||||||
|
@Binding var connReqInvitation: String
|
||||||
|
@Binding var incognitoEnabled: Bool
|
||||||
|
@Binding var choosingProfile: Bool
|
||||||
|
@State private var alert: SomeAlert?
|
||||||
|
@State private var profileSwitchStatus: ProfileSwitchStatus = .idle
|
||||||
|
@State private var switchingProfileByTimeout = false
|
||||||
|
@State private var lastSwitchingProfileByTimeoutCall: Double?
|
||||||
|
@State private var profiles: [User] = []
|
||||||
|
@State private var searchTextOrPassword = ""
|
||||||
|
@State private var showIncognitoSheet = false
|
||||||
|
@State private var incognitoFirst: Bool = false
|
||||||
|
@State var selectedProfile: User
|
||||||
|
var trimmedSearchTextOrPassword: String { searchTextOrPassword.trimmingCharacters(in: .whitespaces)}
|
||||||
|
|
||||||
|
var body: some View {
|
||||||
|
viewBody()
|
||||||
|
.navigationTitle("Select chat profile")
|
||||||
|
.searchable(text: $searchTextOrPassword, placement: .navigationBarDrawer(displayMode: .always))
|
||||||
|
.autocorrectionDisabled(true)
|
||||||
|
.navigationBarTitleDisplayMode(.large)
|
||||||
|
.onAppear {
|
||||||
|
profiles = chatModel.users
|
||||||
|
.map { $0.user }
|
||||||
|
.sorted { u, _ in u.activeUser }
|
||||||
|
}
|
||||||
|
.onChange(of: incognitoEnabled) { incognito in
|
||||||
|
if profileSwitchStatus != .switchingIncognito {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
if let contactConn = contactConnection,
|
||||||
|
let conn = try await apiSetConnectionIncognito(connId: contactConn.pccConnId, incognito: incognito) {
|
||||||
|
await MainActor.run {
|
||||||
|
contactConnection = conn
|
||||||
|
chatModel.updateContactConnection(conn)
|
||||||
|
profileSwitchStatus = .idle
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
profileSwitchStatus = .idle
|
||||||
|
incognitoEnabled = !incognito
|
||||||
|
logger.error("apiSetConnectionIncognito error: \(responseError(error))")
|
||||||
|
let err = getErrorAlert(error, "Error changing to incognito!")
|
||||||
|
|
||||||
|
alert = SomeAlert(
|
||||||
|
alert: Alert(
|
||||||
|
title: Text(err.title),
|
||||||
|
message: Text(err.message ?? "Error: \(responseError(error))")
|
||||||
|
),
|
||||||
|
id: "setConnectionIncognitoError"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: profileSwitchStatus) { sp in
|
||||||
|
if sp != .idle {
|
||||||
|
DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) {
|
||||||
|
switchingProfileByTimeout = profileSwitchStatus != .idle
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switchingProfileByTimeout = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: selectedProfile) { profile in
|
||||||
|
if (profileSwitchStatus != .switchingUser) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
Task {
|
||||||
|
do {
|
||||||
|
if let contactConn = contactConnection,
|
||||||
|
let conn = try await apiChangeConnectionUser(connId: contactConn.pccConnId, userId: profile.userId) {
|
||||||
|
|
||||||
|
await MainActor.run {
|
||||||
|
contactConnection = conn
|
||||||
|
connReqInvitation = conn.connReqInv ?? ""
|
||||||
|
incognitoEnabled = false
|
||||||
|
chatModel.updateContactConnection(conn)
|
||||||
|
}
|
||||||
|
do {
|
||||||
|
try await changeActiveUserAsync_(profile.userId, viewPwd: profile.hidden ? trimmedSearchTextOrPassword : nil )
|
||||||
|
await MainActor.run {
|
||||||
|
profileSwitchStatus = .idle
|
||||||
|
dismiss()
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
await MainActor.run {
|
||||||
|
profileSwitchStatus = .idle
|
||||||
|
alert = SomeAlert(
|
||||||
|
alert: Alert(
|
||||||
|
title: Text("Error switching profile"),
|
||||||
|
message: Text("Your connection was moved to \(profile.chatViewName) but an unexpected error occurred while redirecting you to the profile.")
|
||||||
|
),
|
||||||
|
id: "switchingProfileError"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
await MainActor.run {
|
||||||
|
profileSwitchStatus = .idle
|
||||||
|
if let currentUser = chatModel.currentUser {
|
||||||
|
selectedProfile = currentUser
|
||||||
|
}
|
||||||
|
let err = getErrorAlert(error, "Error changing connection profile")
|
||||||
|
alert = SomeAlert(
|
||||||
|
alert: Alert(
|
||||||
|
title: Text(err.title),
|
||||||
|
message: Text(err.message ?? "Error: \(responseError(error))")
|
||||||
|
),
|
||||||
|
id: "changeConnectionUserError"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.alert(item: $alert) { a in
|
||||||
|
a.alert
|
||||||
|
}
|
||||||
|
.onAppear {
|
||||||
|
incognitoFirst = incognitoEnabled
|
||||||
|
choosingProfile = true
|
||||||
|
}
|
||||||
|
.onDisappear {
|
||||||
|
choosingProfile = false
|
||||||
|
}
|
||||||
|
.sheet(isPresented: $showIncognitoSheet) {
|
||||||
|
IncognitoHelp()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ViewBuilder private func viewBody() -> some View {
|
||||||
|
profilePicker()
|
||||||
|
.allowsHitTesting(!switchingProfileByTimeout)
|
||||||
|
.modifier(ThemedBackground(grouped: true))
|
||||||
|
.overlay {
|
||||||
|
if switchingProfileByTimeout {
|
||||||
|
ProgressView()
|
||||||
|
.scaleEffect(2)
|
||||||
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private func filteredProfiles() -> [User] {
|
||||||
|
let s = trimmedSearchTextOrPassword
|
||||||
|
let lower = s.localizedLowercase
|
||||||
|
|
||||||
|
return profiles.filter { u in
|
||||||
|
if (u.activeUser || !u.hidden) && (s == "" || u.chatViewName.localizedLowercase.contains(lower)) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return correctPassword(u, s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewBuilder private func profilerPickerUserOption(_ user: User) -> some View {
|
||||||
|
Button {
|
||||||
|
if selectedProfile == user && incognitoEnabled {
|
||||||
|
incognitoEnabled = false
|
||||||
|
profileSwitchStatus = .switchingIncognito
|
||||||
|
} else if selectedProfile != user {
|
||||||
|
selectedProfile = user
|
||||||
|
profileSwitchStatus = .switchingUser
|
||||||
|
}
|
||||||
|
} label: {
|
||||||
|
HStack {
|
||||||
|
ProfileImage(imageStr: user.image, size: 30)
|
||||||
|
.padding(.trailing, 2)
|
||||||
|
Text(user.chatViewName)
|
||||||
|
.foregroundColor(theme.colors.onBackground)
|
||||||
|
.lineLimit(1)
|
||||||
|
Spacer()
|
||||||
|
if selectedProfile == user, !incognitoEnabled {
|
||||||
|
Image(systemName: "checkmark")
|
||||||
|
.resizable().scaledToFit().frame(width: 16)
|
||||||
|
.foregroundColor(theme.colors.primary)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ViewBuilder private func profilePicker() -> some View {
|
||||||
|
let incognitoOption = Button {
|
||||||
|
if !incognitoEnabled {
|
||||||
|
incognitoEnabled = true
|
||||||
|
profileSwitchStatus = .switchingIncognito
|
||||||
|
}
|
||||||
|
} label : {
|
||||||
|
HStack {
|
||||||
|
incognitoProfileImage()
|
||||||
|
Text("Incognito")
|
||||||
|
.foregroundColor(theme.colors.onBackground)
|
||||||
|
Image(systemName: "info.circle")
|
||||||
|
.foregroundColor(theme.colors.primary)
|
||||||
|
.font(.system(size: 14))
|
||||||
|
.onTapGesture {
|
||||||
|
showIncognitoSheet = true
|
||||||
|
}
|
||||||
|
Spacer()
|
||||||
|
if incognitoEnabled {
|
||||||
|
Image(systemName: "checkmark")
|
||||||
|
.resizable().scaledToFit().frame(width: 16)
|
||||||
|
.foregroundColor(theme.colors.primary)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
List {
|
||||||
|
let filteredProfiles = filteredProfiles()
|
||||||
|
let activeProfile = filteredProfiles.first { u in u.activeUser }
|
||||||
|
|
||||||
|
if let selectedProfile = activeProfile {
|
||||||
|
let otherProfiles = filteredProfiles.filter { u in u.userId != activeProfile?.userId }
|
||||||
|
|
||||||
|
if incognitoFirst {
|
||||||
|
incognitoOption
|
||||||
|
profilerPickerUserOption(selectedProfile)
|
||||||
|
} else {
|
||||||
|
profilerPickerUserOption(selectedProfile)
|
||||||
|
incognitoOption
|
||||||
|
}
|
||||||
|
|
||||||
|
ForEach(otherProfiles) { p in
|
||||||
|
profilerPickerUserOption(p)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
incognitoOption
|
||||||
|
ForEach(filteredProfiles) { p in
|
||||||
|
profilerPickerUserOption(p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.opacity(switchingProfileByTimeout ? 0.4 : 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private struct ConnectView: View {
|
private struct ConnectView: View {
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@@ -296,6 +584,7 @@ private struct ConnectView: View {
|
|||||||
@Binding var pastedLink: String
|
@Binding var pastedLink: String
|
||||||
@Binding var alert: NewChatViewAlert?
|
@Binding var alert: NewChatViewAlert?
|
||||||
@State private var sheet: PlanAndConnectActionSheet?
|
@State private var sheet: PlanAndConnectActionSheet?
|
||||||
|
@State private var pasteboardHasStrings = UIPasteboard.general.hasStrings
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
List {
|
List {
|
||||||
@@ -332,7 +621,7 @@ private struct ConnectView: View {
|
|||||||
} label: {
|
} label: {
|
||||||
Text("Tap to paste link")
|
Text("Tap to paste link")
|
||||||
}
|
}
|
||||||
.disabled(!ChatModel.shared.pasteboardHasStrings)
|
.disabled(!pasteboardHasStrings)
|
||||||
.frame(maxWidth: .infinity, alignment: .center)
|
.frame(maxWidth: .infinity, alignment: .center)
|
||||||
} else {
|
} else {
|
||||||
linkTextView(pastedLink)
|
linkTextView(pastedLink)
|
||||||
@@ -403,6 +692,7 @@ struct ScannerInView: View {
|
|||||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
.foregroundColor(Color.clear)
|
.foregroundColor(Color.clear)
|
||||||
switch cameraAuthorizationStatus {
|
switch cameraAuthorizationStatus {
|
||||||
|
case .authorized, nil: EmptyView()
|
||||||
case .restricted: Text("Camera not available")
|
case .restricted: Text("Camera not available")
|
||||||
case .denied: Label("Enable camera access", systemImage: "camera")
|
case .denied: Label("Enable camera access", systemImage: "camera")
|
||||||
default: Label("Tap to scan", systemImage: "qrcode")
|
default: Label("Tap to scan", systemImage: "qrcode")
|
||||||
@@ -422,21 +712,26 @@ struct ScannerInView: View {
|
|||||||
.disabled(cameraAuthorizationStatus == .restricted)
|
.disabled(cameraAuthorizationStatus == .restricted)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onAppear {
|
.task {
|
||||||
let status = AVCaptureDevice.authorizationStatus(for: .video)
|
let status = AVCaptureDevice.authorizationStatus(for: .video)
|
||||||
cameraAuthorizationStatus = status
|
cameraAuthorizationStatus = status
|
||||||
if showQRCodeScanner {
|
if showQRCodeScanner {
|
||||||
switch status {
|
switch status {
|
||||||
case .notDetermined: askCameraAuthorization()
|
case .notDetermined: await askCameraAuthorizationAsync()
|
||||||
case .restricted: showQRCodeScanner = false
|
case .restricted: showQRCodeScanner = false
|
||||||
case .denied: showQRCodeScanner = false
|
case .denied: showQRCodeScanner = false
|
||||||
case .authorized: ()
|
case .authorized: ()
|
||||||
@unknown default: askCameraAuthorization()
|
@unknown default: await askCameraAuthorizationAsync()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func askCameraAuthorizationAsync() async {
|
||||||
|
await AVCaptureDevice.requestAccess(for: .video)
|
||||||
|
cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
|
||||||
|
}
|
||||||
|
|
||||||
func askCameraAuthorization(_ cb: (() -> Void)? = nil) {
|
func askCameraAuthorization(_ cb: (() -> Void)? = nil) {
|
||||||
AVCaptureDevice.requestAccess(for: .video) { allowed in
|
AVCaptureDevice.requestAccess(for: .video) { allowed in
|
||||||
cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
|
cameraAuthorizationStatus = AVCaptureDevice.authorizationStatus(for: .video)
|
||||||
@@ -975,10 +1270,12 @@ func connReqSentAlert(_ type: ConnReqType) -> Alert {
|
|||||||
struct NewChatView_Previews: PreviewProvider {
|
struct NewChatView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
@State var parentAlert: SomeAlert?
|
@State var parentAlert: SomeAlert?
|
||||||
|
@State var contactConnection: PendingContactConnection? = nil
|
||||||
|
|
||||||
NewChatView(
|
NewChatView(
|
||||||
selection: .invite,
|
selection: .invite,
|
||||||
parentAlert: $parentAlert
|
parentAlert: $parentAlert,
|
||||||
|
contactConnection: $contactConnection
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -49,34 +49,34 @@ struct QRCode: View {
|
|||||||
ZStack {
|
ZStack {
|
||||||
if let image = image {
|
if let image = image {
|
||||||
qrCodeImage(image)
|
qrCodeImage(image)
|
||||||
}
|
GeometryReader { geo in
|
||||||
GeometryReader { geo in
|
ZStack {
|
||||||
ZStack {
|
if withLogo {
|
||||||
if withLogo {
|
let w = geo.size.width
|
||||||
let w = geo.size.width
|
Image("icon-light")
|
||||||
Image("icon-light")
|
.resizable()
|
||||||
.resizable()
|
.scaledToFit()
|
||||||
.scaledToFit()
|
.frame(width: w * 0.16, height: w * 0.16)
|
||||||
.frame(width: w * 0.16, height: w * 0.16)
|
.frame(width: w * 0.165, height: w * 0.165)
|
||||||
.frame(width: w * 0.165, height: w * 0.165)
|
.background(.white)
|
||||||
.background(.white)
|
.clipShape(Circle())
|
||||||
.clipShape(Circle())
|
}
|
||||||
}
|
}
|
||||||
}
|
.onAppear {
|
||||||
.onAppear {
|
makeScreenshotFunc = {
|
||||||
makeScreenshotFunc = {
|
let size = CGSizeMake(1024 / UIScreen.main.scale, 1024 / UIScreen.main.scale)
|
||||||
let size = CGSizeMake(1024 / UIScreen.main.scale, 1024 / UIScreen.main.scale)
|
showShareSheet(items: [makeScreenshot(geo.frame(in: .local).origin, size)])
|
||||||
showShareSheet(items: [makeScreenshot(geo.frame(in: .local).origin, size)])
|
onShare?()
|
||||||
onShare?()
|
}
|
||||||
}
|
}
|
||||||
|
.frame(width: geo.size.width, height: geo.size.height)
|
||||||
}
|
}
|
||||||
.frame(width: geo.size.width, height: geo.size.height)
|
} else {
|
||||||
|
Color.clear.aspectRatio(1, contentMode: .fit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.onTapGesture(perform: makeScreenshotFunc)
|
.onTapGesture(perform: makeScreenshotFunc)
|
||||||
.onAppear {
|
.task { image = await generateImage(uri, tintColor: tintColor) }
|
||||||
image = image ?? generateImage(uri, tintColor: tintColor)
|
|
||||||
}
|
|
||||||
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
.frame(maxWidth: .infinity, maxHeight: .infinity)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -89,7 +89,7 @@ private func qrCodeImage(_ image: UIImage) -> some View {
|
|||||||
.textSelection(.enabled)
|
.textSelection(.enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func generateImage(_ uri: String, tintColor: UIColor) -> UIImage? {
|
private func generateImage(_ uri: String, tintColor: UIColor) async -> UIImage? {
|
||||||
let context = CIContext()
|
let context = CIContext()
|
||||||
let filter = CIFilter.qrCodeGenerator()
|
let filter = CIFilter.qrCodeGenerator()
|
||||||
filter.message = Data(uri.utf8)
|
filter.message = Data(uri.utf8)
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ struct ConnectDesktopView: View {
|
|||||||
@EnvironmentObject var m: ChatModel
|
@EnvironmentObject var m: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
var viaSettings = false
|
|
||||||
@AppStorage(DEFAULT_DEVICE_NAME_FOR_REMOTE_ACCESS) private var deviceName = UIDevice.current.name
|
@AppStorage(DEFAULT_DEVICE_NAME_FOR_REMOTE_ACCESS) private var deviceName = UIDevice.current.name
|
||||||
@AppStorage(DEFAULT_CONFIRM_REMOTE_SESSIONS) private var confirmRemoteSessions = false
|
@AppStorage(DEFAULT_CONFIRM_REMOTE_SESSIONS) private var confirmRemoteSessions = false
|
||||||
@AppStorage(DEFAULT_CONNECT_REMOTE_VIA_MULTICAST) private var connectRemoteViaMulticast = true
|
@AppStorage(DEFAULT_CONNECT_REMOTE_VIA_MULTICAST) private var connectRemoteViaMulticast = true
|
||||||
@@ -57,23 +56,6 @@ struct ConnectDesktopView: View {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
if viaSettings {
|
|
||||||
viewBody
|
|
||||||
.modifier(BackButton(label: "Back", disabled: Binding.constant(false)) {
|
|
||||||
if m.activeRemoteCtrl {
|
|
||||||
alert = .disconnectDesktop(action: .back)
|
|
||||||
} else {
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
NavigationView {
|
|
||||||
viewBody
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
var viewBody: some View {
|
|
||||||
Group {
|
Group {
|
||||||
let discovery = m.remoteCtrlSession?.discovery
|
let discovery = m.remoteCtrlSession?.discovery
|
||||||
if discovery == true || (discovery == nil && !showConnectScreen) {
|
if discovery == true || (discovery == nil && !showConnectScreen) {
|
||||||
|
|||||||
@@ -160,7 +160,7 @@ struct TerminalView_Previews: PreviewProvider {
|
|||||||
let chatModel = ChatModel()
|
let chatModel = ChatModel()
|
||||||
chatModel.terminalItems = [
|
chatModel.terminalItems = [
|
||||||
.resp(.now, ChatResponse.response(type: "contactSubscribed", json: "{}")),
|
.resp(.now, ChatResponse.response(type: "contactSubscribed", json: "{}")),
|
||||||
.resp(.now, ChatResponse.response(type: "newChatItem", json: "{}"))
|
.resp(.now, ChatResponse.response(type: "newChatItems", json: "{}"))
|
||||||
]
|
]
|
||||||
return NavigationView {
|
return NavigationView {
|
||||||
TerminalView()
|
TerminalView()
|
||||||
|
|||||||
@@ -36,6 +36,10 @@ struct AdvancedNetworkSettings: View {
|
|||||||
@State private var showSettingsAlert: NetworkSettingsAlert?
|
@State private var showSettingsAlert: NetworkSettingsAlert?
|
||||||
@State private var onionHosts: OnionHosts = .no
|
@State private var onionHosts: OnionHosts = .no
|
||||||
@State private var showSaveDialog = false
|
@State private var showSaveDialog = false
|
||||||
|
@State private var netProxy = networkProxyDefault.get()
|
||||||
|
@State private var currentNetProxy = networkProxyDefault.get()
|
||||||
|
@State private var useNetProxy = false
|
||||||
|
@State private var netProxyAuth = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
VStack {
|
VStack {
|
||||||
@@ -102,6 +106,76 @@ struct AdvancedNetworkSettings: View {
|
|||||||
.foregroundColor(theme.colors.secondary)
|
.foregroundColor(theme.colors.secondary)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Section {
|
||||||
|
Toggle("Use SOCKS proxy", isOn: $useNetProxy)
|
||||||
|
Group {
|
||||||
|
TextField("IP address", text: $netProxy.host)
|
||||||
|
TextField(
|
||||||
|
"Port",
|
||||||
|
text: Binding(
|
||||||
|
get: { netProxy.port > 0 ? "\(netProxy.port)" : "" },
|
||||||
|
set: { s in
|
||||||
|
netProxy.port = if let port = Int(s), port > 0 {
|
||||||
|
port
|
||||||
|
} else {
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
Toggle("Proxy requires password", isOn: $netProxyAuth)
|
||||||
|
if netProxyAuth {
|
||||||
|
TextField("Username", text: $netProxy.username)
|
||||||
|
PassphraseField(
|
||||||
|
key: $netProxy.password,
|
||||||
|
placeholder: "Password",
|
||||||
|
valid: NetworkProxy.validCredential(netProxy.password)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.if(!useNetProxy) { $0.foregroundColor(theme.colors.secondary) }
|
||||||
|
.disabled(!useNetProxy)
|
||||||
|
} header: {
|
||||||
|
HStack {
|
||||||
|
Text("SOCKS proxy").foregroundColor(theme.colors.secondary)
|
||||||
|
if useNetProxy && !netProxy.valid {
|
||||||
|
Spacer()
|
||||||
|
Image(systemName: "exclamationmark.circle.fill").foregroundColor(.red)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} footer: {
|
||||||
|
if netProxyAuth {
|
||||||
|
Text("Your credentials may be sent unencrypted.")
|
||||||
|
.foregroundColor(theme.colors.secondary)
|
||||||
|
} else {
|
||||||
|
Text("Do not use credentials with proxy.")
|
||||||
|
.foregroundColor(theme.colors.secondary)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: useNetProxy) { useNetProxy in
|
||||||
|
netCfg.socksProxy = useNetProxy && currentNetProxy.valid
|
||||||
|
? currentNetProxy.toProxyString()
|
||||||
|
: nil
|
||||||
|
netProxy = currentNetProxy
|
||||||
|
netProxyAuth = netProxy.username != "" || netProxy.password != ""
|
||||||
|
}
|
||||||
|
.onChange(of: netProxyAuth) { netProxyAuth in
|
||||||
|
if netProxyAuth {
|
||||||
|
netProxy.auth = currentNetProxy.auth
|
||||||
|
netProxy.username = currentNetProxy.username
|
||||||
|
netProxy.password = currentNetProxy.password
|
||||||
|
} else {
|
||||||
|
netProxy.auth = .username
|
||||||
|
netProxy.username = ""
|
||||||
|
netProxy.password = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.onChange(of: netProxy) { netProxy in
|
||||||
|
netCfg.socksProxy = useNetProxy && netProxy.valid
|
||||||
|
? netProxy.toProxyString()
|
||||||
|
: nil
|
||||||
|
}
|
||||||
|
|
||||||
Section {
|
Section {
|
||||||
Picker("Use .onion hosts", selection: $onionHosts) {
|
Picker("Use .onion hosts", selection: $onionHosts) {
|
||||||
ForEach(OnionHosts.values, id: \.self) { Text($0.text) }
|
ForEach(OnionHosts.values, id: \.self) { Text($0.text) }
|
||||||
@@ -156,19 +230,19 @@ struct AdvancedNetworkSettings: View {
|
|||||||
|
|
||||||
Section {
|
Section {
|
||||||
Button("Reset to defaults") {
|
Button("Reset to defaults") {
|
||||||
updateNetCfgView(NetCfg.defaults)
|
updateNetCfgView(NetCfg.defaults, NetworkProxy.def)
|
||||||
}
|
}
|
||||||
.disabled(netCfg == NetCfg.defaults)
|
.disabled(netCfg == NetCfg.defaults)
|
||||||
|
|
||||||
Button("Set timeouts for proxy/VPN") {
|
Button("Set timeouts for proxy/VPN") {
|
||||||
updateNetCfgView(netCfg.withProxyTimeouts)
|
updateNetCfgView(netCfg.withProxyTimeouts, netProxy)
|
||||||
}
|
}
|
||||||
.disabled(netCfg.hasProxyTimeouts)
|
.disabled(netCfg.hasProxyTimeouts)
|
||||||
|
|
||||||
Button("Save and reconnect") {
|
Button("Save and reconnect") {
|
||||||
showSettingsAlert = .update
|
showSettingsAlert = .update
|
||||||
}
|
}
|
||||||
.disabled(netCfg == currentNetCfg)
|
.disabled(netCfg == currentNetCfg || (useNetProxy && !netProxy.valid))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -182,7 +256,8 @@ struct AdvancedNetworkSettings: View {
|
|||||||
if cfgLoaded { return }
|
if cfgLoaded { return }
|
||||||
cfgLoaded = true
|
cfgLoaded = true
|
||||||
currentNetCfg = getNetCfg()
|
currentNetCfg = getNetCfg()
|
||||||
updateNetCfgView(currentNetCfg)
|
currentNetProxy = networkProxyDefault.get()
|
||||||
|
updateNetCfgView(currentNetCfg, currentNetProxy)
|
||||||
}
|
}
|
||||||
.alert(item: $showSettingsAlert) { a in
|
.alert(item: $showSettingsAlert) { a in
|
||||||
switch a {
|
switch a {
|
||||||
@@ -206,7 +281,7 @@ struct AdvancedNetworkSettings: View {
|
|||||||
if netCfg == currentNetCfg {
|
if netCfg == currentNetCfg {
|
||||||
dismiss()
|
dismiss()
|
||||||
cfgLoaded = false
|
cfgLoaded = false
|
||||||
} else {
|
} else if !useNetProxy || netProxy.valid {
|
||||||
showSaveDialog = true
|
showSaveDialog = true
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
@@ -221,18 +296,26 @@ struct AdvancedNetworkSettings: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func updateNetCfgView(_ cfg: NetCfg) {
|
private func updateNetCfgView(_ cfg: NetCfg, _ proxy: NetworkProxy) {
|
||||||
netCfg = cfg
|
netCfg = cfg
|
||||||
|
netProxy = proxy
|
||||||
onionHosts = OnionHosts(netCfg: netCfg)
|
onionHosts = OnionHosts(netCfg: netCfg)
|
||||||
enableKeepAlive = netCfg.enableKeepAlive
|
enableKeepAlive = netCfg.enableKeepAlive
|
||||||
keepAliveOpts = netCfg.tcpKeepAlive ?? KeepAliveOpts.defaults
|
keepAliveOpts = netCfg.tcpKeepAlive ?? KeepAliveOpts.defaults
|
||||||
|
useNetProxy = netCfg.socksProxy != nil
|
||||||
|
netProxyAuth = switch netProxy.auth {
|
||||||
|
case .username: netProxy.username != "" || netProxy.password != ""
|
||||||
|
case .isolate: false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func saveNetCfg() -> Bool {
|
private func saveNetCfg() -> Bool {
|
||||||
do {
|
do {
|
||||||
try setNetworkConfig(netCfg)
|
try setNetworkConfig(netCfg)
|
||||||
currentNetCfg = netCfg
|
currentNetCfg = netCfg
|
||||||
setNetCfg(netCfg)
|
setNetCfg(netCfg, networkProxy: useNetProxy ? netProxy : nil)
|
||||||
|
currentNetProxy = netProxy
|
||||||
|
networkProxyDefault.set(netProxy)
|
||||||
return true
|
return true
|
||||||
} catch let error {
|
} catch let error {
|
||||||
let err = responseError(error)
|
let err = responseError(error)
|
||||||
|
|||||||
@@ -19,9 +19,15 @@ extension AppSettings {
|
|||||||
val.hostMode = .publicHost
|
val.hostMode = .publicHost
|
||||||
val.requiredHostMode = true
|
val.requiredHostMode = true
|
||||||
}
|
}
|
||||||
val.socksProxy = nil
|
if val.socksProxy != nil {
|
||||||
setNetCfg(val)
|
val.socksProxy = networkProxy?.toProxyString()
|
||||||
|
setNetCfg(val, networkProxy: networkProxy)
|
||||||
|
} else {
|
||||||
|
val.socksProxy = nil
|
||||||
|
setNetCfg(val, networkProxy: nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
if let val = networkProxy { networkProxyDefault.set(val) }
|
||||||
if let val = privacyEncryptLocalFiles { privacyEncryptLocalFilesGroupDefault.set(val) }
|
if let val = privacyEncryptLocalFiles { privacyEncryptLocalFilesGroupDefault.set(val) }
|
||||||
if let val = privacyAskToApproveRelays { privacyAskToApproveRelaysGroupDefault.set(val) }
|
if let val = privacyAskToApproveRelays { privacyAskToApproveRelaysGroupDefault.set(val) }
|
||||||
if let val = privacyAcceptImages {
|
if let val = privacyAcceptImages {
|
||||||
@@ -52,10 +58,10 @@ extension AppSettings {
|
|||||||
profileImageCornerRadiusGroupDefault.set(val)
|
profileImageCornerRadiusGroupDefault.set(val)
|
||||||
def.setValue(val, forKey: DEFAULT_PROFILE_IMAGE_CORNER_RADIUS)
|
def.setValue(val, forKey: DEFAULT_PROFILE_IMAGE_CORNER_RADIUS)
|
||||||
}
|
}
|
||||||
if let val = uiColorScheme { def.setValue(val, forKey: DEFAULT_CURRENT_THEME) }
|
if let val = uiColorScheme { currentThemeDefault.set(val) }
|
||||||
if let val = uiDarkColorScheme { def.setValue(val, forKey: DEFAULT_SYSTEM_DARK_THEME) }
|
if let val = uiDarkColorScheme { systemDarkThemeDefault.set(val) }
|
||||||
if let val = uiCurrentThemeIds { def.setValue(val, forKey: DEFAULT_CURRENT_THEME_IDS) }
|
if let val = uiCurrentThemeIds { currentThemeIdsDefault.set(val) }
|
||||||
if let val = uiThemes { def.setValue(val.skipDuplicates(), forKey: DEFAULT_THEME_OVERRIDES) }
|
if let val = uiThemes { themeOverridesDefault.set(val.skipDuplicates()) }
|
||||||
if let val = oneHandUI { groupDefaults.setValue(val, forKey: GROUP_DEFAULT_ONE_HAND_UI) }
|
if let val = oneHandUI { groupDefaults.setValue(val, forKey: GROUP_DEFAULT_ONE_HAND_UI) }
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -63,6 +69,7 @@ extension AppSettings {
|
|||||||
let def = UserDefaults.standard
|
let def = UserDefaults.standard
|
||||||
var c = AppSettings.defaults
|
var c = AppSettings.defaults
|
||||||
c.networkConfig = getNetCfg()
|
c.networkConfig = getNetCfg()
|
||||||
|
c.networkProxy = networkProxyDefault.get()
|
||||||
c.privacyEncryptLocalFiles = privacyEncryptLocalFilesGroupDefault.get()
|
c.privacyEncryptLocalFiles = privacyEncryptLocalFilesGroupDefault.get()
|
||||||
c.privacyAskToApproveRelays = privacyAskToApproveRelaysGroupDefault.get()
|
c.privacyAskToApproveRelays = privacyAskToApproveRelaysGroupDefault.get()
|
||||||
c.privacyAcceptImages = privacyAcceptImagesGroupDefault.get()
|
c.privacyAcceptImages = privacyAcceptImagesGroupDefault.get()
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ struct AppearanceSettings: View {
|
|||||||
}()
|
}()
|
||||||
@State private var darkModeTheme: String = UserDefaults.standard.string(forKey: DEFAULT_SYSTEM_DARK_THEME) ?? DefaultTheme.DARK.themeName
|
@State private var darkModeTheme: String = UserDefaults.standard.string(forKey: DEFAULT_SYSTEM_DARK_THEME) ?? DefaultTheme.DARK.themeName
|
||||||
@AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var profileImageCornerRadius = defaultProfileImageCorner
|
@AppStorage(DEFAULT_PROFILE_IMAGE_CORNER_RADIUS) private var profileImageCornerRadius = defaultProfileImageCorner
|
||||||
|
@AppStorage(DEFAULT_CHAT_ITEM_ROUNDNESS) private var chatItemRoundness = defaultChatItemRoundness
|
||||||
|
@AppStorage(DEFAULT_CHAT_ITEM_TAIL) private var chatItemTail = true
|
||||||
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
|
@AppStorage(GROUP_DEFAULT_ONE_HAND_UI, store: groupDefaults) private var oneHandUI = true
|
||||||
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
|
@AppStorage(DEFAULT_TOOLBAR_MATERIAL) private var toolbarMaterial = ToolbarMaterial.defaultMaterial
|
||||||
|
|
||||||
@@ -179,6 +181,14 @@ struct AppearanceSettings: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Section(header: Text("Message shape").foregroundColor(theme.colors.secondary)) {
|
||||||
|
HStack {
|
||||||
|
Text("Corner")
|
||||||
|
Slider(value: $chatItemRoundness, in: 0...1, step: 0.05)
|
||||||
|
}
|
||||||
|
Toggle("Tail", isOn: $chatItemTail)
|
||||||
|
}
|
||||||
|
|
||||||
Section(header: Text("Profile images").foregroundColor(theme.colors.secondary)) {
|
Section(header: Text("Profile images").foregroundColor(theme.colors.secondary)) {
|
||||||
HStack(spacing: 16) {
|
HStack(spacing: 16) {
|
||||||
if let img = m.currentUser?.image, img != "" {
|
if let img = m.currentUser?.image, img != "" {
|
||||||
@@ -358,20 +368,21 @@ struct ChatThemePreview: View {
|
|||||||
let bob = ChatItem.getSample(2, CIDirection.directSnd, Date.now, NSLocalizedString("Good morning!", comment: "message preview"), quotedItem: CIQuote.getSample(alice.id, alice.meta.itemTs, alice.content.text, chatDir: alice.chatDir))
|
let bob = ChatItem.getSample(2, CIDirection.directSnd, Date.now, NSLocalizedString("Good morning!", comment: "message preview"), quotedItem: CIQuote.getSample(alice.id, alice.meta.itemTs, alice.content.text, chatDir: alice.chatDir))
|
||||||
HStack {
|
HStack {
|
||||||
ChatItemView(chat: Chat.sampleData, chatItem: alice, revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: alice, revealed: Binding.constant(false))
|
||||||
.modifier(ChatItemClipped())
|
.modifier(ChatItemClipped(alice, tailVisible: true))
|
||||||
Spacer()
|
Spacer()
|
||||||
}
|
}
|
||||||
HStack {
|
HStack {
|
||||||
Spacer()
|
Spacer()
|
||||||
ChatItemView(chat: Chat.sampleData, chatItem: bob, revealed: Binding.constant(false))
|
ChatItemView(chat: Chat.sampleData, chatItem: bob, revealed: Binding.constant(false))
|
||||||
.modifier(ChatItemClipped())
|
.modifier(ChatItemClipped(bob, tailVisible: true))
|
||||||
.frame(alignment: .trailing)
|
.frame(alignment: .trailing)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Rectangle().fill(.clear)
|
Rectangle().fill(.clear)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.padding(10)
|
.padding(.vertical, 10)
|
||||||
|
.padding(.horizontal, 16)
|
||||||
.frame(maxWidth: .infinity)
|
.frame(maxWidth: .infinity)
|
||||||
|
|
||||||
if let wallpaperType, let wallpaperImage = wallpaperType.image, let backgroundColor, let tintColor {
|
if let wallpaperType, let wallpaperImage = wallpaperType.image, let backgroundColor, let tintColor {
|
||||||
@@ -797,7 +808,7 @@ struct ThemeDestinationPicker: View {
|
|||||||
@Binding var customizeThemeIsOpen: Bool
|
@Binding var customizeThemeIsOpen: Bool
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
let values = [(nil, "All profiles")] + m.users.filter { $0.user.activeUser }.map { ($0.user.userId, $0.user.chatViewName)}
|
let values = [(nil, NSLocalizedString("All profiles", comment: "profile dropdown"))] + m.users.filter { $0.user.activeUser }.map { ($0.user.userId, $0.user.chatViewName)}
|
||||||
|
|
||||||
if values.contains(where: { (userId, text) in userId == themeUserDestination?.0 }) {
|
if values.contains(where: { (userId, text) in userId == themeUserDestination?.0 }) {
|
||||||
Picker("Apply to", selection: $themeUserDest) {
|
Picker("Apply to", selection: $themeUserDest) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ struct IncognitoHelp: View {
|
|||||||
Text("Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).")
|
Text("Read more in [User Guide](https://simplex.chat/docs/guide/chat-profiles.html#incognito-mode).")
|
||||||
}
|
}
|
||||||
.listRowBackground(Color.clear)
|
.listRowBackground(Color.clear)
|
||||||
|
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))
|
||||||
}
|
}
|
||||||
.modifier(ThemedBackground())
|
.modifier(ThemedBackground())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,6 +32,17 @@ struct PreferencesView: View {
|
|||||||
.disabled(currentPreferences == preferences)
|
.disabled(currentPreferences == preferences)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.onDisappear {
|
||||||
|
if currentPreferences != preferences {
|
||||||
|
showAlert(
|
||||||
|
title: NSLocalizedString("Your chat preferences", comment: "alert title"),
|
||||||
|
message: NSLocalizedString("Chat preferences were changed.", comment: "alert message"),
|
||||||
|
buttonTitle: NSLocalizedString("Save", comment: "alert button"),
|
||||||
|
buttonAction: savePreferences,
|
||||||
|
cancelButton: true
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func featureSection(_ feature: ChatFeature, _ allowFeature: Binding<FeatureAllowed>) -> some View {
|
private func featureSection(_ feature: ChatFeature, _ allowFeature: Binding<FeatureAllowed>) -> some View {
|
||||||
|
|||||||
@@ -47,6 +47,8 @@ let DEFAULT_ACCENT_COLOR_GREEN = "accentColorGreen" // deprecated, only used for
|
|||||||
let DEFAULT_ACCENT_COLOR_BLUE = "accentColorBlue" // deprecated, only used for migration
|
let DEFAULT_ACCENT_COLOR_BLUE = "accentColorBlue" // deprecated, only used for migration
|
||||||
let DEFAULT_USER_INTERFACE_STYLE = "userInterfaceStyle" // deprecated, only used for migration
|
let DEFAULT_USER_INTERFACE_STYLE = "userInterfaceStyle" // deprecated, only used for migration
|
||||||
let DEFAULT_PROFILE_IMAGE_CORNER_RADIUS = "profileImageCornerRadius"
|
let DEFAULT_PROFILE_IMAGE_CORNER_RADIUS = "profileImageCornerRadius"
|
||||||
|
let DEFAULT_CHAT_ITEM_ROUNDNESS = "chatItemRoundness"
|
||||||
|
let DEFAULT_CHAT_ITEM_TAIL = "chatItemTail"
|
||||||
let DEFAULT_ONE_HAND_UI_CARD_SHOWN = "oneHandUICardShown"
|
let DEFAULT_ONE_HAND_UI_CARD_SHOWN = "oneHandUICardShown"
|
||||||
let DEFAULT_TOOLBAR_MATERIAL = "toolbarMaterial"
|
let DEFAULT_TOOLBAR_MATERIAL = "toolbarMaterial"
|
||||||
let DEFAULT_CONNECT_VIA_LINK_TAB = "connectViaLinkTab"
|
let DEFAULT_CONNECT_VIA_LINK_TAB = "connectViaLinkTab"
|
||||||
@@ -73,8 +75,12 @@ let DEFAULT_SYSTEM_DARK_THEME = "systemDarkTheme"
|
|||||||
let DEFAULT_CURRENT_THEME_IDS = "currentThemeIds"
|
let DEFAULT_CURRENT_THEME_IDS = "currentThemeIds"
|
||||||
let DEFAULT_THEME_OVERRIDES = "themeOverrides"
|
let DEFAULT_THEME_OVERRIDES = "themeOverrides"
|
||||||
|
|
||||||
|
let DEFAULT_NETWORK_PROXY = "networkProxy"
|
||||||
|
|
||||||
let ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN = "androidCallOnLockScreen"
|
let ANDROID_DEFAULT_CALL_ON_LOCK_SCREEN = "androidCallOnLockScreen"
|
||||||
|
|
||||||
|
let defaultChatItemRoundness: Double = 0.75
|
||||||
|
|
||||||
let appDefaults: [String: Any] = [
|
let appDefaults: [String: Any] = [
|
||||||
DEFAULT_SHOW_LA_NOTICE: false,
|
DEFAULT_SHOW_LA_NOTICE: false,
|
||||||
DEFAULT_LA_NOTICE_SHOWN: false,
|
DEFAULT_LA_NOTICE_SHOWN: false,
|
||||||
@@ -98,6 +104,8 @@ let appDefaults: [String: Any] = [
|
|||||||
DEFAULT_DEVELOPER_TOOLS: false,
|
DEFAULT_DEVELOPER_TOOLS: false,
|
||||||
DEFAULT_ENCRYPTION_STARTED: false,
|
DEFAULT_ENCRYPTION_STARTED: false,
|
||||||
DEFAULT_PROFILE_IMAGE_CORNER_RADIUS: defaultProfileImageCorner,
|
DEFAULT_PROFILE_IMAGE_CORNER_RADIUS: defaultProfileImageCorner,
|
||||||
|
DEFAULT_CHAT_ITEM_ROUNDNESS: defaultChatItemRoundness,
|
||||||
|
DEFAULT_CHAT_ITEM_TAIL: true,
|
||||||
DEFAULT_ONE_HAND_UI_CARD_SHOWN: false,
|
DEFAULT_ONE_HAND_UI_CARD_SHOWN: false,
|
||||||
DEFAULT_TOOLBAR_MATERIAL: ToolbarMaterial.defaultMaterial,
|
DEFAULT_TOOLBAR_MATERIAL: ToolbarMaterial.defaultMaterial,
|
||||||
DEFAULT_CONNECT_VIA_LINK_TAB: ConnectViaLinkTab.scan.rawValue,
|
DEFAULT_CONNECT_VIA_LINK_TAB: ConnectViaLinkTab.scan.rawValue,
|
||||||
@@ -245,13 +253,14 @@ public class CodableDefault<T: Codable> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let networkProxyDefault: CodableDefault<NetworkProxy> = CodableDefault(defaults: UserDefaults.standard, forKey: DEFAULT_NETWORK_PROXY, withDefault: NetworkProxy.def)
|
||||||
|
|
||||||
struct SettingsView: View {
|
struct SettingsView: View {
|
||||||
@Environment(\.colorScheme) var colorScheme
|
@Environment(\.colorScheme) var colorScheme
|
||||||
|
@Environment(\.dismiss) var dismiss
|
||||||
@EnvironmentObject var chatModel: ChatModel
|
@EnvironmentObject var chatModel: ChatModel
|
||||||
@EnvironmentObject var sceneDelegate: SceneDelegate
|
@EnvironmentObject var sceneDelegate: SceneDelegate
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@Binding var showSettings: Bool
|
|
||||||
@State private var showProgress: Bool = false
|
@State private var showProgress: Bool = false
|
||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
@@ -260,71 +269,12 @@ struct SettingsView: View {
|
|||||||
if showProgress {
|
if showProgress {
|
||||||
progressView()
|
progressView()
|
||||||
}
|
}
|
||||||
if let la = chatModel.laRequest {
|
|
||||||
LocalAuthView(authRequest: la)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder func settingsView() -> some View {
|
@ViewBuilder func settingsView() -> some View {
|
||||||
let user = chatModel.currentUser
|
let user = chatModel.currentUser
|
||||||
NavigationView {
|
|
||||||
List {
|
List {
|
||||||
Section(header: Text("You").foregroundColor(theme.colors.secondary)) {
|
|
||||||
if let user = user {
|
|
||||||
NavigationLink {
|
|
||||||
UserProfile()
|
|
||||||
.navigationTitle("Your current profile")
|
|
||||||
.modifier(ThemedBackground())
|
|
||||||
} label: {
|
|
||||||
ProfilePreview(profileOf: user)
|
|
||||||
.padding(.leading, -8)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NavigationLink {
|
|
||||||
UserProfilesView(showSettings: $showSettings)
|
|
||||||
} label: {
|
|
||||||
settingsRow("person.crop.rectangle.stack", color: theme.colors.secondary) { Text("Your chat profiles") }
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if let user = user {
|
|
||||||
NavigationLink {
|
|
||||||
UserAddressView(shareViaProfile: user.addressShared)
|
|
||||||
.navigationTitle("SimpleX address")
|
|
||||||
.modifier(ThemedBackground(grouped: true))
|
|
||||||
.navigationBarTitleDisplayMode(.large)
|
|
||||||
} label: {
|
|
||||||
settingsRow("qrcode", color: theme.colors.secondary) { Text("Your SimpleX address") }
|
|
||||||
}
|
|
||||||
|
|
||||||
NavigationLink {
|
|
||||||
PreferencesView(profile: user.profile, preferences: user.fullPreferences, currentPreferences: user.fullPreferences)
|
|
||||||
.navigationTitle("Your preferences")
|
|
||||||
.modifier(ThemedBackground(grouped: true))
|
|
||||||
} label: {
|
|
||||||
settingsRow("switch.2", color: theme.colors.secondary) { Text("Chat preferences") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
NavigationLink {
|
|
||||||
ConnectDesktopView(viaSettings: true)
|
|
||||||
} label: {
|
|
||||||
settingsRow("desktopcomputer", color: theme.colors.secondary) { Text("Use from desktop") }
|
|
||||||
}
|
|
||||||
|
|
||||||
NavigationLink {
|
|
||||||
MigrateFromDevice(showSettings: $showSettings, showProgressOnSettings: $showProgress)
|
|
||||||
.navigationTitle("Migrate device")
|
|
||||||
.modifier(ThemedBackground(grouped: true))
|
|
||||||
.navigationBarTitleDisplayMode(.large)
|
|
||||||
} label: {
|
|
||||||
settingsRow("tray.and.arrow.up", color: theme.colors.secondary) { Text("Migrate to another device") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.disabled(chatModel.chatRunning != true)
|
|
||||||
|
|
||||||
Section(header: Text("Settings").foregroundColor(theme.colors.secondary)) {
|
Section(header: Text("Settings").foregroundColor(theme.colors.secondary)) {
|
||||||
NavigationLink {
|
NavigationLink {
|
||||||
NotificationsView()
|
NotificationsView()
|
||||||
@@ -375,14 +325,24 @@ struct SettingsView: View {
|
|||||||
}
|
}
|
||||||
.disabled(chatModel.chatRunning != true)
|
.disabled(chatModel.chatRunning != true)
|
||||||
}
|
}
|
||||||
|
|
||||||
chatDatabaseRow()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Section(header: Text("Chat database").foregroundColor(theme.colors.secondary)) {
|
||||||
|
chatDatabaseRow()
|
||||||
|
NavigationLink {
|
||||||
|
MigrateFromDevice(showProgressOnSettings: $showProgress)
|
||||||
|
.navigationTitle("Migrate device")
|
||||||
|
.modifier(ThemedBackground(grouped: true))
|
||||||
|
.navigationBarTitleDisplayMode(.large)
|
||||||
|
} label: {
|
||||||
|
settingsRow("tray.and.arrow.up", color: theme.colors.secondary) { Text("Migrate to another device") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Section(header: Text("Help").foregroundColor(theme.colors.secondary)) {
|
Section(header: Text("Help").foregroundColor(theme.colors.secondary)) {
|
||||||
if let user = user {
|
if let user = user {
|
||||||
NavigationLink {
|
NavigationLink {
|
||||||
ChatHelp(showSettings: $showSettings)
|
ChatHelp(dismissSettingsSheet: dismiss)
|
||||||
.navigationTitle("Welcome \(user.displayName)!")
|
.navigationTitle("Welcome \(user.displayName)!")
|
||||||
.modifier(ThemedBackground())
|
.modifier(ThemedBackground())
|
||||||
.frame(maxHeight: .infinity, alignment: .top)
|
.frame(maxHeight: .infinity, alignment: .top)
|
||||||
@@ -407,7 +367,7 @@ struct SettingsView: View {
|
|||||||
}
|
}
|
||||||
settingsRow("number", color: theme.colors.secondary) {
|
settingsRow("number", color: theme.colors.secondary) {
|
||||||
Button("Send questions and ideas") {
|
Button("Send questions and ideas") {
|
||||||
showSettings = false
|
dismiss()
|
||||||
DispatchQueue.main.async {
|
DispatchQueue.main.async {
|
||||||
UIApplication.shared.open(simplexTeamURL)
|
UIApplication.shared.open(simplexTeamURL)
|
||||||
}
|
}
|
||||||
@@ -456,16 +416,15 @@ struct SettingsView: View {
|
|||||||
}
|
}
|
||||||
.navigationTitle("Your settings")
|
.navigationTitle("Your settings")
|
||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
}
|
.onDisappear {
|
||||||
.onDisappear {
|
chatModel.showingTerminal = false
|
||||||
chatModel.showingTerminal = false
|
chatModel.terminalItems = []
|
||||||
chatModel.terminalItems = []
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func chatDatabaseRow() -> some View {
|
private func chatDatabaseRow() -> some View {
|
||||||
NavigationLink {
|
NavigationLink {
|
||||||
DatabaseView(showSettings: $showSettings, chatItemTTL: chatModel.chatItemTTL)
|
DatabaseView(dismissSettingsSheet: dismiss, chatItemTTL: chatModel.chatItemTTL)
|
||||||
.navigationTitle("Your chat database")
|
.navigationTitle("Your chat database")
|
||||||
.modifier(ThemedBackground(grouped: true))
|
.modifier(ThemedBackground(grouped: true))
|
||||||
} label: {
|
} label: {
|
||||||
@@ -543,26 +502,25 @@ struct ProfilePreview: View {
|
|||||||
HStack {
|
HStack {
|
||||||
ProfileImage(imageStr: profileOf.image, size: 44, color: color)
|
ProfileImage(imageStr: profileOf.image, size: 44, color: color)
|
||||||
.padding(.trailing, 6)
|
.padding(.trailing, 6)
|
||||||
.padding(.vertical, 6)
|
profileName(profileOf).lineLimit(1)
|
||||||
VStack(alignment: .leading) {
|
|
||||||
Text(profileOf.displayName)
|
|
||||||
.fontWeight(.bold)
|
|
||||||
.font(.title2)
|
|
||||||
if profileOf.fullName != "" && profileOf.fullName != profileOf.displayName {
|
|
||||||
Text(profileOf.fullName)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func profileName(_ profileOf: NamedChat) -> Text {
|
||||||
|
var t = Text(profileOf.displayName).fontWeight(.semibold).font(.title2)
|
||||||
|
if profileOf.fullName != "" && profileOf.fullName != profileOf.displayName {
|
||||||
|
t = t + Text(" (" + profileOf.fullName + ")")
|
||||||
|
// .font(.callout)
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
struct SettingsView_Previews: PreviewProvider {
|
struct SettingsView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let chatModel = ChatModel()
|
let chatModel = ChatModel()
|
||||||
chatModel.currentUser = User.sampleData
|
chatModel.currentUser = User.sampleData
|
||||||
@State var showSettings = false
|
return SettingsView()
|
||||||
|
|
||||||
return SettingsView(showSettings: $showSettings)
|
|
||||||
.environmentObject(chatModel)
|
.environmentObject(chatModel)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,7 +14,6 @@ struct UserAddressView: View {
|
|||||||
@Environment(\.dismiss) var dismiss: DismissAction
|
@Environment(\.dismiss) var dismiss: DismissAction
|
||||||
@EnvironmentObject private var chatModel: ChatModel
|
@EnvironmentObject private var chatModel: ChatModel
|
||||||
@EnvironmentObject var theme: AppTheme
|
@EnvironmentObject var theme: AppTheme
|
||||||
@State var viaCreateLinkView = false
|
|
||||||
@State var shareViaProfile = false
|
@State var shareViaProfile = false
|
||||||
@State private var aas = AutoAcceptState()
|
@State private var aas = AutoAcceptState()
|
||||||
@State private var savedAAS = AutoAcceptState()
|
@State private var savedAAS = AutoAcceptState()
|
||||||
@@ -22,7 +21,6 @@ struct UserAddressView: View {
|
|||||||
@State private var showMailView = false
|
@State private var showMailView = false
|
||||||
@State private var mailViewResult: Result<MFMailComposeResult, Error>? = nil
|
@State private var mailViewResult: Result<MFMailComposeResult, Error>? = nil
|
||||||
@State private var alert: UserAddressAlert?
|
@State private var alert: UserAddressAlert?
|
||||||
@State private var showSaveDialogue = false
|
|
||||||
@State private var progressIndicator = false
|
@State private var progressIndicator = false
|
||||||
@FocusState private var keyboardVisible: Bool
|
@FocusState private var keyboardVisible: Bool
|
||||||
|
|
||||||
@@ -44,26 +42,19 @@ struct UserAddressView: View {
|
|||||||
|
|
||||||
var body: some View {
|
var body: some View {
|
||||||
ZStack {
|
ZStack {
|
||||||
if viaCreateLinkView {
|
userAddressScrollView()
|
||||||
userAddressScrollView()
|
.onDisappear {
|
||||||
} else {
|
if savedAAS != aas {
|
||||||
userAddressScrollView()
|
showAlert(
|
||||||
.modifier(BackButton(disabled: Binding.constant(false)) {
|
title: NSLocalizedString("Auto-accept settings", comment: "alert title"),
|
||||||
if savedAAS == aas {
|
message: NSLocalizedString("Settings were changed.", comment: "alert message"),
|
||||||
dismiss()
|
buttonTitle: NSLocalizedString("Save", comment: "alert button"),
|
||||||
} else {
|
buttonAction: saveAAS,
|
||||||
keyboardVisible = false
|
cancelButton: true
|
||||||
showSaveDialogue = true
|
)
|
||||||
}
|
|
||||||
})
|
|
||||||
.confirmationDialog("Save settings?", isPresented: $showSaveDialogue) {
|
|
||||||
Button("Save auto-accept settings") {
|
|
||||||
saveAAS()
|
|
||||||
dismiss()
|
|
||||||
}
|
|
||||||
Button("Exit without saving") { dismiss() }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if progressIndicator {
|
if progressIndicator {
|
||||||
ZStack {
|
ZStack {
|
||||||
if chatModel.userAddress != nil {
|
if chatModel.userAddress != nil {
|
||||||
@@ -342,7 +333,7 @@ struct UserAddressView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private struct AutoAcceptState: Equatable {
|
private struct AutoAcceptState: Equatable {
|
||||||
var enable = false
|
var enable = false
|
||||||
var incognito = false
|
var incognito = false
|
||||||
@@ -447,6 +438,8 @@ struct UserAddressView_Previews: PreviewProvider {
|
|||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
let chatModel = ChatModel()
|
let chatModel = ChatModel()
|
||||||
chatModel.userAddress = UserContactLink(connReqContact: "https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D")
|
chatModel.userAddress = UserContactLink(connReqContact: "https://simplex.chat/contact#/?v=1&smp=smp%3A%2F%2FPQUV2eL0t7OStZOoAsPEV2QYWt4-xilbakvGUGOItUo%3D%40smp6.simplex.im%2FK1rslx-m5bpXVIdMZg9NLUZ_8JBm8xTt%23MCowBQYDK2VuAyEALDeVe-sG8mRY22LsXlPgiwTNs9dbiLrNuA7f3ZMAJ2w%3D")
|
||||||
|
|
||||||
|
|
||||||
return Group {
|
return Group {
|
||||||
UserAddressView()
|
UserAddressView()
|
||||||
.environmentObject(chatModel)
|
.environmentObject(chatModel)
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -9,7 +9,6 @@ import SimpleXChat
|
|||||||
struct UserProfilesView: View {
|
struct UserProfilesView: View {
|
||||||
@EnvironmentObject private var m: ChatModel
|
@EnvironmentObject private var m: ChatModel
|
||||||
@EnvironmentObject private var theme: AppTheme
|
@EnvironmentObject private var theme: AppTheme
|
||||||
@Binding var showSettings: Bool
|
|
||||||
@Environment(\.editMode) private var editMode
|
@Environment(\.editMode) private var editMode
|
||||||
@AppStorage(DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE) private var showHiddenProfilesNotice = true
|
@AppStorage(DEFAULT_SHOW_HIDDEN_PROFILES_NOTICE) private var showHiddenProfilesNotice = true
|
||||||
@AppStorage(DEFAULT_SHOW_MUTE_PROFILE_ALERT) private var showMuteProfileAlert = true
|
@AppStorage(DEFAULT_SHOW_MUTE_PROFILE_ALERT) private var showMuteProfileAlert = true
|
||||||
@@ -96,8 +95,7 @@ struct UserProfilesView: View {
|
|||||||
} label: {
|
} label: {
|
||||||
Label("Add profile", systemImage: "plus")
|
Label("Add profile", systemImage: "plus")
|
||||||
}
|
}
|
||||||
.frame(height: 44)
|
.frame(height: 38)
|
||||||
.padding(.vertical, 4)
|
|
||||||
}
|
}
|
||||||
} footer: {
|
} footer: {
|
||||||
Text("Tap to activate profile.")
|
Text("Tap to activate profile.")
|
||||||
@@ -285,7 +283,7 @@ struct UserProfilesView: View {
|
|||||||
await MainActor.run {
|
await MainActor.run {
|
||||||
onboardingStageDefault.set(.step1_SimpleXInfo)
|
onboardingStageDefault.set(.step1_SimpleXInfo)
|
||||||
m.onboardingStage = .step1_SimpleXInfo
|
m.onboardingStage = .step1_SimpleXInfo
|
||||||
showSettings = false
|
dismissAllSheets()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -308,14 +306,14 @@ struct UserProfilesView: View {
|
|||||||
Task {
|
Task {
|
||||||
do {
|
do {
|
||||||
try await changeActiveUserAsync_(user.userId, viewPwd: userViewPassword(user))
|
try await changeActiveUserAsync_(user.userId, viewPwd: userViewPassword(user))
|
||||||
|
dismissAllSheets()
|
||||||
} catch {
|
} catch {
|
||||||
await MainActor.run { alert = .activateUserError(error: responseError(error)) }
|
await MainActor.run { alert = .activateUserError(error: responseError(error)) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} label: {
|
} label: {
|
||||||
HStack {
|
HStack {
|
||||||
ProfileImage(imageStr: user.image, size: 44)
|
ProfileImage(imageStr: user.image, size: 38)
|
||||||
.padding(.vertical, 4)
|
|
||||||
.padding(.trailing, 12)
|
.padding(.trailing, 12)
|
||||||
Text(user.chatViewName)
|
Text(user.chatViewName)
|
||||||
Spacer()
|
Spacer()
|
||||||
@@ -406,8 +404,15 @@ public func chatPasswordHash(_ pwd: String, _ salt: String) -> String {
|
|||||||
return hash
|
return hash
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public func correctPassword(_ user: User, _ pwd: String) -> Bool {
|
||||||
|
if let ph = user.viewPwdHash {
|
||||||
|
return pwd != "" && chatPasswordHash(pwd, ph.salt) == ph.hash
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
struct UserProfilesView_Previews: PreviewProvider {
|
struct UserProfilesView_Previews: PreviewProvider {
|
||||||
static var previews: some View {
|
static var previews: some View {
|
||||||
UserProfilesView(showSettings: Binding.constant(true))
|
UserProfilesView()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<target>%@ иска да се свърже!</target>
|
<target>%@ иска да се свърже!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ и %lld членове</target>
|
<target>%@, %@ и %lld членове</target>
|
||||||
@@ -157,11 +161,31 @@
|
|||||||
<target>%d дни</target>
|
<target>%d дни</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d часа</target>
|
<target>%d часа</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d мин.</target>
|
<target>%d мин.</target>
|
||||||
@@ -1003,6 +1027,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="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Назад</target>
|
<target>Назад</target>
|
||||||
@@ -1167,7 +1195,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Отказ</target>
|
<target>Отказ</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1186,7 +1214,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Файлът не може да бъде получен</target>
|
<target>Файлът не може да бъде получен</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1310,6 +1338,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="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -1685,6 +1717,10 @@ This is your own one-time link!</source>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>Поправи име на %@?</target>
|
<target>Поправи име на %@?</target>
|
||||||
@@ -2334,6 +2370,10 @@ This is your own one-time link!</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="Do not use credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Не създавай адрес</target>
|
<target>Не създавай адрес</target>
|
||||||
@@ -2357,7 +2397,8 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Изтегли</target>
|
<target>Изтегли</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2373,6 +2414,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Свали файл</target>
|
<target>Свали файл</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2645,6 +2690,10 @@ This is your own one-time link!</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="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Грешка при промяна на ролята</target>
|
<target>Грешка при промяна на ролята</target>
|
||||||
@@ -2655,6 +2704,10 @@ This is your own one-time link!</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="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2773,6 +2826,10 @@ This is your own one-time link!</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="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Грешка при отваряне на чата</target>
|
<target>Грешка при отваряне на чата</target>
|
||||||
@@ -2781,7 +2838,7 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Грешка при получаване на файл</target>
|
<target>Грешка при получаване на файл</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2870,6 +2927,10 @@ This is your own one-time link!</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="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Грешка при смяна на профил!</target>
|
<target>Грешка при смяна на профил!</target>
|
||||||
@@ -3003,6 +3064,11 @@ This is your own one-time link!</source>
|
|||||||
<source>File error</source>
|
<source>File error</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<note>file error text</note>
|
<note>file error text</note>
|
||||||
@@ -3133,11 +3199,23 @@ This is your own one-time link!</source>
|
|||||||
<target>Препрати</target>
|
<target>Препрати</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</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="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Препратено</target>
|
<target>Препратено</target>
|
||||||
@@ -3148,6 +3226,10 @@ This is your own one-time link!</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="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3190,11 +3272,6 @@ Error: %2$@</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="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Пълно име:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Напълно децентрализирана – видима е само за членовете.</target>
|
<target>Напълно децентрализирана – видима е само за членовете.</target>
|
||||||
@@ -3438,6 +3515,10 @@ Error: %2$@</source>
|
|||||||
<target>ICE сървъри (по един на ред)</target>
|
<target>ICE сървъри (по един на ред)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Ако не можете да се срещнете лично, покажете QR код във видеоразговора или споделете линка.</target>
|
<target>Ако не можете да се срещнете лично, покажете QR код във видеоразговора или споделете линка.</target>
|
||||||
@@ -4069,6 +4150,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Message servers</source>
|
<source>Message servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>Източникът на съобщението остава скрит.</target>
|
<target>Източникът на съобщението остава скрит.</target>
|
||||||
@@ -4115,6 +4200,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Messages sent</source>
|
<source>Messages sent</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Съобщенията, файловете и разговорите са защитени чрез **криптиране от край до край** с перфектна секретност при препращане, правдоподобно опровержение и възстановяване при взлом.</target>
|
<target>Съобщенията, файловете и разговорите са защитени чрез **криптиране от край до край** с перфектна секретност при препращане, правдоподобно опровержение и възстановяване при взлом.</target>
|
||||||
@@ -4404,6 +4493,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Nothing selected</source>
|
<source>Nothing selected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Известия</target>
|
<target>Известия</target>
|
||||||
@@ -4436,7 +4529,7 @@ This is your link for group %@!</source>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ок</target>
|
<target>Ок</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4624,6 +4717,11 @@ Requires compatible VPN.</source>
|
|||||||
<source>Other %@ servers</source>
|
<source>Other %@ servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4659,6 +4757,10 @@ Requires compatible VPN.</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="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Парола за показване</target>
|
<target>Парола за показване</target>
|
||||||
@@ -4803,6 +4905,10 @@ Error: %@</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="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Въжможно е пръстовият отпечатък на сертификата в адреса на сървъра да е неправилен</target>
|
<target>Въжможно е пръстовият отпечатък на сертификата в адреса на сървъра да е неправилен</target>
|
||||||
@@ -4883,16 +4989,6 @@ Error: %@</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="Profile name" xml:space="preserve">
|
|
||||||
<source>Profile name</source>
|
|
||||||
<target>Име на профила</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Profile name:" xml:space="preserve">
|
|
||||||
<source>Profile name:</source>
|
|
||||||
<target>Име на профила:</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>Профилна парола</target>
|
<target>Профилна парола</target>
|
||||||
@@ -4989,6 +5085,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Proxied servers</source>
|
<source>Proxied servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Push известия</target>
|
<target>Push известия</target>
|
||||||
@@ -5200,6 +5300,10 @@ Enable in *Network & servers* 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="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5373,6 +5477,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>SMP server</source>
|
<source>SMP server</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5385,12 +5493,13 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Запази</target>
|
<target>Запази</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Запази (и уведоми контактите)</target>
|
<target>Запази (и уведоми контактите)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5416,11 +5525,6 @@ Enable in *Network & servers* 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="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Запази настройките за автоматично приемане</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Запази профила на групата</target>
|
<target>Запази профила на групата</target>
|
||||||
@@ -5456,16 +5560,15 @@ Enable in *Network & servers* 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="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Запази настройките?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</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="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Запазено</target>
|
<target>Запазено</target>
|
||||||
@@ -5486,6 +5589,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Запазено съобщение</target>
|
<target>Запазено съобщение</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5562,6 +5669,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Избери</target>
|
<target>Избери</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5674,7 +5785,7 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Подателят отмени прехвърлянето на файла.</target>
|
<target>Подателят отмени прехвърлянето на файла.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -5877,6 +5988,10 @@ Enable in *Network & servers* 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="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Променете формата на профилните изображения</target>
|
<target>Променете формата на профилните изображения</target>
|
||||||
@@ -5911,6 +6026,10 @@ Enable in *Network & servers* 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="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Сподели този еднократен линк за връзка</target>
|
<target>Сподели този еднократен линк за връзка</target>
|
||||||
@@ -6069,6 +6188,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Soft</source>
|
<source>Soft</source>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6235,6 +6358,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Направи снимка</target>
|
<target>Направи снимка</target>
|
||||||
@@ -6423,6 +6550,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<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="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6694,7 +6825,7 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -6804,6 +6935,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Използвай .onion хостове</target>
|
<target>Използвай .onion хостове</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Използвай сървърите на SimpleX Chat?</target>
|
<target>Използвай сървърите на SimpleX Chat?</target>
|
||||||
@@ -6875,6 +7010,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<source>User selection</source>
|
<source>User selection</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Използват се сървърите на SimpleX Chat.</target>
|
<target>Използват се сървърите на SimpleX Chat.</target>
|
||||||
@@ -7104,7 +7243,7 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7475,11 +7614,19 @@ Repeat connection request?</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 chat preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Вашият контакт изпрати файл, който е по-голям от поддържания в момента максимален размер (%@).</target>
|
<target>Вашият контакт изпрати файл, който е по-голям от поддържания в момента максимален размер (%@).</target>
|
||||||
@@ -7495,6 +7642,10 @@ Repeat connection request?</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 credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Вашата текуща чат база данни ще бъде ИЗТРИТА и ЗАМЕНЕНА с импортираната.</target>
|
<target>Вашата текуща чат база данни ще бъде ИЗТРИТА и ЗАМЕНЕНА с импортираната.</target>
|
||||||
@@ -7525,13 +7676,15 @@ Repeat connection request?</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 is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<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="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство.</target>
|
<target>Вашият профил, контакти и доставени съобщения се съхраняват на вашето устройство.</target>
|
||||||
|
|||||||
@@ -135,6 +135,10 @@
|
|||||||
<target>%@ se chce připojit!</target>
|
<target>%@ se chce připojit!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -154,11 +158,31 @@
|
|||||||
<target>%d dní</target>
|
<target>%d dní</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d hodin</target>
|
<target>%d hodin</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d minuty</target>
|
<target>%d minuty</target>
|
||||||
@@ -973,6 +997,10 @@
|
|||||||
<target>Automaticky přijímat obrázky</target>
|
<target>Automaticky přijímat obrázky</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Zpět</target>
|
<target>Zpět</target>
|
||||||
@@ -1127,7 +1155,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Zrušit</target>
|
<target>Zrušit</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1145,7 +1173,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Nelze přijmout soubor</target>
|
<target>Nelze přijmout soubor</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1266,6 +1294,10 @@
|
|||||||
<target>Předvolby chatu</target>
|
<target>Předvolby chatu</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -1623,6 +1655,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Verze jádra: v%@</target>
|
<target>Verze jádra: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2255,6 +2291,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Do not send history to new members.</source>
|
<source>Do not send history to new members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Do not use credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Nevytvářet adresu</target>
|
<target>Nevytvářet adresu</target>
|
||||||
@@ -2277,7 +2317,8 @@ This is your own one-time link!</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2292,6 +2333,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Stáhnout soubor</target>
|
<target>Stáhnout soubor</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2552,6 +2597,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Chuba změny adresy</target>
|
<target>Chuba změny adresy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Chyba při změně role</target>
|
<target>Chyba při změně role</target>
|
||||||
@@ -2562,6 +2611,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Chyba změny nastavení</target>
|
<target>Chyba změny nastavení</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2678,6 +2731,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Chyba načítání %@ serverů</target>
|
<target>Chyba načítání %@ serverů</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2685,7 +2742,7 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Chyba při příjmu souboru</target>
|
<target>Chyba při příjmu souboru</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2772,6 +2829,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Chyba při zastavení chatu</target>
|
<target>Chyba při zastavení chatu</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Chyba při přepínání profilu!</target>
|
<target>Chyba při přepínání profilu!</target>
|
||||||
@@ -2900,6 +2961,11 @@ This is your own one-time link!</source>
|
|||||||
<source>File error</source>
|
<source>File error</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<note>file error text</note>
|
<note>file error text</note>
|
||||||
@@ -3026,10 +3092,22 @@ This is your own one-time link!</source>
|
|||||||
<source>Forward</source>
|
<source>Forward</source>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3038,6 +3116,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Forwarded from</source>
|
<source>Forwarded from</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3079,11 +3161,6 @@ Error: %2$@</source>
|
|||||||
<target>Celé jméno (volitelně)</target>
|
<target>Celé jméno (volitelně)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Celé jméno:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3321,6 +3398,10 @@ Error: %2$@</source>
|
|||||||
<target>Servery ICE (jeden na řádek)</target>
|
<target>Servery ICE (jeden na řádek)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Pokud se nemůžete setkat osobně, zobrazte QR kód ve videohovoru nebo sdílejte odkaz.</target>
|
<target>Pokud se nemůžete setkat osobně, zobrazte QR kód ve videohovoru nebo sdílejte odkaz.</target>
|
||||||
@@ -3928,6 +4009,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Message servers</source>
|
<source>Message servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3971,6 +4056,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Messages sent</source>
|
<source>Messages sent</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -4245,6 +4334,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Nothing selected</source>
|
<source>Nothing selected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Oznámení</target>
|
<target>Oznámení</target>
|
||||||
@@ -4276,7 +4369,7 @@ This is your link for group %@!</source>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ok</target>
|
<target>Ok</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4456,6 +4549,11 @@ Vyžaduje povolení sítě VPN.</target>
|
|||||||
<source>Other %@ servers</source>
|
<source>Other %@ servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>Počet PING</target>
|
<target>Počet PING</target>
|
||||||
@@ -4491,6 +4589,10 @@ Vyžaduje povolení sítě VPN.</target>
|
|||||||
<target>Heslo nastaveno!</target>
|
<target>Heslo nastaveno!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Heslo k zobrazení</target>
|
<target>Heslo k zobrazení</target>
|
||||||
@@ -4627,6 +4729,10 @@ Error: %@</source>
|
|||||||
<target>Polské rozhraní</target>
|
<target>Polské rozhraní</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Je možné, že otisk certifikátu v adrese serveru je nesprávný</target>
|
<target>Je možné, že otisk certifikátu v adrese serveru je nesprávný</target>
|
||||||
@@ -4705,14 +4811,6 @@ Error: %@</source>
|
|||||||
<source>Profile images</source>
|
<source>Profile images</source>
|
||||||
<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>Heslo profilu</target>
|
<target>Heslo profilu</target>
|
||||||
@@ -4808,6 +4906,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Proxied servers</source>
|
<source>Proxied servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Nabízená oznámení</target>
|
<target>Nabízená oznámení</target>
|
||||||
@@ -5014,6 +5116,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Odstranit</target>
|
<target>Odstranit</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5181,6 +5287,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>SMP server</source>
|
<source>SMP server</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5192,12 +5302,13 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Uložit</target>
|
<target>Uložit</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Uložit (a informovat kontakty)</target>
|
<target>Uložit (a informovat kontakty)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5223,11 +5334,6 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Uložit archiv</target>
|
<target>Uložit archiv</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Uložit nastavení automatického přijímání</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Uložení profilu skupiny</target>
|
<target>Uložení profilu skupiny</target>
|
||||||
@@ -5263,16 +5369,15 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Uložit servery?</target>
|
<target>Uložit servery?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Uložit nastavení?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Uložit uvítací zprávu?</target>
|
<target>Uložit uvítací zprávu?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5290,6 +5395,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Saved message</source>
|
<source>Saved message</source>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5363,6 +5472,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Vybrat</target>
|
<target>Vybrat</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5474,7 +5587,7 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Odesílatel zrušil přenos souboru.</target>
|
<target>Odesílatel zrušil přenos souboru.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -5675,6 +5788,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Nastavení</target>
|
<target>Nastavení</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5708,6 +5825,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Sdílet odkaz</target>
|
<target>Sdílet odkaz</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5862,6 +5983,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Soft</source>
|
<source>Soft</source>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6024,6 +6149,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Vyfotit</target>
|
<target>Vyfotit</target>
|
||||||
@@ -6207,6 +6336,10 @@ Může se to stát kvůli nějaké chybě, nebo pokud je spojení kompromitován
|
|||||||
<source>The text you pasted is not a SimpleX link.</source>
|
<source>The text you pasted is not a SimpleX link.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6465,7 +6598,7 @@ Před zapnutím této funkce budete vyzváni k dokončení ověření.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -6570,6 +6703,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
|
|||||||
<target>Použít hostitele .onion</target>
|
<target>Použít hostitele .onion</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Používat servery SimpleX Chat?</target>
|
<target>Používat servery SimpleX Chat?</target>
|
||||||
@@ -6638,6 +6775,10 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
|
|||||||
<source>User selection</source>
|
<source>User selection</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Používat servery SimpleX Chat.</target>
|
<target>Používat servery SimpleX Chat.</target>
|
||||||
@@ -6850,7 +6991,7 @@ Chcete-li se připojit, požádejte svůj kontakt o vytvoření dalšího odkazu
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7204,11 +7345,19 @@ Repeat connection request?</source>
|
|||||||
<target>Vaše chat databáze není šifrována – nastavte přístupovou frázi pro její šifrování.</target>
|
<target>Vaše chat databáze není šifrována – nastavte přístupovou frázi pro její šifrování.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your chat preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>Vaše chat profily</target>
|
<target>Vaše chat profily</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Kontakt odeslal soubor, který je větší než aktuálně podporovaná maximální velikost (%@).</target>
|
<target>Kontakt odeslal soubor, který je větší než aktuálně podporovaná maximální velikost (%@).</target>
|
||||||
@@ -7224,6 +7373,10 @@ Repeat connection request?</source>
|
|||||||
<target>Vaše kontakty zůstanou připojeny.</target>
|
<target>Vaše kontakty zůstanou připojeny.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Vaše aktuální chat databáze bude ODSTRANĚNA a NAHRAZENA importovanou.</target>
|
<target>Vaše aktuální chat databáze bude ODSTRANĚNA a NAHRAZENA importovanou.</target>
|
||||||
@@ -7253,13 +7406,15 @@ Repeat connection request?</source>
|
|||||||
<target>Váš profil **%@** bude sdílen.</target>
|
<target>Váš profil **%@** bude sdílen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty. Servery SimpleX nevidí váš profil.</target>
|
||||||
<target>Váš profil je uložen ve vašem zařízení a sdílen pouze s vašimi kontakty.
|
|
||||||
Servery SimpleX nevidí váš profil.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Váš profil, kontakty a doručené zprávy jsou uloženy ve vašem zařízení.</target>
|
<target>Váš profil, kontakty a doručené zprávy jsou uloženy ve vašem zařízení.</target>
|
||||||
|
|||||||
@@ -137,6 +137,11 @@
|
|||||||
<target>%@ will sich mit Ihnen verbinden!</target>
|
<target>%@ will sich mit Ihnen verbinden!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<target>%1$@, %2$@</target>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ und %lld Mitglieder</target>
|
<target>%@, %@ und %lld Mitglieder</target>
|
||||||
@@ -157,11 +162,31 @@
|
|||||||
<target>%d Tage</target>
|
<target>%d Tage</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d Stunden</target>
|
<target>%d Stunden</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d min</target>
|
<target>%d min</target>
|
||||||
@@ -1020,6 +1045,11 @@
|
|||||||
<target>Bilder automatisch akzeptieren</target>
|
<target>Bilder automatisch akzeptieren</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<target>Einstellungen automatisch akzeptieren</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Zurück</target>
|
<target>Zurück</target>
|
||||||
@@ -1193,7 +1223,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Abbrechen</target>
|
<target>Abbrechen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1213,7 +1243,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Datei kann nicht empfangen werden</target>
|
<target>Datei kann nicht empfangen werden</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1341,6 +1371,11 @@
|
|||||||
<target>Chat-Präferenzen</target>
|
<target>Chat-Präferenzen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<target>Die Chat-Präferenzen wurden geändert.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<target>Chat-Design</target>
|
<target>Chat-Design</target>
|
||||||
@@ -1393,22 +1428,22 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Clear" xml:space="preserve">
|
<trans-unit id="Clear" xml:space="preserve">
|
||||||
<source>Clear</source>
|
<source>Clear</source>
|
||||||
<target>Löschen</target>
|
<target>Entfernen</target>
|
||||||
<note>swipe action</note>
|
<note>swipe action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Clear conversation" xml:space="preserve">
|
<trans-unit id="Clear conversation" xml:space="preserve">
|
||||||
<source>Clear conversation</source>
|
<source>Clear conversation</source>
|
||||||
<target>Chatinhalte löschen</target>
|
<target>Chat-Inhalte entfernen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Clear conversation?" xml:space="preserve">
|
<trans-unit id="Clear conversation?" xml:space="preserve">
|
||||||
<source>Clear conversation?</source>
|
<source>Clear conversation?</source>
|
||||||
<target>Unterhaltung löschen?</target>
|
<target>Chat-Inhalte entfernen?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Clear private notes?" xml:space="preserve">
|
<trans-unit id="Clear private notes?" xml:space="preserve">
|
||||||
<source>Clear private notes?</source>
|
<source>Clear private notes?</source>
|
||||||
<target>Private Notizen löschen?</target>
|
<target>Private Notizen entfernen?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Clear verification" xml:space="preserve">
|
<trans-unit id="Clear verification" xml:space="preserve">
|
||||||
@@ -1722,7 +1757,7 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Conversation deleted!" xml:space="preserve">
|
<trans-unit id="Conversation deleted!" xml:space="preserve">
|
||||||
<source>Conversation deleted!</source>
|
<source>Conversation deleted!</source>
|
||||||
<target>Unterhaltung gelöscht!</target>
|
<target>Chat-Inhalte entfernt!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Copy" xml:space="preserve">
|
<trans-unit id="Copy" xml:space="preserve">
|
||||||
@@ -1740,6 +1775,11 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<target>Ecke</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>Richtiger Name für %@?</target>
|
<target>Richtiger Name für %@?</target>
|
||||||
@@ -2409,6 +2449,10 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Den Nachrichtenverlauf nicht an neue Mitglieder senden.</target>
|
<target>Den Nachrichtenverlauf nicht an neue Mitglieder senden.</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 credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Keine Adresse erstellt</target>
|
<target>Keine Adresse erstellt</target>
|
||||||
@@ -2432,7 +2476,8 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Herunterladen</target>
|
<target>Herunterladen</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2449,6 +2494,10 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Datei herunterladen</target>
|
<target>Datei herunterladen</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<target>Heruntergeladen</target>
|
<target>Heruntergeladen</target>
|
||||||
@@ -2724,6 +2773,11 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Fehler beim Wechseln der Empfängeradresse</target>
|
<target>Fehler beim Wechseln der Empfängeradresse</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<target>Fehler beim Wechseln des Verbindungs-Profils</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Fehler beim Ändern der Rolle</target>
|
<target>Fehler beim Ändern der Rolle</target>
|
||||||
@@ -2734,6 +2788,11 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Fehler beim Ändern der Einstellung</target>
|
<target>Fehler beim Ändern der Einstellung</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<target>Fehler beim Wechseln zum Inkognito-Profil!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<target>Fehler beim Verbinden mit dem Weiterleitungsserver %@. Bitte versuchen Sie es später erneut.</target>
|
<target>Fehler beim Verbinden mit dem Weiterleitungsserver %@. Bitte versuchen Sie es später erneut.</target>
|
||||||
@@ -2854,6 +2913,11 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Fehler beim Laden von %@ Servern</target>
|
<target>Fehler beim Laden von %@ Servern</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<target>Fehler beim Migrieren der Einstellungen</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Fehler beim Öffnen des Chats</target>
|
<target>Fehler beim Öffnen des Chats</target>
|
||||||
@@ -2862,7 +2926,7 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Fehler beim Empfangen der Datei</target>
|
<target>Fehler beim Empfangen der Datei</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2954,6 +3018,11 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Fehler beim Beenden des Chats</target>
|
<target>Fehler beim Beenden des Chats</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<target>Fehler beim Wechseln des Profils</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Fehler beim Umschalten des Profils!</target>
|
<target>Fehler beim Umschalten des Profils!</target>
|
||||||
@@ -3090,6 +3159,11 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Datei-Fehler</target>
|
<target>Datei-Fehler</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<target>Datei nicht gefunden - höchstwahrscheinlich wurde die Datei gelöscht oder der Transfer abgebrochen.</target>
|
<target>Datei nicht gefunden - höchstwahrscheinlich wurde die Datei gelöscht oder der Transfer abgebrochen.</target>
|
||||||
@@ -3225,11 +3299,23 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Weiterleiten</target>
|
<target>Weiterleiten</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<target>Nachrichten weiterleiten und speichern</target>
|
<target>Nachrichten weiterleiten und speichern</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Weitergeleitet</target>
|
<target>Weitergeleitet</target>
|
||||||
@@ -3240,6 +3326,10 @@ Das ist Ihr eigener Einmal-Link!</target>
|
|||||||
<target>Weitergeleitet aus</target>
|
<target>Weitergeleitet aus</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<target>Weiterleitungsserver %@ konnte sich nicht mit dem Zielserver %@ verbinden. Bitte versuchen Sie es später erneut.</target>
|
<target>Weiterleitungsserver %@ konnte sich nicht mit dem Zielserver %@ verbinden. Bitte versuchen Sie es später erneut.</target>
|
||||||
@@ -3289,11 +3379,6 @@ Fehler: %2$@</target>
|
|||||||
<target>Vollständiger Name (optional)</target>
|
<target>Vollständiger Name (optional)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Vollständiger Name:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Vollständig dezentralisiert – nur für Mitglieder sichtbar.</target>
|
<target>Vollständig dezentralisiert – nur für Mitglieder sichtbar.</target>
|
||||||
@@ -3451,7 +3536,7 @@ Fehler: %2$@</target>
|
|||||||
</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>Die Gruppe wird für Sie gelöscht. Dies kann nicht rückgängig gemacht werden!</target>
|
<target>Die Gruppe wird nur bei Ihnen gelöscht. Dies kann nicht rückgängig gemacht werden!</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">
|
||||||
@@ -3539,6 +3624,10 @@ Fehler: %2$@</target>
|
|||||||
<target>ICE-Server (einer pro Zeile)</target>
|
<target>ICE-Server (einer pro Zeile)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Falls Sie sich nicht persönlich treffen können, zeigen Sie den QR-Code in einem Videoanruf oder teilen Sie den Link.</target>
|
<target>Falls Sie sich nicht persönlich treffen können, zeigen Sie den QR-Code in einem Videoanruf oder teilen Sie den Link.</target>
|
||||||
@@ -3906,7 +3995,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Keep conversation" xml:space="preserve">
|
<trans-unit id="Keep conversation" xml:space="preserve">
|
||||||
<source>Keep conversation</source>
|
<source>Keep conversation</source>
|
||||||
<target>Unterhaltung behalten</target>
|
<target>Chat-Inhalte beibehalten</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">
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
@@ -4184,6 +4273,11 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
|||||||
<target>Nachrichten-Server</target>
|
<target>Nachrichten-Server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<target>Nachrichten-Form</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>Die Nachrichtenquelle bleibt privat.</target>
|
<target>Die Nachrichtenquelle bleibt privat.</target>
|
||||||
@@ -4234,6 +4328,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
|||||||
<target>Gesendete Nachrichten</target>
|
<target>Gesendete Nachrichten</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Nachrichten, Dateien und Anrufe sind durch **Ende-zu-Ende-Verschlüsselung** mit Perfect Forward Secrecy, Ablehnung und Einbruchs-Wiederherstellung geschützt.</target>
|
<target>Nachrichten, Dateien und Anrufe sind durch **Ende-zu-Ende-Verschlüsselung** mit Perfect Forward Secrecy, Ablehnung und Einbruchs-Wiederherstellung geschützt.</target>
|
||||||
@@ -4529,6 +4627,10 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
|||||||
<target>Nichts ausgewählt</target>
|
<target>Nichts ausgewählt</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Benachrichtigungen</target>
|
<target>Benachrichtigungen</target>
|
||||||
@@ -4561,7 +4663,7 @@ Das ist Ihr Link für die Gruppe %@!</target>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ok</target>
|
<target>Ok</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4604,7 +4706,7 @@ Dies erfordert die Aktivierung eines VPNs.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Only delete conversation" xml:space="preserve">
|
<trans-unit id="Only delete conversation" xml:space="preserve">
|
||||||
<source>Only delete conversation</source>
|
<source>Only delete conversation</source>
|
||||||
<target>Nur die Unterhaltung löschen</target>
|
<target>Nur die Chat-Inhalte löschen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Only group owners can change group preferences." xml:space="preserve">
|
<trans-unit id="Only group owners can change group preferences." xml:space="preserve">
|
||||||
@@ -4752,6 +4854,11 @@ Dies erfordert die Aktivierung eines VPNs.</target>
|
|||||||
<target>Andere %@ Server</target>
|
<target>Andere %@ Server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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-Zähler</target>
|
<target>PING-Zähler</target>
|
||||||
@@ -4787,6 +4894,10 @@ Dies erfordert die Aktivierung eines VPNs.</target>
|
|||||||
<target>Zugangscode eingestellt!</target>
|
<target>Zugangscode eingestellt!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Passwort anzeigen</target>
|
<target>Passwort anzeigen</target>
|
||||||
@@ -4936,6 +5047,10 @@ Fehler: %@</target>
|
|||||||
<target>Polnische Bedienoberfläche</target>
|
<target>Polnische Bedienoberfläche</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Der Fingerabdruck des Zertifikats in der Serveradresse ist wahrscheinlich ungültig</target>
|
<target>Der Fingerabdruck des Zertifikats in der Serveradresse ist wahrscheinlich ungültig</target>
|
||||||
@@ -5021,16 +5136,6 @@ Fehler: %@</target>
|
|||||||
<target>Profil-Bilder</target>
|
<target>Profil-Bilder</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>Profilname</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Profile name:" xml:space="preserve">
|
|
||||||
<source>Profile name:</source>
|
|
||||||
<target>Profilname:</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>Passwort für Profil</target>
|
<target>Passwort für Profil</target>
|
||||||
@@ -5133,6 +5238,10 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Proxy-Server</target>
|
<target>Proxy-Server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Push-Benachrichtigungen</target>
|
<target>Push-Benachrichtigungen</target>
|
||||||
@@ -5155,7 +5264,7 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Reachable chat toolbar" xml:space="preserve">
|
<trans-unit id="Reachable chat toolbar" xml:space="preserve">
|
||||||
<source>Reachable chat toolbar</source>
|
<source>Reachable chat toolbar</source>
|
||||||
<target>Erreichbare Chat-Symbolleiste</target>
|
<target>Chat-Symbolleiste unten</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="React…" xml:space="preserve">
|
<trans-unit id="React…" xml:space="preserve">
|
||||||
@@ -5354,6 +5463,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Entfernen</target>
|
<target>Entfernen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<target>Archiv entfernen?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<target>Bild entfernen</target>
|
<target>Bild entfernen</target>
|
||||||
@@ -5534,6 +5648,10 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>SMP-Server</target>
|
<target>SMP-Server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Dateien sicher empfangen</target>
|
<target>Dateien sicher empfangen</target>
|
||||||
@@ -5547,12 +5665,13 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Speichern</target>
|
<target>Speichern</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Speichern (und Kontakte benachrichtigen)</target>
|
<target>Speichern (und Kontakte benachrichtigen)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5579,11 +5698,6 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Archiv speichern</target>
|
<target>Archiv speichern</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Einstellungen von "Automatisch akzeptieren" speichern</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Gruppenprofil speichern</target>
|
<target>Gruppenprofil speichern</target>
|
||||||
@@ -5619,16 +5733,16 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Alle Server speichern?</target>
|
<target>Alle Server speichern?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Einstellungen speichern?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Begrüßungsmeldung speichern?</target>
|
<target>Begrüßungsmeldung speichern?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<target>Ihr Profil speichern?</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Abgespeichert</target>
|
<target>Abgespeichert</target>
|
||||||
@@ -5649,6 +5763,10 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Gespeicherte Nachricht</target>
|
<target>Gespeicherte Nachricht</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<target>Skalieren</target>
|
<target>Skalieren</target>
|
||||||
@@ -5696,7 +5814,7 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Search or paste SimpleX link" xml:space="preserve">
|
<trans-unit id="Search or paste SimpleX link" xml:space="preserve">
|
||||||
<source>Search or paste SimpleX link</source>
|
<source>Search or paste SimpleX link</source>
|
||||||
<target>Suchen oder fügen Sie den SimpleX-Link ein</target>
|
<target>Suchen oder SimpleX-Link einfügen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Secondary" xml:space="preserve">
|
<trans-unit id="Secondary" xml:space="preserve">
|
||||||
@@ -5729,6 +5847,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Auswählen</target>
|
<target>Auswählen</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<target>Chat-Profil auswählen</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<target>%lld ausgewählt</target>
|
<target>%lld ausgewählt</target>
|
||||||
@@ -5847,7 +5970,7 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Der Absender hat die Dateiübertragung abgebrochen.</target>
|
<target>Der Absender hat die Dateiübertragung abgebrochen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -6064,6 +6187,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Einstellungen</target>
|
<target>Einstellungen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<target>Die Einstellungen wurden geändert.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Form der Profil-Bilder</target>
|
<target>Form der Profil-Bilder</target>
|
||||||
@@ -6099,6 +6227,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Link teilen</target>
|
<target>Link teilen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<target>Profil teilen</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Teilen Sie diesen Einmal-Einladungslink</target>
|
<target>Teilen Sie diesen Einmal-Einladungslink</target>
|
||||||
@@ -6264,6 +6397,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>Weich</target>
|
<target>Weich</target>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<target>Einige App-Einstellungen wurden nicht migriert.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<target>Einzelne Datei(en) wurde(n) nicht exportiert:</target>
|
<target>Einzelne Datei(en) wurde(n) nicht exportiert:</target>
|
||||||
@@ -6439,6 +6577,11 @@ Aktivieren Sie es in den *Netzwerk & Server* Einstellungen.</target>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<target>Sprechblase</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Machen Sie ein Foto</target>
|
<target>Machen Sie ein Foto</target>
|
||||||
@@ -6588,7 +6731,7 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The messages will be deleted for all members." xml:space="preserve">
|
<trans-unit id="The messages will be deleted for all members." xml:space="preserve">
|
||||||
<source>The messages will be deleted for all members.</source>
|
<source>The messages will be deleted for all members.</source>
|
||||||
<target>Die Nachrichten werden für alle Mitglieder gelöscht werden.</target>
|
<target>Die Nachrichten werden für alle Gruppenmitglieder gelöscht.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The messages will be marked as moderated for all members." xml:space="preserve">
|
<trans-unit id="The messages will be marked as moderated for all members." xml:space="preserve">
|
||||||
@@ -6631,6 +6774,11 @@ Dies kann passieren, wenn es einen Fehler gegeben hat oder die Verbindung kompro
|
|||||||
<target>Der von Ihnen eingefügte Text ist kein SimpleX-Link.</target>
|
<target>Der von Ihnen eingefügte Text ist kein SimpleX-Link.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<target>Das hochgeladene Datenbank-Archiv wird dauerhaft von den Servern entfernt.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<target>Design</target>
|
<target>Design</target>
|
||||||
@@ -6911,7 +7059,7 @@ Sie werden aufgefordert, die Authentifizierung abzuschließen, bevor diese Funkt
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>Unbekannte Server!</target>
|
<target>Unbekannte Server!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -7025,6 +7173,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
|
|||||||
<target>Verwende .onion-Hosts</target>
|
<target>Verwende .onion-Hosts</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Verwenden Sie SimpleX-Chat-Server?</target>
|
<target>Verwenden Sie SimpleX-Chat-Server?</target>
|
||||||
@@ -7087,7 +7239,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Use the app with one hand." xml:space="preserve">
|
<trans-unit id="Use the app with one hand." xml:space="preserve">
|
||||||
<source>Use the app with one hand.</source>
|
<source>Use the app with one hand.</source>
|
||||||
<target>Die App mit einer Hand nutzen.</target>
|
<target>Die App mit einer Hand bedienen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="User profile" xml:space="preserve">
|
<trans-unit id="User profile" xml:space="preserve">
|
||||||
@@ -7100,6 +7252,10 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
|
|||||||
<target>Benutzer-Auswahl</target>
|
<target>Benutzer-Auswahl</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Verwendung von SimpleX-Chat-Servern.</target>
|
<target>Verwendung von SimpleX-Chat-Servern.</target>
|
||||||
@@ -7333,7 +7489,7 @@ Bitten Sie Ihren Kontakt darum einen weiteren Verbindungs-Link zu erzeugen, um s
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für diese XFTP-Relais sichtbar sein: %@.</target>
|
<target>Ohne Tor- oder VPN-Nutzung wird Ihre IP-Adresse für diese XFTP-Relais sichtbar sein: %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7519,7 +7675,7 @@ Verbindungsanfrage wiederholen?</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You can still view conversation with %@ in the list of chats." xml:space="preserve">
|
<trans-unit id="You can still view conversation with %@ in the list of chats." xml:space="preserve">
|
||||||
<source>You can still view conversation with %@ in the list of chats.</source>
|
<source>You can still view conversation with %@ in the list of chats.</source>
|
||||||
<target>Sie können in der Chatliste weiterhin die Unterhaltung mit %@ einsehen.</target>
|
<target>Sie können in der Chat-Liste weiterhin die Unterhaltung mit %@ einsehen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
|
<trans-unit id="You can turn on SimpleX Lock via Settings." xml:space="preserve">
|
||||||
@@ -7714,11 +7870,21 @@ Verbindungsanfrage wiederholen?</target>
|
|||||||
<target>Ihre Chat-Datenbank ist nicht verschlüsselt. Bitte legen Sie ein Passwort fest, um sie zu schützen.</target>
|
<target>Ihre Chat-Datenbank ist nicht verschlüsselt. Bitte legen Sie ein Passwort fest, um sie zu schützen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your chat preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<target>Ihre Chat-Präferenzen</target>
|
||||||
|
<note>alert title</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>Ihre Chat-Profile</target>
|
<target>Ihre Chat-Profile</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<target>Ihre Verbindung wurde auf %@ verschoben. Während Sie auf das Profil weitergeleitet wurden trat aber ein unerwarteter Fehler auf.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Ihr Kontakt hat eine Datei gesendet, die größer ist als die derzeit unterstützte maximale Größe (%@).</target>
|
<target>Ihr Kontakt hat eine Datei gesendet, die größer ist als die derzeit unterstützte maximale Größe (%@).</target>
|
||||||
@@ -7734,6 +7900,10 @@ Verbindungsanfrage wiederholen?</target>
|
|||||||
<target>Ihre Kontakte bleiben weiterhin verbunden.</target>
|
<target>Ihre Kontakte bleiben weiterhin verbunden.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Ihre aktuelle Chat-Datenbank wird GELÖSCHT und durch die Importierte ERSETZT.</target>
|
<target>Ihre aktuelle Chat-Datenbank wird GELÖSCHT und durch die Importierte ERSETZT.</target>
|
||||||
@@ -7764,13 +7934,16 @@ Verbindungsanfrage wiederholen?</target>
|
|||||||
<target>Ihr Profil **%@** wird geteilt.</target>
|
<target>Ihr Profil **%@** wird geteilt.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt. SimpleX-Server können Ihr Profil nicht einsehen.</target>
|
||||||
<target>Ihr Profil wird auf Ihrem Gerät gespeichert und nur mit Ihren Kontakten geteilt.
|
|
||||||
SimpleX-Server können Ihr Profil nicht einsehen.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<target>Ihr Profil wurde geändert. Wenn Sie es speichern, wird das aktualisierte Profil an alle Ihre Kontakte gesendet.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Ihr Profil, Ihre Kontakte und zugestellten Nachrichten werden auf Ihrem Gerät gespeichert.</target>
|
<target>Ihr Profil, Ihre Kontakte und zugestellten Nachrichten werden auf Ihrem Gerät gespeichert.</target>
|
||||||
|
|||||||
@@ -137,6 +137,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="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<target>%1$@, %2$@</target>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ and %lld members</target>
|
<target>%@, %@ and %lld members</target>
|
||||||
@@ -157,11 +162,36 @@
|
|||||||
<target>%d days</target>
|
<target>%d days</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<target>%d file(s) are still being downloaded.</target>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<target>%d file(s) failed to download.</target>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<target>%d file(s) were deleted.</target>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<target>%d file(s) were not downloaded.</target>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d hours</target>
|
<target>%d hours</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<target>%d messages not forwarded</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d min</target>
|
<target>%d min</target>
|
||||||
@@ -1020,6 +1050,11 @@
|
|||||||
<target>Auto-accept images</target>
|
<target>Auto-accept images</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<target>Auto-accept settings</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Back</target>
|
<target>Back</target>
|
||||||
@@ -1193,7 +1228,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Cancel</target>
|
<target>Cancel</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1213,7 +1248,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Cannot receive file</target>
|
<target>Cannot receive file</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1341,6 +1376,11 @@
|
|||||||
<target>Chat preferences</target>
|
<target>Chat preferences</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<target>Chat preferences were changed.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<target>Chat theme</target>
|
<target>Chat theme</target>
|
||||||
@@ -1740,6 +1780,11 @@ This is your own one-time link!</target>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<target>Corner</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>Correct name to %@?</target>
|
<target>Correct name to %@?</target>
|
||||||
@@ -2409,6 +2454,11 @@ This is your own one-time link!</target>
|
|||||||
<target>Do not send history to new members.</target>
|
<target>Do not send history to new members.</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 credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<target>Do not use credentials with proxy.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Don't create address</target>
|
<target>Don't create address</target>
|
||||||
@@ -2432,7 +2482,8 @@ This is your own one-time link!</target>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Download</target>
|
<target>Download</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2449,6 +2500,11 @@ This is your own one-time link!</target>
|
|||||||
<target>Download file</target>
|
<target>Download file</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<target>Download files</target>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<target>Downloaded</target>
|
<target>Downloaded</target>
|
||||||
@@ -2724,6 +2780,11 @@ This is your own one-time link!</target>
|
|||||||
<target>Error changing address</target>
|
<target>Error changing address</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<target>Error changing connection profile</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Error changing role</target>
|
<target>Error changing role</target>
|
||||||
@@ -2734,6 +2795,11 @@ This is your own one-time link!</target>
|
|||||||
<target>Error changing setting</target>
|
<target>Error changing setting</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<target>Error changing to incognito!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<target>Error connecting to forwarding server %@. Please try later.</target>
|
<target>Error connecting to forwarding server %@. Please try later.</target>
|
||||||
@@ -2854,6 +2920,11 @@ This is your own one-time link!</target>
|
|||||||
<target>Error loading %@ servers</target>
|
<target>Error loading %@ servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<target>Error migrating settings</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Error opening chat</target>
|
<target>Error opening chat</target>
|
||||||
@@ -2862,7 +2933,7 @@ This is your own one-time link!</target>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Error receiving file</target>
|
<target>Error receiving file</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2954,6 +3025,11 @@ This is your own one-time link!</target>
|
|||||||
<target>Error stopping chat</target>
|
<target>Error stopping chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<target>Error switching profile</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Error switching profile!</target>
|
<target>Error switching profile!</target>
|
||||||
@@ -3090,6 +3166,13 @@ This is your own one-time link!</target>
|
|||||||
<target>File error</target>
|
<target>File error</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<target>File errors:
|
||||||
|
%@</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<target>File not found - most likely file was deleted or cancelled.</target>
|
<target>File not found - most likely file was deleted or cancelled.</target>
|
||||||
@@ -3225,11 +3308,26 @@ This is your own one-time link!</target>
|
|||||||
<target>Forward</target>
|
<target>Forward</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<target>Forward %d message(s)?</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<target>Forward and save messages</target>
|
<target>Forward and save messages</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<target>Forward messages</target>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<target>Forward messages without files?</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Forwarded</target>
|
<target>Forwarded</target>
|
||||||
@@ -3240,6 +3338,11 @@ This is your own one-time link!</target>
|
|||||||
<target>Forwarded from</target>
|
<target>Forwarded from</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<target>Forwarding %lld messages</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<target>Forwarding server %@ failed to connect to destination server %@. Please try later.</target>
|
<target>Forwarding server %@ failed to connect to destination server %@. Please try later.</target>
|
||||||
@@ -3289,11 +3392,6 @@ Error: %2$@</target>
|
|||||||
<target>Full name (optional)</target>
|
<target>Full name (optional)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Full name:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Fully decentralized – visible only to members.</target>
|
<target>Fully decentralized – visible only to members.</target>
|
||||||
@@ -3539,6 +3637,11 @@ Error: %2$@</target>
|
|||||||
<target>ICE servers (one per line)</target>
|
<target>ICE servers (one per line)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<target>IP address</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>If you can't meet in person, show QR code in a video call, or share the link.</target>
|
<target>If you can't meet in person, show QR code in a video call, or share the link.</target>
|
||||||
@@ -4184,6 +4287,11 @@ This is your link for group %@!</target>
|
|||||||
<target>Message servers</target>
|
<target>Message servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<target>Message shape</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>Message source remains private.</target>
|
<target>Message source remains private.</target>
|
||||||
@@ -4234,6 +4342,11 @@ This is your link for group %@!</target>
|
|||||||
<target>Messages sent</target>
|
<target>Messages sent</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<target>Messages were deleted after you selected them.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</target>
|
<target>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</target>
|
||||||
@@ -4529,6 +4642,11 @@ This is your link for group %@!</target>
|
|||||||
<target>Nothing selected</target>
|
<target>Nothing selected</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<target>Nothing to forward!</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Notifications</target>
|
<target>Notifications</target>
|
||||||
@@ -4561,7 +4679,7 @@ This is your link for group %@!</target>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ok</target>
|
<target>Ok</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4752,6 +4870,13 @@ Requires compatible VPN.</target>
|
|||||||
<target>Other %@ servers</target>
|
<target>Other %@ servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<target>Other file errors:
|
||||||
|
%@</target>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4787,6 +4912,11 @@ Requires compatible VPN.</target>
|
|||||||
<target>Passcode set!</target>
|
<target>Passcode set!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<target>Password</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Password to show</target>
|
<target>Password to show</target>
|
||||||
@@ -4936,6 +5066,11 @@ Error: %@</target>
|
|||||||
<target>Polish interface</target>
|
<target>Polish interface</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<target>Port</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Possibly, certificate fingerprint in server address is incorrect</target>
|
<target>Possibly, certificate fingerprint in server address is incorrect</target>
|
||||||
@@ -5021,16 +5156,6 @@ Error: %@</target>
|
|||||||
<target>Profile images</target>
|
<target>Profile images</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>
|
||||||
@@ -5133,6 +5258,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Proxied servers</target>
|
<target>Proxied servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<target>Proxy requires password</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Push notifications</target>
|
<target>Push notifications</target>
|
||||||
@@ -5354,6 +5484,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Remove</target>
|
<target>Remove</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<target>Remove archive?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<target>Remove image</target>
|
<target>Remove image</target>
|
||||||
@@ -5534,6 +5669,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>SMP server</target>
|
<target>SMP server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<target>SOCKS proxy</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Safely receive files</target>
|
<target>Safely receive files</target>
|
||||||
@@ -5547,12 +5687,13 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Save</target>
|
<target>Save</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Save (and notify contacts)</target>
|
<target>Save (and notify contacts)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5579,11 +5720,6 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Save archive</target>
|
<target>Save archive</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Save auto-accept settings</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Save group profile</target>
|
<target>Save group profile</target>
|
||||||
@@ -5619,16 +5755,16 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Save servers?</target>
|
<target>Save servers?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Save settings?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Save welcome message?</target>
|
<target>Save welcome message?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<target>Save your profile?</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Saved</target>
|
<target>Saved</target>
|
||||||
@@ -5649,6 +5785,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Saved message</target>
|
<target>Saved message</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<target>Saving %lld messages</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<target>Scale</target>
|
<target>Scale</target>
|
||||||
@@ -5729,6 +5870,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Select</target>
|
<target>Select</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<target>Select chat profile</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<target>Selected %lld</target>
|
<target>Selected %lld</target>
|
||||||
@@ -5847,7 +5993,7 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Sender cancelled file transfer.</target>
|
<target>Sender cancelled file transfer.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -6064,6 +6210,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Settings</target>
|
<target>Settings</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<target>Settings were changed.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Shape profile images</target>
|
<target>Shape profile images</target>
|
||||||
@@ -6099,6 +6250,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Share link</target>
|
<target>Share link</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<target>Share profile</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Share this 1-time invite link</target>
|
<target>Share this 1-time invite link</target>
|
||||||
@@ -6264,6 +6420,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>Soft</target>
|
<target>Soft</target>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<target>Some app settings were not migrated.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<target>Some file(s) were not exported:</target>
|
<target>Some file(s) were not exported:</target>
|
||||||
@@ -6439,6 +6600,11 @@ Enable in *Network & servers* settings.</target>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<target>Tail</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Take picture</target>
|
<target>Take picture</target>
|
||||||
@@ -6631,6 +6797,11 @@ It can happen because of some bug or when the connection is compromised.</target
|
|||||||
<target>The text you pasted is not a SimpleX link.</target>
|
<target>The text you pasted is not a SimpleX link.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<target>The uploaded database archive will be permanently removed from the servers.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<target>Themes</target>
|
<target>Themes</target>
|
||||||
@@ -6911,7 +7082,7 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>Unknown servers!</target>
|
<target>Unknown servers!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -7025,6 +7196,11 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Use .onion hosts</target>
|
<target>Use .onion hosts</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<target>Use SOCKS proxy</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Use SimpleX Chat servers?</target>
|
<target>Use SimpleX Chat servers?</target>
|
||||||
@@ -7100,6 +7276,11 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>User selection</target>
|
<target>User selection</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<target>Username</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Using SimpleX Chat servers.</target>
|
<target>Using SimpleX Chat servers.</target>
|
||||||
@@ -7333,7 +7514,7 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</target>
|
<target>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7714,11 +7895,21 @@ Repeat connection request?</target>
|
|||||||
<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 preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<target>Your chat preferences</target>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<target>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Your contact sent a file that is larger than currently supported maximum size (%@).</target>
|
<target>Your contact sent a file that is larger than currently supported maximum size (%@).</target>
|
||||||
@@ -7734,6 +7925,11 @@ Repeat connection request?</target>
|
|||||||
<target>Your contacts will remain connected.</target>
|
<target>Your contacts will remain connected.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<target>Your credentials may be sent unencrypted.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Your current chat database will be DELETED and REPLACED with the imported one.</target>
|
<target>Your current chat database will be DELETED and REPLACED with the imported one.</target>
|
||||||
@@ -7764,13 +7960,16 @@ Repeat connection request?</target>
|
|||||||
<target>Your profile **%@** will be shared.</target>
|
<target>Your profile **%@** will be shared.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</target>
|
||||||
<target>Your profile is stored on your device and shared only with your contacts.
|
|
||||||
SimpleX servers cannot see your profile.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<target>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Your profile, contacts and delivered messages are stored on your device.</target>
|
<target>Your profile, contacts and delivered messages are stored on your device.</target>
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<target>¡ %@ quiere contactar!</target>
|
<target>¡ %@ quiere contactar!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ y %lld miembro(s) más</target>
|
<target>%@, %@ y %lld miembro(s) más</target>
|
||||||
@@ -157,11 +161,31 @@
|
|||||||
<target>%d días</target>
|
<target>%d días</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d horas</target>
|
<target>%d horas</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d minutos</target>
|
<target>%d minutos</target>
|
||||||
@@ -802,7 +826,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
|
<trans-unit id="Allow to send SimpleX links." xml:space="preserve">
|
||||||
<source>Allow to send SimpleX links.</source>
|
<source>Allow to send SimpleX links.</source>
|
||||||
<target>Permitir enviar enlaces SimpleX.</target>
|
<target>Se permite enviar enlaces SimpleX.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Allow to send files and media." xml:space="preserve">
|
<trans-unit id="Allow to send files and media." xml:space="preserve">
|
||||||
@@ -1020,6 +1044,10 @@
|
|||||||
<target>Aceptar imágenes automáticamente</target>
|
<target>Aceptar imágenes automáticamente</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Volver</target>
|
<target>Volver</target>
|
||||||
@@ -1193,7 +1221,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Cancelar</target>
|
<target>Cancelar</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1213,7 +1241,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>No se puede recibir el archivo</target>
|
<target>No se puede recibir el archivo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1341,6 +1369,10 @@
|
|||||||
<target>Preferencias de Chat</target>
|
<target>Preferencias de Chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<target>Tema de chat</target>
|
<target>Tema de chat</target>
|
||||||
@@ -1740,6 +1772,10 @@ This is your own one-time link!</source>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>¿Corregir el nombre a %@?</target>
|
<target>¿Corregir el nombre a %@?</target>
|
||||||
@@ -2406,7 +2442,11 @@ This is your own one-time link!</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Do not send history to new members." xml:space="preserve">
|
<trans-unit id="Do not send history to new members." xml:space="preserve">
|
||||||
<source>Do not send history to new members.</source>
|
<source>Do not send history to new members.</source>
|
||||||
<target>No enviar historial a miembros nuevos.</target>
|
<target>No se envía el historial a los miembros nuevos.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Do not use credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
@@ -2432,7 +2472,8 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Descargar</target>
|
<target>Descargar</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2449,6 +2490,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Descargar archivo</target>
|
<target>Descargar archivo</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<target>Descargado</target>
|
<target>Descargado</target>
|
||||||
@@ -2724,6 +2769,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Error al cambiar servidor</target>
|
<target>Error al cambiar servidor</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Error al cambiar rol</target>
|
<target>Error al cambiar rol</target>
|
||||||
@@ -2734,6 +2783,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Error cambiando configuración</target>
|
<target>Error cambiando configuración</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<target>Error al conectar con el servidor de reenvío %@. Por favor, inténtalo más tarde.</target>
|
<target>Error al conectar con el servidor de reenvío %@. Por favor, inténtalo más tarde.</target>
|
||||||
@@ -2854,6 +2907,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Error al cargar servidores %@</target>
|
<target>Error al cargar servidores %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Error al abrir chat</target>
|
<target>Error al abrir chat</target>
|
||||||
@@ -2862,7 +2919,7 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Error al recibir archivo</target>
|
<target>Error al recibir archivo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2954,6 +3011,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Error al parar SimpleX</target>
|
<target>Error al parar SimpleX</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>¡Error al cambiar perfil!</target>
|
<target>¡Error al cambiar perfil!</target>
|
||||||
@@ -3090,6 +3151,11 @@ This is your own one-time link!</source>
|
|||||||
<target>Error de archivo</target>
|
<target>Error de archivo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<target>Archivo no encontrado, probablemente haya sido borrado o cancelado.</target>
|
<target>Archivo no encontrado, probablemente haya sido borrado o cancelado.</target>
|
||||||
@@ -3225,11 +3291,23 @@ This is your own one-time link!</source>
|
|||||||
<target>Reenviar</target>
|
<target>Reenviar</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<target>Reenviar y guardar mensajes</target>
|
<target>Reenviar y guardar mensajes</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Reenviado</target>
|
<target>Reenviado</target>
|
||||||
@@ -3240,6 +3318,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Reenviado por</target>
|
<target>Reenviado por</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<target>El servidor de reenvío %@ no ha podido conectarse al servidor de destino %@. Por favor, intentalo más tarde.</target>
|
<target>El servidor de reenvío %@ no ha podido conectarse al servidor de destino %@. Por favor, intentalo más tarde.</target>
|
||||||
@@ -3289,11 +3371,6 @@ Error: %2$@</target>
|
|||||||
<target>Nombre completo (opcional)</target>
|
<target>Nombre completo (opcional)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Nombre completo:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Completamente descentralizado y sólo visible para los miembros.</target>
|
<target>Completamente descentralizado y sólo visible para los miembros.</target>
|
||||||
@@ -3539,6 +3616,10 @@ Error: %2$@</target>
|
|||||||
<target>Servidores ICE (uno por línea)</target>
|
<target>Servidores ICE (uno por línea)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Si no puedes reunirte en persona, muestra el código QR por videollamada o comparte el enlace.</target>
|
<target>Si no puedes reunirte en persona, muestra el código QR por videollamada o comparte el enlace.</target>
|
||||||
@@ -4184,6 +4265,10 @@ This is your link for group %@!</source>
|
|||||||
<target>Servidores de mensajes</target>
|
<target>Servidores de mensajes</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>El autor del mensaje se mantiene privado.</target>
|
<target>El autor del mensaje se mantiene privado.</target>
|
||||||
@@ -4234,6 +4319,10 @@ This is your link for group %@!</source>
|
|||||||
<target>Mensajes enviados</target>
|
<target>Mensajes enviados</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Los mensajes, archivos y llamadas están protegidos mediante **cifrado de extremo a extremo** con secreto perfecto hacía adelante, repudio y recuperación tras ataque.</target>
|
<target>Los mensajes, archivos y llamadas están protegidos mediante **cifrado de extremo a extremo** con secreto perfecto hacía adelante, repudio y recuperación tras ataque.</target>
|
||||||
@@ -4529,6 +4618,10 @@ This is your link for group %@!</source>
|
|||||||
<target>Nada seleccionado</target>
|
<target>Nada seleccionado</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Notificaciones</target>
|
<target>Notificaciones</target>
|
||||||
@@ -4561,7 +4654,7 @@ This is your link for group %@!</source>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ok</target>
|
<target>Ok</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4752,6 +4845,11 @@ Requiere activación de la VPN.</target>
|
|||||||
<target>Otros servidores %@</target>
|
<target>Otros servidores %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4787,6 +4885,10 @@ Requiere activación de la VPN.</target>
|
|||||||
<target>¡Código de acceso guardado!</target>
|
<target>¡Código de acceso guardado!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Contraseña para hacerlo visible</target>
|
<target>Contraseña para hacerlo visible</target>
|
||||||
@@ -4936,6 +5038,10 @@ Error: %@</target>
|
|||||||
<target>Interfaz en polaco</target>
|
<target>Interfaz en polaco</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta</target>
|
<target>Posiblemente la huella digital del certificado en la dirección del servidor es incorrecta</target>
|
||||||
@@ -5021,16 +5127,6 @@ Error: %@</target>
|
|||||||
<target>Forma de los perfiles</target>
|
<target>Forma de los perfiles</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>Nombre del perfil</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Profile name:" xml:space="preserve">
|
|
||||||
<source>Profile name:</source>
|
|
||||||
<target>Nombre del perfil:</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>Contraseña del perfil</target>
|
<target>Contraseña del perfil</target>
|
||||||
@@ -5068,7 +5164,7 @@ Error: %@</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
|
<trans-unit id="Prohibit sending SimpleX links." xml:space="preserve">
|
||||||
<source>Prohibit sending SimpleX links.</source>
|
<source>Prohibit sending SimpleX links.</source>
|
||||||
<target>No permitir el envío de enlaces SimpleX.</target>
|
<target>No se permite enviar enlaces SimpleX.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
|
<trans-unit id="Prohibit sending direct messages to members." xml:space="preserve">
|
||||||
@@ -5133,6 +5229,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Servidores con proxy</target>
|
<target>Servidores con proxy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Notificaciones automáticas</target>
|
<target>Notificaciones automáticas</target>
|
||||||
@@ -5354,6 +5454,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Eliminar</target>
|
<target>Eliminar</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<target>Eliminar imagen</target>
|
<target>Eliminar imagen</target>
|
||||||
@@ -5534,6 +5638,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Servidor SMP</target>
|
<target>Servidor SMP</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Recibe archivos de forma segura</target>
|
<target>Recibe archivos de forma segura</target>
|
||||||
@@ -5547,12 +5655,13 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Guardar</target>
|
<target>Guardar</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Guardar (y notificar contactos)</target>
|
<target>Guardar (y notificar contactos)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5579,11 +5688,6 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Guardar archivo</target>
|
<target>Guardar archivo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Guardar configuración de auto aceptar</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Guardar perfil de grupo</target>
|
<target>Guardar perfil de grupo</target>
|
||||||
@@ -5619,16 +5723,15 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>¿Guardar servidores?</target>
|
<target>¿Guardar servidores?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>¿Guardar configuración?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>¿Guardar mensaje de bienvenida?</target>
|
<target>¿Guardar mensaje de bienvenida?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Guardado</target>
|
<target>Guardado</target>
|
||||||
@@ -5649,6 +5752,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Mensaje guardado</target>
|
<target>Mensaje guardado</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<target>Escala</target>
|
<target>Escala</target>
|
||||||
@@ -5729,6 +5836,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Seleccionar</target>
|
<target>Seleccionar</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<target>Seleccionados %lld</target>
|
<target>Seleccionados %lld</target>
|
||||||
@@ -5841,13 +5952,13 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Send up to 100 last messages to new members." xml:space="preserve">
|
<trans-unit id="Send up to 100 last messages to new members." xml:space="preserve">
|
||||||
<source>Send up to 100 last messages to new members.</source>
|
<source>Send up to 100 last messages to new members.</source>
|
||||||
<target>Enviar hasta 100 últimos mensajes a los miembros nuevos.</target>
|
<target>Se envían hasta 100 mensajes más recientes a los miembros nuevos.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>El remitente ha cancelado la transferencia de archivos.</target>
|
<target>El remitente ha cancelado la transferencia de archivos.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -6064,6 +6175,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Configuración</target>
|
<target>Configuración</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Dar forma a las imágenes de perfil</target>
|
<target>Dar forma a las imágenes de perfil</target>
|
||||||
@@ -6099,6 +6214,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Compartir enlace</target>
|
<target>Compartir enlace</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Comparte este enlace de un solo uso</target>
|
<target>Comparte este enlace de un solo uso</target>
|
||||||
@@ -6264,6 +6383,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>Suave</target>
|
<target>Suave</target>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<target>Algunos archivos no han sido exportados:</target>
|
<target>Algunos archivos no han sido exportados:</target>
|
||||||
@@ -6439,6 +6562,10 @@ Actívalo en ajustes de *Servidores y Redes*.</target>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Tomar foto</target>
|
<target>Tomar foto</target>
|
||||||
@@ -6631,6 +6758,10 @@ Puede ocurrir por algún bug o cuando la conexión está comprometida.</target>
|
|||||||
<target>El texto pegado no es un enlace SimpleX.</target>
|
<target>El texto pegado no es un enlace SimpleX.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<target>Temas</target>
|
<target>Temas</target>
|
||||||
@@ -6911,7 +7042,7 @@ Se te pedirá que completes la autenticación antes de activar esta función.</t
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>¡Servidores desconocidos!</target>
|
<target>¡Servidores desconocidos!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -7025,6 +7156,10 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
|
|||||||
<target>Usar hosts .onion</target>
|
<target>Usar hosts .onion</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>¿Usar servidores SimpleX Chat?</target>
|
<target>¿Usar servidores SimpleX Chat?</target>
|
||||||
@@ -7100,6 +7235,10 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
|
|||||||
<target>Selección de usuarios</target>
|
<target>Selección de usuarios</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Usar servidores SimpleX Chat.</target>
|
<target>Usar servidores SimpleX Chat.</target>
|
||||||
@@ -7333,7 +7472,7 @@ Para conectarte pide a tu contacto que cree otro enlace y comprueba la conexión
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Sin Tor o VPN, tu dirección IP será visible para estos servidores XFTP: %@.</target>
|
<target>Sin Tor o VPN, tu dirección IP será visible para estos servidores XFTP: %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7449,7 +7588,7 @@ Repeat join request?</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
|
<trans-unit id="You can change it in Appearance settings." xml:space="preserve">
|
||||||
<source>You can change it in Appearance settings.</source>
|
<source>You can change it in Appearance settings.</source>
|
||||||
<target>Puede cambiarlo desde el menú Apariencia.</target>
|
<target>Puedes cambiar la posición de la barra desde el menú Apariencia.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You can create it later" xml:space="preserve">
|
<trans-unit id="You can create it later" xml:space="preserve">
|
||||||
@@ -7714,11 +7853,19 @@ Repeat connection request?</source>
|
|||||||
<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 preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>El contacto ha enviado un archivo mayor al máximo admitido (%@).</target>
|
<target>El contacto ha enviado un archivo mayor al máximo admitido (%@).</target>
|
||||||
@@ -7734,6 +7881,10 @@ Repeat connection request?</source>
|
|||||||
<target>Tus contactos permanecerán conectados.</target>
|
<target>Tus contactos permanecerán conectados.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>La base de datos actual será ELIMINADA y SUSTITUIDA por la importada.</target>
|
<target>La base de datos actual será ELIMINADA y SUSTITUIDA por la importada.</target>
|
||||||
@@ -7764,13 +7915,15 @@ Repeat connection request?</source>
|
|||||||
<target>El perfil **%@** será compartido.</target>
|
<target>El perfil **%@** será compartido.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos. Los servidores SimpleX no pueden ver tu perfil.</target>
|
||||||
<target>Tu perfil es almacenado en tu dispositivo y solamente se comparte con tus contactos.
|
|
||||||
Los servidores SimpleX no pueden ver tu perfil.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Tu perfil, contactos y mensajes se almacenan en tu dispositivo.</target>
|
<target>Tu perfil, contactos y mensajes se almacenan en tu dispositivo.</target>
|
||||||
|
|||||||
@@ -133,6 +133,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="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -152,11 +156,31 @@
|
|||||||
<target>%d päivää</target>
|
<target>%d päivää</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d tuntia</target>
|
<target>%d tuntia</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d min</target>
|
<target>%d min</target>
|
||||||
@@ -967,6 +991,10 @@
|
|||||||
<target>Hyväksy kuvat automaattisesti</target>
|
<target>Hyväksy kuvat automaattisesti</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Takaisin</target>
|
<target>Takaisin</target>
|
||||||
@@ -1120,7 +1148,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Peruuta</target>
|
<target>Peruuta</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1138,7 +1166,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Tiedostoa ei voi vastaanottaa</target>
|
<target>Tiedostoa ei voi vastaanottaa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1259,6 +1287,10 @@
|
|||||||
<target>Chat-asetukset</target>
|
<target>Chat-asetukset</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -1616,6 +1648,10 @@ This is your own one-time link!</source>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2248,6 +2284,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Do not send history to new members.</source>
|
<source>Do not send history to new members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Do not use credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Älä luo osoitetta</target>
|
<target>Älä luo osoitetta</target>
|
||||||
@@ -2270,7 +2310,8 @@ This is your own one-time link!</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2285,6 +2326,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Lataa tiedosto</target>
|
<target>Lataa tiedosto</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2544,6 +2589,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Virhe osoitteenvaihdossa</target>
|
<target>Virhe osoitteenvaihdossa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Virhe roolin vaihdossa</target>
|
<target>Virhe roolin vaihdossa</target>
|
||||||
@@ -2554,6 +2603,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Virhe asetuksen muuttamisessa</target>
|
<target>Virhe asetuksen muuttamisessa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2669,6 +2722,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Virhe %@-palvelimien lataamisessa</target>
|
<target>Virhe %@-palvelimien lataamisessa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2676,7 +2733,7 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Virhe tiedoston vastaanottamisessa</target>
|
<target>Virhe tiedoston vastaanottamisessa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2762,6 +2819,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Virhe keskustelun lopettamisessa</target>
|
<target>Virhe keskustelun lopettamisessa</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Virhe profiilin vaihdossa!</target>
|
<target>Virhe profiilin vaihdossa!</target>
|
||||||
@@ -2890,6 +2951,11 @@ This is your own one-time link!</source>
|
|||||||
<source>File error</source>
|
<source>File error</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<note>file error text</note>
|
<note>file error text</note>
|
||||||
@@ -3016,10 +3082,22 @@ This is your own one-time link!</source>
|
|||||||
<source>Forward</source>
|
<source>Forward</source>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3028,6 +3106,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Forwarded from</source>
|
<source>Forwarded from</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3069,11 +3151,6 @@ Error: %2$@</source>
|
|||||||
<target>Koko nimi (valinnainen)</target>
|
<target>Koko nimi (valinnainen)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Koko nimi:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3311,6 +3388,10 @@ Error: %2$@</source>
|
|||||||
<target>ICE-palvelimet (yksi per rivi)</target>
|
<target>ICE-palvelimet (yksi per rivi)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Jos et voi tavata henkilökohtaisesti, näytä QR-koodi videopuhelussa tai jaa linkki.</target>
|
<target>Jos et voi tavata henkilökohtaisesti, näytä QR-koodi videopuhelussa tai jaa linkki.</target>
|
||||||
@@ -3918,6 +3999,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Message servers</source>
|
<source>Message servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3961,6 +4046,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Messages sent</source>
|
<source>Messages sent</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -4234,6 +4323,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Nothing selected</source>
|
<source>Nothing selected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Ilmoitukset</target>
|
<target>Ilmoitukset</target>
|
||||||
@@ -4265,7 +4358,7 @@ This is your link for group %@!</source>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ok</target>
|
<target>Ok</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4444,6 +4537,11 @@ Edellyttää VPN:n sallimista.</target>
|
|||||||
<source>Other %@ servers</source>
|
<source>Other %@ servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4479,6 +4577,10 @@ Edellyttää VPN:n sallimista.</target>
|
|||||||
<target>Pääsykoodi asetettu!</target>
|
<target>Pääsykoodi asetettu!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Salasana näytettäväksi</target>
|
<target>Salasana näytettäväksi</target>
|
||||||
@@ -4615,6 +4717,10 @@ Error: %@</source>
|
|||||||
<target>Puolalainen käyttöliittymä</target>
|
<target>Puolalainen käyttöliittymä</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Palvelimen osoitteen varmenteen sormenjälki on mahdollisesti virheellinen</target>
|
<target>Palvelimen osoitteen varmenteen sormenjälki on mahdollisesti virheellinen</target>
|
||||||
@@ -4693,14 +4799,6 @@ Error: %@</source>
|
|||||||
<source>Profile images</source>
|
<source>Profile images</source>
|
||||||
<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>
|
||||||
@@ -4796,6 +4894,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Proxied servers</source>
|
<source>Proxied servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Push-ilmoitukset</target>
|
<target>Push-ilmoitukset</target>
|
||||||
@@ -5002,6 +5104,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Poista</target>
|
<target>Poista</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5169,6 +5275,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>SMP server</source>
|
<source>SMP server</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5180,12 +5290,13 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Tallenna</target>
|
<target>Tallenna</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Tallenna (ja ilmoita kontakteille)</target>
|
<target>Tallenna (ja ilmoita kontakteille)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5211,11 +5322,6 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Tallenna arkisto</target>
|
<target>Tallenna arkisto</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Tallenna automaattisen hyväksynnän asetukset</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Tallenna ryhmäprofiili</target>
|
<target>Tallenna ryhmäprofiili</target>
|
||||||
@@ -5251,16 +5357,15 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Tallenna palvelimet?</target>
|
<target>Tallenna palvelimet?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Tallenna asetukset?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Tallenna tervetuloviesti?</target>
|
<target>Tallenna tervetuloviesti?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5278,6 +5383,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Saved message</source>
|
<source>Saved message</source>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5351,6 +5460,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Valitse</target>
|
<target>Valitse</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5461,7 +5574,7 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Lähettäjä peruutti tiedoston siirron.</target>
|
<target>Lähettäjä peruutti tiedoston siirron.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -5662,6 +5775,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Asetukset</target>
|
<target>Asetukset</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5695,6 +5812,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Jaa linkki</target>
|
<target>Jaa linkki</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5848,6 +5969,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Soft</source>
|
<source>Soft</source>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6010,6 +6135,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Ota kuva</target>
|
<target>Ota kuva</target>
|
||||||
@@ -6193,6 +6322,10 @@ Tämä voi johtua jostain virheestä tai siitä, että yhteys on vaarantunut.</t
|
|||||||
<source>The text you pasted is not a SimpleX link.</source>
|
<source>The text you pasted is not a SimpleX link.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6450,7 +6583,7 @@ Sinua kehotetaan suorittamaan todennus loppuun, ennen kuin tämä ominaisuus ote
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -6555,6 +6688,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<target>Käytä .onion-isäntiä</target>
|
<target>Käytä .onion-isäntiä</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Käytä SimpleX Chat palvelimia?</target>
|
<target>Käytä SimpleX Chat palvelimia?</target>
|
||||||
@@ -6623,6 +6760,10 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
<source>User selection</source>
|
<source>User selection</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Käyttää SimpleX Chat -palvelimia.</target>
|
<target>Käyttää SimpleX Chat -palvelimia.</target>
|
||||||
@@ -6835,7 +6976,7 @@ Jos haluat muodostaa yhteyden, pyydä kontaktiasi luomaan toinen yhteyslinkki ja
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7189,11 +7330,19 @@ Repeat connection request?</source>
|
|||||||
<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 preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Yhteyshenkilösi lähetti tiedoston, joka on suurempi kuin tällä hetkellä tuettu enimmäiskoko (%@).</target>
|
<target>Yhteyshenkilösi lähetti tiedoston, joka on suurempi kuin tällä hetkellä tuettu enimmäiskoko (%@).</target>
|
||||||
@@ -7209,6 +7358,10 @@ Repeat connection request?</source>
|
|||||||
<target>Kontaktisi pysyvät yhdistettyinä.</target>
|
<target>Kontaktisi pysyvät yhdistettyinä.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Nykyinen keskustelut-tietokantasi poistetaan ja korvataan tuodulla tietokannalla.</target>
|
<target>Nykyinen keskustelut-tietokantasi poistetaan ja korvataan tuodulla tietokannalla.</target>
|
||||||
@@ -7238,13 +7391,15 @@ Repeat connection request?</source>
|
|||||||
<target>Profiilisi **%@** jaetaan.</target>
|
<target>Profiilisi **%@** jaetaan.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa. SimpleX-palvelimet eivät näe profiiliasi.</target>
|
||||||
<target>Profiilisi tallennetaan laitteeseesi ja jaetaan vain yhteystietojesi kanssa.
|
|
||||||
SimpleX-palvelimet eivät näe profiiliasi.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Profiilisi, kontaktisi ja toimitetut viestit tallennetaan laitteellesi.</target>
|
<target>Profiilisi, kontaktisi ja toimitetut viestit tallennetaan laitteellesi.</target>
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<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="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ et %lld membres</target>
|
<target>%@, %@ et %lld membres</target>
|
||||||
@@ -157,11 +161,31 @@
|
|||||||
<target>%d jours</target>
|
<target>%d jours</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d heures</target>
|
<target>%d heures</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d min</target>
|
<target>%d min</target>
|
||||||
@@ -1020,6 +1044,10 @@
|
|||||||
<target>Images auto-acceptées</target>
|
<target>Images auto-acceptées</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Retour</target>
|
<target>Retour</target>
|
||||||
@@ -1193,7 +1221,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Annuler</target>
|
<target>Annuler</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1213,7 +1241,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Impossible de recevoir le fichier</target>
|
<target>Impossible de recevoir le fichier</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1341,6 +1369,10 @@
|
|||||||
<target>Préférences de chat</target>
|
<target>Préférences de chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<target>Thème de chat</target>
|
<target>Thème de chat</target>
|
||||||
@@ -1740,6 +1772,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>Corriger le nom pour %@ ?</target>
|
<target>Corriger le nom pour %@ ?</target>
|
||||||
@@ -2409,6 +2445,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Ne pas envoyer d'historique aux nouveaux membres.</target>
|
<target>Ne pas envoyer d'historique aux nouveaux membres.</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 credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Ne pas créer d'adresse</target>
|
<target>Ne pas créer d'adresse</target>
|
||||||
@@ -2432,7 +2472,8 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Télécharger</target>
|
<target>Télécharger</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2449,6 +2490,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Télécharger le fichier</target>
|
<target>Télécharger le fichier</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<target>Téléchargé</target>
|
<target>Téléchargé</target>
|
||||||
@@ -2724,6 +2769,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Erreur de changement d'adresse</target>
|
<target>Erreur de changement d'adresse</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Erreur lors du changement de rôle</target>
|
<target>Erreur lors du changement de rôle</target>
|
||||||
@@ -2734,6 +2783,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Erreur de changement de paramètre</target>
|
<target>Erreur de changement de paramètre</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<target>Erreur de connexion au serveur de redirection %@. Veuillez réessayer plus tard.</target>
|
<target>Erreur de connexion au serveur de redirection %@. Veuillez réessayer plus tard.</target>
|
||||||
@@ -2854,6 +2907,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Erreur lors du chargement des serveurs %@</target>
|
<target>Erreur lors du chargement des serveurs %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Erreur lors de l'ouverture du chat</target>
|
<target>Erreur lors de l'ouverture du chat</target>
|
||||||
@@ -2862,7 +2919,7 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Erreur lors de la réception du fichier</target>
|
<target>Erreur lors de la réception du fichier</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2954,6 +3011,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Erreur lors de l'arrêt du chat</target>
|
<target>Erreur lors de l'arrêt du chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Erreur lors du changement de profil !</target>
|
<target>Erreur lors du changement de profil !</target>
|
||||||
@@ -3090,6 +3151,11 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Erreur de fichier</target>
|
<target>Erreur de fichier</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<target>Fichier introuvable - le fichier a probablement été supprimé ou annulé.</target>
|
<target>Fichier introuvable - le fichier a probablement été supprimé ou annulé.</target>
|
||||||
@@ -3225,11 +3291,23 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Transférer</target>
|
<target>Transférer</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<target>Transférer et sauvegarder des messages</target>
|
<target>Transférer et sauvegarder des messages</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Transféré</target>
|
<target>Transféré</target>
|
||||||
@@ -3240,6 +3318,10 @@ Il s'agit de votre propre lien unique !</target>
|
|||||||
<target>Transféré depuis</target>
|
<target>Transféré depuis</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<target>Le serveur de redirection %@ n'a pas réussi à se connecter au serveur de destination %@. Veuillez réessayer plus tard.</target>
|
<target>Le serveur de redirection %@ n'a pas réussi à se connecter au serveur de destination %@. Veuillez réessayer plus tard.</target>
|
||||||
@@ -3289,11 +3371,6 @@ Erreur : %2$@</target>
|
|||||||
<target>Nom complet (optionnel)</target>
|
<target>Nom complet (optionnel)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Nom complet :</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Entièrement décentralisé – visible que par ses membres.</target>
|
<target>Entièrement décentralisé – visible que par ses membres.</target>
|
||||||
@@ -3539,6 +3616,10 @@ Erreur : %2$@</target>
|
|||||||
<target>Serveurs ICE (un par ligne)</target>
|
<target>Serveurs ICE (un par ligne)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Si vous ne pouvez pas vous rencontrer en personne, montrez le code QR lors d'un appel vidéo ou partagez le lien.</target>
|
<target>Si vous ne pouvez pas vous rencontrer en personne, montrez le code QR lors d'un appel vidéo ou partagez le lien.</target>
|
||||||
@@ -4184,6 +4265,10 @@ Voici votre lien pour le groupe %@ !</target>
|
|||||||
<target>Serveurs de messages</target>
|
<target>Serveurs de messages</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>La source du message reste privée.</target>
|
<target>La source du message reste privée.</target>
|
||||||
@@ -4234,6 +4319,10 @@ Voici votre lien pour le groupe %@ !</target>
|
|||||||
<target>Messages envoyés</target>
|
<target>Messages envoyés</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Les messages, fichiers et appels sont protégés par un chiffrement **de bout en bout** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.</target>
|
<target>Les messages, fichiers et appels sont protégés par un chiffrement **de bout en bout** avec une confidentialité persistante, une répudiation et une récupération en cas d'effraction.</target>
|
||||||
@@ -4529,6 +4618,10 @@ Voici votre lien pour le groupe %@ !</target>
|
|||||||
<target>Aucune sélection</target>
|
<target>Aucune sélection</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Notifications</target>
|
<target>Notifications</target>
|
||||||
@@ -4561,7 +4654,7 @@ Voici votre lien pour le groupe %@ !</target>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ok</target>
|
<target>Ok</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4752,6 +4845,11 @@ Nécessite l'activation d'un VPN.</target>
|
|||||||
<target>Autres serveurs %@</target>
|
<target>Autres serveurs %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4787,6 +4885,10 @@ Nécessite l'activation d'un VPN.</target>
|
|||||||
<target>Code d'accès défini !</target>
|
<target>Code d'accès défini !</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Mot de passe à entrer</target>
|
<target>Mot de passe à entrer</target>
|
||||||
@@ -4936,6 +5038,10 @@ Erreur : %@</target>
|
|||||||
<target>Interface en polonais</target>
|
<target>Interface en polonais</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Il est possible que l'empreinte du certificat dans l'adresse du serveur soit incorrecte</target>
|
<target>Il est possible que l'empreinte du certificat dans l'adresse du serveur soit incorrecte</target>
|
||||||
@@ -5021,16 +5127,6 @@ Erreur : %@</target>
|
|||||||
<target>Images de profil</target>
|
<target>Images 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>
|
||||||
@@ -5133,6 +5229,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Serveurs routés via des proxy</target>
|
<target>Serveurs routés via des proxy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Notifications push</target>
|
<target>Notifications push</target>
|
||||||
@@ -5354,6 +5454,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Supprimer</target>
|
<target>Supprimer</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<target>Enlever l'image</target>
|
<target>Enlever l'image</target>
|
||||||
@@ -5534,6 +5638,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Serveur SMP</target>
|
<target>Serveur SMP</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Réception de fichiers en toute sécurité</target>
|
<target>Réception de fichiers en toute sécurité</target>
|
||||||
@@ -5547,12 +5655,13 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Enregistrer</target>
|
<target>Enregistrer</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Enregistrer (et en informer les contacts)</target>
|
<target>Enregistrer (et en informer les contacts)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5579,11 +5688,6 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Enregistrer l'archive</target>
|
<target>Enregistrer l'archive</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Enregistrer les paramètres de validation automatique</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Enregistrer le profil du groupe</target>
|
<target>Enregistrer le profil du groupe</target>
|
||||||
@@ -5619,16 +5723,15 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Enregistrer les serveurs ?</target>
|
<target>Enregistrer les serveurs ?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Enregistrer les paramètres ?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Enregistrer le message d'accueil ?</target>
|
<target>Enregistrer le message d'accueil ?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Enregistré</target>
|
<target>Enregistré</target>
|
||||||
@@ -5649,6 +5752,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Message enregistré</target>
|
<target>Message enregistré</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<target>Échelle</target>
|
<target>Échelle</target>
|
||||||
@@ -5729,6 +5836,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Choisir</target>
|
<target>Choisir</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<target>%lld sélectionné(s)</target>
|
<target>%lld sélectionné(s)</target>
|
||||||
@@ -5847,7 +5958,7 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>L'expéditeur a annulé le transfert de fichiers.</target>
|
<target>L'expéditeur a annulé le transfert de fichiers.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -6064,6 +6175,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Paramètres</target>
|
<target>Paramètres</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Images de profil modelable</target>
|
<target>Images de profil modelable</target>
|
||||||
@@ -6099,6 +6214,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Partager le lien</target>
|
<target>Partager le lien</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Partager ce lien d'invitation unique</target>
|
<target>Partager ce lien d'invitation unique</target>
|
||||||
@@ -6264,6 +6383,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>Léger</target>
|
<target>Léger</target>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<target>Certains fichiers n'ont pas été exportés :</target>
|
<target>Certains fichiers n'ont pas été exportés :</target>
|
||||||
@@ -6439,6 +6562,10 @@ Activez-le dans les paramètres *Réseau et serveurs*.</target>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Prendre une photo</target>
|
<target>Prendre une photo</target>
|
||||||
@@ -6631,6 +6758,10 @@ Cela peut se produire en raison d'un bug ou lorsque la connexion est compromise.
|
|||||||
<target>Le texte collé n'est pas un lien SimpleX.</target>
|
<target>Le texte collé n'est pas un lien SimpleX.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<target>Thèmes</target>
|
<target>Thèmes</target>
|
||||||
@@ -6911,7 +7042,7 @@ Vous serez invité à confirmer l'authentification avant que cette fonction ne s
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>Serveurs inconnus !</target>
|
<target>Serveurs inconnus !</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -7025,6 +7156,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Utiliser les hôtes .onions</target>
|
<target>Utiliser les hôtes .onions</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Utiliser les serveurs SimpleX Chat ?</target>
|
<target>Utiliser les serveurs SimpleX Chat ?</target>
|
||||||
@@ -7100,6 +7235,10 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<target>Sélection de l'utilisateur</target>
|
<target>Sélection de l'utilisateur</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Vous utilisez les serveurs SimpleX.</target>
|
<target>Vous utilisez les serveurs SimpleX.</target>
|
||||||
@@ -7333,7 +7472,7 @@ Pour vous connecter, veuillez demander à votre contact de créer un autre lien
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Sans Tor ni VPN, votre adresse IP sera visible par ces relais XFTP : %@.</target>
|
<target>Sans Tor ni VPN, votre adresse IP sera visible par ces relais XFTP : %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7714,11 +7853,19 @@ Répéter la demande de connexion ?</target>
|
|||||||
<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 preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Votre contact a envoyé un fichier plus grand que la taille maximale supportée actuellement(%@).</target>
|
<target>Votre contact a envoyé un fichier plus grand que la taille maximale supportée actuellement(%@).</target>
|
||||||
@@ -7734,6 +7881,10 @@ Répéter la demande de connexion ?</target>
|
|||||||
<target>Vos contacts resteront connectés.</target>
|
<target>Vos contacts resteront connectés.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Votre base de données de chat actuelle va être SUPPRIMEE et REMPLACEE par celle importée.</target>
|
<target>Votre base de données de chat actuelle va être SUPPRIMEE et REMPLACEE par celle importée.</target>
|
||||||
@@ -7764,13 +7915,15 @@ Répéter la demande de connexion ?</target>
|
|||||||
<target>Votre profil **%@** sera partagé.</target>
|
<target>Votre profil **%@** sera partagé.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts. Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
||||||
<target>Votre profil est stocké sur votre appareil et est seulement partagé avec vos contacts.
|
|
||||||
Les serveurs SimpleX ne peuvent pas voir votre profil.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Votre profil, vos contacts et les messages reçus sont stockés sur votre appareil.</target>
|
<target>Votre profil, vos contacts et les messages reçus sont stockés sur votre appareil.</target>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -137,6 +137,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="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<target>%1$@, %2$@</target>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ e %lld membri</target>
|
<target>%@, %@ e %lld membri</target>
|
||||||
@@ -157,11 +162,31 @@
|
|||||||
<target>%d giorni</target>
|
<target>%d giorni</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d ore</target>
|
<target>%d ore</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d min</target>
|
<target>%d min</target>
|
||||||
@@ -1020,6 +1045,11 @@
|
|||||||
<target>Auto-accetta immagini</target>
|
<target>Auto-accetta immagini</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<target>Accetta automaticamente le impostazioni</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Indietro</target>
|
<target>Indietro</target>
|
||||||
@@ -1193,7 +1223,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Annulla</target>
|
<target>Annulla</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1213,7 +1243,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Impossibile ricevere il file</target>
|
<target>Impossibile ricevere il file</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1341,6 +1371,11 @@
|
|||||||
<target>Preferenze della chat</target>
|
<target>Preferenze della chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<target>Le preferenze della chat sono state cambiate.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<target>Tema della chat</target>
|
<target>Tema della chat</target>
|
||||||
@@ -1617,7 +1652,7 @@ Questo è il tuo link una tantum!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connection and servers status." xml:space="preserve">
|
<trans-unit id="Connection and servers status." xml:space="preserve">
|
||||||
<source>Connection and servers status.</source>
|
<source>Connection and servers status.</source>
|
||||||
<target>Stato di connessione e server.</target>
|
<target>Stato della connessione e dei server.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Connection error" xml:space="preserve">
|
<trans-unit id="Connection error" xml:space="preserve">
|
||||||
@@ -1740,6 +1775,11 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<target>Angolo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>Correggere il nome a %@?</target>
|
<target>Correggere il nome a %@?</target>
|
||||||
@@ -2409,6 +2449,10 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Non inviare la cronologia ai nuovi membri.</target>
|
<target>Non inviare la cronologia ai nuovi membri.</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 credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Non creare un indirizzo</target>
|
<target>Non creare un indirizzo</target>
|
||||||
@@ -2432,7 +2476,8 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Scarica</target>
|
<target>Scarica</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2449,6 +2494,10 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Scarica file</target>
|
<target>Scarica file</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<target>Scaricato</target>
|
<target>Scaricato</target>
|
||||||
@@ -2724,6 +2773,11 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Errore nella modifica dell'indirizzo</target>
|
<target>Errore nella modifica dell'indirizzo</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<target>Errore nel cambio di profilo di connessione</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Errore nel cambio di ruolo</target>
|
<target>Errore nel cambio di ruolo</target>
|
||||||
@@ -2734,6 +2788,11 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Errore nella modifica dell'impostazione</target>
|
<target>Errore nella modifica dell'impostazione</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<target>Errore nel passaggio a incognito!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<target>Errore di connessione al server di inoltro %@. Riprova più tardi.</target>
|
<target>Errore di connessione al server di inoltro %@. Riprova più tardi.</target>
|
||||||
@@ -2854,6 +2913,11 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Errore nel caricamento dei server %@</target>
|
<target>Errore nel caricamento dei server %@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<target>Errore nella migrazione delle impostazioni</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Errore di apertura della chat</target>
|
<target>Errore di apertura della chat</target>
|
||||||
@@ -2862,7 +2926,7 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Errore nella ricezione del file</target>
|
<target>Errore nella ricezione del file</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2954,6 +3018,11 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Errore nell'interruzione della chat</target>
|
<target>Errore nell'interruzione della chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<target>Errore nel cambio di profilo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Errore nel cambio di profilo!</target>
|
<target>Errore nel cambio di profilo!</target>
|
||||||
@@ -3090,6 +3159,11 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Errore del file</target>
|
<target>Errore del file</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<target>File non trovato - probabilmente è stato eliminato o annullato.</target>
|
<target>File non trovato - probabilmente è stato eliminato o annullato.</target>
|
||||||
@@ -3225,11 +3299,23 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Inoltra</target>
|
<target>Inoltra</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<target>Inoltra e salva i messaggi</target>
|
<target>Inoltra e salva i messaggi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Inoltrato</target>
|
<target>Inoltrato</target>
|
||||||
@@ -3240,6 +3326,10 @@ Questo è il tuo link una tantum!</target>
|
|||||||
<target>Inoltrato da</target>
|
<target>Inoltrato da</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<target>Il server di inoltro %@ non è riuscito a connettersi al server di destinazione %@. Riprova più tardi.</target>
|
<target>Il server di inoltro %@ non è riuscito a connettersi al server di destinazione %@. Riprova più tardi.</target>
|
||||||
@@ -3289,11 +3379,6 @@ Errore: %2$@</target>
|
|||||||
<target>Nome completo (facoltativo)</target>
|
<target>Nome completo (facoltativo)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Nome completo:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Completamente decentralizzato: visibile solo ai membri.</target>
|
<target>Completamente decentralizzato: visibile solo ai membri.</target>
|
||||||
@@ -3539,6 +3624,10 @@ Errore: %2$@</target>
|
|||||||
<target>Server ICE (uno per riga)</target>
|
<target>Server ICE (uno per riga)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Se non potete incontrarvi di persona, mostra il codice QR in una videochiamata o condividi il link.</target>
|
<target>Se non potete incontrarvi di persona, mostra il codice QR in una videochiamata o condividi il link.</target>
|
||||||
@@ -4184,6 +4273,11 @@ Questo è il tuo link per il gruppo %@!</target>
|
|||||||
<target>Server dei messaggi</target>
|
<target>Server dei messaggi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<target>Forma del messaggio</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>La fonte del messaggio resta privata.</target>
|
<target>La fonte del messaggio resta privata.</target>
|
||||||
@@ -4234,6 +4328,10 @@ Questo è il tuo link per il gruppo %@!</target>
|
|||||||
<target>Messaggi inviati</target>
|
<target>Messaggi inviati</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>I messaggi, i file e le chiamate sono protetti da **crittografia end-to-end** con perfect forward secrecy, ripudio e recupero da intrusione.</target>
|
<target>I messaggi, i file e le chiamate sono protetti da **crittografia end-to-end** con perfect forward secrecy, ripudio e recupero da intrusione.</target>
|
||||||
@@ -4529,6 +4627,10 @@ Questo è il tuo link per il gruppo %@!</target>
|
|||||||
<target>Nessuna selezione</target>
|
<target>Nessuna selezione</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Notifiche</target>
|
<target>Notifiche</target>
|
||||||
@@ -4561,7 +4663,7 @@ Questo è il tuo link per il gruppo %@!</target>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ok</target>
|
<target>Ok</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4752,6 +4854,11 @@ Richiede l'attivazione della VPN.</target>
|
|||||||
<target>Altri %@ server</target>
|
<target>Altri %@ server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4787,6 +4894,10 @@ Richiede l'attivazione della VPN.</target>
|
|||||||
<target>Codice di accesso impostato!</target>
|
<target>Codice di accesso impostato!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Password per mostrare</target>
|
<target>Password per mostrare</target>
|
||||||
@@ -4936,6 +5047,10 @@ Errore: %@</target>
|
|||||||
<target>Interfaccia polacca</target>
|
<target>Interfaccia polacca</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Probabilmente l'impronta del certificato nell'indirizzo del server è sbagliata</target>
|
<target>Probabilmente l'impronta del certificato nell'indirizzo del server è sbagliata</target>
|
||||||
@@ -5021,16 +5136,6 @@ Errore: %@</target>
|
|||||||
<target>Immagini del profilo</target>
|
<target>Immagini 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>
|
||||||
@@ -5133,6 +5238,10 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Server via proxy</target>
|
<target>Server via proxy</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Notifiche push</target>
|
<target>Notifiche push</target>
|
||||||
@@ -5354,6 +5463,11 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Rimuovi</target>
|
<target>Rimuovi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<target>Rimuovere l'archivio?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<target>Rimuovi immagine</target>
|
<target>Rimuovi immagine</target>
|
||||||
@@ -5534,6 +5648,10 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Server SMP</target>
|
<target>Server SMP</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Ricevi i file in sicurezza</target>
|
<target>Ricevi i file in sicurezza</target>
|
||||||
@@ -5547,12 +5665,13 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Salva</target>
|
<target>Salva</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Salva (e avvisa i contatti)</target>
|
<target>Salva (e avvisa i contatti)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5579,11 +5698,6 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Salva archivio</target>
|
<target>Salva archivio</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Salva le impostazioni di accettazione automatica</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Salva il profilo del gruppo</target>
|
<target>Salva il profilo del gruppo</target>
|
||||||
@@ -5619,16 +5733,16 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Salvare i server?</target>
|
<target>Salvare i server?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Salvare le impostazioni?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Salvare il messaggio di benvenuto?</target>
|
<target>Salvare il messaggio di benvenuto?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<target>Salvare il profilo?</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Salvato</target>
|
<target>Salvato</target>
|
||||||
@@ -5649,6 +5763,10 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Messaggio salvato</target>
|
<target>Messaggio salvato</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<target>Scala</target>
|
<target>Scala</target>
|
||||||
@@ -5729,6 +5847,11 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Seleziona</target>
|
<target>Seleziona</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<target>Seleziona il profilo di chat</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<target>%lld selezionato</target>
|
<target>%lld selezionato</target>
|
||||||
@@ -5847,7 +5970,7 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Il mittente ha annullato il trasferimento del file.</target>
|
<target>Il mittente ha annullato il trasferimento del file.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -6064,6 +6187,11 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Impostazioni</target>
|
<target>Impostazioni</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<target>Le impostazioni sono state cambiate.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Forma delle immagini del profilo</target>
|
<target>Forma delle immagini del profilo</target>
|
||||||
@@ -6099,6 +6227,11 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Condividi link</target>
|
<target>Condividi link</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<target>Condividi il profilo</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Condividi questo link di invito una tantum</target>
|
<target>Condividi questo link di invito una tantum</target>
|
||||||
@@ -6264,6 +6397,11 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>Leggera</target>
|
<target>Leggera</target>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<target>Alcune impostazioni dell'app non sono state migrate.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<target>Alcuni file non sono stati esportati:</target>
|
<target>Alcuni file non sono stati esportati:</target>
|
||||||
@@ -6439,6 +6577,11 @@ Attivalo nelle impostazioni *Rete e server*.</target>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<target>Coda</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Scatta foto</target>
|
<target>Scatta foto</target>
|
||||||
@@ -6631,6 +6774,11 @@ Può accadere a causa di qualche bug o quando la connessione è compromessa.</ta
|
|||||||
<target>Il testo che hai incollato non è un link SimpleX.</target>
|
<target>Il testo che hai incollato non è un link SimpleX.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<target>L'archivio del database caricato verrà rimosso definitivamente dai server.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<target>Temi</target>
|
<target>Temi</target>
|
||||||
@@ -6911,7 +7059,7 @@ Ti verrà chiesto di completare l'autenticazione prima di attivare questa funzio
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>Server sconosciuti!</target>
|
<target>Server sconosciuti!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -7025,6 +7173,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Usa gli host .onion</target>
|
<target>Usa gli host .onion</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Usare i server di SimpleX Chat?</target>
|
<target>Usare i server di SimpleX Chat?</target>
|
||||||
@@ -7100,6 +7252,10 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<target>Selezione utente</target>
|
<target>Selezione utente</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Utilizzo dei server SimpleX Chat.</target>
|
<target>Utilizzo dei server SimpleX Chat.</target>
|
||||||
@@ -7333,7 +7489,7 @@ Per connetterti, chiedi al tuo contatto di creare un altro link di connessione e
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Senza Tor o VPN, il tuo indirizzo IP sarà visibile a questi relay XFTP: %@.</target>
|
<target>Senza Tor o VPN, il tuo indirizzo IP sarà visibile a questi relay XFTP: %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7714,11 +7870,21 @@ Ripetere la richiesta di connessione?</target>
|
|||||||
<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 preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<target>Le tue preferenze della chat</target>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<target>La tua connessione è stata spostata a %@, ma si è verificato un errore imprevisto durante il reindirizzamento al profilo.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Il tuo contatto ha inviato un file più grande della dimensione massima attualmente supportata (%@).</target>
|
<target>Il tuo contatto ha inviato un file più grande della dimensione massima attualmente supportata (%@).</target>
|
||||||
@@ -7734,6 +7900,10 @@ Ripetere la richiesta di connessione?</target>
|
|||||||
<target>I tuoi contatti resteranno connessi.</target>
|
<target>I tuoi contatti resteranno connessi.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Il tuo attuale database della chat verrà ELIMINATO e SOSTITUITO con quello importato.</target>
|
<target>Il tuo attuale database della chat verrà ELIMINATO e SOSTITUITO con quello importato.</target>
|
||||||
@@ -7764,13 +7934,16 @@ Ripetere la richiesta di connessione?</target>
|
|||||||
<target>Verrà condiviso il tuo profilo **%@**.</target>
|
<target>Verrà condiviso il tuo profilo **%@**.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti. I server di SimpleX non possono vedere il tuo profilo.</target>
|
||||||
<target>Il tuo profilo è memorizzato sul tuo dispositivo e condiviso solo con i tuoi contatti.
|
|
||||||
I server di SimpleX non possono vedere il tuo profilo.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<target>Il tuo profilo è stato cambiato. Se lo salvi, il profilo aggiornato verrà inviato a tutti i tuoi contatti.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Il tuo profilo, i contatti e i messaggi recapitati sono memorizzati sul tuo dispositivo.</target>
|
<target>Il tuo profilo, i contatti e i messaggi recapitati sono memorizzati sul tuo dispositivo.</target>
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<target>%@ が接続を希望しています!</target>
|
<target>%@ が接続を希望しています!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@や%@など%lld人のメンバー</target>
|
<target>%@や%@など%lld人のメンバー</target>
|
||||||
@@ -157,11 +161,31 @@
|
|||||||
<target>%d 日</target>
|
<target>%d 日</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d 時</target>
|
<target>%d 時</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d 分</target>
|
<target>%d 分</target>
|
||||||
@@ -990,6 +1014,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="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>戻る</target>
|
<target>戻る</target>
|
||||||
@@ -1144,7 +1172,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>中止</target>
|
<target>中止</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1162,7 +1190,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>ファイル受信ができません</target>
|
<target>ファイル受信ができません</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1283,6 +1311,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="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -1640,6 +1672,10 @@ This is your own one-time link!</source>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2272,6 +2308,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Do not send history to new members.</source>
|
<source>Do not send history to new members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Do not use credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>アドレスを作成しないでください</target>
|
<target>アドレスを作成しないでください</target>
|
||||||
@@ -2294,7 +2334,8 @@ This is your own one-time link!</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2309,6 +2350,10 @@ This is your own one-time link!</source>
|
|||||||
<target>ファイルをダウンロード</target>
|
<target>ファイルをダウンロード</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2569,6 +2614,10 @@ This is your own one-time link!</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="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>役割変更にエラー発生</target>
|
<target>役割変更にエラー発生</target>
|
||||||
@@ -2579,6 +2628,10 @@ This is your own one-time link!</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="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2694,6 +2747,10 @@ This is your own one-time link!</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="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2701,7 +2758,7 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>ファイル受信にエラー発生</target>
|
<target>ファイル受信にエラー発生</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2787,6 +2844,10 @@ This is your own one-time link!</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="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>プロフィール切り替えにエラー発生!</target>
|
<target>プロフィール切り替えにエラー発生!</target>
|
||||||
@@ -2915,6 +2976,11 @@ This is your own one-time link!</source>
|
|||||||
<source>File error</source>
|
<source>File error</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<note>file error text</note>
|
<note>file error text</note>
|
||||||
@@ -3041,10 +3107,22 @@ This is your own one-time link!</source>
|
|||||||
<source>Forward</source>
|
<source>Forward</source>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3053,6 +3131,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Forwarded from</source>
|
<source>Forwarded from</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3094,11 +3176,6 @@ Error: %2$@</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="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>フルネーム:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3336,6 +3413,10 @@ Error: %2$@</source>
|
|||||||
<target>ICEサーバ (1行に1サーバ)</target>
|
<target>ICEサーバ (1行に1サーバ)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>直接会えない場合は、ビデオ通話で QR コードを表示するか、リンクを共有してください。</target>
|
<target>直接会えない場合は、ビデオ通話で QR コードを表示するか、リンクを共有してください。</target>
|
||||||
@@ -3942,6 +4023,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Message servers</source>
|
<source>Message servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3985,6 +4070,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Messages sent</source>
|
<source>Messages sent</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -4259,6 +4348,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Nothing selected</source>
|
<source>Nothing selected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>通知</target>
|
<target>通知</target>
|
||||||
@@ -4290,7 +4383,7 @@ This is your link for group %@!</source>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>OK</target>
|
<target>OK</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4470,6 +4563,11 @@ VPN を有効にする必要があります。</target>
|
|||||||
<source>Other %@ servers</source>
|
<source>Other %@ servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4505,6 +4603,10 @@ VPN を有効にする必要があります。</target>
|
|||||||
<target>パスコードを設定しました!</target>
|
<target>パスコードを設定しました!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>パスワードを表示する</target>
|
<target>パスワードを表示する</target>
|
||||||
@@ -4641,6 +4743,10 @@ Error: %@</source>
|
|||||||
<target>ポーランド語UI</target>
|
<target>ポーランド語UI</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>サーバアドレスの証明証IDが正しくないかもしれません</target>
|
<target>サーバアドレスの証明証IDが正しくないかもしれません</target>
|
||||||
@@ -4719,14 +4825,6 @@ Error: %@</source>
|
|||||||
<source>Profile images</source>
|
<source>Profile images</source>
|
||||||
<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>
|
||||||
@@ -4822,6 +4920,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Proxied servers</source>
|
<source>Proxied servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>プッシュ通知</target>
|
<target>プッシュ通知</target>
|
||||||
@@ -5027,6 +5129,10 @@ Enable in *Network & servers* 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="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5194,6 +5300,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>SMP server</source>
|
<source>SMP server</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5205,12 +5315,13 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>保存</target>
|
<target>保存</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>保存(連絡先に通知)</target>
|
<target>保存(連絡先に通知)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5236,11 +5347,6 @@ Enable in *Network & servers* 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="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>自動受け入れ設定を保存する</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>グループプロフィールの保存</target>
|
<target>グループプロフィールの保存</target>
|
||||||
@@ -5276,16 +5382,15 @@ Enable in *Network & servers* 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="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>設定を保存しますか?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</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="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5303,6 +5408,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Saved message</source>
|
<source>Saved message</source>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5376,6 +5485,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>選択</target>
|
<target>選択</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5485,7 +5598,7 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>送信者がファイル転送をキャンセルしました。</target>
|
<target>送信者がファイル転送をキャンセルしました。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -5680,6 +5793,10 @@ Enable in *Network & servers* 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="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5713,6 +5830,10 @@ Enable in *Network & servers* 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="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5867,6 +5988,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Soft</source>
|
<source>Soft</source>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6029,6 +6154,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>写真を撮影</target>
|
<target>写真を撮影</target>
|
||||||
@@ -6212,6 +6341,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<source>The text you pasted is not a SimpleX link.</source>
|
<source>The text you pasted is not a SimpleX link.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6468,7 +6601,7 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -6573,6 +6706,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>.onionホストを使う</target>
|
<target>.onionホストを使う</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>SimpleX チャット サーバーを使用しますか?</target>
|
<target>SimpleX チャット サーバーを使用しますか?</target>
|
||||||
@@ -6641,6 +6778,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<source>User selection</source>
|
<source>User selection</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>SimpleX チャット サーバーを使用する。</target>
|
<target>SimpleX チャット サーバーを使用する。</target>
|
||||||
@@ -6853,7 +6994,7 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7207,11 +7348,19 @@ Repeat connection request?</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 chat preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>連絡先が現在サポートされている最大サイズ (%@) より大きいファイルを送信しました。</target>
|
<target>連絡先が現在サポートされている最大サイズ (%@) より大きいファイルを送信しました。</target>
|
||||||
@@ -7227,6 +7376,10 @@ Repeat connection request?</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 credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>現在のチャット データベースは削除され、インポートされたデータベースに置き換えられます。</target>
|
<target>現在のチャット データベースは削除され、インポートされたデータベースに置き換えられます。</target>
|
||||||
@@ -7256,13 +7409,15 @@ Repeat connection request?</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 is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<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="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>あなたのプロフィール、連絡先、送信したメッセージがご自分の端末に保存されます。</target>
|
<target>あなたのプロフィール、連絡先、送信したメッセージがご自分の端末に保存されます。</target>
|
||||||
|
|||||||
@@ -137,6 +137,11 @@
|
|||||||
<target>%@ wil verbinding maken!</target>
|
<target>%@ wil verbinding maken!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<target>%1$@, %2$@</target>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ en %lld leden</target>
|
<target>%@, %@ en %lld leden</target>
|
||||||
@@ -157,11 +162,31 @@
|
|||||||
<target>%d dagen</target>
|
<target>%d dagen</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d uren</target>
|
<target>%d uren</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d min</target>
|
<target>%d min</target>
|
||||||
@@ -512,7 +537,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="A separate TCP connection will be used **for each chat profile you have in the app**." xml:space="preserve">
|
<trans-unit id="A separate TCP connection will be used **for each chat profile you have in the app**." xml:space="preserve">
|
||||||
<source>A separate TCP connection will be used **for each chat profile you have in the app**.</source>
|
<source>A separate TCP connection will be used **for each chat profile you have in the app**.</source>
|
||||||
<target>Er wordt een aparte TCP-verbinding gebruikt **voor elk chat profiel dat je in de app hebt**.</target>
|
<target>Er wordt een aparte TCP-verbinding gebruikt **voor elk chatprofiel dat je in de app hebt**.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="A separate TCP connection will be used **for each contact and group member**. **Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." xml:space="preserve">
|
<trans-unit id="A separate TCP connection will be used **for each contact and group member**. **Please note**: if you have many connections, your battery and traffic consumption can be substantially higher and some connections may fail." xml:space="preserve">
|
||||||
@@ -1020,6 +1045,11 @@
|
|||||||
<target>Afbeeldingen automatisch accepteren</target>
|
<target>Afbeeldingen automatisch accepteren</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<target>Instellingen automatisch accepteren</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Terug</target>
|
<target>Terug</target>
|
||||||
@@ -1142,7 +1172,7 @@
|
|||||||
</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">
|
||||||
<source>By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</source>
|
<source>By chat profile (default) or [by connection](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</source>
|
||||||
<target>Via chat profiel (standaard) of [via verbinding](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</target>
|
<target>Via chatprofiel (standaard) of [via verbinding](https://simplex.chat/blog/20230204-simplex-chat-v4-5-user-chat-profiles.html#transport-isolation) (BETA).</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Call already ended!" xml:space="preserve">
|
<trans-unit id="Call already ended!" xml:space="preserve">
|
||||||
@@ -1193,7 +1223,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Annuleren</target>
|
<target>Annuleren</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1213,7 +1243,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Kan bestand niet ontvangen</target>
|
<target>Kan bestand niet ontvangen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1341,6 +1371,11 @@
|
|||||||
<target>Gesprek voorkeuren</target>
|
<target>Gesprek voorkeuren</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<target>Chatvoorkeuren zijn gewijzigd.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<target>Chat thema</target>
|
<target>Chat thema</target>
|
||||||
@@ -1348,7 +1383,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Chats" xml:space="preserve">
|
<trans-unit id="Chats" xml:space="preserve">
|
||||||
<source>Chats</source>
|
<source>Chats</source>
|
||||||
<target>Gesprekken</target>
|
<target>Chats</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Check server address and try again." xml:space="preserve">
|
<trans-unit id="Check server address and try again." xml:space="preserve">
|
||||||
@@ -1740,6 +1775,11 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Core versie: v% @</target>
|
<target>Core versie: v% @</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<target>Hoek</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>Juiste naam voor %@?</target>
|
<target>Juiste naam voor %@?</target>
|
||||||
@@ -1951,7 +1991,7 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Database passphrase is required to open chat." xml:space="preserve">
|
<trans-unit id="Database passphrase is required to open chat." xml:space="preserve">
|
||||||
<source>Database passphrase is required to open chat.</source>
|
<source>Database passphrase is required to open chat.</source>
|
||||||
<target>Database wachtwoord is vereist om je gesprekken te openen.</target>
|
<target>Database wachtwoord is vereist om je chats te openen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Database upgrade" xml:space="preserve">
|
<trans-unit id="Database upgrade" xml:space="preserve">
|
||||||
@@ -2046,12 +2086,12 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete chat profile" xml:space="preserve">
|
<trans-unit id="Delete chat profile" xml:space="preserve">
|
||||||
<source>Delete chat profile</source>
|
<source>Delete chat profile</source>
|
||||||
<target>Chat profiel verwijderen</target>
|
<target>Chatprofiel verwijderen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
<trans-unit id="Delete chat profile?" xml:space="preserve">
|
||||||
<source>Delete chat profile?</source>
|
<source>Delete chat profile?</source>
|
||||||
<target>Chat profiel verwijderen?</target>
|
<target>Chatprofiel verwijderen?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete connection" xml:space="preserve">
|
<trans-unit id="Delete connection" xml:space="preserve">
|
||||||
@@ -2091,7 +2131,7 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete files for all chat profiles" xml:space="preserve">
|
<trans-unit id="Delete files for all chat profiles" xml:space="preserve">
|
||||||
<source>Delete files for all chat profiles</source>
|
<source>Delete files for all chat profiles</source>
|
||||||
<target>Verwijder bestanden voor alle chat profielen</target>
|
<target>Verwijder bestanden voor alle chatprofielen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete for everyone" xml:space="preserve">
|
<trans-unit id="Delete for everyone" xml:space="preserve">
|
||||||
@@ -2409,6 +2449,10 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Stuur geen geschiedenis naar nieuwe leden.</target>
|
<target>Stuur geen geschiedenis naar nieuwe leden.</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 credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Maak geen adres aan</target>
|
<target>Maak geen adres aan</target>
|
||||||
@@ -2432,7 +2476,8 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Downloaden</target>
|
<target>Downloaden</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2449,6 +2494,10 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Download bestand</target>
|
<target>Download bestand</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<target>Gedownload</target>
|
<target>Gedownload</target>
|
||||||
@@ -2724,6 +2773,11 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Fout bij wijzigen van adres</target>
|
<target>Fout bij wijzigen van adres</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<target>Fout bij wijzigen van verbindingsprofiel</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Fout bij wisselen van rol</target>
|
<target>Fout bij wisselen van rol</target>
|
||||||
@@ -2734,6 +2788,11 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Fout bij wijzigen van instelling</target>
|
<target>Fout bij wijzigen van instelling</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<target>Fout bij het overschakelen naar incognito!</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<target>Fout bij het verbinden met doorstuurserver %@. Probeer het later opnieuw.</target>
|
<target>Fout bij het verbinden met doorstuurserver %@. Probeer het later opnieuw.</target>
|
||||||
@@ -2854,6 +2913,11 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Fout bij het laden van %@ servers</target>
|
<target>Fout bij het laden van %@ servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<target>Fout bij migreren van instellingen</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Fout bij het openen van de chat</target>
|
<target>Fout bij het openen van de chat</target>
|
||||||
@@ -2862,7 +2926,7 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Fout bij ontvangen van bestand</target>
|
<target>Fout bij ontvangen van bestand</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2954,6 +3018,11 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Fout bij het stoppen van de chat</target>
|
<target>Fout bij het stoppen van de chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<target>Fout bij wisselen van profiel</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Fout bij wisselen van profiel!</target>
|
<target>Fout bij wisselen van profiel!</target>
|
||||||
@@ -3090,6 +3159,11 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Bestandsfout</target>
|
<target>Bestandsfout</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<target>Bestand niet gevonden - hoogstwaarschijnlijk is het bestand verwijderd of geannuleerd.</target>
|
<target>Bestand niet gevonden - hoogstwaarschijnlijk is het bestand verwijderd of geannuleerd.</target>
|
||||||
@@ -3182,7 +3256,7 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Find chats faster" xml:space="preserve">
|
<trans-unit id="Find chats faster" xml:space="preserve">
|
||||||
<source>Find chats faster</source>
|
<source>Find chats faster</source>
|
||||||
<target>Vind gesprekken sneller</target>
|
<target>Vind chats sneller</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Fix" xml:space="preserve">
|
<trans-unit id="Fix" xml:space="preserve">
|
||||||
@@ -3225,11 +3299,23 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Doorsturen</target>
|
<target>Doorsturen</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<target>Berichten doorsturen en opslaan</target>
|
<target>Berichten doorsturen en opslaan</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Doorgestuurd</target>
|
<target>Doorgestuurd</target>
|
||||||
@@ -3240,6 +3326,10 @@ Dit is uw eigen eenmalige link!</target>
|
|||||||
<target>Doorgestuurd vanuit</target>
|
<target>Doorgestuurd vanuit</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<target>De doorstuurserver %@ kon geen verbinding maken met de bestemmingsserver %@. Probeer het later opnieuw.</target>
|
<target>De doorstuurserver %@ kon geen verbinding maken met de bestemmingsserver %@. Probeer het later opnieuw.</target>
|
||||||
@@ -3289,11 +3379,6 @@ Fout: %2$@</target>
|
|||||||
<target>Volledige naam (optioneel)</target>
|
<target>Volledige naam (optioneel)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Volledige naam:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Volledig gedecentraliseerd – alleen zichtbaar voor leden.</target>
|
<target>Volledig gedecentraliseerd – alleen zichtbaar voor leden.</target>
|
||||||
@@ -3466,7 +3551,7 @@ Fout: %2$@</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Hidden chat profiles" xml:space="preserve">
|
<trans-unit id="Hidden chat profiles" xml:space="preserve">
|
||||||
<source>Hidden chat profiles</source>
|
<source>Hidden chat profiles</source>
|
||||||
<target>Verborgen chat profielen</target>
|
<target>Verborgen chatprofielen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Hidden profile password" xml:space="preserve">
|
<trans-unit id="Hidden profile password" xml:space="preserve">
|
||||||
@@ -3539,6 +3624,10 @@ Fout: %2$@</target>
|
|||||||
<target>ICE servers (één per lijn)</target>
|
<target>ICE servers (één per lijn)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Als je elkaar niet persoonlijk kunt ontmoeten, laat dan de QR-code zien in een videogesprek of deel de link.</target>
|
<target>Als je elkaar niet persoonlijk kunt ontmoeten, laat dan de QR-code zien in een videogesprek of deel de link.</target>
|
||||||
@@ -3818,7 +3907,7 @@ Fout: %2$@</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="It allows having many anonymous connections without any shared data between them in a single chat profile." xml:space="preserve">
|
<trans-unit id="It allows having many anonymous connections without any shared data between them in a single chat profile." xml:space="preserve">
|
||||||
<source>It allows having many anonymous connections without any shared data between them in a single chat profile.</source>
|
<source>It allows having many anonymous connections without any shared data between them in a single chat profile.</source>
|
||||||
<target>Het maakt het mogelijk om veel anonieme verbindingen te hebben zonder enige gedeelde gegevens tussen hen in een enkel chat profiel.</target>
|
<target>Het maakt het mogelijk om veel anonieme verbindingen te hebben zonder enige gedeelde gegevens tussen hen in een enkel chatprofiel.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
|
<trans-unit id="It can happen when you or your connection used the old database backup." xml:space="preserve">
|
||||||
@@ -3906,7 +3995,7 @@ Dit is jouw link voor groep %@!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Keep conversation" xml:space="preserve">
|
<trans-unit id="Keep conversation" xml:space="preserve">
|
||||||
<source>Keep conversation</source>
|
<source>Keep conversation</source>
|
||||||
<target>Blijf in gesprek</target>
|
<target>Behoud het gesprek</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">
|
<trans-unit id="Keep the app open to use it from desktop" xml:space="preserve">
|
||||||
@@ -4184,6 +4273,11 @@ Dit is jouw link voor groep %@!</target>
|
|||||||
<target>Berichtservers</target>
|
<target>Berichtservers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<target>Berichtvorm</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>Berichtbron blijft privé.</target>
|
<target>Berichtbron blijft privé.</target>
|
||||||
@@ -4234,6 +4328,10 @@ Dit is jouw link voor groep %@!</target>
|
|||||||
<target>Berichten verzonden</target>
|
<target>Berichten verzonden</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Berichten, bestanden en oproepen worden beschermd door **end-to-end codering** met perfecte voorwaartse geheimhouding, afwijzing en inbraakherstel.</target>
|
<target>Berichten, bestanden en oproepen worden beschermd door **end-to-end codering** met perfecte voorwaartse geheimhouding, afwijzing en inbraakherstel.</target>
|
||||||
@@ -4336,7 +4434,7 @@ Dit is jouw link voor groep %@!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Multiple chat profiles" xml:space="preserve">
|
<trans-unit id="Multiple chat profiles" xml:space="preserve">
|
||||||
<source>Multiple chat profiles</source>
|
<source>Multiple chat profiles</source>
|
||||||
<target>Meerdere chat profielen</target>
|
<target>Meerdere chatprofielen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Mute" xml:space="preserve">
|
<trans-unit id="Mute" xml:space="preserve">
|
||||||
@@ -4486,7 +4584,7 @@ Dit is jouw link voor groep %@!</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="No filtered chats" xml:space="preserve">
|
<trans-unit id="No filtered chats" xml:space="preserve">
|
||||||
<source>No filtered chats</source>
|
<source>No filtered chats</source>
|
||||||
<target>Geen gefilterde gesprekken</target>
|
<target>Geen gefilterde chats</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="No group!" xml:space="preserve">
|
<trans-unit id="No group!" xml:space="preserve">
|
||||||
@@ -4529,6 +4627,10 @@ Dit is jouw link voor groep %@!</target>
|
|||||||
<target>Niets geselecteerd</target>
|
<target>Niets geselecteerd</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Meldingen</target>
|
<target>Meldingen</target>
|
||||||
@@ -4561,7 +4663,7 @@ Dit is jouw link voor groep %@!</target>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>OK</target>
|
<target>OK</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4752,6 +4854,11 @@ Vereist het inschakelen van VPN.</target>
|
|||||||
<target>Andere %@ servers</target>
|
<target>Andere %@ servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4787,6 +4894,10 @@ Vereist het inschakelen van VPN.</target>
|
|||||||
<target>Toegangscode ingesteld!</target>
|
<target>Toegangscode ingesteld!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Wachtwoord om weer te geven</target>
|
<target>Wachtwoord om weer te geven</target>
|
||||||
@@ -4844,7 +4955,7 @@ Vereist het inschakelen van VPN.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Play from the chat list." xml:space="preserve">
|
<trans-unit id="Play from the chat list." xml:space="preserve">
|
||||||
<source>Play from the chat list.</source>
|
<source>Play from the chat list.</source>
|
||||||
<target>Afspelen via de gesprekken lijst.</target>
|
<target>Afspelen via de chat lijst.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
|
<trans-unit id="Please ask your contact to enable calls." xml:space="preserve">
|
||||||
@@ -4923,7 +5034,7 @@ Fout: %@</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Please store passphrase securely, you will NOT be able to access chat if you lose it." xml:space="preserve">
|
<trans-unit id="Please store passphrase securely, you will NOT be able to access chat if you lose it." xml:space="preserve">
|
||||||
<source>Please store passphrase securely, you will NOT be able to access chat if you lose it.</source>
|
<source>Please store passphrase securely, you will NOT be able to access chat if you lose it.</source>
|
||||||
<target>Sla het wachtwoord veilig op. Als u deze kwijtraakt, heeft u GEEN toegang tot de gesprekken.</target>
|
<target>Sla het wachtwoord veilig op. Als u deze kwijtraakt, heeft u GEEN toegang tot de chats.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Please store passphrase securely, you will NOT be able to change it if you lose it." xml:space="preserve">
|
<trans-unit id="Please store passphrase securely, you will NOT be able to change it if you lose it." xml:space="preserve">
|
||||||
@@ -4936,6 +5047,10 @@ Fout: %@</target>
|
|||||||
<target>Poolse interface</target>
|
<target>Poolse interface</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Mogelijk is de certificaat vingerafdruk in het server adres onjuist</target>
|
<target>Mogelijk is de certificaat vingerafdruk in het server adres onjuist</target>
|
||||||
@@ -5021,16 +5136,6 @@ Fout: %@</target>
|
|||||||
<target>Profiel afbeeldingen</target>
|
<target>Profiel afbeeldingen</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>Profielnaam</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Profile name:" xml:space="preserve">
|
|
||||||
<source>Profile name:</source>
|
|
||||||
<target>Profielnaam:</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>Profiel wachtwoord</target>
|
<target>Profiel wachtwoord</target>
|
||||||
@@ -5110,7 +5215,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
|
<trans-unit id="Protect your chat profiles with a password!" xml:space="preserve">
|
||||||
<source>Protect your chat profiles with a password!</source>
|
<source>Protect your chat profiles with a password!</source>
|
||||||
<target>Bescherm je chat profielen met een wachtwoord!</target>
|
<target>Bescherm je chatprofielen met een wachtwoord!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Protocol timeout" xml:space="preserve">
|
<trans-unit id="Protocol timeout" xml:space="preserve">
|
||||||
@@ -5133,6 +5238,10 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Proxied servers</target>
|
<target>Proxied servers</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Push meldingen</target>
|
<target>Push meldingen</target>
|
||||||
@@ -5354,6 +5463,11 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Verwijderen</target>
|
<target>Verwijderen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<target>Archief verwijderen?</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<target>Verwijder afbeelding</target>
|
<target>Verwijder afbeelding</target>
|
||||||
@@ -5466,7 +5580,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Restart the app to create a new chat profile" xml:space="preserve">
|
<trans-unit id="Restart the app to create a new chat profile" xml:space="preserve">
|
||||||
<source>Restart the app to create a new chat profile</source>
|
<source>Restart the app to create a new chat profile</source>
|
||||||
<target>Start de app opnieuw om een nieuw chat profiel aan te maken</target>
|
<target>Start de app opnieuw om een nieuw chatprofiel aan te maken</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Restart the app to use imported chat database" xml:space="preserve">
|
<trans-unit id="Restart the app to use imported chat database" xml:space="preserve">
|
||||||
@@ -5534,6 +5648,10 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>SMP server</target>
|
<target>SMP server</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Veilig bestanden ontvangen</target>
|
<target>Veilig bestanden ontvangen</target>
|
||||||
@@ -5547,12 +5665,13 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Opslaan</target>
|
<target>Opslaan</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Bewaar (en informeer contacten)</target>
|
<target>Bewaar (en informeer contacten)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5579,11 +5698,6 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Bewaar archief</target>
|
<target>Bewaar archief</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Sla instellingen voor automatisch accepteren op</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Groep profiel opslaan</target>
|
<target>Groep profiel opslaan</target>
|
||||||
@@ -5591,7 +5705,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save passphrase and open chat" xml:space="preserve">
|
<trans-unit id="Save passphrase and open chat" xml:space="preserve">
|
||||||
<source>Save passphrase and open chat</source>
|
<source>Save passphrase and open chat</source>
|
||||||
<target>Bewaar het wachtwoord en open je gesprekken</target>
|
<target>Bewaar het wachtwoord en open je chats</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save passphrase in Keychain" xml:space="preserve">
|
<trans-unit id="Save passphrase in Keychain" xml:space="preserve">
|
||||||
@@ -5611,7 +5725,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save servers" xml:space="preserve">
|
<trans-unit id="Save servers" xml:space="preserve">
|
||||||
<source>Save servers</source>
|
<source>Save servers</source>
|
||||||
<target>Bewaar servers</target>
|
<target>Servers opslaan</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save servers?" xml:space="preserve">
|
<trans-unit id="Save servers?" xml:space="preserve">
|
||||||
@@ -5619,16 +5733,16 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Servers opslaan?</target>
|
<target>Servers opslaan?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Instellingen opslaan?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Welkom bericht opslaan?</target>
|
<target>Welkom bericht opslaan?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<target>Uw profiel opslaan?</target>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Opgeslagen</target>
|
<target>Opgeslagen</target>
|
||||||
@@ -5649,6 +5763,10 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Opgeslagen bericht</target>
|
<target>Opgeslagen bericht</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<target>Schaal</target>
|
<target>Schaal</target>
|
||||||
@@ -5729,6 +5847,11 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Selecteer</target>
|
<target>Selecteer</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<target>Selecteer chatprofiel</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<target>%lld geselecteerd</target>
|
<target>%lld geselecteerd</target>
|
||||||
@@ -5847,7 +5970,7 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Afzender heeft bestandsoverdracht geannuleerd.</target>
|
<target>Afzender heeft bestandsoverdracht geannuleerd.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -6064,6 +6187,11 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Instellingen</target>
|
<target>Instellingen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<target>Instellingen zijn gewijzigd.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Vorm profiel afbeeldingen</target>
|
<target>Vorm profiel afbeeldingen</target>
|
||||||
@@ -6099,6 +6227,11 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Deel link</target>
|
<target>Deel link</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<target>Profiel delen</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Deel deze eenmalige uitnodigingslink</target>
|
<target>Deel deze eenmalige uitnodigingslink</target>
|
||||||
@@ -6264,6 +6397,11 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>Soft</target>
|
<target>Soft</target>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<target>Sommige app-instellingen zijn niet gemigreerd.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<target>Sommige bestanden zijn niet geëxporteerd:</target>
|
<target>Sommige bestanden zijn niet geëxporteerd:</target>
|
||||||
@@ -6439,6 +6577,10 @@ Schakel dit in in *Netwerk en servers*-instellingen.</target>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Foto nemen</target>
|
<target>Foto nemen</target>
|
||||||
@@ -6623,7 +6765,7 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The servers for new connections of your current chat profile **%@**." xml:space="preserve">
|
<trans-unit id="The servers for new connections of your current chat profile **%@**." xml:space="preserve">
|
||||||
<source>The servers for new connections of your current chat profile **%@**.</source>
|
<source>The servers for new connections of your current chat profile **%@**.</source>
|
||||||
<target>De servers voor nieuwe verbindingen van uw huidige chat profiel **%@**.</target>
|
<target>De servers voor nieuwe verbindingen van uw huidige chatprofiel **%@**.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="The text you pasted is not a SimpleX link." xml:space="preserve">
|
<trans-unit id="The text you pasted is not a SimpleX link." xml:space="preserve">
|
||||||
@@ -6631,6 +6773,11 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
|
|||||||
<target>De tekst die u hebt geplakt is geen SimpleX link.</target>
|
<target>De tekst die u hebt geplakt is geen SimpleX link.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<target>Het geüploade databasearchief wordt permanent van de servers verwijderd.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<target>Thema's</target>
|
<target>Thema's</target>
|
||||||
@@ -6708,7 +6855,7 @@ Het kan gebeuren vanwege een bug of wanneer de verbinding is aangetast.</target>
|
|||||||
</trans-unit>
|
</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>Deze instelling is van toepassing op berichten in je huidige chat profiel **%@**.</target>
|
<target>Deze instelling is van toepassing op berichten in je huidige chatprofiel **%@**.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Title" xml:space="preserve">
|
<trans-unit id="Title" xml:space="preserve">
|
||||||
@@ -6765,7 +6912,7 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." xml:space="preserve">
|
<trans-unit id="To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page." xml:space="preserve">
|
||||||
<source>To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page.</source>
|
<source>To reveal your hidden profile, enter a full password into a search field in **Your chat profiles** page.</source>
|
||||||
<target>Om uw verborgen profiel te onthullen, voert u een volledig wachtwoord in een zoek veld in op de pagina **Uw chat profielen**.</target>
|
<target>Om uw verborgen profiel te onthullen, voert u een volledig wachtwoord in een zoek veld in op de pagina **Uw chatprofielen**.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
<trans-unit id="To support instant push notifications the chat database has to be migrated." xml:space="preserve">
|
||||||
@@ -6880,7 +7027,7 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
<trans-unit id="Unhide chat profile" xml:space="preserve">
|
||||||
<source>Unhide chat profile</source>
|
<source>Unhide chat profile</source>
|
||||||
<target>Chat profiel zichtbaar maken</target>
|
<target>Chatprofiel zichtbaar maken</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unhide profile" xml:space="preserve">
|
<trans-unit id="Unhide profile" xml:space="preserve">
|
||||||
@@ -6911,7 +7058,7 @@ U wordt gevraagd de authenticatie te voltooien voordat deze functie wordt ingesc
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>Onbekende servers!</target>
|
<target>Onbekende servers!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -7025,6 +7172,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
|
|||||||
<target>Gebruik .onion-hosts</target>
|
<target>Gebruik .onion-hosts</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>SimpleX Chat servers gebruiken?</target>
|
<target>SimpleX Chat servers gebruiken?</target>
|
||||||
@@ -7100,6 +7251,10 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
|
|||||||
<target>Gebruikersselectie</target>
|
<target>Gebruikersselectie</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>SimpleX Chat servers gebruiken.</target>
|
<target>SimpleX Chat servers gebruiken.</target>
|
||||||
@@ -7333,7 +7488,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Zonder Tor of VPN zal uw IP-adres zichtbaar zijn voor deze XFTP-relays: %@.</target>
|
<target>Zonder Tor of VPN zal uw IP-adres zichtbaar zijn voor deze XFTP-relays: %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7382,7 +7537,7 @@ Om verbinding te maken, vraagt u uw contact om een andere verbinding link te mak
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="You already have a chat profile with the same display name. Please choose another name." xml:space="preserve">
|
<trans-unit id="You already have a chat profile with the same display name. Please choose another name." xml:space="preserve">
|
||||||
<source>You already have a chat profile with the same display name. Please choose another name.</source>
|
<source>You already have a chat profile with the same display name. Please choose another name.</source>
|
||||||
<target>Je hebt al een chat profiel met dezelfde weergave naam. Kies een andere naam.</target>
|
<target>Je hebt al een chatprofiel met dezelfde weergave naam. Kies een andere naam.</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 connected to %@." xml:space="preserve">
|
<trans-unit id="You are already connected to %@." xml:space="preserve">
|
||||||
@@ -7714,11 +7869,21 @@ Verbindingsverzoek herhalen?</target>
|
|||||||
<target>Uw chat database is niet versleuteld, stel een wachtwoord in om deze te versleutelen.</target>
|
<target>Uw chat database is niet versleuteld, stel een wachtwoord in om deze te versleutelen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your chat preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<target>Uw chat voorkeuren</target>
|
||||||
|
<note>alert title</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>Uw chat profielen</target>
|
<target>Uw chat profielen</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<target>Uw verbinding is verplaatst naar %@, maar er is een onverwachte fout opgetreden tijdens het omleiden naar het profiel.</target>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Uw contact heeft een bestand verzonden dat groter is dan de momenteel ondersteunde maximale grootte (%@).</target>
|
<target>Uw contact heeft een bestand verzonden dat groter is dan de momenteel ondersteunde maximale grootte (%@).</target>
|
||||||
@@ -7734,6 +7899,10 @@ Verbindingsverzoek herhalen?</target>
|
|||||||
<target>Uw contacten blijven verbonden.</target>
|
<target>Uw contacten blijven verbonden.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Uw huidige chat database wordt VERWIJDERD en VERVANGEN door de geïmporteerde.</target>
|
<target>Uw huidige chat database wordt VERWIJDERD en VERVANGEN door de geïmporteerde.</target>
|
||||||
@@ -7764,13 +7933,16 @@ Verbindingsverzoek herhalen?</target>
|
|||||||
<target>Uw profiel **%@** wordt gedeeld.</target>
|
<target>Uw profiel **%@** wordt gedeeld.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten. SimpleX servers kunnen uw profiel niet zien.</target>
|
||||||
<target>Uw profiel wordt op uw apparaat opgeslagen en alleen gedeeld met uw contacten.
|
|
||||||
SimpleX servers kunnen uw profiel niet zien.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<target>Je profiel is gewijzigd. Als je het opslaat, wordt het bijgewerkte profiel naar al je contacten verzonden.</target>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Uw profiel, contacten en afgeleverde berichten worden op uw apparaat opgeslagen.</target>
|
<target>Uw profiel, contacten en afgeleverde berichten worden op uw apparaat opgeslagen.</target>
|
||||||
@@ -8917,7 +9089,7 @@ laatst ontvangen bericht: %2$@</target>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Database passphrase is required to open chat." xml:space="preserve">
|
<trans-unit id="Database passphrase is required to open chat." xml:space="preserve">
|
||||||
<source>Database passphrase is required to open chat.</source>
|
<source>Database passphrase is required to open chat.</source>
|
||||||
<target>Database wachtwoord is vereist om je gesprekken te openen.</target>
|
<target>Database wachtwoord is vereist om je chats te openen.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Database upgrade required" xml:space="preserve">
|
<trans-unit id="Database upgrade required" xml:space="preserve">
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -5234,6 +5234,274 @@ Isso pode acontecer por causa de algum bug ou quando a conexão está comprometi
|
|||||||
<target state="translated">%1$@ em %2$@:</target>
|
<target state="translated">%1$@ em %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="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
|
||||||
|
<target state="translated">Permitir que seus contatos deletem mensagens enviadas de maneira irreversível. (24 horas)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ downloaded" xml:space="preserve" approved="no">
|
||||||
|
<source>%@ downloaded</source>
|
||||||
|
<target state="translated">baixado</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ uploaded" xml:space="preserve" approved="no">
|
||||||
|
<source>%@ uploaded</source>
|
||||||
|
<target state="translated">transferido</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="A new random profile will be shared." xml:space="preserve" approved="no">
|
||||||
|
<source>A new random profile will be shared.</source>
|
||||||
|
<target state="translated">Um novo perfil aleatório será compartilhado.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Camera not available" xml:space="preserve" approved="no">
|
||||||
|
<source>Camera not available</source>
|
||||||
|
<target state="translated">Câmera indisponível</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Admins can block a member for all." xml:space="preserve" approved="no">
|
||||||
|
<source>Admins can block a member for all.</source>
|
||||||
|
<target state="translated">Administradores podem bloquear um membro para todos.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow to irreversibly delete sent messages. (24 hours)</source>
|
||||||
|
<target state="translated">Permitir que mensagens enviadas sejam deletadas de maneira irreversível. (24 horas)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Apply" xml:space="preserve" approved="no">
|
||||||
|
<source>Apply</source>
|
||||||
|
<target state="translated">Aplicar</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Accent" xml:space="preserve" approved="no">
|
||||||
|
<source>Accent</source>
|
||||||
|
<target state="translated">Esquema</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Accept connection request?" xml:space="preserve" approved="no">
|
||||||
|
<source>Accept connection request?</source>
|
||||||
|
<target state="translated">Aceitar solicitação de conexão?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Active connections" xml:space="preserve" approved="no">
|
||||||
|
<source>Active connections</source>
|
||||||
|
<target state="translated">Conexões ativas</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Add contact" xml:space="preserve" approved="no">
|
||||||
|
<source>Add contact</source>
|
||||||
|
<target state="translated">Adicionar contato</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Additional accent" xml:space="preserve" approved="no">
|
||||||
|
<source>Additional accent</source>
|
||||||
|
<target state="translated">Esquema adicional</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="All new messages from %@ will be hidden!" xml:space="preserve" approved="no">
|
||||||
|
<source>All new messages from %@ will be hidden!</source>
|
||||||
|
<target state="translated">Todas as novas mensagens de %@ serão ocultas!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="All profiles" xml:space="preserve" approved="no">
|
||||||
|
<source>All profiles</source>
|
||||||
|
<target state="translated">Todos perfis</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow calls?" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow calls?</source>
|
||||||
|
<target state="translated">Permitir chamadas?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Archive contacts to chat later." xml:space="preserve" approved="no">
|
||||||
|
<source>Archive contacts to chat later.</source>
|
||||||
|
<target state="translated">Arquivar contatos para conversar depois.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Blur media" xml:space="preserve" approved="no">
|
||||||
|
<source>Blur media</source>
|
||||||
|
<target state="translated">Censurar mídia</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Calls prohibited!" xml:space="preserve" approved="no">
|
||||||
|
<source>Calls prohibited!</source>
|
||||||
|
<target state="translated">Chamadas proibidas!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Can't call contact" xml:space="preserve" approved="no">
|
||||||
|
<source>Can't call contact</source>
|
||||||
|
<target state="translated">Não foi possível ligar para o contato</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve" approved="no">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<target state="translated">mensagens deletadas</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve" approved="no">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<target state="translated">0 seg</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked" xml:space="preserve" approved="no">
|
||||||
|
<source>%lld messages blocked</source>
|
||||||
|
<target state="translated">mensagens bloqueadas</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages blocked by admin" xml:space="preserve" approved="no">
|
||||||
|
<source>%lld messages blocked by admin</source>
|
||||||
|
<target state="translated">mensagens bloqueadas pelo administrador</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection." xml:space="preserve" approved="no">
|
||||||
|
<source>**Please note**: using the same database on two devices will break the decryption of messages from your connections, as a security protection.</source>
|
||||||
|
<target state="translated">**Nota**: usar o mesmo banco de dados em dois dispositivos irá quebrar a desencriptação das mensagens de suas conexões como uma medida de segurança.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="- more stable message delivery. - a bit better groups. - and more!" xml:space="preserve" approved="no">
|
||||||
|
<source>- more stable message delivery.
|
||||||
|
- a bit better groups.
|
||||||
|
- and more!</source>
|
||||||
|
<target state="translated">- entrega de mensagens mais estável.
|
||||||
|
- grupos melhorados.
|
||||||
|
- e muito mais!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="All messages will be deleted - this cannot be undone!" xml:space="preserve" approved="no">
|
||||||
|
<source>All messages will be deleted - this cannot be undone!</source>
|
||||||
|
<target state="translated">Todas as mensagens serão deletadas - isto não pode ser desfeito!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow to send files and media." xml:space="preserve" approved="no">
|
||||||
|
<source>Allow to send files and media.</source>
|
||||||
|
<target state="translated">Permitir o envio de arquivos e mídia.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow to send SimpleX links." xml:space="preserve" approved="no">
|
||||||
|
<source>Allow to send SimpleX links.</source>
|
||||||
|
<target state="translated">Permitir envio de links SimpleX.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block for all" xml:space="preserve" approved="no">
|
||||||
|
<source>Block for all</source>
|
||||||
|
<target state="translated">Bloquear para todos</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve" approved="no">
|
||||||
|
<source>Block member</source>
|
||||||
|
<target state="translated">Bloquear membro</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Blocked by admin" xml:space="preserve" approved="no">
|
||||||
|
<source>Blocked by admin</source>
|
||||||
|
<target state="translated">Bloqueado por um administrador</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block group members" xml:space="preserve" approved="no">
|
||||||
|
<source>Block group members</source>
|
||||||
|
<target state="translated">Bloquear membros de grupo</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member for all?" xml:space="preserve" approved="no">
|
||||||
|
<source>Block member for all?</source>
|
||||||
|
<target state="translated">Bloquear membro para todos?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve" approved="no">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<target state="translated">Bloquear membro?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Both you and your contact can irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Both you and your contact can irreversibly delete sent messages. (24 hours)</source>
|
||||||
|
<target state="translated">Você e seu contato podem apagar mensagens enviadas de maneira irreversível. (24 horas)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Can't call member" xml:space="preserve" approved="no">
|
||||||
|
<source>Can't call member</source>
|
||||||
|
<target state="translated">Não foi possível ligar para este membro</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Can't message member" xml:space="preserve" approved="no">
|
||||||
|
<source>Can't message member</source>
|
||||||
|
<target state="translated">Não foi possível enviar mensagem para este membro</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Cancel migration" xml:space="preserve" approved="no">
|
||||||
|
<source>Cancel migration</source>
|
||||||
|
<target state="translated">Cancelar migração</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Abort" xml:space="preserve" approved="no">
|
||||||
|
<source>Abort</source>
|
||||||
|
<target state="translated">Abortar</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Abort changing address" xml:space="preserve" approved="no">
|
||||||
|
<source>Abort changing address</source>
|
||||||
|
<target state="translated">Abortar troca de endereço</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Abort changing address?" xml:space="preserve" approved="no">
|
||||||
|
<source>Abort changing address?</source>
|
||||||
|
<target state="translated">Abortar troca de endereço?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="- optionally notify deleted contacts. - profile names with spaces. - and more!" xml:space="preserve" approved="no">
|
||||||
|
<source>- optionally notify deleted contacts.
|
||||||
|
- profile names with spaces.
|
||||||
|
- and more!</source>
|
||||||
|
<target state="translated">- notificar contatos apagados de maneira opcional.
|
||||||
|
- nome de perfil com espaços.
|
||||||
|
- e muito mais!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow sharing" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow sharing</source>
|
||||||
|
<target state="translated">Permitir compartilhamento</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve" approved="no">
|
||||||
|
<source>Block</source>
|
||||||
|
<target state="translated">Bloquear</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Additional accent 2" xml:space="preserve" approved="no">
|
||||||
|
<source>Additional accent 2</source>
|
||||||
|
<target state="translated">Esquema adicional 2</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve" approved="no">
|
||||||
|
<source>Address change will be aborted. Old receiving address will be used.</source>
|
||||||
|
<target state="translated">Alteração de endereço será abortada. O endereço antigo será utilizado.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Advanced settings" xml:space="preserve" approved="no">
|
||||||
|
<source>Advanced settings</source>
|
||||||
|
<target state="translated">Configurações avançadas</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="All data is private to your device." xml:space="preserve" approved="no">
|
||||||
|
<source>All data is private to your device.</source>
|
||||||
|
<target state="translated">Toda informação é privada em seu dispositivo.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve" approved="no">
|
||||||
|
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
|
||||||
|
<target state="translated">Todos os seus contatos, conversas e arquivos serão encriptados e enviados em pedaços para nós XFTP.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||||
|
<target state="translated">Permitir deletar mensagens de maneira irreversível apenas se seu contato permitir para você. (24 horas)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve" approved="no">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<target state="translated">Já está conectando!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve" approved="no">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<target state="translated">Já está entrando no grupo!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Always use private routing." xml:space="preserve" approved="no">
|
||||||
|
<source>Always use private routing.</source>
|
||||||
|
<target state="translated">Sempre use rotas privadas.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Apply to" xml:space="preserve" approved="no">
|
||||||
|
<source>Apply to</source>
|
||||||
|
<target state="translated">Aplicar em</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Archiving database" xml:space="preserve" approved="no">
|
||||||
|
<source>Archiving database</source>
|
||||||
|
<target state="translated">Arquivando banco de dados</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Black" xml:space="preserve" approved="no">
|
||||||
|
<source>Black</source>
|
||||||
|
<target state="translated">Preto</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Cannot forward message" xml:space="preserve" approved="no">
|
||||||
|
<source>Cannot forward message</source>
|
||||||
|
<target state="translated">Não é possível encaminhar mensagem</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve" approved="no">
|
||||||
|
<source>(new)</source>
|
||||||
|
<target state="translated">(novo)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(this device v%@)" xml:space="preserve" approved="no">
|
||||||
|
<source>(this device v%@)</source>
|
||||||
|
<target state="translated">este dispositivo</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="**Add contact**: to create a new invitation link, or connect via a link you received." xml:space="preserve" approved="no">
|
||||||
|
<source>**Add contact**: to create a new invitation link, or connect via a link you received.</source>
|
||||||
|
<target state="translated">**Adicionar contato**: criar um novo link de convite ou conectar via um link que você recebeu.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="**Create group**: to create a new group." xml:space="preserve" approved="no">
|
||||||
|
<source>**Create group**: to create a new group.</source>
|
||||||
|
<target state="translated">**Criar grupo**: criar um novo grupo.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="**Warning**: the archive will be removed." xml:space="preserve" approved="no">
|
||||||
|
<source>**Warning**: the archive will be removed.</source>
|
||||||
|
<target state="translated">**Aviso**: o arquivo será removido.</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="A few more things" xml:space="preserve" approved="no">
|
||||||
|
<source>A few more things</source>
|
||||||
|
<target state="translated">E mais algumas coisas</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Archived contacts" xml:space="preserve" approved="no">
|
||||||
|
<source>Archived contacts</source>
|
||||||
|
<target state="translated">Contatos arquivados</target>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pt-BR" datatype="plaintext">
|
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="pt-BR" datatype="plaintext">
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<target>%@ хочет соединиться!</target>
|
<target>%@ хочет соединиться!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ и %lld членов группы</target>
|
<target>%@, %@ и %lld членов группы</target>
|
||||||
@@ -157,11 +161,31 @@
|
|||||||
<target>%d дней</target>
|
<target>%d дней</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d ч.</target>
|
<target>%d ч.</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d мин</target>
|
<target>%d мин</target>
|
||||||
@@ -1020,6 +1044,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="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Назад</target>
|
<target>Назад</target>
|
||||||
@@ -1193,7 +1221,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>Отменить</target>
|
<target>Отменить</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1213,7 +1241,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Невозможно получить файл</target>
|
<target>Невозможно получить файл</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1341,6 +1369,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="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<target>Тема чата</target>
|
<target>Тема чата</target>
|
||||||
@@ -1418,7 +1450,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Color chats with the new themes." xml:space="preserve">
|
<trans-unit id="Color chats with the new themes." xml:space="preserve">
|
||||||
<source>Color chats with the new themes.</source>
|
<source>Color chats with the new themes.</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="Color mode" xml:space="preserve">
|
<trans-unit id="Color mode" xml:space="preserve">
|
||||||
@@ -1740,6 +1772,10 @@ This is your own one-time link!</source>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>Исправить имя на %@?</target>
|
<target>Исправить имя на %@?</target>
|
||||||
@@ -2176,7 +2212,7 @@ This is your own one-time link!</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete up to 20 messages at once." xml:space="preserve">
|
<trans-unit id="Delete up to 20 messages at once." xml:space="preserve">
|
||||||
<source>Delete up to 20 messages at once.</source>
|
<source>Delete up to 20 messages at once.</source>
|
||||||
<target>Удаляйте до 20 сообщений одновременно.</target>
|
<target>Удаляйте до 20 сообщений за раз.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Delete user profile?" xml:space="preserve">
|
<trans-unit id="Delete user profile?" xml:space="preserve">
|
||||||
@@ -2409,6 +2445,10 @@ This is your own one-time link!</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="Do not use credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Не создавать адрес</target>
|
<target>Не создавать адрес</target>
|
||||||
@@ -2432,7 +2472,8 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>Загрузить</target>
|
<target>Загрузить</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2449,6 +2490,10 @@ This is your own one-time link!</source>
|
|||||||
<target>Загрузка файла</target>
|
<target>Загрузка файла</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<target>Принято</target>
|
<target>Принято</target>
|
||||||
@@ -2724,6 +2769,10 @@ This is your own one-time link!</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="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Ошибка при изменении роли</target>
|
<target>Ошибка при изменении роли</target>
|
||||||
@@ -2734,6 +2783,10 @@ This is your own one-time link!</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="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<target>Ошибка подключения к пересылающему серверу %@. Попробуйте позже.</target>
|
<target>Ошибка подключения к пересылающему серверу %@. Попробуйте позже.</target>
|
||||||
@@ -2854,6 +2907,10 @@ This is your own one-time link!</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="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Ошибка доступа к чату</target>
|
<target>Ошибка доступа к чату</target>
|
||||||
@@ -2862,7 +2919,7 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Ошибка при получении файла</target>
|
<target>Ошибка при получении файла</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2954,6 +3011,10 @@ This is your own one-time link!</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="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Ошибка выбора профиля!</target>
|
<target>Ошибка выбора профиля!</target>
|
||||||
@@ -3090,6 +3151,11 @@ This is your own one-time link!</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="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<target>Файл не найден - скорее всего, файл был удален или отменен.</target>
|
<target>Файл не найден - скорее всего, файл был удален или отменен.</target>
|
||||||
@@ -3225,11 +3291,23 @@ This is your own one-time link!</source>
|
|||||||
<target>Переслать</target>
|
<target>Переслать</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</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="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>Переслано</target>
|
<target>Переслано</target>
|
||||||
@@ -3240,6 +3318,10 @@ This is your own one-time link!</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="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<target>Пересылающий сервер %@ не смог подключиться к серверу назначения %@. Попробуйте позже.</target>
|
<target>Пересылающий сервер %@ не смог подключиться к серверу назначения %@. Попробуйте позже.</target>
|
||||||
@@ -3289,11 +3371,6 @@ Error: %2$@</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="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Полное имя:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Группа полностью децентрализована – она видна только членам.</target>
|
<target>Группа полностью децентрализована – она видна только членам.</target>
|
||||||
@@ -3539,6 +3616,10 @@ Error: %2$@</source>
|
|||||||
<target>ICE серверы (один на строке)</target>
|
<target>ICE серверы (один на строке)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Если Вы не можете встретиться лично, покажите QR-код во время видеозвонка или поделитесь ссылкой.</target>
|
<target>Если Вы не можете встретиться лично, покажите QR-код во время видеозвонка или поделитесь ссылкой.</target>
|
||||||
@@ -4184,6 +4265,10 @@ This is your link for 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="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>Источник сообщения остаётся конфиденциальным.</target>
|
<target>Источник сообщения остаётся конфиденциальным.</target>
|
||||||
@@ -4234,6 +4319,10 @@ This is your link for 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="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Сообщения, файлы и звонки защищены **end-to-end шифрованием** с прямой секретностью (PFS), правдоподобным отрицанием и восстановлением от взлома.</target>
|
<target>Сообщения, файлы и звонки защищены **end-to-end шифрованием** с прямой секретностью (PFS), правдоподобным отрицанием и восстановлением от взлома.</target>
|
||||||
@@ -4529,6 +4618,10 @@ This is your link for 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="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Уведомления</target>
|
<target>Уведомления</target>
|
||||||
@@ -4561,7 +4654,7 @@ This is your link for group %@!</source>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Ок</target>
|
<target>Ок</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4752,6 +4845,11 @@ Requires compatible VPN.</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="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4787,6 +4885,10 @@ Requires compatible VPN.</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="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Пароль чтобы раскрыть</target>
|
<target>Пароль чтобы раскрыть</target>
|
||||||
@@ -4936,6 +5038,10 @@ Error: %@</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="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Возможно, хэш сертификата в адресе сервера неверный</target>
|
<target>Возможно, хэш сертификата в адресе сервера неверный</target>
|
||||||
@@ -4988,7 +5094,7 @@ Error: %@</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Private message routing 🚀" xml:space="preserve">
|
<trans-unit id="Private message routing 🚀" xml:space="preserve">
|
||||||
<source>Private message routing 🚀</source>
|
<source>Private message routing 🚀</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="Private notes" xml:space="preserve">
|
<trans-unit id="Private notes" xml:space="preserve">
|
||||||
@@ -5021,16 +5127,6 @@ Error: %@</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="Profile name" xml:space="preserve">
|
|
||||||
<source>Profile name</source>
|
|
||||||
<target>Имя профиля</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Profile name:" xml:space="preserve">
|
|
||||||
<source>Profile name:</source>
|
|
||||||
<target>Имя профиля:</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>Пароль профиля</target>
|
<target>Пароль профиля</target>
|
||||||
@@ -5133,6 +5229,10 @@ Enable in *Network & servers* 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="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Доставка уведомлений</target>
|
<target>Доставка уведомлений</target>
|
||||||
@@ -5354,6 +5454,10 @@ Enable in *Network & servers* 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="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<target>Удалить изображение</target>
|
<target>Удалить изображение</target>
|
||||||
@@ -5534,6 +5638,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>SMP сервер</target>
|
<target>SMP сервер</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Получайте файлы безопасно</target>
|
<target>Получайте файлы безопасно</target>
|
||||||
@@ -5547,12 +5655,13 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Сохранить</target>
|
<target>Сохранить</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Сохранить (и уведомить контакты)</target>
|
<target>Сохранить (и уведомить контакты)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5579,11 +5688,6 @@ Enable in *Network & servers* 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="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Сохранить настройки автоприема</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Сохранить профиль группы</target>
|
<target>Сохранить профиль группы</target>
|
||||||
@@ -5619,16 +5723,15 @@ Enable in *Network & servers* 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="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Сохранить настройки?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</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="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Сохранено</target>
|
<target>Сохранено</target>
|
||||||
@@ -5649,6 +5752,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Сохраненное сообщение</target>
|
<target>Сохраненное сообщение</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<target>Масштаб</target>
|
<target>Масштаб</target>
|
||||||
@@ -5729,6 +5836,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Выбрать</target>
|
<target>Выбрать</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<target>Выбрано %lld</target>
|
<target>Выбрано %lld</target>
|
||||||
@@ -5847,7 +5958,7 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Отправитель отменил передачу файла.</target>
|
<target>Отправитель отменил передачу файла.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -6064,6 +6175,10 @@ Enable in *Network & servers* 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="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Форма картинок профилей</target>
|
<target>Форма картинок профилей</target>
|
||||||
@@ -6099,6 +6214,10 @@ Enable in *Network & servers* 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="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Поделиться одноразовой ссылкой-приглашением</target>
|
<target>Поделиться одноразовой ссылкой-приглашением</target>
|
||||||
@@ -6264,6 +6383,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Слабое</target>
|
<target>Слабое</target>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<target>Некоторые файл(ы) не были экспортированы:</target>
|
<target>Некоторые файл(ы) не были экспортированы:</target>
|
||||||
@@ -6439,6 +6562,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Сделать фото</target>
|
<target>Сделать фото</target>
|
||||||
@@ -6631,6 +6758,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<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="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<target>Темы</target>
|
<target>Темы</target>
|
||||||
@@ -6911,7 +7042,7 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>Неизвестные серверы!</target>
|
<target>Неизвестные серверы!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -7025,6 +7156,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>Использовать .onion хосты</target>
|
<target>Использовать .onion хосты</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>Использовать серверы предосталенные SimpleX Chat?</target>
|
<target>Использовать серверы предосталенные SimpleX Chat?</target>
|
||||||
@@ -7100,6 +7235,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="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>Используются серверы, предоставленные SimpleX Chat.</target>
|
<target>Используются серверы, предоставленные SimpleX Chat.</target>
|
||||||
@@ -7333,7 +7472,7 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Без Тора или ВПН, Ваш IP адрес будет доступен этим серверам файлов: %@.</target>
|
<target>Без Тора или ВПН, Ваш IP адрес будет доступен этим серверам файлов: %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7714,11 +7853,19 @@ Repeat connection request?</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 chat preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Ваш контакт отправил файл, размер которого превышает максимальный размер (%@).</target>
|
<target>Ваш контакт отправил файл, размер которого превышает максимальный размер (%@).</target>
|
||||||
@@ -7734,6 +7881,10 @@ Repeat connection request?</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 credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Текущие данные Вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными.</target>
|
<target>Текущие данные Вашего чата будет УДАЛЕНЫ и ЗАМЕНЕНЫ импортированными.</target>
|
||||||
@@ -7764,13 +7915,15 @@ Repeat connection request?</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 is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<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="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.</target>
|
<target>Ваш профиль, контакты и доставленные сообщения хранятся на Вашем устройстве.</target>
|
||||||
|
|||||||
@@ -129,6 +129,10 @@
|
|||||||
<target>%@ อยากเชื่อมต่อ!</target>
|
<target>%@ อยากเชื่อมต่อ!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -147,11 +151,31 @@
|
|||||||
<target>%d วัน</target>
|
<target>%d วัน</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d ชั่วโมง</target>
|
<target>%d ชั่วโมง</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d นาที</target>
|
<target>%d นาที</target>
|
||||||
@@ -959,6 +983,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="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>กลับ</target>
|
<target>กลับ</target>
|
||||||
@@ -1112,7 +1140,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>ยกเลิก</target>
|
<target>ยกเลิก</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1130,7 +1158,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>ไม่สามารถรับไฟล์ได้</target>
|
<target>ไม่สามารถรับไฟล์ได้</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1251,6 +1279,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="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -1606,6 +1638,10 @@ This is your own one-time link!</source>
|
|||||||
<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="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2235,6 +2271,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Do not send history to new members.</source>
|
<source>Do not send history to new members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Do not use credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>อย่าสร้างที่อยู่</target>
|
<target>อย่าสร้างที่อยู่</target>
|
||||||
@@ -2257,7 +2297,8 @@ This is your own one-time link!</source>
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2272,6 +2313,10 @@ This is your own one-time link!</source>
|
|||||||
<target>ดาวน์โหลดไฟล์</target>
|
<target>ดาวน์โหลดไฟล์</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2530,6 +2575,10 @@ This is your own one-time link!</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="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>เกิดข้อผิดพลาดในการเปลี่ยนบทบาท</target>
|
<target>เกิดข้อผิดพลาดในการเปลี่ยนบทบาท</target>
|
||||||
@@ -2540,6 +2589,10 @@ This is your own one-time link!</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="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2654,6 +2707,10 @@ This is your own one-time link!</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="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2661,7 +2718,7 @@ This is your own one-time link!</source>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>เกิดข้อผิดพลาดในการรับไฟล์</target>
|
<target>เกิดข้อผิดพลาดในการรับไฟล์</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2747,6 +2804,10 @@ This is your own one-time link!</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="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>เกิดข้อผิดพลาดในการเปลี่ยนโปรไฟล์!</target>
|
<target>เกิดข้อผิดพลาดในการเปลี่ยนโปรไฟล์!</target>
|
||||||
@@ -2875,6 +2936,11 @@ This is your own one-time link!</source>
|
|||||||
<source>File error</source>
|
<source>File error</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<note>file error text</note>
|
<note>file error text</note>
|
||||||
@@ -3001,10 +3067,22 @@ This is your own one-time link!</source>
|
|||||||
<source>Forward</source>
|
<source>Forward</source>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3013,6 +3091,10 @@ This is your own one-time link!</source>
|
|||||||
<source>Forwarded from</source>
|
<source>Forwarded from</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3054,11 +3136,6 @@ Error: %2$@</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="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>ชื่อเต็ม:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3296,6 +3373,10 @@ Error: %2$@</source>
|
|||||||
<target>เซิร์ฟเวอร์ ICE (หนึ่งเครื่องต่อสาย)</target>
|
<target>เซิร์ฟเวอร์ ICE (หนึ่งเครื่องต่อสาย)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>หากคุณไม่สามารถพบกันในชีวิตจริงได้ ให้แสดงคิวอาร์โค้ดในวิดีโอคอล หรือแชร์ลิงก์</target>
|
<target>หากคุณไม่สามารถพบกันในชีวิตจริงได้ ให้แสดงคิวอาร์โค้ดในวิดีโอคอล หรือแชร์ลิงก์</target>
|
||||||
@@ -3901,6 +3982,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Message servers</source>
|
<source>Message servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3944,6 +4029,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Messages sent</source>
|
<source>Messages sent</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -4215,6 +4304,10 @@ This is your link for group %@!</source>
|
|||||||
<source>Nothing selected</source>
|
<source>Nothing selected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>การแจ้งเตือน</target>
|
<target>การแจ้งเตือน</target>
|
||||||
@@ -4246,7 +4339,7 @@ This is your link for group %@!</source>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>ตกลง</target>
|
<target>ตกลง</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4423,6 +4516,11 @@ Requires compatible VPN.</source>
|
|||||||
<source>Other %@ servers</source>
|
<source>Other %@ servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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>
|
||||||
@@ -4458,6 +4556,10 @@ Requires compatible VPN.</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="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>รหัสผ่านที่จะแสดง</target>
|
<target>รหัสผ่านที่จะแสดง</target>
|
||||||
@@ -4594,6 +4696,10 @@ Error: %@</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="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>อาจเป็นไปได้ว่าลายนิ้วมือของ certificate ในที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง</target>
|
<target>อาจเป็นไปได้ว่าลายนิ้วมือของ certificate ในที่อยู่เซิร์ฟเวอร์ไม่ถูกต้อง</target>
|
||||||
@@ -4672,14 +4778,6 @@ Error: %@</source>
|
|||||||
<source>Profile images</source>
|
<source>Profile images</source>
|
||||||
<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>
|
||||||
@@ -4775,6 +4873,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Proxied servers</source>
|
<source>Proxied servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>การแจ้งเตือนแบบทันที</target>
|
<target>การแจ้งเตือนแบบทันที</target>
|
||||||
@@ -4979,6 +5081,10 @@ Enable in *Network & servers* 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="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5146,6 +5252,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>SMP server</source>
|
<source>SMP server</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5157,12 +5267,13 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>บันทึก</target>
|
<target>บันทึก</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>บันทึก (และแจ้งผู้ติดต่อ)</target>
|
<target>บันทึก (และแจ้งผู้ติดต่อ)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5188,11 +5299,6 @@ Enable in *Network & servers* 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="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>บันทึกการตั้งค่าการยอมรับอัตโนมัติ</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>บันทึกโปรไฟล์กลุ่ม</target>
|
<target>บันทึกโปรไฟล์กลุ่ม</target>
|
||||||
@@ -5228,16 +5334,15 @@ Enable in *Network & servers* 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="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>บันทึกการตั้งค่า?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</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="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5255,6 +5360,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Saved message</source>
|
<source>Saved message</source>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5328,6 +5437,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>เลือก</target>
|
<target>เลือก</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5438,7 +5551,7 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>ผู้ส่งยกเลิกการโอนไฟล์</target>
|
<target>ผู้ส่งยกเลิกการโอนไฟล์</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -5637,6 +5750,10 @@ Enable in *Network & servers* 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="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5670,6 +5787,10 @@ Enable in *Network & servers* 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="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5821,6 +5942,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Soft</source>
|
<source>Soft</source>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5983,6 +6108,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>TCP_KEEPINTVL</target>
|
<target>TCP_KEEPINTVL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>ถ่ายภาพ</target>
|
<target>ถ่ายภาพ</target>
|
||||||
@@ -6167,6 +6296,10 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<source>The text you pasted is not a SimpleX link.</source>
|
<source>The text you pasted is not a SimpleX link.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6422,7 +6555,7 @@ You will be prompted to complete authentication before this feature is enabled.<
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -6527,6 +6660,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<target>ใช้โฮสต์ .onion</target>
|
<target>ใช้โฮสต์ .onion</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>ใช้เซิร์ฟเวอร์ SimpleX Chat ไหม?</target>
|
<target>ใช้เซิร์ฟเวอร์ SimpleX Chat ไหม?</target>
|
||||||
@@ -6593,6 +6730,10 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
<source>User selection</source>
|
<source>User selection</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่</target>
|
<target>กำลังใช้เซิร์ฟเวอร์ SimpleX Chat อยู่</target>
|
||||||
@@ -6805,7 +6946,7 @@ To connect, please ask your contact to create another connection link and check
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7158,11 +7299,19 @@ Repeat connection request?</source>
|
|||||||
<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 preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>ผู้ติดต่อของคุณส่งไฟล์ที่ใหญ่กว่าขนาดสูงสุดที่รองรับในปัจจุบัน (%@)</target>
|
<target>ผู้ติดต่อของคุณส่งไฟล์ที่ใหญ่กว่าขนาดสูงสุดที่รองรับในปัจจุบัน (%@)</target>
|
||||||
@@ -7178,6 +7327,10 @@ Repeat connection request?</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 credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>ฐานข้อมูลแชทปัจจุบันของคุณจะถูกลบและแทนที่ด้วยฐานข้อมูลที่นำเข้า</target>
|
<target>ฐานข้อมูลแชทปัจจุบันของคุณจะถูกลบและแทนที่ด้วยฐานข้อมูลที่นำเข้า</target>
|
||||||
@@ -7206,13 +7359,15 @@ Repeat connection request?</source>
|
|||||||
<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>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<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="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ</target>
|
<target>โปรไฟล์ รายชื่อผู้ติดต่อ และข้อความที่ส่งของคุณจะถูกจัดเก็บไว้ในอุปกรณ์ของคุณ</target>
|
||||||
|
|||||||
@@ -137,6 +137,10 @@
|
|||||||
<target>%@ bağlanmak istiyor!</target>
|
<target>%@ bağlanmak istiyor!</target>
|
||||||
<note>notification title</note>
|
<note>notification title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@" xml:space="preserve">
|
||||||
|
<source>%1$@, %2$@</source>
|
||||||
|
<note>format for date separator in chat</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve">
|
||||||
<source>%@, %@ and %lld members</source>
|
<source>%@, %@ and %lld members</source>
|
||||||
<target>%@, %@ ve %lld üyeleri</target>
|
<target>%@, %@ ve %lld üyeleri</target>
|
||||||
@@ -157,11 +161,31 @@
|
|||||||
<target>%d gün</target>
|
<target>%d gün</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) are still being downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) are still being downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) failed to download." xml:space="preserve">
|
||||||
|
<source>%d file(s) failed to download.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were deleted." xml:space="preserve">
|
||||||
|
<source>%d file(s) were deleted.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%d file(s) were not downloaded." xml:space="preserve">
|
||||||
|
<source>%d file(s) were not downloaded.</source>
|
||||||
|
<note>forward confirmation reason</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d hours" xml:space="preserve">
|
<trans-unit id="%d hours" xml:space="preserve">
|
||||||
<source>%d hours</source>
|
<source>%d hours</source>
|
||||||
<target>%d saat</target>
|
<target>%d saat</target>
|
||||||
<note>time interval</note>
|
<note>time interval</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%d messages not forwarded" xml:space="preserve">
|
||||||
|
<source>%d messages not forwarded</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="%d min" xml:space="preserve">
|
<trans-unit id="%d min" xml:space="preserve">
|
||||||
<source>%d min</source>
|
<source>%d min</source>
|
||||||
<target>%d dakika</target>
|
<target>%d dakika</target>
|
||||||
@@ -1005,6 +1029,10 @@
|
|||||||
<target>Fotoğrafları otomatik kabul et</target>
|
<target>Fotoğrafları otomatik kabul et</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Auto-accept settings" xml:space="preserve">
|
||||||
|
<source>Auto-accept settings</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Back" xml:space="preserve">
|
<trans-unit id="Back" xml:space="preserve">
|
||||||
<source>Back</source>
|
<source>Back</source>
|
||||||
<target>Geri</target>
|
<target>Geri</target>
|
||||||
@@ -1169,7 +1197,7 @@
|
|||||||
<trans-unit id="Cancel" xml:space="preserve">
|
<trans-unit id="Cancel" xml:space="preserve">
|
||||||
<source>Cancel</source>
|
<source>Cancel</source>
|
||||||
<target>İptal et</target>
|
<target>İptal et</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Cancel migration" xml:space="preserve">
|
<trans-unit id="Cancel migration" xml:space="preserve">
|
||||||
<source>Cancel migration</source>
|
<source>Cancel migration</source>
|
||||||
@@ -1188,7 +1216,7 @@
|
|||||||
<trans-unit id="Cannot receive file" xml:space="preserve">
|
<trans-unit id="Cannot receive file" xml:space="preserve">
|
||||||
<source>Cannot receive file</source>
|
<source>Cannot receive file</source>
|
||||||
<target>Dosya alınamıyor</target>
|
<target>Dosya alınamıyor</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
<trans-unit id="Capacity exceeded - recipient did not receive previously sent messages." xml:space="preserve">
|
||||||
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
<source>Capacity exceeded - recipient did not receive previously sent messages.</source>
|
||||||
@@ -1313,6 +1341,10 @@
|
|||||||
<target>Sohbet tercihleri</target>
|
<target>Sohbet tercihleri</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat preferences were changed." xml:space="preserve">
|
||||||
|
<source>Chat preferences were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Chat theme" xml:space="preserve">
|
<trans-unit id="Chat theme" xml:space="preserve">
|
||||||
<source>Chat theme</source>
|
<source>Chat theme</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -1689,6 +1721,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>Çekirdek sürümü: v%@</target>
|
<target>Çekirdek sürümü: v%@</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Corner" xml:space="preserve">
|
||||||
|
<source>Corner</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
<trans-unit id="Correct name to %@?" xml:space="preserve">
|
||||||
<source>Correct name to %@?</source>
|
<source>Correct name to %@?</source>
|
||||||
<target>İsim %@ olarak düzeltilsin mi?</target>
|
<target>İsim %@ olarak düzeltilsin mi?</target>
|
||||||
@@ -2342,6 +2378,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>Yeni üyelere geçmişi gönderme.</target>
|
<target>Yeni üyelere geçmişi gönderme.</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 credentials with proxy." xml:space="preserve">
|
||||||
|
<source>Do not use credentials with proxy.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Don't create address" xml:space="preserve">
|
<trans-unit id="Don't create address" xml:space="preserve">
|
||||||
<source>Don't create address</source>
|
<source>Don't create address</source>
|
||||||
<target>Adres oluşturma</target>
|
<target>Adres oluşturma</target>
|
||||||
@@ -2365,7 +2405,8 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<trans-unit id="Download" xml:space="preserve">
|
<trans-unit id="Download" xml:space="preserve">
|
||||||
<source>Download</source>
|
<source>Download</source>
|
||||||
<target>İndir</target>
|
<target>İndir</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Download errors" xml:space="preserve">
|
<trans-unit id="Download errors" xml:space="preserve">
|
||||||
<source>Download errors</source>
|
<source>Download errors</source>
|
||||||
@@ -2381,6 +2422,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>Dosya indir</target>
|
<target>Dosya indir</target>
|
||||||
<note>server test step</note>
|
<note>server test step</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Download files" xml:space="preserve">
|
||||||
|
<source>Download files</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Downloaded" xml:space="preserve">
|
<trans-unit id="Downloaded" xml:space="preserve">
|
||||||
<source>Downloaded</source>
|
<source>Downloaded</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2653,6 +2698,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>Adres değiştirilirken hata oluştu</target>
|
<target>Adres değiştirilirken hata oluştu</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing connection profile" xml:space="preserve">
|
||||||
|
<source>Error changing connection profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error changing role" xml:space="preserve">
|
<trans-unit id="Error changing role" xml:space="preserve">
|
||||||
<source>Error changing role</source>
|
<source>Error changing role</source>
|
||||||
<target>Rol değiştirilirken hata oluştu</target>
|
<target>Rol değiştirilirken hata oluştu</target>
|
||||||
@@ -2663,6 +2712,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>Ayar değiştirilirken hata oluştu</target>
|
<target>Ayar değiştirilirken hata oluştu</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error changing to incognito!" xml:space="preserve">
|
||||||
|
<source>Error changing to incognito!</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Error connecting to forwarding server %@. Please try later." xml:space="preserve">
|
||||||
<source>Error connecting to forwarding server %@. Please try later.</source>
|
<source>Error connecting to forwarding server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -2781,6 +2834,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>%@ sunucuları yüklenirken hata oluştu</target>
|
<target>%@ sunucuları yüklenirken hata oluştu</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error migrating settings" xml:space="preserve">
|
||||||
|
<source>Error migrating settings</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error opening chat" xml:space="preserve">
|
<trans-unit id="Error opening chat" xml:space="preserve">
|
||||||
<source>Error opening chat</source>
|
<source>Error opening chat</source>
|
||||||
<target>Sohbeti açarken sorun oluştu</target>
|
<target>Sohbeti açarken sorun oluştu</target>
|
||||||
@@ -2789,7 +2846,7 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<trans-unit id="Error receiving file" xml:space="preserve">
|
<trans-unit id="Error receiving file" xml:space="preserve">
|
||||||
<source>Error receiving file</source>
|
<source>Error receiving file</source>
|
||||||
<target>Dosya alınırken sorun oluştu</target>
|
<target>Dosya alınırken sorun oluştu</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
<trans-unit id="Error reconnecting server" xml:space="preserve">
|
||||||
<source>Error reconnecting server</source>
|
<source>Error reconnecting server</source>
|
||||||
@@ -2878,6 +2935,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>Sohbet durdurulurken hata oluştu</target>
|
<target>Sohbet durdurulurken hata oluştu</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Error switching profile" xml:space="preserve">
|
||||||
|
<source>Error switching profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Error switching profile!" xml:space="preserve">
|
<trans-unit id="Error switching profile!" xml:space="preserve">
|
||||||
<source>Error switching profile!</source>
|
<source>Error switching profile!</source>
|
||||||
<target>Profil değiştirilirken hata oluştu!</target>
|
<target>Profil değiştirilirken hata oluştu!</target>
|
||||||
@@ -3011,6 +3072,11 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<source>File error</source>
|
<source>File error</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="File errors: %@" xml:space="preserve">
|
||||||
|
<source>File errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
<trans-unit id="File not found - most likely file was deleted or cancelled." xml:space="preserve">
|
||||||
<source>File not found - most likely file was deleted or cancelled.</source>
|
<source>File not found - most likely file was deleted or cancelled.</source>
|
||||||
<note>file error text</note>
|
<note>file error text</note>
|
||||||
@@ -3142,11 +3208,23 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>İlet</target>
|
<target>İlet</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward %d message(s)?" xml:space="preserve">
|
||||||
|
<source>Forward %d message(s)?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forward and save messages" xml:space="preserve">
|
<trans-unit id="Forward and save messages" xml:space="preserve">
|
||||||
<source>Forward and save messages</source>
|
<source>Forward and save messages</source>
|
||||||
<target>Mesajları ilet ve kaydet</target>
|
<target>Mesajları ilet ve kaydet</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages" xml:space="preserve">
|
||||||
|
<source>Forward messages</source>
|
||||||
|
<note>alert action</note>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Forward messages without files?" xml:space="preserve">
|
||||||
|
<source>Forward messages without files?</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarded" xml:space="preserve">
|
<trans-unit id="Forwarded" xml:space="preserve">
|
||||||
<source>Forwarded</source>
|
<source>Forwarded</source>
|
||||||
<target>İletildi</target>
|
<target>İletildi</target>
|
||||||
@@ -3157,6 +3235,10 @@ Bu senin kendi tek kullanımlık bağlantın!</target>
|
|||||||
<target>Şuradan iletildi</target>
|
<target>Şuradan iletildi</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Forwarding %lld messages" xml:space="preserve">
|
||||||
|
<source>Forwarding %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
<trans-unit id="Forwarding server %@ failed to connect to destination server %@. Please try later." xml:space="preserve">
|
||||||
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
<source>Forwarding server %@ failed to connect to destination server %@. Please try later.</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -3203,11 +3285,6 @@ Hata: %2$@</target>
|
|||||||
<target>Bütün isim (opsiyonel)</target>
|
<target>Bütün isim (opsiyonel)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Full name:" xml:space="preserve">
|
|
||||||
<source>Full name:</source>
|
|
||||||
<target>Bütün isim:</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
<trans-unit id="Fully decentralized – visible only to members." xml:space="preserve">
|
||||||
<source>Fully decentralized – visible only to members.</source>
|
<source>Fully decentralized – visible only to members.</source>
|
||||||
<target>Tamamiyle merkezi olmayan - sadece kişilere görünür.</target>
|
<target>Tamamiyle merkezi olmayan - sadece kişilere görünür.</target>
|
||||||
@@ -3451,6 +3528,10 @@ Hata: %2$@</target>
|
|||||||
<target>ICE sunucuları (her satıra bir tane)</target>
|
<target>ICE sunucuları (her satıra bir tane)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="IP address" xml:space="preserve">
|
||||||
|
<source>IP address</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
<trans-unit id="If you can't meet in person, show QR code in a video call, or share the link." xml:space="preserve">
|
||||||
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
<source>If you can't meet in person, show QR code in a video call, or share the link.</source>
|
||||||
<target>Eğer onunla buluşamıyorsan görüntülü aramada QR kod göster veya bağlantığı paylaş.</target>
|
<target>Eğer onunla buluşamıyorsan görüntülü aramada QR kod göster veya bağlantığı paylaş.</target>
|
||||||
@@ -4084,6 +4165,10 @@ Bu senin grup için bağlantın %@!</target>
|
|||||||
<source>Message servers</source>
|
<source>Message servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Message shape" xml:space="preserve">
|
||||||
|
<source>Message shape</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Message source remains private." xml:space="preserve">
|
<trans-unit id="Message source remains private." xml:space="preserve">
|
||||||
<source>Message source remains private.</source>
|
<source>Message source remains private.</source>
|
||||||
<target>Mesaj kaynağı gizli kalır.</target>
|
<target>Mesaj kaynağı gizli kalır.</target>
|
||||||
@@ -4130,6 +4215,10 @@ Bu senin grup için bağlantın %@!</target>
|
|||||||
<source>Messages sent</source>
|
<source>Messages sent</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Messages were deleted after you selected them." xml:space="preserve">
|
||||||
|
<source>Messages were deleted after you selected them.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
<trans-unit id="Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery." xml:space="preserve">
|
||||||
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
<source>Messages, files and calls are protected by **end-to-end encryption** with perfect forward secrecy, repudiation and break-in recovery.</source>
|
||||||
<target>Mesajlar, dosyalar ve aramalar **uçtan uca şifreleme** ile mükemmel ileri gizlilik, inkar ve izinsiz giriş kurtarma ile korunur.</target>
|
<target>Mesajlar, dosyalar ve aramalar **uçtan uca şifreleme** ile mükemmel ileri gizlilik, inkar ve izinsiz giriş kurtarma ile korunur.</target>
|
||||||
@@ -4420,6 +4509,10 @@ Bu senin grup için bağlantın %@!</target>
|
|||||||
<source>Nothing selected</source>
|
<source>Nothing selected</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Nothing to forward!" xml:space="preserve">
|
||||||
|
<source>Nothing to forward!</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Notifications" xml:space="preserve">
|
<trans-unit id="Notifications" xml:space="preserve">
|
||||||
<source>Notifications</source>
|
<source>Notifications</source>
|
||||||
<target>Bildirimler</target>
|
<target>Bildirimler</target>
|
||||||
@@ -4452,7 +4545,7 @@ Bu senin grup için bağlantın %@!</target>
|
|||||||
<trans-unit id="Ok" xml:space="preserve">
|
<trans-unit id="Ok" xml:space="preserve">
|
||||||
<source>Ok</source>
|
<source>Ok</source>
|
||||||
<target>Tamam</target>
|
<target>Tamam</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Old database" xml:space="preserve">
|
<trans-unit id="Old database" xml:space="preserve">
|
||||||
<source>Old database</source>
|
<source>Old database</source>
|
||||||
@@ -4640,6 +4733,11 @@ VPN'nin etkinleştirilmesi gerekir.</target>
|
|||||||
<source>Other %@ servers</source>
|
<source>Other %@ servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Other file errors: %@" xml:space="preserve">
|
||||||
|
<source>Other file errors:
|
||||||
|
%@</source>
|
||||||
|
<note>alert message</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 sayısı</target>
|
<target>PING sayısı</target>
|
||||||
@@ -4675,6 +4773,10 @@ VPN'nin etkinleştirilmesi gerekir.</target>
|
|||||||
<target>Şifre ayarlandı!</target>
|
<target>Şifre ayarlandı!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Password" xml:space="preserve">
|
||||||
|
<source>Password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Password to show" xml:space="preserve">
|
<trans-unit id="Password to show" xml:space="preserve">
|
||||||
<source>Password to show</source>
|
<source>Password to show</source>
|
||||||
<target>Gösterilecek şifre</target>
|
<target>Gösterilecek şifre</target>
|
||||||
@@ -4819,6 +4921,10 @@ Hata: %@</target>
|
|||||||
<target>Lehçe arayüz</target>
|
<target>Lehçe arayüz</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Port" xml:space="preserve">
|
||||||
|
<source>Port</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
<trans-unit id="Possibly, certificate fingerprint in server address is incorrect" xml:space="preserve">
|
||||||
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
<source>Possibly, certificate fingerprint in server address is incorrect</source>
|
||||||
<target>Muhtemelen, sunucu adresindeki parmakizi sertifikası doğru değil</target>
|
<target>Muhtemelen, sunucu adresindeki parmakizi sertifikası doğru değil</target>
|
||||||
@@ -4902,16 +5008,6 @@ Hata: %@</target>
|
|||||||
<target>Profil resimleri</target>
|
<target>Profil resimleri</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>Profil ismi</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Profile name:" xml:space="preserve">
|
|
||||||
<source>Profile name:</source>
|
|
||||||
<target>Profil ismi:</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>Profil parolası</target>
|
<target>Profil parolası</target>
|
||||||
@@ -5011,6 +5107,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Proxied servers</source>
|
<source>Proxied servers</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Proxy requires password" xml:space="preserve">
|
||||||
|
<source>Proxy requires password</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Push notifications" xml:space="preserve">
|
<trans-unit id="Push notifications" xml:space="preserve">
|
||||||
<source>Push notifications</source>
|
<source>Push notifications</source>
|
||||||
<target>Anında bildirimler</target>
|
<target>Anında bildirimler</target>
|
||||||
@@ -5222,6 +5322,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Sil</target>
|
<target>Sil</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Remove archive?" xml:space="preserve">
|
||||||
|
<source>Remove archive?</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Remove image" xml:space="preserve">
|
<trans-unit id="Remove image" xml:space="preserve">
|
||||||
<source>Remove image</source>
|
<source>Remove image</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5395,6 +5499,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>SMP server</source>
|
<source>SMP server</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Safely receive files" xml:space="preserve">
|
<trans-unit id="Safely receive files" xml:space="preserve">
|
||||||
<source>Safely receive files</source>
|
<source>Safely receive files</source>
|
||||||
<target>Dosyaları güvenle alın</target>
|
<target>Dosyaları güvenle alın</target>
|
||||||
@@ -5408,12 +5516,13 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Save" xml:space="preserve">
|
<trans-unit id="Save" xml:space="preserve">
|
||||||
<source>Save</source>
|
<source>Save</source>
|
||||||
<target>Kaydet</target>
|
<target>Kaydet</target>
|
||||||
<note>chat item action</note>
|
<note>alert button
|
||||||
|
chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
<trans-unit id="Save (and notify contacts)" xml:space="preserve">
|
||||||
<source>Save (and notify contacts)</source>
|
<source>Save (and notify contacts)</source>
|
||||||
<target>Kaydet (ve kişilere bildir)</target>
|
<target>Kaydet (ve kişilere bildir)</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert button</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save and notify contact" xml:space="preserve">
|
<trans-unit id="Save and notify contact" xml:space="preserve">
|
||||||
<source>Save and notify contact</source>
|
<source>Save and notify contact</source>
|
||||||
@@ -5439,11 +5548,6 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Arşivi kaydet</target>
|
<target>Arşivi kaydet</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save auto-accept settings" xml:space="preserve">
|
|
||||||
<source>Save auto-accept settings</source>
|
|
||||||
<target>Otomatik kabul et ayarlarını kaydet</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save group profile" xml:space="preserve">
|
<trans-unit id="Save group profile" xml:space="preserve">
|
||||||
<source>Save group profile</source>
|
<source>Save group profile</source>
|
||||||
<target>Grup profilini kaydet</target>
|
<target>Grup profilini kaydet</target>
|
||||||
@@ -5479,16 +5583,15 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Sunucular kaydedilsin mi?</target>
|
<target>Sunucular kaydedilsin mi?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Save settings?" xml:space="preserve">
|
|
||||||
<source>Save settings?</source>
|
|
||||||
<target>Ayarlar kaydedilsin mi?</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
|
||||||
</trans-unit>
|
|
||||||
<trans-unit id="Save welcome message?" xml:space="preserve">
|
<trans-unit id="Save welcome message?" xml:space="preserve">
|
||||||
<source>Save welcome message?</source>
|
<source>Save welcome message?</source>
|
||||||
<target>Hoşgeldin mesajı kaydedilsin mi?</target>
|
<target>Hoşgeldin mesajı kaydedilsin mi?</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Save your profile?" xml:space="preserve">
|
||||||
|
<source>Save your profile?</source>
|
||||||
|
<note>alert title</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Saved" xml:space="preserve">
|
<trans-unit id="Saved" xml:space="preserve">
|
||||||
<source>Saved</source>
|
<source>Saved</source>
|
||||||
<target>Kaydedildi</target>
|
<target>Kaydedildi</target>
|
||||||
@@ -5509,6 +5612,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Kaydedilmiş mesaj</target>
|
<target>Kaydedilmiş mesaj</target>
|
||||||
<note>message info title</note>
|
<note>message info title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Saving %lld messages" xml:space="preserve">
|
||||||
|
<source>Saving %lld messages</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Scale" xml:space="preserve">
|
<trans-unit id="Scale" xml:space="preserve">
|
||||||
<source>Scale</source>
|
<source>Scale</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5585,6 +5692,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Seç</target>
|
<target>Seç</target>
|
||||||
<note>chat item action</note>
|
<note>chat item action</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Select chat profile" xml:space="preserve">
|
||||||
|
<source>Select chat profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Selected %lld" xml:space="preserve">
|
<trans-unit id="Selected %lld" xml:space="preserve">
|
||||||
<source>Selected %lld</source>
|
<source>Selected %lld</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -5699,7 +5810,7 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
<trans-unit id="Sender cancelled file transfer." xml:space="preserve">
|
||||||
<source>Sender cancelled file transfer.</source>
|
<source>Sender cancelled file transfer.</source>
|
||||||
<target>Gönderici dosya gönderimini iptal etti.</target>
|
<target>Gönderici dosya gönderimini iptal etti.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
<trans-unit id="Sender may have deleted the connection request." xml:space="preserve">
|
||||||
<source>Sender may have deleted the connection request.</source>
|
<source>Sender may have deleted the connection request.</source>
|
||||||
@@ -5904,6 +6015,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Ayarlar</target>
|
<target>Ayarlar</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Settings were changed." xml:space="preserve">
|
||||||
|
<source>Settings were changed.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Shape profile images" xml:space="preserve">
|
<trans-unit id="Shape profile images" xml:space="preserve">
|
||||||
<source>Shape profile images</source>
|
<source>Shape profile images</source>
|
||||||
<target>Profil resimlerini şekillendir</target>
|
<target>Profil resimlerini şekillendir</target>
|
||||||
@@ -5938,6 +6053,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>Bağlantıyı paylaş</target>
|
<target>Bağlantıyı paylaş</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Share profile" xml:space="preserve">
|
||||||
|
<source>Share profile</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
<trans-unit id="Share this 1-time invite link" xml:space="preserve">
|
||||||
<source>Share this 1-time invite link</source>
|
<source>Share this 1-time invite link</source>
|
||||||
<target>Bu tek kullanımlık bağlantı davetini paylaş</target>
|
<target>Bu tek kullanımlık bağlantı davetini paylaş</target>
|
||||||
@@ -6098,6 +6217,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<source>Soft</source>
|
<source>Soft</source>
|
||||||
<note>blur media</note>
|
<note>blur media</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Some app settings were not migrated." xml:space="preserve">
|
||||||
|
<source>Some app settings were not migrated.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
<trans-unit id="Some file(s) were not exported:" xml:space="preserve">
|
||||||
<source>Some file(s) were not exported:</source>
|
<source>Some file(s) were not exported:</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6264,6 +6387,10 @@ Enable in *Network & servers* settings.</source>
|
|||||||
<target>TCP_TVLDEKAL</target>
|
<target>TCP_TVLDEKAL</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Tail" xml:space="preserve">
|
||||||
|
<source>Tail</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Take picture" xml:space="preserve">
|
<trans-unit id="Take picture" xml:space="preserve">
|
||||||
<source>Take picture</source>
|
<source>Take picture</source>
|
||||||
<target>Fotoğraf çek</target>
|
<target>Fotoğraf çek</target>
|
||||||
@@ -6453,6 +6580,10 @@ Bazı hatalar nedeniyle veya bağlantı tehlikeye girdiğinde meydana gelebilir.
|
|||||||
<target>Yapıştırdığın metin bir SimpleX bağlantısı değildir.</target>
|
<target>Yapıştırdığın metin bir SimpleX bağlantısı değildir.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="The uploaded database archive will be permanently removed from the servers." xml:space="preserve">
|
||||||
|
<source>The uploaded database archive will be permanently removed from the servers.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Themes" xml:space="preserve">
|
<trans-unit id="Themes" xml:space="preserve">
|
||||||
<source>Themes</source>
|
<source>Themes</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
@@ -6726,7 +6857,7 @@ Bu özellik etkinleştirilmeden önce kimlik doğrulamayı tamamlamanız istenec
|
|||||||
<trans-unit id="Unknown servers!" xml:space="preserve">
|
<trans-unit id="Unknown servers!" xml:space="preserve">
|
||||||
<source>Unknown servers!</source>
|
<source>Unknown servers!</source>
|
||||||
<target>Bilinmeyen sunucular!</target>
|
<target>Bilinmeyen sunucular!</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert title</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
<trans-unit id="Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions." xml:space="preserve">
|
||||||
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
<source>Unless you use iOS call interface, enable Do Not Disturb mode to avoid interruptions.</source>
|
||||||
@@ -6836,6 +6967,10 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
|||||||
<target>.onion ana bilgisayarlarını kullan</target>
|
<target>.onion ana bilgisayarlarını kullan</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Use SOCKS proxy" xml:space="preserve">
|
||||||
|
<source>Use SOCKS proxy</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
<trans-unit id="Use SimpleX Chat servers?" xml:space="preserve">
|
||||||
<source>Use SimpleX Chat servers?</source>
|
<source>Use SimpleX Chat servers?</source>
|
||||||
<target>SimpleX Chat sunucuları kullanılsın mı?</target>
|
<target>SimpleX Chat sunucuları kullanılsın mı?</target>
|
||||||
@@ -6909,6 +7044,10 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
|||||||
<source>User selection</source>
|
<source>User selection</source>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Username" xml:space="preserve">
|
||||||
|
<source>Username</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
<trans-unit id="Using SimpleX Chat servers." xml:space="preserve">
|
||||||
<source>Using SimpleX Chat servers.</source>
|
<source>Using SimpleX Chat servers.</source>
|
||||||
<target>SimpleX Chat sunucuları kullanılıyor.</target>
|
<target>SimpleX Chat sunucuları kullanılıyor.</target>
|
||||||
@@ -7140,7 +7279,7 @@ Bağlanmak için lütfen kişinizden başka bir bağlantı oluşturmasını iste
|
|||||||
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
<trans-unit id="Without Tor or VPN, your IP address will be visible to these XFTP relays: %@." xml:space="preserve">
|
||||||
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
<source>Without Tor or VPN, your IP address will be visible to these XFTP relays: %@.</source>
|
||||||
<target>Tor veya VPN olmadan, IP adresiniz bu XFTP aktarıcıları tarafından görülebilir: %@.</target>
|
<target>Tor veya VPN olmadan, IP adresiniz bu XFTP aktarıcıları tarafından görülebilir: %@.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>alert message</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
<trans-unit id="Wrong database passphrase" xml:space="preserve">
|
||||||
<source>Wrong database passphrase</source>
|
<source>Wrong database passphrase</source>
|
||||||
@@ -7512,11 +7651,19 @@ Bağlantı isteği tekrarlansın mı?</target>
|
|||||||
<target>Sohbet veritabanınız şifrelenmemiş - şifrelemek için parola ayarlayın.</target>
|
<target>Sohbet veritabanınız şifrelenmemiş - şifrelemek için parola ayarlayın.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your chat preferences" xml:space="preserve">
|
||||||
|
<source>Your chat preferences</source>
|
||||||
|
<note>alert title</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>Sohbet profillerin</target>
|
<target>Sohbet profillerin</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile." xml:space="preserve">
|
||||||
|
<source>Your connection was moved to %@ but an unexpected error occurred while redirecting you to the profile.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
<trans-unit id="Your contact sent a file that is larger than currently supported maximum size (%@)." xml:space="preserve">
|
||||||
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
<source>Your contact sent a file that is larger than currently supported maximum size (%@).</source>
|
||||||
<target>Kişiniz şu anda desteklenen maksimum boyuttan (%@) daha büyük bir dosya gönderdi.</target>
|
<target>Kişiniz şu anda desteklenen maksimum boyuttan (%@) daha büyük bir dosya gönderdi.</target>
|
||||||
@@ -7532,6 +7679,10 @@ Bağlantı isteği tekrarlansın mı?</target>
|
|||||||
<target>Kişileriniz bağlı kalacaktır.</target>
|
<target>Kişileriniz bağlı kalacaktır.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your credentials may be sent unencrypted." xml:space="preserve">
|
||||||
|
<source>Your credentials may be sent unencrypted.</source>
|
||||||
|
<note>No comment provided by engineer.</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
<trans-unit id="Your current chat database will be DELETED and REPLACED with the imported one." xml:space="preserve">
|
||||||
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
<source>Your current chat database will be DELETED and REPLACED with the imported one.</source>
|
||||||
<target>Mevcut sohbet veritabanınız SİLİNECEK ve içe aktarılan veritabanıyla DEĞİŞTİRİLECEKTİR.</target>
|
<target>Mevcut sohbet veritabanınız SİLİNECEK ve içe aktarılan veritabanıyla DEĞİŞTİRİLECEKTİR.</target>
|
||||||
@@ -7562,13 +7713,15 @@ Bağlantı isteği tekrarlansın mı?</target>
|
|||||||
<target>Profiliniz **%@** paylaşılacaktır.</target>
|
<target>Profiliniz **%@** paylaşılacaktır.</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
<trans-unit id="Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile." xml:space="preserve">
|
||||||
<source>Your profile is stored on your device and shared only with your contacts.
|
<source>Your profile is stored on your device and shared only with your contacts. SimpleX servers cannot see your profile.</source>
|
||||||
SimpleX servers cannot see your profile.</source>
|
<target>Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır. SimpleX sunucuları profilinizi göremez.</target>
|
||||||
<target>Profiliniz cihazınızda saklanır ve sadece kişilerinizle paylaşılır.
|
|
||||||
SimpleX sunucuları profilinizi göremez.</target>
|
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="Your profile was changed. If you save it, the updated profile will be sent to all your contacts." xml:space="preserve">
|
||||||
|
<source>Your profile was changed. If you save it, the updated profile will be sent to all your contacts.</source>
|
||||||
|
<note>alert message</note>
|
||||||
|
</trans-unit>
|
||||||
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
<trans-unit id="Your profile, contacts and delivered messages are stored on your device." xml:space="preserve">
|
||||||
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
<source>Your profile, contacts and delivered messages are stored on your device.</source>
|
||||||
<target>Profiliniz, kişileriniz ve gönderilmiş mesajlar cihazınızda saklanır.</target>
|
<target>Profiliniz, kişileriniz ve gönderilmiş mesajlar cihazınızda saklanır.</target>
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -314,7 +314,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="About SimpleX Chat" xml:space="preserve" approved="no">
|
<trans-unit id="About SimpleX Chat" xml:space="preserve" approved="no">
|
||||||
<source>About SimpleX Chat</source>
|
<source>About SimpleX Chat</source>
|
||||||
<target state="translated">關於 SimpleX 對話</target>
|
<target state="translated">關於 SimpleX Chat</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Accent color" xml:space="preserve" approved="no">
|
<trans-unit id="Accent color" xml:space="preserve" approved="no">
|
||||||
@@ -445,7 +445,7 @@
|
|||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve" approved="no">
|
<trans-unit id="Allow your contacts to send disappearing messages." xml:space="preserve" approved="no">
|
||||||
<source>Allow your contacts to send disappearing messages.</source>
|
<source>Allow your contacts to send disappearing messages.</source>
|
||||||
<target state="translated">允許你的聯絡人傳送自動銷毀的訊息。</target>
|
<target state="translated">允許您的聯絡人傳送限時訊息。</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve" approved="no">
|
<trans-unit id="Allow your contacts to send voice messages." xml:space="preserve" approved="no">
|
||||||
@@ -5898,6 +5898,230 @@ It can happen because of some bug or when the connection is compromised.</source
|
|||||||
<target state="translated">%@ 和 %@ 已連接</target>
|
<target state="translated">%@ 和 %@ 已連接</target>
|
||||||
<note>No comment provided by engineer.</note>
|
<note>No comment provided by engineer.</note>
|
||||||
</trans-unit>
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ downloaded" xml:space="preserve" approved="no">
|
||||||
|
<source>%@ downloaded</source>
|
||||||
|
<target state="translated">%@ 下載</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%@ uploaded" xml:space="preserve" approved="no">
|
||||||
|
<source>%@ uploaded</source>
|
||||||
|
<target state="translated">%@ 上傳</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Abort" xml:space="preserve" approved="no">
|
||||||
|
<source>Abort</source>
|
||||||
|
<target state="translated">中止</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="**Create group**: to create a new group." xml:space="preserve" approved="no">
|
||||||
|
<source>**Create group**: to create a new group.</source>
|
||||||
|
<target state="translated">**創建群組**: 創建一個新的群組。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Abort changing address" xml:space="preserve" approved="no">
|
||||||
|
<source>Abort changing address</source>
|
||||||
|
<target state="translated">中止更改地址</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Accept connection request?" xml:space="preserve" approved="no">
|
||||||
|
<source>Accept connection request?</source>
|
||||||
|
<target state="translated">接受連線請求?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Camera not available" xml:space="preserve" approved="no">
|
||||||
|
<source>Camera not available</source>
|
||||||
|
<target state="translated">相機不可用</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="All messages will be deleted - this cannot be undone!" xml:space="preserve" approved="no">
|
||||||
|
<source>All messages will be deleted - this cannot be undone!</source>
|
||||||
|
<target state="translated">所有訊息都將被刪除 - 這不能還原!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow irreversible message deletion only if your contact allows it to you. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow irreversible message deletion only if your contact allows it to you. (24 hours)</source>
|
||||||
|
<target state="translated">只有你的聯絡人允許的情況下,才允許不可逆地將訊息刪除。(24小時)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow to irreversibly delete sent messages. (24 hours)</source>
|
||||||
|
<target state="translated">允許將不可撤銷的訊息刪除。(24小時)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow your contacts to irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow your contacts to irreversibly delete sent messages. (24 hours)</source>
|
||||||
|
<target state="translated">允許您的聯絡人不可復原地刪除已傳送的訊息。(24小時)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Bad desktop address" xml:space="preserve" approved="no">
|
||||||
|
<source>Bad desktop address</source>
|
||||||
|
<target state="translated">無效的桌面地址</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Error decrypting file" xml:space="preserve" approved="no">
|
||||||
|
<source>Error decrypting file</source>
|
||||||
|
<target state="translated">解密檔案時出錯</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Add contact" xml:space="preserve" approved="no">
|
||||||
|
<source>Add contact</source>
|
||||||
|
<target state="translated">新增聯絡人</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Advanced settings" xml:space="preserve" approved="no">
|
||||||
|
<source>Advanced settings</source>
|
||||||
|
<target state="translated">進階設定</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow calls?" xml:space="preserve" approved="no">
|
||||||
|
<source>Allow calls?</source>
|
||||||
|
<target state="translated">允許通話?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow to send files and media." xml:space="preserve" approved="no">
|
||||||
|
<source>Allow to send files and media.</source>
|
||||||
|
<target state="translated">允許傳送檔案和媒體。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already joining the group!" xml:space="preserve" approved="no">
|
||||||
|
<source>Already joining the group!</source>
|
||||||
|
<target state="translated">已加入群組!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="App data migration" xml:space="preserve" approved="no">
|
||||||
|
<source>App data migration</source>
|
||||||
|
<target state="translated">應用資料轉移</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Apply" xml:space="preserve" approved="no">
|
||||||
|
<source>Apply</source>
|
||||||
|
<target state="translated">應用</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Apply to" xml:space="preserve" approved="no">
|
||||||
|
<source>Apply to</source>
|
||||||
|
<target state="translated">應用到</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Archive and upload" xml:space="preserve" approved="no">
|
||||||
|
<source>Archive and upload</source>
|
||||||
|
<target state="translated">儲存並上傳</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block" xml:space="preserve" approved="no">
|
||||||
|
<source>Block</source>
|
||||||
|
<target state="translated">封鎖</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block group members" xml:space="preserve" approved="no">
|
||||||
|
<source>Block group members</source>
|
||||||
|
<target state="translated">封鎖群組成員</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member" xml:space="preserve" approved="no">
|
||||||
|
<source>Block member</source>
|
||||||
|
<target state="translated">封鎖成員</target>
|
||||||
|
</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" approved="no">
|
||||||
|
<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 state="translated">保加利亞語、芬蘭語、泰語和烏克蘭語——感謝使用者們和[Weblate](https://github.com/simplex-chat/simplex-chat/tree/stable#help-translating-simplex-chat)!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Can't call member" xml:space="preserve" approved="no">
|
||||||
|
<source>Can't call member</source>
|
||||||
|
<target state="translated">無法與成員通話</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Can't message member" xml:space="preserve" approved="no">
|
||||||
|
<source>Can't message member</source>
|
||||||
|
<target state="translated">無法傳送訊息給成員</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Cancel migration" xml:space="preserve" approved="no">
|
||||||
|
<source>Cancel migration</source>
|
||||||
|
<target state="translated">取消遷移</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Chat database exported" xml:space="preserve" approved="no">
|
||||||
|
<source>Chat database exported</source>
|
||||||
|
<target state="translated">導出聊天數據庫</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="0 sec" xml:space="preserve" approved="no">
|
||||||
|
<source>0 sec</source>
|
||||||
|
<target state="translated">0 秒</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays." xml:space="preserve" approved="no">
|
||||||
|
<source>All your contacts, conversations and files will be securely encrypted and uploaded in chunks to configured XFTP relays.</source>
|
||||||
|
<target state="translated">你的所有聯絡人、對話和文件將被安全加密並切塊上傳到設置的 XFTP 中繼。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Address change will be aborted. Old receiving address will be used." xml:space="preserve" approved="no">
|
||||||
|
<source>Address change will be aborted. Old receiving address will be used.</source>
|
||||||
|
<target state="translated">將取消地址更改。將使用舊聯絡地址。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Archiving database" xml:space="preserve" approved="no">
|
||||||
|
<source>Archiving database</source>
|
||||||
|
<target state="translated">正在儲存資料庫</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Cellular" xml:space="preserve" approved="no">
|
||||||
|
<source>Cellular</source>
|
||||||
|
<target state="translated">行動網路</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld members" xml:space="preserve" approved="no">
|
||||||
|
<source>%@, %@ and %lld members</source>
|
||||||
|
<target state="translated">%@, %@ 和 %lld 成員</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld messages marked deleted" xml:space="preserve" approved="no">
|
||||||
|
<source>%lld messages marked deleted</source>
|
||||||
|
<target state="translated">%lld 條訊息已刪除</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Already connecting!" xml:space="preserve" approved="no">
|
||||||
|
<source>Already connecting!</source>
|
||||||
|
<target state="translated">已連接!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Block member?" xml:space="preserve" approved="no">
|
||||||
|
<source>Block member?</source>
|
||||||
|
<target state="translated">封鎖成員?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="(new)" xml:space="preserve" approved="no">
|
||||||
|
<source>(new)</source>
|
||||||
|
<target state="translated">(新)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%@, %@ and %lld other members connected" xml:space="preserve" approved="no">
|
||||||
|
<source>%@, %@ and %lld other members connected</source>
|
||||||
|
<target state="translated">%@, %@ 和 %lld 個成員已連接</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="A few more things" xml:space="preserve" approved="no">
|
||||||
|
<source>A few more things</source>
|
||||||
|
<target state="translated">其他</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Show last messages" xml:space="preserve" approved="no">
|
||||||
|
<source>Show last messages</source>
|
||||||
|
<target state="translated">顯示最新的訊息</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="App encrypts new local files (except videos)." xml:space="preserve" approved="no">
|
||||||
|
<source>App encrypts new local files (except videos).</source>
|
||||||
|
<target state="translated">應用程式將為新的本機文件(影片除外)加密。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Better groups" xml:space="preserve" approved="no">
|
||||||
|
<source>Better groups</source>
|
||||||
|
<target state="translated">更加的群組</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="%lld new interface languages" xml:space="preserve" approved="no">
|
||||||
|
<source>%lld new interface languages</source>
|
||||||
|
<target state="translated">%lld 種新的介面語言</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Blocked by admin" xml:space="preserve" approved="no">
|
||||||
|
<source>Blocked by admin</source>
|
||||||
|
<target state="translated">由管理員封鎖</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Both you and your contact can irreversibly delete sent messages. (24 hours)" xml:space="preserve" approved="no">
|
||||||
|
<source>Both you and your contact can irreversibly delete sent messages. (24 hours)</source>
|
||||||
|
<target state="translated">您與您的聯絡人都可以不可復原地删除已傳送的訊息。(24小時)</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Encrypt local files" xml:space="preserve" approved="no">
|
||||||
|
<source>Encrypt local files</source>
|
||||||
|
<target state="translated">加密本機檔案</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="- more stable message delivery. - a bit better groups. - and more!" xml:space="preserve" approved="no">
|
||||||
|
<source>- more stable message delivery.
|
||||||
|
- a bit better groups.
|
||||||
|
- and more!</source>
|
||||||
|
<target state="translated">- 更穩定的傳送!
|
||||||
|
- 更好的社群!
|
||||||
|
- 以及更多!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="- optionally notify deleted contacts. - profile names with spaces. - and more!" xml:space="preserve" approved="no">
|
||||||
|
<source>- optionally notify deleted contacts.
|
||||||
|
- profile names with spaces.
|
||||||
|
- and more!</source>
|
||||||
|
<target state="translated">- 可選擇通知已刪除的聯絡人
|
||||||
|
- 帶空格的共人資料名稱。
|
||||||
|
-以及更多!</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Abort changing address?" xml:space="preserve" approved="no">
|
||||||
|
<source>Abort changing address?</source>
|
||||||
|
<target state="translated">中止更改地址?</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Allow to send SimpleX links." xml:space="preserve" approved="no">
|
||||||
|
<source>Allow to send SimpleX links.</source>
|
||||||
|
<target state="translated">允許傳送 SimpleX 連結。</target>
|
||||||
|
</trans-unit>
|
||||||
|
<trans-unit id="Background" xml:space="preserve" approved="no">
|
||||||
|
<source>Background</source>
|
||||||
|
<target state="translated">後台</target>
|
||||||
|
</trans-unit>
|
||||||
</body>
|
</body>
|
||||||
</file>
|
</file>
|
||||||
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="zh-Hant" datatype="plaintext">
|
<file original="en.lproj/SimpleX--iOS--InfoPlist.strings" source-language="en" target-language="zh-Hant" datatype="plaintext">
|
||||||
|
|||||||
@@ -339,7 +339,9 @@ class NotificationService: UNNotificationServiceExtension {
|
|||||||
CXProvider.reportNewIncomingVoIPPushPayload([
|
CXProvider.reportNewIncomingVoIPPushPayload([
|
||||||
"displayName": invitation.contact.displayName,
|
"displayName": invitation.contact.displayName,
|
||||||
"contactId": invitation.contact.id,
|
"contactId": invitation.contact.id,
|
||||||
"media": invitation.callType.media.rawValue
|
"callUUID": invitation.callUUID ?? "",
|
||||||
|
"media": invitation.callType.media.rawValue,
|
||||||
|
"callTs": invitation.callTs.timeIntervalSince1970
|
||||||
]) { error in
|
]) { error in
|
||||||
logger.debug("reportNewIncomingVoIPPushPayload result: \(error)")
|
logger.debug("reportNewIncomingVoIPPushPayload result: \(error)")
|
||||||
deliver(error == nil ? nil : createCallInvitationNtf(invitation))
|
deliver(error == nil ? nil : createCallInvitationNtf(invitation))
|
||||||
@@ -571,17 +573,22 @@ func receivedMsgNtf(_ res: ChatResponse) async -> (String, NSENotification)? {
|
|||||||
// TODO profile update
|
// TODO profile update
|
||||||
case let .receivedContactRequest(user, contactRequest):
|
case let .receivedContactRequest(user, contactRequest):
|
||||||
return (UserContact(contactRequest: contactRequest).id, .nse(createContactRequestNtf(user, contactRequest)))
|
return (UserContact(contactRequest: contactRequest).id, .nse(createContactRequestNtf(user, contactRequest)))
|
||||||
case let .newChatItem(user, aChatItem):
|
case let .newChatItems(user, chatItems):
|
||||||
let cInfo = aChatItem.chatInfo
|
// Received items are created one at a time
|
||||||
var cItem = aChatItem.chatItem
|
if let chatItem = chatItems.first {
|
||||||
if !cInfo.ntfsEnabled {
|
let cInfo = chatItem.chatInfo
|
||||||
ntfBadgeCountGroupDefault.set(max(0, ntfBadgeCountGroupDefault.get() - 1))
|
var cItem = chatItem.chatItem
|
||||||
|
if !cInfo.ntfsEnabled {
|
||||||
|
ntfBadgeCountGroupDefault.set(max(0, ntfBadgeCountGroupDefault.get() - 1))
|
||||||
|
}
|
||||||
|
if let file = cItem.autoReceiveFile() {
|
||||||
|
cItem = autoReceiveFile(file) ?? cItem
|
||||||
|
}
|
||||||
|
let ntf: NSENotification = cInfo.ntfsEnabled ? .nse(createMessageReceivedNtf(user, cInfo, cItem)) : .empty
|
||||||
|
return cItem.showNotification ? (chatItem.chatId, ntf) : nil
|
||||||
|
} else {
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
if let file = cItem.autoReceiveFile() {
|
|
||||||
cItem = autoReceiveFile(file) ?? cItem
|
|
||||||
}
|
|
||||||
let ntf: NSENotification = cInfo.ntfsEnabled ? .nse(createMessageReceivedNtf(user, cInfo, cItem)) : .empty
|
|
||||||
return cItem.showNotification ? (aChatItem.chatId, ntf) : nil
|
|
||||||
case let .rcvFileSndCancelled(_, aChatItem, _):
|
case let .rcvFileSndCancelled(_, aChatItem, _):
|
||||||
cleanupFile(aChatItem)
|
cleanupFile(aChatItem)
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@@ -54,32 +54,30 @@ func apiGetChats(userId: User.ID) throws -> Array<ChatData> {
|
|||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
|
|
||||||
func apiSendMessage(
|
func apiSendMessages(
|
||||||
chatInfo: ChatInfo,
|
chatInfo: ChatInfo,
|
||||||
cryptoFile: CryptoFile?,
|
composedMessages: [ComposedMessage]
|
||||||
msgContent: MsgContent
|
) throws -> [AChatItem] {
|
||||||
) throws -> AChatItem {
|
|
||||||
let r = sendSimpleXCmd(
|
let r = sendSimpleXCmd(
|
||||||
chatInfo.chatType == .local
|
chatInfo.chatType == .local
|
||||||
? .apiCreateChatItem(
|
? .apiCreateChatItems(
|
||||||
noteFolderId: chatInfo.apiId,
|
noteFolderId: chatInfo.apiId,
|
||||||
file: cryptoFile,
|
composedMessages: composedMessages
|
||||||
msg: msgContent
|
|
||||||
)
|
)
|
||||||
: .apiSendMessage(
|
: .apiSendMessages(
|
||||||
type: chatInfo.chatType,
|
type: chatInfo.chatType,
|
||||||
id: chatInfo.apiId,
|
id: chatInfo.apiId,
|
||||||
file: cryptoFile,
|
|
||||||
quotedItemId: nil,
|
|
||||||
msg: msgContent,
|
|
||||||
live: false,
|
live: false,
|
||||||
ttl: nil
|
ttl: nil,
|
||||||
|
composedMessages: composedMessages
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
if case let .newChatItem(_, chatItem) = r {
|
if case let .newChatItems(_, chatItems) = r {
|
||||||
return chatItem
|
return chatItems
|
||||||
} else {
|
} else {
|
||||||
if let filePath = cryptoFile?.filePath { removeFile(filePath) }
|
for composedMessage in composedMessages {
|
||||||
|
if let filePath = composedMessage.fileSource?.filePath { removeFile(filePath) }
|
||||||
|
}
|
||||||
throw r
|
throw r
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ class ShareModel: ObservableObject {
|
|||||||
// Decode base64 images on background thread
|
// Decode base64 images on background thread
|
||||||
let profileImages = chats.reduce(into: Dictionary<ChatInfo.ID, UIImage>()) { dict, chatData in
|
let profileImages = chats.reduce(into: Dictionary<ChatInfo.ID, UIImage>()) { dict, chatData in
|
||||||
if let profileImage = chatData.chatInfo.image,
|
if let profileImage = chatData.chatInfo.image,
|
||||||
let uiImage = UIImage(base64Encoded: profileImage) {
|
let uiImage = imageFromBase64(profileImage) {
|
||||||
dict[chatData.id] = uiImage
|
dict[chatData.id] = uiImage
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -141,23 +141,25 @@ class ShareModel: ObservableObject {
|
|||||||
do {
|
do {
|
||||||
SEChatState.shared.set(.sendingMessage)
|
SEChatState.shared.set(.sendingMessage)
|
||||||
await waitForOtherProcessesToSuspend()
|
await waitForOtherProcessesToSuspend()
|
||||||
let ci = try apiSendMessage(
|
let chatItems = try apiSendMessages(
|
||||||
chatInfo: selected.chatInfo,
|
chatInfo: selected.chatInfo,
|
||||||
cryptoFile: sharedContent.cryptoFile,
|
composedMessages: [ComposedMessage(fileSource: sharedContent.cryptoFile, msgContent: sharedContent.msgContent(comment: self.comment))]
|
||||||
msgContent: sharedContent.msgContent(comment: self.comment)
|
|
||||||
)
|
)
|
||||||
if selected.chatInfo.chatType == .local {
|
if selected.chatInfo.chatType == .local {
|
||||||
completion()
|
completion()
|
||||||
} else {
|
} else {
|
||||||
await MainActor.run { self.bottomBar = .loadingBar(progress: 0) }
|
// TODO batch send: share multiple items
|
||||||
if let e = await handleEvents(
|
if let ci = chatItems.first {
|
||||||
isGroupChat: ci.chatInfo.chatType == .group,
|
await MainActor.run { self.bottomBar = .loadingBar(progress: 0) }
|
||||||
isWithoutFile: sharedContent.cryptoFile == nil,
|
if let e = await handleEvents(
|
||||||
chatItemId: ci.chatItem.id
|
isGroupChat: ci.chatInfo.chatType == .group,
|
||||||
) {
|
isWithoutFile: sharedContent.cryptoFile == nil,
|
||||||
await MainActor.run { errorAlert = e }
|
chatItemId: ci.chatItem.id
|
||||||
} else {
|
) {
|
||||||
completion()
|
await MainActor.run { errorAlert = e }
|
||||||
|
} else {
|
||||||
|
completion()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} catch {
|
} catch {
|
||||||
@@ -318,7 +320,8 @@ class ShareModel: ObservableObject {
|
|||||||
}
|
}
|
||||||
await ch.completeFile()
|
await ch.completeFile()
|
||||||
if await !ch.isRunning { break }
|
if await !ch.isRunning { break }
|
||||||
case let .chatItemStatusUpdated(_, ci):
|
case let .chatItemsStatusesUpdated(_, chatItems):
|
||||||
|
guard let ci = chatItems.last else { continue }
|
||||||
guard isMessage(for: ci) else { continue }
|
guard isMessage(for: ci) else { continue }
|
||||||
if let (title, message) = ci.chatItem.meta.itemStatus.statusInfo {
|
if let (title, message) = ci.chatItem.meta.itemStatus.statusInfo {
|
||||||
// `title` and `message` already localized and interpolated
|
// `title` and `message` already localized and interpolated
|
||||||
|
|||||||
@@ -147,8 +147,8 @@ struct ShareView: View {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ViewBuilder private func imagePreview(_ img: String) -> some View {
|
@ViewBuilder private func imagePreview(_ imgStr: String) -> some View {
|
||||||
if let img = UIImage(base64Encoded: img) {
|
if let img = imageFromBase64(imgStr) {
|
||||||
previewArea {
|
previewArea {
|
||||||
Image(uiImage: img)
|
Image(uiImage: img)
|
||||||
.resizable()
|
.resizable()
|
||||||
@@ -163,7 +163,7 @@ struct ShareView: View {
|
|||||||
@ViewBuilder private func linkPreview(_ linkPreview: LinkPreview) -> some View {
|
@ViewBuilder private func linkPreview(_ linkPreview: LinkPreview) -> some View {
|
||||||
previewArea {
|
previewArea {
|
||||||
HStack(alignment: .center, spacing: 8) {
|
HStack(alignment: .center, spacing: 8) {
|
||||||
if let uiImage = UIImage(base64Encoded: linkPreview.image) {
|
if let uiImage = imageFromBase64(linkPreview.image) {
|
||||||
Image(uiImage: uiImage)
|
Image(uiImage: uiImage)
|
||||||
.resizable()
|
.resizable()
|
||||||
.aspectRatio(contentMode: .fit)
|
.aspectRatio(contentMode: .fit)
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
"Comment" = "Hozzászólás";
|
"Comment" = "Hozzászólás";
|
||||||
|
|
||||||
/* No comment provided by engineer. */
|
/* No comment provided by engineer. */
|
||||||
"Currently maximum supported file size is %@." = "Jelenleg a maximális támogatott fájlméret %@.";
|
"Currently maximum supported file size is %@." = "Jelenleg a maximálisan támogatott fájlméret: %@.";
|
||||||
|
|
||||||
/* No comment provided by engineer. */
|
/* No comment provided by engineer. */
|
||||||
"Database downgrade required" = "Adatbázis visszafejlesztése szükséges";
|
"Database downgrade required" = "Adatbázis visszafejlesztése szükséges";
|
||||||
@@ -107,5 +107,5 @@
|
|||||||
"Wrong database passphrase" = "Hibás adatbázis jelmondat";
|
"Wrong database passphrase" = "Hibás adatbázis jelmondat";
|
||||||
|
|
||||||
/* No comment provided by engineer. */
|
/* No comment provided by engineer. */
|
||||||
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "A megosztást az Adatvédelem és biztonság / SimpleX zár menüben engedélyezheti.";
|
"You can allow sharing in Privacy & Security / SimpleX Lock settings." = "A megosztást az Adatvédelem és biztonság / SimpleX-zár menüben engedélyezheti.";
|
||||||
|
|
||||||
|
|||||||
@@ -32,7 +32,7 @@
|
|||||||
"Database passphrase is different from saved in the keychain." = "Het wachtwoord van de database verschilt van het wachtwoord die in de keychain is opgeslagen.";
|
"Database passphrase is different from saved in the keychain." = "Het wachtwoord van de database verschilt van het wachtwoord die in de keychain is opgeslagen.";
|
||||||
|
|
||||||
/* No comment provided by engineer. */
|
/* No comment provided by engineer. */
|
||||||
"Database passphrase is required to open chat." = "Database wachtwoord is vereist om je gesprekken te openen.";
|
"Database passphrase is required to open chat." = "Database wachtwoord is vereist om je chats te openen.";
|
||||||
|
|
||||||
/* No comment provided by engineer. */
|
/* No comment provided by engineer. */
|
||||||
"Database upgrade required" = "Database upgrade vereist";
|
"Database upgrade required" = "Database upgrade vereist";
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user