diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 04b80e8a2a14be918889df06b54c314feb812303..0000000000000000000000000000000000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,3 +0,0 @@ -github: inputmice -liberapay: inputmice -custom: https://gultsch.de/donate.html diff --git a/.github/workflows/android.yml b/.github/workflows/android.yml deleted file mode 100644 index 0b737c568c5784d10286c3a0670e00f67cdd2593..0000000000000000000000000000000000000000 --- a/.github/workflows/android.yml +++ /dev/null @@ -1,34 +0,0 @@ -name: Android CI - -on: - push: - branches: [ master ] - pull_request: - branches: [ master ] - -jobs: - build: - - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v2 - - name: set up JDK 11 - uses: actions/setup-java@v2 - with: - java-version: '11' - distribution: 'adopt' - - name: Download WebRTC - run: mkdir libs && wget -O libs/libwebrtc-m99.aar https://gultsch.de/files/libwebrtc-m99.aar - - name: Grant execute permission for gradlew - run: chmod +x gradlew - - name: Build Quicksy - run: ./gradlew assembleQuicksyFreeDebug - - name: Build Conversations - run: ./gradlew assembleConversationsFreeDebug - - uses: actions/upload-artifact@v2 - with: - name: Conversations all-flavors (debug) - path: ./build/outputs/apk/**/debug/Conversations-*.apk - - diff --git a/CHANGELOG.md b/CHANGELOG.md index ca90749baf3c5ca01135a3c71e06566ca6ff3d7f..44f9829f840eea5020472eb3b6238f70fbd7a58a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,20 @@ # Changelog +### Version 2.11.3 + +* Fix messages getting resend when using SASL2 +* Fix black video between some devices +* Fix crash on empty passwords + +### Version 2.11.2 + +* Fixed regression in P2P file transfer + +### Version 2.11.1 + +* Fix resend loop on servers that support only sm:2 +* Show 'Switch to video' only if other party supports video + ### Version 2.11.0 * Implement Extensible SASL Profile, Bind 2.0 and Fast for faster reconnects diff --git a/art/render.rb b/art/render.rb index 7ae4ac8ae18d8d6c3e8cb2c6a49ed7c661a476f7..59cd7b15624ba68bba5381d30a170046282e40f2 100755 --- a/art/render.rb +++ b/art/render.rb @@ -1,168 +1,157 @@ #!/bin/env ruby +# frozen_string_literal: true require 'xml' resolutions = { - 'mdpi' => 1, - 'hdpi' => 1.5, - 'xhdpi' => 2, - 'xxhdpi' => 3, - 'xxxhdpi' => 4, - } + 'mdpi' => 1, + 'hdpi' => 1.5, + 'xhdpi' => 2, + 'xxhdpi' => 3, + 'xxxhdpi' => 4 +} images = { - 'main_logo.svg' => ['conversations/main_logo', 200], - 'quicksy_main_logo.svg' => ['quicksy/main_logo', 200], - 'splash_logo.svg' => ['conversations/splash_logo', 144], - 'quicksy_splash_logo.svg' => ['quicksy/splash_logo', 144], - 'ic_search_black.svg' => ['ic_search_background_black', 144], - 'ic_search_white.svg' => ['ic_search_background_white', 144], - 'ic_no_results_white.svg' => ['ic_no_results_background_white', 144], - 'ic_no_results_black.svg' => ['ic_no_results_background_black', 144], - 'play_video_white.svg' => ['play_video_white', 128], - 'play_gif_white.svg' => ['play_gif_white', 128], - 'play_video_black.svg' => ['play_video_black', 128], - 'play_gif_black.svg' => ['play_gif_black', 128], - 'open_pdf_black.svg' => ['open_pdf_black', 128], - 'open_pdf_white.svg' => ['open_pdf_white', 128], - 'conversations_mono.svg' => ['conversations/ic_notification', 24], - 'quicksy_mono.svg' => ['quicksy/ic_notification', 24], - 'flip_camera_android-black-24dp.svg' => ['ic_flip_camera_android_black_24dp', 24], - 'ic_missed_call_notification.svg' => ['ic_missed_call_notification', 24], - 'ic_send_text_offline.svg' => ['ic_send_text_offline', 36], - 'ic_send_text_offline_white.svg' => ['ic_send_text_offline_white', 36], - 'ic_send_text_online.svg' => ['ic_send_text_online', 36], - 'ic_send_text_away.svg' => ['ic_send_text_away', 36], - 'ic_send_text_dnd.svg' => ['ic_send_text_dnd', 36], - 'ic_send_photo_online.svg' => ['ic_send_photo_online', 36], - 'ic_send_photo_offline.svg' => ['ic_send_photo_offline', 36], - 'ic_send_photo_offline_white.svg' => ['ic_send_photo_offline_white', 36], - 'ic_send_photo_away.svg' => ['ic_send_photo_away', 36], - 'ic_send_photo_dnd.svg' => ['ic_send_photo_dnd', 36], - 'ic_send_location_online.svg' => ['ic_send_location_online', 36], - 'ic_send_location_offline.svg' => ['ic_send_location_offline', 36], - 'ic_send_location_offline_white.svg' => ['ic_send_location_offline_white', 36], - 'ic_send_location_away.svg' => ['ic_send_location_away', 36], - 'ic_send_location_dnd.svg' => ['ic_send_location_dnd', 36], - 'ic_send_voice_online.svg' => ['ic_send_voice_online', 36], - 'ic_send_voice_offline.svg' => ['ic_send_voice_offline', 36], - 'ic_send_voice_offline_white.svg' => ['ic_send_voice_offline_white', 36], - 'ic_send_voice_away.svg' => ['ic_send_voice_away', 36], - 'ic_send_voice_dnd.svg' => ['ic_send_voice_dnd', 36], - 'ic_send_cancel_online.svg' => ['ic_send_cancel_online', 36], - 'ic_send_cancel_offline.svg' => ['ic_send_cancel_offline', 36], - 'ic_send_cancel_offline_white.svg' => ['ic_send_cancel_offline_white', 36], - 'ic_send_cancel_away.svg' => ['ic_send_cancel_away', 36], - 'ic_send_cancel_dnd.svg' => ['ic_send_cancel_dnd', 36], - 'ic_send_picture_online.svg' => ['ic_send_picture_online', 36], - 'ic_send_picture_offline.svg' => ['ic_send_picture_offline', 36], - 'ic_send_picture_offline_white.svg' => ['ic_send_picture_offline_white', 36], - 'ic_send_picture_away.svg' => ['ic_send_picture_away', 36], - 'ic_send_picture_dnd.svg' => ['ic_send_picture_dnd', 36], - 'ic_send_videocam_online.svg' => ['ic_send_videocam_online', 36], - 'ic_send_videocam_offline.svg' => ['ic_send_videocam_offline', 36], - 'ic_send_videocam_offline_white.svg' => ['ic_send_videocam_offline_white', 36], - 'ic_send_videocam_away.svg' => ['ic_send_videocam_away', 36], - 'ic_send_videocam_dnd.svg' => ['ic_send_videocam_dnd', 36], - 'ic_notifications_none_white80.svg' => ['ic_notifications_none_white80', 24], - 'ic_notifications_off_white80.svg' => ['ic_notifications_off_white80', 24], - 'ic_notifications_paused_white80.svg' => ['ic_notifications_paused_white80', 24], - 'ic_notifications_white80.svg' => ['ic_notifications_white80', 24], - 'ic_verified_fingerprint.svg' => ['ic_verified_fingerprint', 36], - 'qrcode-scan.svg' => ['ic_qr_code_scan_white_24dp', 24], - 'message_bubble_received.svg' => ['message_bubble_received.9', 0], - 'message_bubble_received_grey.svg' => ['message_bubble_received_grey.9', 0], - 'message_bubble_received_dark.svg' => ['message_bubble_received_dark.9', 0], - 'message_bubble_received_warning.svg' => ['message_bubble_received_warning.9', 0], - 'message_bubble_received_white.svg' => ['message_bubble_received_white.9', 0], - 'message_bubble_sent.svg' => ['message_bubble_sent.9', 0], - 'message_bubble_sent_grey.svg' => ['message_bubble_sent_grey.9', 0], - 'date_bubble_white.svg' => ['date_bubble_white.9', 0], - 'date_bubble_grey.svg' => ['date_bubble_grey.9', 0], - 'marker.svg' => ['marker', 0] - } - -# Executable paths for Mac OSX -# "/Applications/Inkscape.app/Contents/Resources/bin/inkscape" - -inkscape = "inkscape" -imagemagick = "magick" + 'main_logo.svg' => ['conversations/main_logo', 200], + 'quicksy_main_logo.svg' => ['quicksy/main_logo', 200], + 'splash_logo.svg' => ['conversations/splash_logo', 144], + 'quicksy_splash_logo.svg' => ['quicksy/splash_logo', 144], + 'ic_search_black.svg' => ['ic_search_background_black', 144], + 'ic_search_white.svg' => ['ic_search_background_white', 144], + 'ic_no_results_white.svg' => ['ic_no_results_background_white', 144], + 'ic_no_results_black.svg' => ['ic_no_results_background_black', 144], + 'play_video_white.svg' => ['play_video_white', 128], + 'play_gif_white.svg' => ['play_gif_white', 128], + 'play_video_black.svg' => ['play_video_black', 128], + 'play_gif_black.svg' => ['play_gif_black', 128], + 'open_pdf_black.svg' => ['open_pdf_black', 128], + 'open_pdf_white.svg' => ['open_pdf_white', 128], + 'conversations_mono.svg' => ['conversations/ic_notification', 24], + 'quicksy_mono.svg' => ['quicksy/ic_notification', 24], + 'flip_camera_android-black-24dp.svg' => ['ic_flip_camera_android_black_24dp', 24], + 'ic_send_text_offline.svg' => ['ic_send_text_offline', 36], + 'ic_send_text_offline_white.svg' => ['ic_send_text_offline_white', 36], + 'ic_send_text_online.svg' => ['ic_send_text_online', 36], + 'ic_send_text_away.svg' => ['ic_send_text_away', 36], + 'ic_send_text_dnd.svg' => ['ic_send_text_dnd', 36], + 'ic_send_photo_online.svg' => ['ic_send_photo_online', 36], + 'ic_send_photo_offline.svg' => ['ic_send_photo_offline', 36], + 'ic_send_photo_offline_white.svg' => ['ic_send_photo_offline_white', 36], + 'ic_send_photo_away.svg' => ['ic_send_photo_away', 36], + 'ic_send_photo_dnd.svg' => ['ic_send_photo_dnd', 36], + 'ic_send_location_online.svg' => ['ic_send_location_online', 36], + 'ic_send_location_offline.svg' => ['ic_send_location_offline', 36], + 'ic_send_location_offline_white.svg' => ['ic_send_location_offline_white', 36], + 'ic_send_location_away.svg' => ['ic_send_location_away', 36], + 'ic_send_location_dnd.svg' => ['ic_send_location_dnd', 36], + 'ic_send_voice_online.svg' => ['ic_send_voice_online', 36], + 'ic_send_voice_offline.svg' => ['ic_send_voice_offline', 36], + 'ic_send_voice_offline_white.svg' => ['ic_send_voice_offline_white', 36], + 'ic_send_voice_away.svg' => ['ic_send_voice_away', 36], + 'ic_send_voice_dnd.svg' => ['ic_send_voice_dnd', 36], + 'ic_send_cancel_online.svg' => ['ic_send_cancel_online', 36], + 'ic_send_cancel_offline.svg' => ['ic_send_cancel_offline', 36], + 'ic_send_cancel_offline_white.svg' => ['ic_send_cancel_offline_white', 36], + 'ic_send_cancel_away.svg' => ['ic_send_cancel_away', 36], + 'ic_send_cancel_dnd.svg' => ['ic_send_cancel_dnd', 36], + 'ic_send_picture_online.svg' => ['ic_send_picture_online', 36], + 'ic_send_picture_offline.svg' => ['ic_send_picture_offline', 36], + 'ic_send_picture_offline_white.svg' => ['ic_send_picture_offline_white', 36], + 'ic_send_picture_away.svg' => ['ic_send_picture_away', 36], + 'ic_send_picture_dnd.svg' => ['ic_send_picture_dnd', 36], + 'ic_send_videocam_online.svg' => ['ic_send_videocam_online', 36], + 'ic_send_videocam_offline.svg' => ['ic_send_videocam_offline', 36], + 'ic_send_videocam_offline_white.svg' => ['ic_send_videocam_offline_white', 36], + 'ic_send_videocam_away.svg' => ['ic_send_videocam_away', 36], + 'ic_send_videocam_dnd.svg' => ['ic_send_videocam_dnd', 36], + 'ic_notifications_none_white80.svg' => ['ic_notifications_none_white80', 24], + 'ic_notifications_off_white80.svg' => ['ic_notifications_off_white80', 24], + 'ic_notifications_paused_white80.svg' => ['ic_notifications_paused_white80', 24], + 'ic_notifications_white80.svg' => ['ic_notifications_white80', 24], + 'ic_verified_fingerprint.svg' => ['ic_verified_fingerprint', 36], + 'qrcode-scan.svg' => ['ic_qr_code_scan_white_24dp', 24], + 'message_bubble_received.svg' => ['message_bubble_received.9', 0], + 'message_bubble_received_grey.svg' => ['message_bubble_received_grey.9', 0], + 'message_bubble_received_dark.svg' => ['message_bubble_received_dark.9', 0], + 'message_bubble_received_warning.svg' => ['message_bubble_received_warning.9', 0], + 'message_bubble_received_white.svg' => ['message_bubble_received_white.9', 0], + 'message_bubble_sent.svg' => ['message_bubble_sent.9', 0], + 'message_bubble_sent_grey.svg' => ['message_bubble_sent_grey.9', 0], + 'date_bubble_white.svg' => ['date_bubble_white.9', 0], + 'date_bubble_grey.svg' => ['date_bubble_grey.9', 0], + 'marker.svg' => ['marker', 0] +} + +inkscape = 'inkscape' +imagemagick = 'convert' def execute_cmd(cmd) - puts cmd - system cmd + puts cmd + system cmd end images.each do |source_filename, settings| - svg_content = File.read(source_filename) - - svg = XML::Document.string(svg_content) - base_width = svg.root["width"].to_i - base_height = svg.root["height"].to_i - - guides = svg.find(".//sodipodi:guide","sodipodi:http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd") - - resolutions.each do |resolution, factor| - output_filename, base_size = settings - - if base_size > 0 - width = factor * base_size - height = factor * base_size - else - width = factor * base_width - height = factor * base_height - end - - output_parts = output_filename.split('/') - - if output_parts.count != 2 - path = "../src/main/res/drawable-#{resolution}/#{output_filename}.png" - else - path = "../src/#{output_parts[0]}/res/drawable-#{resolution}/#{output_parts[1]}.png" - end - execute_cmd "#{inkscape} #{source_filename} -C -w #{width} -h #{height} -e #{path}" - - top = [] - right = [] - bottom = [] - left = [] - - guides.each do |guide| - orientation = guide["orientation"] - x, y = guide["position"].split(",") - x, y = x.to_i, y.to_i - - if orientation == "1,0" and y == base_height - top.push(x * factor) - end - - if orientation == "0,1" and x == base_width - right.push((base_height - y) * factor) - end - - if orientation == "1,0" and y == 0 - bottom.push(x * factor) - end - - if orientation == "0,1" and x == 0 - left.push((base_height - y) * factor) - end - end - - next if top.length != 2 - next if right.length != 2 - next if bottom.length != 2 - next if left.length != 2 - - execute_cmd "#{imagemagick} -background none PNG32:#{path} -gravity center -extent #{width+2}x#{height+2} PNG32:#{path}" - - draw_format = "-draw \"line %d,%d %d,%d\"" - top_line = draw_format % [top.min + 1, 0, top.max, 0] - right_line = draw_format % [width + 1, right.min + 1, width + 1, right.max] - bottom_line = draw_format % [bottom.min + 1, height + 1, bottom.max, height + 1] - left_line = draw_format % [0, left.min + 1, 0, left.max] - draws = "#{top_line} #{right_line} #{bottom_line} #{left_line}" - - execute_cmd "#{imagemagick} -background none PNG32:#{path} -fill black -stroke none #{draws} PNG32:#{path}" - end + svg_content = File.read(source_filename) + output_filename, base_size = settings + + svg = XML::Document.string(svg_content) + base_width = svg.root['width'].to_i + base_height = svg.root['height'].to_i + + guides = svg.find('.//sodipodi:guide', 'sodipodi:http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd') + + resolutions.each do |resolution, factor| + if base_size.positive? + width = factor * base_size + height = factor * base_size + else + width = factor * base_width + height = factor * base_height + end + + output_parts = output_filename.split('/') + + path = if output_parts.count != 2 + "../src/main/res/drawable-#{resolution}/#{output_filename}.png" + else + "../src/#{output_parts[0]}/res/drawable-#{resolution}/#{output_parts[1]}.png" + end + execute_cmd "#{inkscape} #{source_filename} -C -w #{width.to_i} -h #{height.to_i} --export-filename=#{path}" + + top = [] + right = [] + bottom = [] + left = [] + + guides.each do |guide| + orientation = guide['orientation'] + x, y = guide['position'].split(',') + x = x.to_i + y = y.to_i + + top.push(x * factor) if (orientation == '1,0') && (y == base_height) + + right.push((base_height - y) * factor) if (orientation == '0,1') && (x == base_width) + + bottom.push(x * factor) if (orientation == '1,0') && y.zero? + + left.push((base_height - y) * factor) if (orientation == '0,1') && x.zero? + end + + next if top.length != 2 + next if right.length != 2 + next if bottom.length != 2 + next if left.length != 2 + + execute_cmd "#{imagemagick} -background none PNG32:#{path} -gravity center -extent #{width + 2}x#{height + 2} PNG32:#{path}" + + draw_format = '-draw "line %d,%d %d,%d"' + top_line = format(draw_format, top.min + 1, 0, top.max, 0) + right_line = format(draw_format, width + 1, right.min + 1, width + 1, right.max) + bottom_line = format(draw_format, bottom.min + 1, height + 1, bottom.max, height + 1) + left_line = format(draw_format, 0, left.min + 1, 0, left.max) + draws = "#{top_line} #{right_line} #{bottom_line} #{left_line}" + + execute_cmd "#{imagemagick} -background none PNG32:#{path} -fill black -stroke none #{draws} PNG32:#{path}" + end end diff --git a/build.gradle b/build.gradle index e2f31b0bcec21b1ad6ee17b702c5fbab5dfc1c4c..72d2cbe280b9231cf530e76574e1531b527e17ed 100644 --- a/build.gradle +++ b/build.gradle @@ -49,7 +49,7 @@ dependencies { implementation 'androidx.viewpager:viewpager:1.0.0' - playstoreImplementation('com.google.firebase:firebase-messaging:23.1.0') { + playstoreImplementation('com.google.firebase:firebase-messaging:23.1.1') { exclude group: 'com.google.firebase', module: 'firebase-core' exclude group: 'com.google.firebase', module: 'firebase-analytics' exclude group: 'com.google.firebase', module: 'firebase-measurement-connector' @@ -103,7 +103,6 @@ dependencies { } ext { - travisBuild = System.getenv("TRAVIS") == "true" preDexEnabled = System.getProperty("pre-dex", "true") abiCodes = ['armeabi-v7a': 1, 'x86': 2, 'x86_64': 3, 'arm64-v8a': 4] } @@ -125,7 +124,6 @@ android { testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } - configurations { implementation.exclude group: 'org.jetbrains' , module:'annotations' } @@ -151,7 +149,7 @@ android { def appName = "Quicksy" resValue "string", "app_name", appName - buildConfigField "String", "APP_NAME", "\"$appName\""; + buildConfigField "String", "APP_NAME", "\"$appName\"" } conversations { diff --git a/fastlane/metadata/android/de-DE/changelogs/349.txt b/fastlane/metadata/android/de-DE/changelogs/349.txt new file mode 100644 index 0000000000000000000000000000000000000000..9e38d16c1b0b79e1c6b13309ab366303294e7f49 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/349.txt @@ -0,0 +1,4 @@ +* Einführung einer Experteneinstellung zur Channel-Erkennung auf dem lokalen Server anstelle von search.jabber.network +* Standardmäßig Zustellungshäkchen aktiviert und Einstellung entfernt +* Standardmäßig 'Sendetaste zeigt Status an' aktiviert und die Einstellung entfernt +* Einstellungen für Sicherung und Vordergrunddienst in den Hauptbereich verschoben diff --git a/fastlane/metadata/android/de-DE/changelogs/351.txt b/fastlane/metadata/android/de-DE/changelogs/351.txt new file mode 100644 index 0000000000000000000000000000000000000000..5ee41b5bd893da8faf195990fa57c616b47b1d9e --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/351.txt @@ -0,0 +1,3 @@ +* Fehlerkorrektur für Jingle IBB Dateitransfer +* Fehlerkorrektur für wiederholende Korrekturen, welche die Datenbank füllen +* Wechsel zu Last Message Correction v1.1 diff --git a/fastlane/metadata/android/de-DE/changelogs/353.txt b/fastlane/metadata/android/de-DE/changelogs/353.txt new file mode 100644 index 0000000000000000000000000000000000000000..5b53a3cfb2ebbd08e34fb98aad04cc4d76241cc5 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/353.txt @@ -0,0 +1,4 @@ +* Benutzer können ihren eigenen Nicknamen festlegen +* Wiederaufnahme des Downloads von OMEMO-verschlüsselten Dateien +* Channels verwenden jetzt '#' als Symbol im Profilbild +* Quicksy verwendet 'immer' als OMEMO-Verschlüsselungsstandard (versteckt das Schlosssymbol) diff --git a/fastlane/metadata/android/de-DE/changelogs/360.txt b/fastlane/metadata/android/de-DE/changelogs/360.txt new file mode 100644 index 0000000000000000000000000000000000000000..1a4f98051e4f0234de5cb757c4ca73877af4ac04 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/360.txt @@ -0,0 +1 @@ +* Unterstützung für ?register und ?register;preauth XMPP URI-Parameter diff --git a/fastlane/metadata/android/de-DE/changelogs/362.txt b/fastlane/metadata/android/de-DE/changelogs/362.txt new file mode 100644 index 0000000000000000000000000000000000000000..507f33b1aa6b32e69c6fa243cfab96a91f6251e1 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/362.txt @@ -0,0 +1 @@ +* Unterstützung für automatischen Designwechsel in Android 10 diff --git a/fastlane/metadata/android/de-DE/changelogs/364.txt b/fastlane/metadata/android/de-DE/changelogs/364.txt new file mode 100644 index 0000000000000000000000000000000000000000..9297ddc86f85c30a2a7ba1be5922cb3bab49fa02 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/364.txt @@ -0,0 +1,2 @@ +* Bereitstellen von PDF-Vorschau ab Android 5+ +* Nutzung von 12 byte IVs für OMEMO diff --git a/fastlane/metadata/android/de-DE/changelogs/367.txt b/fastlane/metadata/android/de-DE/changelogs/367.txt new file mode 100644 index 0000000000000000000000000000000000000000..793fe26f92f9bfa6f02a887e3bc9c16aec92a998 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/367.txt @@ -0,0 +1,2 @@ +* Profilbildauswahl auf einigen Android 10 Geräten korrigiert +* Dateiübertragung für größere Dateien korrigiert diff --git a/fastlane/metadata/android/de-DE/changelogs/379.txt b/fastlane/metadata/android/de-DE/changelogs/379.txt new file mode 100644 index 0000000000000000000000000000000000000000..1106e2c6283a54cd1b252cae925170743149d681 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/379.txt @@ -0,0 +1 @@ +* Audio-/Videoanrufe (erfordert Serverunterstützung in Form von STUN- und TURN-Servern, die über XEP-0215 ermittelt werden können) diff --git a/fastlane/metadata/android/de-DE/changelogs/381.txt b/fastlane/metadata/android/de-DE/changelogs/381.txt new file mode 100644 index 0000000000000000000000000000000000000000..b4ad85ce2a9356625985c7b4bc4082208c943dd8 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/381.txt @@ -0,0 +1,2 @@ +* Akustische Rückmeldungen (Wählen, Anruf begonnen, Anruf beendet) für Audioanrufe +* Problem mit der Wiederholung eines fehlgeschlagenen Videoanrufs behoben diff --git a/fastlane/metadata/android/de-DE/changelogs/382.txt b/fastlane/metadata/android/de-DE/changelogs/382.txt new file mode 100644 index 0000000000000000000000000000000000000000..7f49cbb9e7efba637cf4990236b081a47bced8c9 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/382.txt @@ -0,0 +1,2 @@ +* Schaltfläche zum Umschalten der Kamera während eines Videoanrufs hinzugefügt +* Audioanrufe auf Tablets repariert diff --git a/fastlane/metadata/android/de-DE/changelogs/383.txt b/fastlane/metadata/android/de-DE/changelogs/383.txt new file mode 100644 index 0000000000000000000000000000000000000000..df2b532fecd53b8fcada51b7cdbe28b0dc1999b4 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/383.txt @@ -0,0 +1,3 @@ +* Anrufsymbol nach links verschoben, damit die anderen Symbole der Symbolleiste an einer einheitlichen Stelle bleiben +* Anzeige der Gesprächsdauer bei Sprachanrufen +* Unterbrechung der Verbindung bei A/V-Anrufen (zwei Personen rufen sich gleichzeitig an) diff --git a/fastlane/metadata/android/de-DE/changelogs/387.txt b/fastlane/metadata/android/de-DE/changelogs/387.txt new file mode 100644 index 0000000000000000000000000000000000000000..aafeabd80409a828f90386b071f70b3b73f4cc54 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/387.txt @@ -0,0 +1,2 @@ +* Überarbeitung der UI für die Anmeldung mit Zertifikat +* Integration der Möglichkeit, Chats ganz oben anzuheften (zu den Favoriten hinzufügen) diff --git a/fastlane/metadata/android/de-DE/changelogs/388.txt b/fastlane/metadata/android/de-DE/changelogs/388.txt new file mode 100644 index 0000000000000000000000000000000000000000..434dbfe847e8d2275b9b67a5059288c4b9c60642 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/388.txt @@ -0,0 +1,3 @@ +* Reduzierung des Echos bei Anrufen auf einigen Geräten +* Anmeldung korrigiert, wenn Passwörter Sonderzeichen enthalten +* Wähl- und Besetztzeichen bei Videoanrufen auf dem Lautsprecher abspielen diff --git a/fastlane/metadata/android/de-DE/changelogs/390.txt b/fastlane/metadata/android/de-DE/changelogs/390.txt new file mode 100644 index 0000000000000000000000000000000000000000..f9743617d6140cc80be6b997f560fa16ade93b08 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/390.txt @@ -0,0 +1 @@ +* Möglichkeit zur Aufnahme einer Sprachnachricht, wenn der Anrufer beschäftigt ist diff --git a/fastlane/metadata/android/de-DE/changelogs/393.txt b/fastlane/metadata/android/de-DE/changelogs/393.txt new file mode 100644 index 0000000000000000000000000000000000000000..272afee944048090f29050a6f333fbc45e62a072 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/393.txt @@ -0,0 +1,3 @@ +* Hilfe-Schaltfläche anzeigen, wenn A/V-Anruf fehlschlägt +* Einige lästige Abstürze behoben +* Jingle-Verbindungen (Dateiübertragung + Anrufe) mit bloßen JIDs behoben diff --git a/fastlane/metadata/android/de-DE/changelogs/394.txt b/fastlane/metadata/android/de-DE/changelogs/394.txt new file mode 100644 index 0000000000000000000000000000000000000000..aa8559931830ad36aa74ff480fed7e9b1372e441 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/394.txt @@ -0,0 +1,2 @@ +* Benachrichtigungen wurden unter bestimmten Bedingungen nicht mehr angezeigt +* Kompatibilitätsprobleme und Abstürze im Zusammenhang mit A/V-Anrufen behoben diff --git a/fastlane/metadata/android/de-DE/changelogs/395.txt b/fastlane/metadata/android/de-DE/changelogs/395.txt new file mode 100644 index 0000000000000000000000000000000000000000..9f3c4a22c553e45116f39ceb3efaee8c0020130f --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/395.txt @@ -0,0 +1,3 @@ +* Hinzufügen von 'Zurück zum Chat' zum Audio-Anruf-Bildschirm +* Verbesserung der Tastaturkürzel +* Fehlerbehebungen diff --git a/fastlane/metadata/android/de-DE/changelogs/397.txt b/fastlane/metadata/android/de-DE/changelogs/397.txt new file mode 100644 index 0000000000000000000000000000000000000000..75edd16331b7d15eaa96ec315c1c750679ccebc9 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/397.txt @@ -0,0 +1,3 @@ +* Verarbeitung von GPX-Dateien +* Verbesserte Leistung bei der Wiederherstellung von Sicherungen +* Fehlerbehebungen diff --git a/fastlane/metadata/android/de-DE/changelogs/398.txt b/fastlane/metadata/android/de-DE/changelogs/398.txt new file mode 100644 index 0000000000000000000000000000000000000000..9c82ee4729fc3bba8dbf864d662b0d1b2add54d3 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/398.txt @@ -0,0 +1,4 @@ +* Suche in einzelnen Unterhaltungen +* Benutzer werden benachrichtigt, wenn die Nachrichtenzustellung fehlschlägt +* Anzeigenamen (Nicks) von Quicksy-Benutzern über Neustarts hinweg speichern +* Hinzufügen einer Schaltfläche zum Starten von Orbot (Tor) aus der Benachrichtigung heraus, falls erforderlich diff --git a/fastlane/metadata/android/de-DE/changelogs/401.txt b/fastlane/metadata/android/de-DE/changelogs/401.txt new file mode 100644 index 0000000000000000000000000000000000000000..bad3aaea4f554b81901559c9ff2d9a83692c982a --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/401.txt @@ -0,0 +1,2 @@ +* Suche auf Android <= 5 korrigiert +* Optimierung des Speicherverbrauchs diff --git a/fastlane/metadata/android/de-DE/changelogs/402.txt b/fastlane/metadata/android/de-DE/changelogs/402.txt new file mode 100644 index 0000000000000000000000000000000000000000..346c8244a609af79e3be22a441c1654f66fe180e --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/402.txt @@ -0,0 +1,3 @@ +* Bietet einfache Einladungserstellung auf unterstützenden Servern +* GIFs anzeigen, die von Movim gesendet werden +* Profilbilder im Cache speichern diff --git a/fastlane/metadata/android/de-DE/changelogs/403.txt b/fastlane/metadata/android/de-DE/changelogs/403.txt new file mode 100644 index 0000000000000000000000000000000000000000..8561ef554e2b68df456dbfdbd7c93f11fee21a6b --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/403.txt @@ -0,0 +1,3 @@ +* Behebung von Verbindungsproblemen, wenn verschiedene Konten unterschiedliche SCRAM-Mechanismen verwenden +* Unterstützung für SCRAM-SHA-512 hinzugefügt +* P2P (Jingle) Dateiübertragung mit eigenem Kontakt zulassen diff --git a/fastlane/metadata/android/de-DE/changelogs/404.txt b/fastlane/metadata/android/de-DE/changelogs/404.txt new file mode 100644 index 0000000000000000000000000000000000000000..39e76f5f3c54362c823f8385ebae8f820b226a6c --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/404.txt @@ -0,0 +1 @@ +* Kleinere Stabilitätsverbesserungen für A/V-Anrufe diff --git a/fastlane/metadata/android/de-DE/changelogs/405.txt b/fastlane/metadata/android/de-DE/changelogs/405.txt new file mode 100644 index 0000000000000000000000000000000000000000..0f2a94978d75c27a26a2da85b0292cf8a28184fc --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/405.txt @@ -0,0 +1 @@ +* Quicksy: Automatischer Empfang der Bestätigungs-SMS diff --git a/fastlane/metadata/android/de-DE/changelogs/407.txt b/fastlane/metadata/android/de-DE/changelogs/407.txt new file mode 100644 index 0000000000000000000000000000000000000000..424db96c884b780d6d04e78eefb55fd41ca770a0 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/407.txt @@ -0,0 +1,3 @@ +* Anzeige der Anruftaste für Offline-Kontakte, wenn diese zuvor Unterstützung gemeldet haben +* Zurück-Taste beendet den Anruf nicht mehr, wenn der Anruf gerade läuft +* Fehlerbehebungen diff --git a/fastlane/metadata/android/de-DE/changelogs/42000.txt b/fastlane/metadata/android/de-DE/changelogs/42000.txt new file mode 100644 index 0000000000000000000000000000000000000000..d08a8b03ccc909a41871ad4d95ffdbfec51118d4 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42000.txt @@ -0,0 +1,4 @@ +* Möglichkeit zur Auswahl des Klingeltons für eingehende Anrufe +* Behebung der OpenPGP-Schlüsselerkennung für OpenKeychain 5.6+ +* Korrekte Verifizierung von Punycode-TLS-Zertifikaten +* Verbesserte Stabilität des RTP-Sitzungsaufbaus (Anrufe) diff --git a/fastlane/metadata/android/de-DE/changelogs/42006.txt b/fastlane/metadata/android/de-DE/changelogs/42006.txt new file mode 100644 index 0000000000000000000000000000000000000000..f577f3552735acf5b1f967a07fecb9ced3827ce7 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42006.txt @@ -0,0 +1,2 @@ +* Verifizierung von A/V-Anrufen mit bereits bestehenden OMEMO-Sitzungen +* Verbesserung der Kompatibilität mit WebRTC-Implementierungen, die nicht von libwebrtc stammen diff --git a/fastlane/metadata/android/de-DE/changelogs/42010.txt b/fastlane/metadata/android/de-DE/changelogs/42010.txt new file mode 100644 index 0000000000000000000000000000000000000000..d0550817eab9fd4b25d2c50548d30a55e5e370ef --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42010.txt @@ -0,0 +1,2 @@ +* Verschiedene Fehlerbehebungen rund um die Tor-Unterstützung +* Verbesserung der Anrufkompatibilität mit Dino diff --git a/fastlane/metadata/android/de-DE/changelogs/42012.txt b/fastlane/metadata/android/de-DE/changelogs/42012.txt new file mode 100644 index 0000000000000000000000000000000000000000..ff872859125aad65593cfb21cf93993b84c7e453 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42012.txt @@ -0,0 +1 @@ +* Problembehebung beim HTTP-Upload/Download für Benutzer, die den System-CAs nicht vertrauen diff --git a/fastlane/metadata/android/de-DE/changelogs/42013.txt b/fastlane/metadata/android/de-DE/changelogs/42013.txt new file mode 100644 index 0000000000000000000000000000000000000000..c40304f5528aec5f27d66cae19700f90edefb148 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42013.txt @@ -0,0 +1 @@ +* Probleme mit "Keine Verbindung" unter Android 7.1 behoben diff --git a/fastlane/metadata/android/de-DE/changelogs/42014.txt b/fastlane/metadata/android/de-DE/changelogs/42014.txt new file mode 100644 index 0000000000000000000000000000000000000000..6bc08c6265da1c40a71d55b35aa43ae45b5e807b --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42014.txt @@ -0,0 +1,2 @@ +* Domänenname immer überprüfen. Kein Überschreiben von Benutzern +* Unterstützung der Kontaktlisten-Vorauthentifizierung diff --git a/fastlane/metadata/android/de-DE/changelogs/42015.txt b/fastlane/metadata/android/de-DE/changelogs/42015.txt new file mode 100644 index 0000000000000000000000000000000000000000..d63b15514a166b32ac34d529a421c45dcce1bfd8 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42015.txt @@ -0,0 +1 @@ +* Kleinere A/V-Verbesserungen diff --git a/fastlane/metadata/android/de-DE/changelogs/42018.txt b/fastlane/metadata/android/de-DE/changelogs/42018.txt new file mode 100644 index 0000000000000000000000000000000000000000..29dab642b233e3b9526720156123cb6b2801b8d6 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42018.txt @@ -0,0 +1,3 @@ +* Schwarze Balken anzeigen, wenn das entfernte Video nicht dem Seitenverhältnis des Bildschirms entspricht +* Verbesserung der Suchleistung +* Einstellung hinzugefügt, um Bildschirmfotos zu verhindern diff --git a/fastlane/metadata/android/de-DE/changelogs/42022.txt b/fastlane/metadata/android/de-DE/changelogs/42022.txt new file mode 100644 index 0000000000000000000000000000000000000000..6de1129acd4b2ab93a6f4919c02bd6f0e6d1e88e --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42022.txt @@ -0,0 +1,2 @@ +* Fehler behoben, bei dem einige Videos nicht komprimiert wurden +* Seltenen Absturz beim Öffnen von Benachrichtigungen behoben diff --git a/fastlane/metadata/android/de-DE/changelogs/42023.txt b/fastlane/metadata/android/de-DE/changelogs/42023.txt new file mode 100644 index 0000000000000000000000000000000000000000..f7e8dba64d6953a77639e34bff2a1bf59d4ebb1b --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42023.txt @@ -0,0 +1,2 @@ +* Absturz beim Rendern einiger Anführungszeichen behoben +* Absturz im Willkommensbildschirm behoben diff --git a/fastlane/metadata/android/de-DE/changelogs/42037.txt b/fastlane/metadata/android/de-DE/changelogs/42037.txt new file mode 100644 index 0000000000000000000000000000000000000000..585b4f896eb9977b152edaa38b772be9b7ac5f2f --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42037.txt @@ -0,0 +1,9 @@ +* Abfrage der Bluetooth-Berechtigung bei A/V-Anrufen (nur bei Bluetooth-Headsets erforderlich) +* Fehler beim Anrufen von Movim behoben +* Anzeige eines falschen Profilbilds bei Gruppenchats behoben +* Immer nach dem Opt-Out für Akku-Optimierungen fragen +* Interaktion mit Google Maps Share Location Plugin behoben +* Fußnote bezüglich der Servergebühr entfernt +* Dateien an einem für Android 11 geeigneten Ort speichern +* Anruf nach Netzwechsel erneut versuchen zu verbinden +* JID des Anrufers und JID des Kontos im Bildschirm für eingehende Anrufe anzeigen diff --git a/fastlane/metadata/android/de-DE/changelogs/42038.txt b/fastlane/metadata/android/de-DE/changelogs/42038.txt new file mode 100644 index 0000000000000000000000000000000000000000..e18587226919c1b6a7a5d9952860598c21fde269 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42038.txt @@ -0,0 +1,2 @@ +* Kleinere Fehlerbehebungen +* Wiederherstellung der Möglichkeit, über JMP und andere Dienste aufzurufen (Playstore-Version) diff --git a/fastlane/metadata/android/de-DE/changelogs/42041.txt b/fastlane/metadata/android/de-DE/changelogs/42041.txt new file mode 100644 index 0000000000000000000000000000000000000000..759914db185713ae02c301d53f8bc5e3bee1c501 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42041.txt @@ -0,0 +1,5 @@ +* Implementierung von Extensible SASL Profile, Bind 2.0 und Fast für schnellere Wiederverbindungen +* Implementierung von Channel Binding +* Möglichkeit von einem Audioanruf zu einem Videoanruf zu wechseln +* Möglichkeit zum Löschen des eigenen Profilbildes hinzugefügt +* Benachrichtigung für verpasste Anrufe hinzugefügt diff --git a/fastlane/metadata/android/de-DE/changelogs/42042.txt b/fastlane/metadata/android/de-DE/changelogs/42042.txt new file mode 100644 index 0000000000000000000000000000000000000000..62a20d7cfe89bd09771026068b119b0ba936dff7 --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42042.txt @@ -0,0 +1,2 @@ +* Wiederholungsschleife auf Servern beheben, die nur sm:2 unterstützen +* "Umschalten auf Video" nur anzeigen, wenn die Gegenseite Video unterstützt diff --git a/fastlane/metadata/android/de-DE/changelogs/42043.txt b/fastlane/metadata/android/de-DE/changelogs/42043.txt new file mode 100644 index 0000000000000000000000000000000000000000..011abd98c17d92f22366801e3a50d0d1c1d0102c --- /dev/null +++ b/fastlane/metadata/android/de-DE/changelogs/42043.txt @@ -0,0 +1 @@ +* Fehler bei der P2P-Dateiübertragung behoben diff --git a/fastlane/metadata/android/de-DE/full_description.txt b/fastlane/metadata/android/de-DE/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..d6b5d4b1ec2b42d2e38fdf952857969004b39384 --- /dev/null +++ b/fastlane/metadata/android/de-DE/full_description.txt @@ -0,0 +1,39 @@ +Einfach zu bedienen, zuverlässig, batteriefreundlich. Mit integrierter Unterstützung für Bilder, Gruppenchats und E2E-Verschlüsselung. + +Designprinzipien: + +* Möglichst schön und benutzerfreundlich, ohne Abstriche bei der Sicherheit und Privatsphäre +* Auf bestehende, gut etablierte Protokolle zurückgreifen +* Kein Google-Konto oder speziell Google Cloud Messaging (GCM) erforderlich +* So wenig Berechtigungen wie möglich erfordern + +Funktionen: + +* Ende-zu-Ende-Verschlüsselung entweder mit OMEMO oder OpenPGP +* Senden und Empfangen von Bildern +* Verschlüsselte Audio- und Videoanrufe (DTLS-SRTP) +* Intuitives UI, das den Android Design Richtlinien folgt +* Bilder / Profilbilder für deine Kontakte +* Synchronisation mit Desktop-Client +* Konferenzen (mit Unterstützung für Lesezeichen) +* Adressbucheinbindung +* Mehrere Konten / einheitlicher Posteingang +* Sehr geringe Auswirkungen auf die Akkulaufzeit + +Mit Conversations ist es sehr einfach, ein Konto auf dem kostenlosen conversations.im-Server zu erstellen. Dennoch funktioniert Conversations auch mit jedem anderen XMPP-Server. Zahlreiche XMPP-Server werden von Freiwilligen betrieben und sind kostenlos. + +XMPP-Funktionen: + +Conversations funktioniert mit jedem XMPP-Server. XMPP ist jedoch ein erweiterbares Protokoll. Diese Erweiterungen sind ebenfalls in sogenannten XEP's standardisiert. Conversations unterstützt einige davon, um die Benutzerfreundlichkeit zu verbessern. Es besteht die Möglichkeit, dass Ihr aktueller XMPP-Server diese Erweiterungen nicht unterstützt. Um Conversations optimal nutzen zu können, solltest du daher entweder zu einem XMPP-Server wechseln, der dies unterstützt, oder - noch besser - einen eigenen XMPP-Server für dich und deine Freunde betreiben. + +Diese XEPs sind es derzeit: + +* XEP-0065: SOCKS5 Bytestreams (oder mod_proxy65). Wird für die Übertragung von Dateien verwendet, wenn sich beide Parteien hinter einer Firewall (NAT) befinden. +* XEP-0163: Personal Eventing Protocol für Profilbilder +* XEP-0191: Mit dem Blockierungsbefehl kannst du Spammer auf eine schwarze Liste setzen oder Kontakte blockieren, ohne sie aus deiner Liste zu entfernen. +* XEP-0198: Stream Management ermöglicht es XMPP, kleinere Netzwerkausfälle und Änderungen der zugrunde liegenden TCP-Verbindung zu überstehen. +* XEP-0280: Message Carbons, das die von dir gesendeten Nachrichten automatisch mit deinem Desktop-Client synchronisiert und es dir somit ermöglicht, innerhalb einer Unterhaltung nahtlos von deinem mobilen Client zu deinem Desktop-Client und zurück zu wechseln. +* XEP-0237: Roster Versioning hauptsächlich, um Bandbreite bei schlechten mobilen Verbindungen zu sparen +* XEP-0313: Nachrichtenarchiv-Management synchronisiert den Nachrichtenverlauf mit dem Server. Aufholen von Nachrichten, die gesendet wurden, während Conversations offline war. +* XEP-0352: Client State Indication lässt den Server wissen, ob Conversations im Hintergrund läuft oder nicht. Ermöglicht es dem Server, Bandbreite zu sparen, indem er unwichtige Pakete zurückhält. +* XEP-0363: HTTP File Upload ermöglicht den Austausch von Dateien in Konferenzen und mit Offline-Kontakten. Erfordert eine zusätzliche Komponente auf deinem Server. diff --git a/fastlane/metadata/android/de-DE/short_description.txt b/fastlane/metadata/android/de-DE/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..52910ff20bea60419be42556559fa32c07b6698f --- /dev/null +++ b/fastlane/metadata/android/de-DE/short_description.txt @@ -0,0 +1 @@ +Ein verschlüsselter, benutzerfreundlicher XMPP-Instant-Messaging-Client, der für Smartphones optimiert ist diff --git a/fastlane/metadata/android/en-US/changelogs/42042.txt b/fastlane/metadata/android/en-US/changelogs/42042.txt new file mode 100644 index 0000000000000000000000000000000000000000..4437be30a3c47ede22f4739a63b489d0aa243dec --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/42042.txt @@ -0,0 +1,2 @@ +* Fix resend loop on servers that support only sm:2 +* Show 'Switch to video' only if other party supports video diff --git a/fastlane/metadata/android/en-US/changelogs/42043.txt b/fastlane/metadata/android/en-US/changelogs/42043.txt new file mode 100644 index 0000000000000000000000000000000000000000..2c0bd4a3448927e4044c574e707c91d755136453 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/42043.txt @@ -0,0 +1 @@ +* Fixed regression in P2P file transfer diff --git a/fastlane/metadata/android/en-US/changelogs/42044.txt b/fastlane/metadata/android/en-US/changelogs/42044.txt new file mode 100644 index 0000000000000000000000000000000000000000..d84707ecff77e495787bd8cc015381b86db7fe57 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/42044.txt @@ -0,0 +1,3 @@ +* Fix messages getting resend when using SASL2 +* Fix black video between some devices +* Fix crash on empty passwords diff --git a/fastlane/metadata/android/it-IT/full_description.txt b/fastlane/metadata/android/it-IT/full_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..d390af661340371a1eec874fdce2f4c5e56127b3 --- /dev/null +++ b/fastlane/metadata/android/it-IT/full_description.txt @@ -0,0 +1,39 @@ +Facile da usare, affidabile, leggero sulla batteria. Con supporto integrato per immagini, chat di gruppo e crittografia e2e. + +Principi di design: + +* Essere il più bello e facile da usare possibile senza sacrificare la sicurezza o la privacy +* Affidarsi a protocolli esistenti ben affermati +* Non richiedere un account Google o nello specifico Google Cloud Messaging (GCM) +* Richiedere il minor numero di autorizzazioni possibile + +Caratteristiche: + +* Crittografia end-to-end con OMEMO o OpenPGP +* Invio e ricezione di immagini +* Chiamate audio e video crittografate (DTLS-SRTP) +* Interfaccia utente intuitiva che segue le linee guida del design di Android +* Immagini / Avatar per i tuoi contatti +* Sincronizzazione con client desktop +* Conferenze (con supporto ai segnalibri) +* Integrazione della rubrica +* Profili multipli / messaggi unificati +* Consumo molto basso della batteria + +Conversations rende veramente facile creare un profilo sul server gratuito conversations.im. Tuttavia Conversations funzionerà anche con qualsiasi altro server XMPP. Molti server XMPP vengono gestiti da volontari e sono gratuiti. + +Caratteristiche di XMPP: + +Conversations funziona con tutti i server XMPP. Tuttavia XMPP è un protocollo estensibile. Anche queste estensioni sono standardizzate, con il nome XEP. Conversations supporta alcune di esse per rendere migliore l'esperienza utente. È possibile che il server XMPP che stai usando non supporti queste estensioni. Perciò, per ottenere il meglio da Conversations dovresti considerare di passare ad un server XMPP che le supporta o, ancora meglio, installarne uno tuo per te e i tuoi amici. + +Queste XEP sono, ad oggi: + +* XEP-0065: SOCKS5 Bytestreams (o mod_proxy65). Usata per trasferire file se entrambe le parti sono dietro un firewall (NAT). +* XEP-0163: Personal Eventing Protocol. Per gli avatar. +* XEP-0191: Blocking command. Ti consente di bloccare lo spam o i contatti senza rimuoverli dal tuo elenco. +* XEP-0198: Stream Management. Consente a XMPP di resistere a brevi disconnessioni e cambi della connessione TCP sottostante. +* XEP-0280: Message Carbons. Sincronizza automaticamente i messaggi che invii al client desktop, quindi ti consente di passare senza problemi dal mobile al desktop e viceversa con un'unica conversazione. +* XEP-0237: Roster Versioning. Principalmente per risparmiare banda di rete in connessioni mobili deboli +* XEP-0313: Message Archive Management. Sincronizza la cronologia dei messaggi con il server. Recupera i messaggi che sono stati inviati mentre Conversations era offline. +* XEP-0352: Client State Indication. Fa sapere al server se Conversations è in secondo piano o no. Permette al server di risparmiare banda di rete trattenendo i pacchetti non importanti. +* XEP-0363: HTTP File Upload. Ti consente di condividere file nelle conferenze e con i contatti offline. Richiede un componente aggiuntivo sul tuo server. diff --git a/fastlane/metadata/android/it-IT/short_description.txt b/fastlane/metadata/android/it-IT/short_description.txt new file mode 100644 index 0000000000000000000000000000000000000000..66e51b2d5d6f2a28e5ef36d141d21eda83c88819 --- /dev/null +++ b/fastlane/metadata/android/it-IT/short_description.txt @@ -0,0 +1 @@ +Un client di messaggistica XMPP facile e criptato, ottimizzato per il mobile diff --git a/src/conversations/res/values-es/strings.xml b/src/conversations/res/values-es/strings.xml index b5ca254b57608ef56f81a38df1fb06795b395971..80958fadc576be0d65adfaab8391262c6cf36bdc 100644 --- a/src/conversations/res/values-es/strings.xml +++ b/src/conversations/res/values-es/strings.xml @@ -4,7 +4,8 @@ Usa conversations.im Crear nueva cuenta ¿Ya tienes una cuenta XMPP? Este puede ser el caso si ya estás usando un cliente XMPP diferente o has usado Conversations anteriormente. Si no es así, puedes crear una nueva cuenta XMPP ahora mismo.\nConsejo: Algunos proveedores de email también ofrecen una cuenta XMPP. - XMPP es una red de mensajería instantánea independiente del proveedor. Puedes usar este cliente con cualquier servidor XMPP que elijas.\nSin embargo, para tu conveniencia, hacemos de forma sencilla la creación de una cuenta en conversations.im; un proveedor especializado para el uso con Conversations + XMPP es una red de mensajería instantánea independiente del proveedor. Puedes usar este cliente con cualquier servidor XMPP que elijas. +\nSin embargo, para tu conveniencia, hacemos de forma sencilla la creación de una cuenta en conversations.im; un proveedor especializado para el uso con Conversations. Has sido invitado a %1$s. Te guiaremos durante el proceso de creación de la cuenta.\nCuando selecciones %1$s como proveedor podrás comunicarte con usuarios de otros servidores proporcionándoles tu dirección XMPP completa. Has sido invitado a %1$s. Un nombre de usuario ya ha sido escogido para ti. Te guiaremos durante el proceso de creación de la cuenta.\nPodrás comunicarte con otros usuarios de otros servidores proporcionándoles tu dirección XMPP completa. Tu invitación al servidor @@ -12,5 +13,5 @@ Pulsa el botón de compartir para enviar a tu contacto una invitación a %1$s. Si tu contacto está cerca, también puede escanear el código mostrado debajo para aceptar tu invitación. Únete a %1$s y chatea conmigo: %2$s - Compartir invitación con... + Comparte la invitación con… \ No newline at end of file diff --git a/src/conversations/res/values-gl/strings.xml b/src/conversations/res/values-gl/strings.xml index ed3299863e1c849ad3874760f95ae158a7052ee6..2becd8bea7516c0611416003cf190f2e544094a6 100644 --- a/src/conversations/res/values-gl/strings.xml +++ b/src/conversations/res/values-gl/strings.xml @@ -12,5 +12,5 @@ Toca no botón compartir para convidar ao teu contacto a %1$s. Se o contacto está preto de ti, pode escanear o código inferior para aceptar o teu convite. Únete a %1$s e conversa conmigo: %2$s - Enviar convite a... + Enviar convite a… \ No newline at end of file diff --git a/src/conversations/res/values-it/strings.xml b/src/conversations/res/values-it/strings.xml index 6e68c5eaa11932b62970ee99d8018d8e8e8eab06..428a2b0326751abe134e450e3ba3933a8c6719d9 100644 --- a/src/conversations/res/values-it/strings.xml +++ b/src/conversations/res/values-it/strings.xml @@ -3,10 +3,10 @@ Scegli il tuo fornitore XMPP Usa conversations.im Crea un nuovo profilo - Possiedi già un profilo XMPP? Questo succede se stai già usando un diverso client XMPP o hai già usato prima Conversations. In caso negativo puoi creare un profilo XMPP adesso. -Suggerimento: alcuni provider di email forniscono anche un account XMPP. + Hai già un profilo XMPP\? Può accadere se stai già usando un client XMPP diverso o hai già usato prima Conversations. In caso negativo, puoi creare un profilo XMPP adesso. +\nNota: alcuni fornitori di email offrono anche account XMPP. XMPP è una rete di messaggistica istantanea indipendente dal fornitore. Puoi usare questo client con qualsiasi server XMPP. -In ogni caso per facilitare puoi creare facilmente un account su conversations.im, un fornitore pensato apposta per essere usato con Conversations. +\nTuttavia, per comodità, puoi creare facilmente un account su conversations.im; un fornitore pensato apposta per essere usato con Conversations. Hai ricevuto un invito per %1$s. Ti guideremo nel procedimento per creare un profilo.\nQuando scegli %1$s come fornitore sarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo. Hai ricevuto un invito per %1$s. È già stato scelto un nome utente per te. Ti guideremo nel procedimento per creare un profilo.\nSarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo. Il tuo invito al server @@ -14,5 +14,5 @@ In ogni caso per facilitare puoi creare facilmente un account su conversations.i Tocca il pulsante condividi per inviare al contatto un invito per %1$s. Se il contatto è vicino, può anche scansionare il codice sottostante per accettare il tuo invito. Unisciti a %1$s e chatta con me: %2$s - Condividi invito con... + Condividi invito con… \ No newline at end of file diff --git a/src/conversations/res/values-zh-rCN/strings.xml b/src/conversations/res/values-zh-rCN/strings.xml index dfe82d428f63f940bd60b097e555ff5836e2bd87..961973b8c1faf6dc1797b12614ffdd65f851ba33 100644 --- a/src/conversations/res/values-zh-rCN/strings.xml +++ b/src/conversations/res/values-zh-rCN/strings.xml @@ -12,5 +12,5 @@ 点击分享按钮向您的联系人发送加入 %1$s 的邀请。 如果你的联系人在附近,他们也可以扫描下面的代码来接受你的邀请。 加入 %1$s 和我聊天:%2$s - 分享邀请 + 分享邀请… \ No newline at end of file diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java index 931debe017cc9a744cb2efa07a76f20c4945543f..e5708e504dedd8a46c4f2f9f1f7dd51e1d1421d8 100644 --- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java +++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramMechanism.java @@ -1,7 +1,6 @@ package eu.siacs.conversations.crypto.sasl; import android.util.Base64; -import android.util.Log; import com.google.common.base.CaseFormat; import com.google.common.base.Objects; @@ -13,14 +12,32 @@ import java.nio.charset.Charset; import java.security.InvalidKeyException; import java.util.concurrent.ExecutionException; +import javax.crypto.SecretKey; import javax.net.ssl.SSLSocket; -import eu.siacs.conversations.Config; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.utils.CryptoHelper; abstract class ScramMechanism extends SaslMechanism { + public static final SecretKey EMPTY_KEY = + new SecretKey() { + @Override + public String getAlgorithm() { + return "HMAC"; + } + + @Override + public String getFormat() { + return "RAW"; + } + + @Override + public byte[] getEncoded() { + return new byte[0]; + } + }; + private static final byte[] CLIENT_KEY_BYTES = "Client Key".getBytes(); private static final byte[] SERVER_KEY_BYTES = "Server Key".getBytes(); private static final Cache CACHE = diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java index 6f00c49eb948dd78599b0062fc5f5e1ac065d31a..1e0fc32b23e6a52dda35451b61c58a01fe297dc8 100644 --- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java +++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java @@ -15,7 +15,9 @@ public class ScramSha1 extends ScramMechanism { @Override protected HashFunction getHMac(final byte[] key) { - return Hashing.hmacSha1(key); + return (key == null || key.length == 0) + ? Hashing.hmacSha1(EMPTY_KEY) + : Hashing.hmacSha1(key); } @Override diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1Plus.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1Plus.java index d353bd9ee5da623581920a97dbdaed20ebe174cc..2ca27570f79e8108b447f5fe7deef8ec09e21bc6 100644 --- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1Plus.java +++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1Plus.java @@ -15,7 +15,9 @@ public class ScramSha1Plus extends ScramPlusMechanism { @Override protected HashFunction getHMac(final byte[] key) { - return Hashing.hmacSha1(key); + return (key == null || key.length == 0) + ? Hashing.hmacSha1(EMPTY_KEY) + : Hashing.hmacSha1(key); } @Override diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java index 9d7d62c365827bb810291e94ff4d7aaef6450dd6..b330f1fe77031f03135cd1646792891cc9f9a845 100644 --- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java +++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256.java @@ -19,7 +19,9 @@ public class ScramSha256 extends ScramMechanism { @Override protected HashFunction getHMac(final byte[] key) { - return Hashing.hmacSha256(key); + return (key == null || key.length == 0) + ? Hashing.hmacSha256(EMPTY_KEY) + : Hashing.hmacSha256(key); } @Override diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256Plus.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256Plus.java index 5f15e9bf18fd77a79df792837ca587591a6a13d7..4db33a2fa08566a3ea5c3abb882ab5bf6b7a9255 100644 --- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256Plus.java +++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha256Plus.java @@ -15,7 +15,9 @@ public class ScramSha256Plus extends ScramPlusMechanism { @Override protected HashFunction getHMac(final byte[] key) { - return Hashing.hmacSha256(key); + return (key == null || key.length == 0) + ? Hashing.hmacSha256(EMPTY_KEY) + : Hashing.hmacSha256(key); } @Override diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512.java index 8194ac0ac226a2e475da6a52fc0fc9bf7b8548ea..e6dcf2efd5cc58d2bfa5ba74d29487d8f0a7233b 100644 --- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512.java +++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512.java @@ -19,7 +19,9 @@ public class ScramSha512 extends ScramMechanism { @Override protected HashFunction getHMac(final byte[] key) { - return Hashing.hmacSha512(key); + return (key == null || key.length == 0) + ? Hashing.hmacSha512(EMPTY_KEY) + : Hashing.hmacSha512(key); } @Override diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512Plus.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512Plus.java index 610c87e2310477d13ebb786b2649c644e9903ef1..5d846197314d713ac5b47d6ab721f078ad6bfd35 100644 --- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512Plus.java +++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha512Plus.java @@ -15,7 +15,9 @@ public class ScramSha512Plus extends ScramPlusMechanism { @Override protected HashFunction getHMac(final byte[] key) { - return Hashing.hmacSha512(key); + return (key == null || key.length == 0) + ? Hashing.hmacSha512(EMPTY_KEY) + : Hashing.hmacSha512(key); } @Override diff --git a/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java b/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java index 96097d0b3996ecc5fad9aafb258caade5bbd46bf..c68b502af10af6b10e39b2cf858f391d31492e73 100644 --- a/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java +++ b/src/main/java/eu/siacs/conversations/services/ContactChooserTargetService.java @@ -1,5 +1,6 @@ package eu.siacs.conversations.services; +import android.annotation.SuppressLint; import android.annotation.TargetApi; import android.content.ComponentName; import android.content.Context; @@ -12,19 +13,23 @@ import android.os.Bundle; import android.os.IBinder; import android.service.chooser.ChooserTarget; import android.service.chooser.ChooserTargetService; +import android.util.Log; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import eu.siacs.conversations.Config; import eu.siacs.conversations.entities.Conversation; import eu.siacs.conversations.ui.ConversationsActivity; import eu.siacs.conversations.utils.Compatibility; +@SuppressLint("Deprecated") @TargetApi(Build.VERSION_CODES.M) public class ContactChooserTargetService extends ChooserTargetService implements ServiceConnection { private final Object lock = new Object(); - private final int MAX_TARGETS = 5; + private static final int MAX_TARGETS = 5; private XmppConnectionService mXmppConnectionService; private static boolean textOnly(IntentFilter filter) { @@ -37,10 +42,10 @@ public class ContactChooserTargetService extends ChooserTargetService implements } @Override - public List onGetChooserTargets(ComponentName targetActivityName, IntentFilter matchedFilter) { - final ArrayList chooserTargets = new ArrayList<>(); + public List onGetChooserTargets( + final ComponentName targetActivityName, final IntentFilter matchedFilter) { if (!EventReceiver.hasEnabledAccounts(this)) { - return chooserTargets; + return Collections.emptyList(); } final Intent intent = new Intent(this, XmppConnectionService.class); intent.setAction("contact_chooser"); @@ -48,37 +53,48 @@ public class ContactChooserTargetService extends ChooserTargetService implements bindService(intent, this, Context.BIND_AUTO_CREATE); try { waitForService(); - final ArrayList conversations = new ArrayList<>(); if (!mXmppConnectionService.areMessagesInitialized()) { - return chooserTargets; + return Collections.emptyList(); } - - mXmppConnectionService.populateWithOrderedConversations(conversations, textOnly(matchedFilter)); - final ComponentName componentName = new ComponentName(this, ConversationsActivity.class); + final ArrayList conversations = new ArrayList<>(); + mXmppConnectionService.populateWithOrderedConversations( + conversations, textOnly(matchedFilter)); + final ComponentName componentName = + new ComponentName(this, ConversationsActivity.class); final int pixel = AvatarService.getSystemUiAvatarSize(this); - for (Conversation conversation : conversations) { + final ArrayList chooserTargets = new ArrayList<>(); + for (final Conversation conversation : conversations) { if (conversation.sentMessagesCount() == 0) { continue; } final String name = conversation.getName().toString(); - final Icon icon = Icon.createWithBitmap(mXmppConnectionService.getAvatarService().get(conversation, pixel)); + final Icon icon = + Icon.createWithBitmap( + mXmppConnectionService.getAvatarService().get(conversation, pixel)); final float score = 1 - (1.0f / MAX_TARGETS) * chooserTargets.size(); final Bundle extras = new Bundle(); extras.putString(ConversationsActivity.EXTRA_CONVERSATION, conversation.getUuid()); chooserTargets.add(new ChooserTarget(name, icon, score, componentName, extras)); if (chooserTargets.size() >= MAX_TARGETS) { - break; + return chooserTargets; } } - } catch (InterruptedException e) { + return chooserTargets; + } catch (final InterruptedException e) { + Log.d( + Config.LOGTAG, + "Thread got interrupted before binding to XmppConnectionService", + e); + } finally { + unbindService(this); } - unbindService(this); - return chooserTargets; + return Collections.emptyList(); } @Override - public void onServiceConnected(ComponentName name, IBinder service) { - XmppConnectionService.XmppConnectionBinder binder = (XmppConnectionService.XmppConnectionBinder) service; + public void onServiceConnected(final ComponentName name, final IBinder service) { + XmppConnectionService.XmppConnectionBinder binder = + (XmppConnectionService.XmppConnectionBinder) service; mXmppConnectionService = binder.getService(); synchronized (this.lock) { lock.notifyAll(); diff --git a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java index 53a31e9e3a29855df5a544e228e7c152bb6f8930..0a04563393a11f2556cf3ea9c7d23d84d135227c 100644 --- a/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/RtpSessionActivity.java @@ -1443,8 +1443,8 @@ public class RtpSessionActivity extends XmppActivity @Override public void onAudioDeviceChanged( - AppRTCAudioManager.AudioDevice selectedAudioDevice, - Set availableAudioDevices) { + final AppRTCAudioManager.AudioDevice selectedAudioDevice, + final Set availableAudioDevices) { Log.d( Config.LOGTAG, "onAudioDeviceChanged in activity: selected:" @@ -1452,24 +1452,26 @@ public class RtpSessionActivity extends XmppActivity + ", available:" + availableAudioDevices); try { - if (getMedia().contains(Media.VIDEO)) { - Log.d(Config.LOGTAG, "nothing to do; in video mode"); - return; - } final RtpEndUserState endUserState = requireRtpConnection().getEndUserState(); - if (endUserState == RtpEndUserState.CONNECTED) { - final AppRTCAudioManager audioManager = requireRtpConnection().getAudioManager(); - updateInCallButtonConfigurationSpeaker( - audioManager.getSelectedAudioDevice(), - audioManager.getAudioDevices().size()); - } else if (END_CARD.contains(endUserState)) { + final Set media = getMedia(); + if (END_CARD.contains(endUserState)) { Log.d( Config.LOGTAG, "onAudioDeviceChanged() nothing to do because end card has been reached"); } else { + if (Media.audioOnly(media) && endUserState == RtpEndUserState.CONNECTED) { + final AppRTCAudioManager audioManager = + requireRtpConnection().getAudioManager(); + updateInCallButtonConfigurationSpeaker( + audioManager.getSelectedAudioDevice(), + audioManager.getAudioDevices().size()); + } + Log.d( + Config.LOGTAG, + "put proximity wake lock into proper state after device update"); putProximityWakeLockInProperState(selectedAudioDevice); } - } catch (IllegalStateException e) { + } catch (final IllegalStateException e) { Log.d(Config.LOGTAG, "RTP connection was not available when audio device changed"); } } diff --git a/src/main/java/eu/siacs/conversations/xml/Element.java b/src/main/java/eu/siacs/conversations/xml/Element.java index 2d2cb47f9628e40a677d0dfba5d8be1c038a8f8e..0b572a64318d191cff15d2e5a25ca234f97c233c 100644 --- a/src/main/java/eu/siacs/conversations/xml/Element.java +++ b/src/main/java/eu/siacs/conversations/xml/Element.java @@ -1,5 +1,8 @@ package eu.siacs.conversations.xml; +import com.google.common.base.Optional; +import com.google.common.primitives.Ints; + import org.jetbrains.annotations.NotNull; import java.util.ArrayList; @@ -190,6 +193,14 @@ public class Element implements Node { } } + public Optional getOptionalIntAttribute(final String name) { + final String value = getAttribute(name); + if (value == null) { + return Optional.absent(); + } + return Optional.fromNullable(Ints.tryParse(value)); + } + public Jid getAttributeAsJid(String name) { final String jid = this.getAttribute(name); if (jid != null && !jid.isEmpty()) { diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 64eff0b19a8241ffff6c9e364c69055df9d992d5..461aec80b033bc3a000e1593ce6e3b2c416cfc52 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -16,6 +16,7 @@ import android.util.SparseArray; import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import com.google.common.base.Optional; import com.google.common.base.Strings; import org.xmlpull.v1.XmlPullParserException; @@ -162,6 +163,7 @@ public class XmppConnection implements Runnable { private String streamId = null; private int stanzasReceived = 0; private int stanzasSent = 0; + private int stanzasSentBeforeAuthentication; private long lastPacketReceived = 0; private long lastPingSent = 0; private long lastConnect = 0; @@ -631,20 +633,21 @@ public class XmppConnection implements Runnable { } final Element ack = tagReader.readElement(nextTag); lastPacketReceived = SystemClock.elapsedRealtime(); - try { - final boolean acknowledgedMessages; - synchronized (this.mStanzaQueue) { - final int serverSequence = Integer.parseInt(ack.getAttribute("h")); - acknowledgedMessages = acknowledgeStanzaUpTo(serverSequence); - } - if (acknowledgedMessages) { - mXmppConnectionService.updateConversationUi(); + final boolean acknowledgedMessages; + synchronized (this.mStanzaQueue) { + final Optional serverSequence = ack.getOptionalIntAttribute("h"); + if (serverSequence.isPresent()) { + acknowledgedMessages = acknowledgeStanzaUpTo(serverSequence.get()); + } else { + acknowledgedMessages = false; + Log.d( + Config.LOGTAG, + account.getJid().asBareJid() + + ": server send ack without sequence number"); } - } catch (NumberFormatException | NullPointerException e) { - Log.d( - Config.LOGTAG, - account.getJid().asBareJid() - + ": server send ack without sequence number"); + } + if (acknowledgedMessages) { + mXmppConnectionService.updateConversationUi(); } } else if (nextTag.isStart("failed")) { final Element failed = tagReader.readElement(nextTag); @@ -758,10 +761,9 @@ public class XmppConnection implements Runnable { account.getJid().asBareJid() + ": jid changed during SASL 2.0. updating database"); } - final boolean nopStreamFeatures; final Element bound = success.findChild("bound", Namespace.BIND2); - final Element resumed = success.findChild("resumed", "urn:xmpp:sm:3"); - final Element failed = success.findChild("failed", "urn:xmpp:sm:3"); + final Element resumed = success.findChild("resumed", Namespace.STREAM_MANAGEMENT); + final Element failed = success.findChild("failed", Namespace.STREAM_MANAGEMENT); final Element tokenWrapper = success.findChild("token", Namespace.FAST); final String token = tokenWrapper == null ? null : tokenWrapper.getAttribute("token"); if (bound != null && resumed != null) { @@ -785,6 +787,7 @@ public class XmppConnection implements Runnable { final Element carbonsEnabled = bound.findChild("enabled", Namespace.CARBONS); final boolean waitForDisco; if (streamManagementEnabled != null) { + resetOutboundStanzaQueue(); processEnabled(streamManagementEnabled); waitForDisco = true; } else { @@ -811,8 +814,16 @@ public class XmppConnection implements Runnable { tokenMechanism = null; } if (tokenMechanism != null && !Strings.isNullOrEmpty(token)) { - this.account.setFastToken(tokenMechanism,token); - Log.d(Config.LOGTAG,account.getJid().asBareJid()+": storing hashed token "+tokenMechanism); + this.account.setFastToken(tokenMechanism, token); + Log.d( + Config.LOGTAG, + account.getJid().asBareJid() + ": storing hashed token " + tokenMechanism); + } else if (this.hashTokenRequest != null) { + Log.w( + Config.LOGTAG, + account.getJid().asBareJid() + + ": no response to our hashed token request " + + this.hashTokenRequest); } // a successful resume will not send stream features if (processNopStreamFeatures) { @@ -836,6 +847,37 @@ public class XmppConnection implements Runnable { } } + private void resetOutboundStanzaQueue() { + synchronized (this.mStanzaQueue) { + final List intermediateStanzas = new ArrayList<>(); + if (Config.EXTENDED_SM_LOGGING) { + Log.d( + Config.LOGTAG, + account.getJid().asBareJid() + + ": stanzas sent before auth: " + + this.stanzasSentBeforeAuthentication); + } + for (int i = this.stanzasSentBeforeAuthentication + 1; i <= this.stanzasSent; ++i) { + final AbstractAcknowledgeableStanza stanza = this.mStanzaQueue.get(i); + if (stanza != null) { + intermediateStanzas.add(stanza); + } + } + this.mStanzaQueue.clear(); + for (int i = 0; i < intermediateStanzas.size(); ++i) { + this.mStanzaQueue.put(i, intermediateStanzas.get(i)); + } + this.stanzasSent = intermediateStanzas.size(); + if (Config.EXTENDED_SM_LOGGING) { + Log.d( + Config.LOGTAG, + account.getJid().asBareJid() + + ": resetting outbound stanza queue to " + + this.stanzasSent); + } + } + } + private void processNopStreamFeatures() throws IOException { final Tag tag = tagReader.readTag(); if (tag != null && tag.isStart("features", Namespace.STREAMS)) { @@ -935,15 +977,11 @@ public class XmppConnection implements Runnable { this.isBound = true; this.tagWriter.writeStanzaAsync(new RequestPacket()); lastPacketReceived = SystemClock.elapsedRealtime(); - final String h = resumed.getAttribute("h"); - if (h == null) { - resetStreamId(); - throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER); - } + final Optional h = resumed.getOptionalIntAttribute("h"); final int serverCount; - try { - serverCount = Integer.parseInt(h); - } catch (final NumberFormatException e) { + if (h.isPresent()) { + serverCount = h.get(); + } else { resetStreamId(); throw new StateChangingException(Account.State.INCOMPATIBLE_SERVER); } @@ -992,28 +1030,22 @@ public class XmppConnection implements Runnable { } private void processFailed(final Element failed, final boolean sendBindRequest) { - final int serverCount; - try { - serverCount = Integer.parseInt(failed.getAttribute("h")); - } catch (final NumberFormatException | NullPointerException e) { - Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": resumption failed"); - resetStreamId(); - if (sendBindRequest) { - sendBindRequest(); + final Optional serverCount = failed.getOptionalIntAttribute("h"); + if (serverCount.isPresent()) { + Log.d( + Config.LOGTAG, + account.getJid().asBareJid() + + ": resumption failed but server acknowledged stanza #" + + serverCount.get()); + final boolean acknowledgedMessages; + synchronized (this.mStanzaQueue) { + acknowledgedMessages = acknowledgeStanzaUpTo(serverCount.get()); } - return; - } - Log.d( - Config.LOGTAG, - account.getJid().asBareJid() - + ": resumption failed but server acknowledged stanza #" - + serverCount); - final boolean acknowledgedMessages; - synchronized (this.mStanzaQueue) { - acknowledgedMessages = acknowledgeStanzaUpTo(serverCount); - } - if (acknowledgedMessages) { - mXmppConnectionService.updateConversationUi(); + if (acknowledgedMessages) { + mXmppConnectionService.updateConversationUi(); + } + } else { + Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": resumption failed"); } resetStreamId(); if (sendBindRequest) { @@ -1021,7 +1053,7 @@ public class XmppConnection implements Runnable { } } - private boolean acknowledgeStanzaUpTo(int serverCount) { + private boolean acknowledgeStanzaUpTo(final int serverCount) { if (serverCount > stanzasSent) { Log.e( Config.LOGTAG, @@ -1403,7 +1435,7 @@ public class XmppConnection implements Runnable { quickStartAvailable = false; } else if (version == SaslMechanism.Version.SASL_2) { final Element inline = authElement.findChild("inline", Namespace.SASL_2); - final boolean sm = inline != null && inline.hasChild("sm", "urn:xmpp:sm:3"); + final boolean sm = inline != null && inline.hasChild("sm", Namespace.STREAM_MANAGEMENT); final HashedToken.Mechanism hashTokenRequest; if (usingFast) { hashTokenRequest = null; @@ -1447,7 +1479,10 @@ public class XmppConnection implements Runnable { + "/" + this.saslMechanism.getMechanism()); authenticate.setAttribute("mechanism", this.saslMechanism.getMechanism()); - tagWriter.writeElement(authenticate); + synchronized (this.mStanzaQueue) { + this.stanzasSentBeforeAuthentication = this.stanzasSent; + tagWriter.writeElement(authenticate); + } } private static boolean isFastTokenAvailable(final Element authentication) { @@ -2174,7 +2209,10 @@ public class XmppConnection implements Runnable { generateAuthenticationRequest(quickStartMechanism.getClientFirstMessage(sslSocketOrNull(this.socket)), usingFast); authenticate.setAttribute("mechanism", quickStartMechanism.getMechanism()); sendStartStream(true, false); - tagWriter.writeElement(authenticate); + synchronized (this.mStanzaQueue) { + this.stanzasSentBeforeAuthentication = this.stanzasSent; + tagWriter.writeElement(authenticate); + } Log.d( Config.LOGTAG, account.getJid().toString() @@ -2270,6 +2308,9 @@ public class XmppConnection implements Runnable { } ++stanzasSent; + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG, account.getJid().asBareJid()+": counting outbound "+packet.getName()+" as #" + stanzasSent); + } this.mStanzaQueue.append(stanzasSent, stanza); if (stanza instanceof MessagePacket && stanza.getId() != null && inSmacksSession) { if (Config.EXTENDED_SM_LOGGING) { @@ -2666,7 +2707,7 @@ public class XmppConnection implements Runnable { public boolean sm() { return streamId != null || (connection.streamFeatures != null - && connection.streamFeatures.hasChild("sm")); + && connection.streamFeatures.hasChild("sm", Namespace.STREAM_MANAGEMENT)); } public boolean csi() { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java index e9160e6b0da32856bb473665d78683729f327d3f..693429a1163c962ae88ec9ed4ea68361b3597f7a 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleRtpConnection.java @@ -2643,6 +2643,12 @@ public class JingleRtpConnection extends AbstractJingleConnection + ": skipping invalid combination of udp/tls in external services"); continue; } + // TODO Starting on milestone 110, Chromium will perform + // stricter validation of TURN and STUN URLs passed to the + // constructor of an RTCPeerConnection. More specifically, + // STUN URLs will not support a query section, and TURN URLs + // will support only a transport parameter in their query + // section. final PeerConnection.IceServer.Builder iceServerBuilder = PeerConnection.IceServer.builder( String.format( diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/VideoSourceWrapper.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/VideoSourceWrapper.java index b837131e88a2d7f28dc15527b4a4e7ab26af26e7..c1ff24521f83a78b68361fa68fbb2618aaf2c9ab 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/VideoSourceWrapper.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/VideoSourceWrapper.java @@ -87,7 +87,15 @@ class VideoSourceWrapper { public void dispose() { this.cameraVideoCapturer.dispose(); if (this.videoSource != null) { - this.videoSource.dispose(); + dispose(this.videoSource); + } + } + + private static void dispose(final VideoSource videoSource) { + try { + videoSource.dispose(); + } catch (final IllegalStateException e) { + Log.e(Config.LOGTAG, "unable to dispose video source", e); } } diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java index 9c3d45b4b94aeb4966cc4da4f62b3970d3dd463f..58314e0fcfeeef15d47c0100612896a55a3dfd8d 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/WebRTCWrapper.java @@ -456,9 +456,14 @@ public class WebRTCWrapper { public void setIsReadyToReceiveIceCandidates(final boolean ready) { readyToReceivedIceCandidates.set(ready); + final int was = iceCandidates.size(); while (ready && iceCandidates.peek() != null) { eventCallback.onIceCandidate(iceCandidates.poll()); } + final int is = iceCandidates.size(); + Log.d( + EXTENDED_LOGGING_TAG, + "setIsReadyToReceiveCandidates(" + ready + ") was=" + was + " is=" + is); } synchronized void close() { @@ -478,6 +483,7 @@ public class WebRTCWrapper { this.localVideoTrack = null; this.remoteVideoTrack = null; if (videoSourceWrapper != null) { + this.videoSourceWrapper = null; try { videoSourceWrapper.stopCapture(); } catch (final InterruptedException e) { @@ -694,7 +700,11 @@ public class WebRTCWrapper { } public PeerConnection.SignalingState getSignalingState() { - return requirePeerConnection().signalingState(); + try { + return requirePeerConnection().signalingState(); + } catch (final IllegalStateException e) { + return PeerConnection.SignalingState.CLOSED; + } } EglBase.Context getEglBaseContext() { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java index 96251529314ab791cc4b1d8a7caffd50881eb14c..061cea752cd280c23051c92bbf3d11a96ffa315b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/stanzas/Content.java @@ -64,7 +64,9 @@ public class Content extends Element { return null; } final String namespace = description.getNamespace(); - if (Namespace.JINGLE_APPS_RTP.equals(namespace)) { + if (FileTransferDescription.NAMESPACES.contains(namespace)) { + return FileTransferDescription.upgrade(description); + } else if (Namespace.JINGLE_APPS_RTP.equals(namespace)) { return RtpDescription.upgrade(description); } else { return GenericDescription.upgrade(description); @@ -84,7 +86,11 @@ public class Content extends Element { public GenericTransportInfo getTransport() { final Element transport = this.findChild("transport"); final String namespace = transport == null ? null : transport.getNamespace(); - if (Namespace.JINGLE_TRANSPORT_ICE_UDP.equals(namespace)) { + if (Namespace.JINGLE_TRANSPORTS_IBB.equals(namespace)) { + return IbbTransportInfo.upgrade(transport); + } else if (Namespace.JINGLE_TRANSPORTS_S5B.equals(namespace)) { + return S5BTransportInfo.upgrade(transport); + } else if (Namespace.JINGLE_TRANSPORT_ICE_UDP.equals(namespace)) { return IceUdpTransportInfo.upgrade(transport); } else if (transport != null) { return GenericTransportInfo.upgrade(transport); @@ -93,6 +99,7 @@ public class Content extends Element { } } + public void setTransport(GenericTransportInfo transportInfo) { this.addChild(transportInfo); } diff --git a/src/main/res/values-ca-rES/strings.xml b/src/main/res/values-ca-rES/strings.xml deleted file mode 100644 index c757504ac22ffabf690af242fcb45db770882057..0000000000000000000000000000000000000000 --- a/src/main/res/values-ca-rES/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/main/res/values-da-rDK/strings.xml b/src/main/res/values-da-rDK/strings.xml index d425b035499905bdc4c681d1763381d097946638..990feea2356859d3c5e1d7bcf742db9daaefaace 100644 --- a/src/main/res/values-da-rDK/strings.xml +++ b/src/main/res/values-da-rDK/strings.xml @@ -170,6 +170,7 @@ Domæne kan ikke verificeres Brud på retningslinjer Inkompatibel server + Inkompatibel klient Strømfejl Fejl ved streamåbning TLS @@ -765,6 +766,7 @@ Beskeder Indkommende opkald Udgående opkald + Mistet opkald Lydløse beskeder Denne notifikationsgruppe bruges til at vise notifikationer, der ikke bør udløse nogen lyd. For eksempel når du er aktiv på en anden enhed (Fredningsperiode). Mislykkede leverancer @@ -905,6 +907,8 @@ Lav opkald Indkommende opkald Indkommende videoopkald + Skift til videoopkald + Tilføje yderligere spor? Forbinder Forbundet Forbinder igen @@ -932,6 +936,18 @@ Udgående opkald Udgående opkald · %s Mistet opkald + + %1$d mistet opkald fra %2$s + %1$d mistet opkald fra %2$s + + + %d mistet opkald + %d mistet opkald + + + %1$d mistet opkald fra %2$d kontakt + %1$d mistet opkald fra %2$d kontakter + Lydopkald Videoopkald Hjælp @@ -978,4 +994,8 @@ Ingen XMPP-adresse fundet Midlertidig godkendelsesfejl Slet avatar - + Opkald er deaktiveret ved brug af Tor + Skift til video + Afvis skift til video anmodning + + diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 517cbd0ae1836fdd9089297de89d242f6dca1297..ea1fbae833e02bf1b8e674f37118ed8d8071aff3 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -31,10 +31,7 @@ vor %d Minuten %d ungelesene Unterhaltung - - %d ungelesene Unterhaltungen - senden… Nachricht wird entschlüsselt. Bitte warten… @@ -89,7 +86,9 @@ Unterhaltungsverlauf löschen Möchtest du alle Nachrichten in dieser Unterhaltung löschen?\n\nAchtung: Dies beeinflusst nicht Nachrichten, die auf anderen Geräten oder Servern gespeichert sind. Datei löschen - Bist du sicher, dass du diese Datei löschen möchtest?\n\nAchtung: Dies löscht keine Kopien dieser Datei, die auf anderen Geräten oder Servern gespeichert sind. + Bist du sicher, dass du diese Datei löschen möchtest\? +\n +\nAchtung: Dies löscht keine Kopien dieser Datei, die auf anderen Geräten oder Servern gespeichert sind. Diese Unterhaltung danach beenden Gerät auswählen Unverschlüsselt schreiben… @@ -194,7 +193,7 @@ Passwort Ungültige XMPP-Adresse Zu wenig Speicher vorhanden. Bild ist zu groß - %s zum Telefonbuch hinzufügen + Möchtest du %s in dein Telefonbuch hinzufügen\? Server-Info XEP-0313: MAM XEP-0280: Message Carbons @@ -262,7 +261,7 @@ Veröffentlichen Profilbild antippen, um ein Bild aus der Galerie auszuwählen Veröffentliche… - Der Server hat die Veröffentlichung des Avatars abgelehnt. + Server hat die Veröffentlichung des Profilbildes abgelehnt Bild konnte nicht konvertiert werden Profilbild kann nicht gespeichert werden (Oder klicke lange, um den Standard wiederherzustellen) @@ -282,7 +281,9 @@ Bitte zuerst den Online-Status von deinem Kontakt anfragen.\n\nDies wird verwendet, um festzustellen, welche Chat-App dein Kontakt nutzt. Jetzt anfordern Ignorieren - Achtung: Ohne gegenseitige Kenntnis des Online-Status kann es zu unerwarteten Problemen kommen.\n\nGehe zu \"Kontaktdetails\", um die Einstellungen zu überprüfen. + Achtung: Ohne gegenseitige Kenntnis des Online-Status kann es zu unerwarteten Problemen kommen. +\n +\nGehe zu \"Kontaktdetails\", um deine Einstellungen zu überprüfen. Sicherheit Nachrichtenkorrektur erlauben Erlaube deinen Kontakten das nachträgliche Korrigieren ihrer Nachrichten @@ -429,7 +430,7 @@ Offline verstecken %s schreibt… %s schreibt nicht mehr - %s schreiben... + %s schreiben… %s schreiben nicht mehr Tipp-Benachrichtigung Informiere deine Kontakte, wenn du eine Nachricht schreibst @@ -734,7 +735,7 @@ Standort anzeigen Teilen Aufnahme konnte nicht gestartet werden - Bitte warten... + Bitte warten… %1$s den Zugriff auf das Mikrofon gewähren Nachrichten durchsuchen GIF @@ -807,8 +808,8 @@ Bist du sicher, dass du den Registrierungsprozess abbrechen willst? Ja Nein - Überprüfen... - SMS anfordern... + Überprüfen… + SMS anfordern… Die eingegebene PIN ist falsch. Die von uns zugesandte PIN ist abgelaufen. Unbekannter Netzwerkfehler. @@ -837,7 +838,7 @@ Dieser Channel wird deine XMPP-Adresse veröffentlichen E-Book Original (unkomprimiert) - Öffnen mit... + Öffnen mit… Conversations Profilbild Konto auswählen Sicherung wiederherstellen @@ -857,7 +858,7 @@ Bitte einen Namen für den Channel eingeben Bitte eine XMPP-Adresse eingeben Dies ist eine XMPP-Adresse. Bitte einen Namen eingeben. - Öffentlichen Channel erstellen... + Öffentlichen Channel erstellen… Dieser Channel existiert bereits Du bist einem bestehenden Channel beigetreten Channeleinstellung konnte nicht gespeichert werden @@ -894,7 +895,7 @@ Dieses Konto wurde bereits eingerichtet Bitte gib das Passwort für dieses Konto ein Diese Aktion konnte nicht durchgeführt werden - Öffentlichen Channel beitreten... + Öffentlichen Channel beitreten… Die teilende App hat keine Berechtigung für den Zugriff auf diese Datei erteilt. jabber.network @@ -997,5 +998,4 @@ Anrufe sind bei der Verwendung von Tor deaktiviert Umschalten auf Video Umschalten auf Video ablehnen - - + \ No newline at end of file diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index a84556c1fdfd0c429e9d908f6d4647c0523ac206..b0398ec9dc888f6abfb3221dfa5ab482006614ac 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -31,16 +31,11 @@ hace %d min %d conversación sin leer - - %dconversaciones sin leer - - %dconversaciones sin leer - enviando… - Descifrando mensaje. Por favor, espera... + Descifrando el mensaje. Espere por favor… Mensaje cifrado con OpenPGP El apodo ya está en uso Apodo inválido @@ -59,7 +54,7 @@ ¿Quieres eliminar %s de tus marcadores? Las conversaciones con este marcador no serán eliminadas. Registrar nueva cuenta en servidor Cambiar contraseña en servidor - Compartir con... + Compartir con… Comenzar conversación Invitar a contacto Invitar @@ -87,12 +82,14 @@ Error al enviar Preparando para enviar imagen Preparando para enviar imágenes - Compartiendo ficheros. Por favor, espera... + Compartiendo el archivo, por favor espere… Limpiar historial Limpiar historial de conversación ¿Quieres borrar todos los mensajes de esta conversación?\n\nAviso: Esto no afectará a los mensajes guardados en otros dispositivos o servidores. Eliminar fichero - ¿Estás seguro de que quieres borrar este fichero?\n\nAviso:Esto no borrará las copias de este fichero almacenado en otros dispositivos o servidores. + ¿Está seguro de que desea eliminar este archivo\? +\n +\nAdvertencia: Esto no eliminará las copias de este archivo almacenadas en otros dispositivos o servidores. Cerrar esta conversación después Seleccionar dispositivo Enviar mensaje sin cifrar @@ -129,10 +126,10 @@ Sonido de notificación para nuevos mensajes Tono para las nuevas llamadas Periodo de gracia - El periodo de tiempo en el que las notificaciones están silenciadas tras detectar actividad en otro de tus dispositivos. + Después de que se detecte actividad en otros dispositivos, las notificaciones se silenciarán durante este período de tiempo. Avanzado Nunca informar de errores - Al enviar las trazas de error estás ayudando en el desarrollo + Estará ayudando al desarrollo si elige enviar un informe de error Confirmar mensajes Permitir a tus contactos saber cuando has recibido y leído sus mensajes Impedir capturas de pantalla @@ -154,8 +151,10 @@ No se pudo comprimir el archivo de imagen Archivo no encontrado Error general. ¿Es posible que no tengas espacio en disco? - La aplicación usaste para seleccionar esta imagen no proporcionó suficientes permisos para leer el archivo.\n\nUtiliza un explorador de archivos diferente para seleccionar la imagen - La aplicación que has utilizado para compartir este archivo no presentó permisos suficientes + La aplicación que utilizó para seleccionar la imagen no tiene los permisos necesarios para ver la imagen. +\n +\nUse otro administrador de archivos para seleccionar una imagen. + La aplicación que utilizó para compartir este archivo no tiene suficientes permisos. Desconocido Deshabilitado temporalmente Conectado @@ -171,7 +170,7 @@ Token de registro inválido Error de negociación TLS Dominio no verificable - Policy violation + Violación de los términos Servidor incompatible Cliente incompatible Error de flujo @@ -221,14 +220,14 @@ Visto última vez hace %d días Mensaje cifrado. Por favor instala OpenKeychain para descifrarlo. Encontrado un nuevo mensaje cifrado con OpenPGP - OpenPGP Key ID + Identificador de la clave OpenPGP Huella digital OMEMO Huella digital v\\OMEMO Huella digital OMEMO (origen del mensaje) Huella digital v\\OMEMO (origen del mensaje) Otros dispositivos Huellas digitales OMEMO de confianza - Buscando claves... + Descargando claves… Hecho Descifrar Marcadores @@ -254,7 +253,7 @@ No se ha podido destruir el canal Editar asunto de la conversación Asunto - Uniéndose a conversación... + Uniéndose a un chat de grupo… Salir El contacto te ha añadido a su lista de contactos Añadir contacto @@ -307,7 +306,7 @@ Has sido expulsado de esta conversación La conversación en grupo ha sido cerrada Ya no estás dentro de esta conversación en grupo - Has dejado esta conversación en grupo debido a razones técnicas. + Abandonaste esta conversación de grupo por motivos técnicos Usando cuenta %s alojado en %s Comprobando %s en servidor HTTP @@ -339,7 +338,7 @@ Los ficheros de respaldo han sido almacenados en %s Restaurando copia de respaldo Tu copia de respaldo ha sido restaurada - No olvides habilitar esta cuenta + No olvides activar la cuenta. Seleccionar archivo Recibiendo %1$s (%2$d%% completado) Descargar %s @@ -430,9 +429,9 @@ Enviando %s Ofreciendo %s Ocultar desconectados - %s está escribiendo... + %s está escribiendo… %s ha dejado de escribir - %s están escribiendo... + %s están escribiendo… %s han dejado de escribir Notificación de escritura Permitir a tus contactos saber cuando estás escribiendo un mensaje @@ -473,7 +472,7 @@ Error al descargar: No se ha podido conectar con el servidor Falló la descarga: No se puede escribir el fichero Error al descargar: Archivo no válido - Red Tor no disponible. + La red Tor no está disponible Fallo de enlace El servidor no es responsable de este dominio Error @@ -491,7 +490,7 @@ No se ha podido leer el certificado Preferencias de archivado Preferencias de archivado en servidor - Buscando preferencias de archivado. Por favor, espera... + Recuperando la configuración del archivo. Espere por favor… No se ha podido conseguir las preferencias de archivado Captcha requerido Introduce el texto de la imagen de arriba @@ -506,7 +505,7 @@ Todas las conexiones se realizan a través de la red TOR. Requiere Orbot Hostname Puerto - Server- or .onion-address + Dirección del servidor o .onion Éste no es un número de puerto válido Éste no es un hostame válido %1$d de %2$d cuentas conectadas @@ -546,10 +545,11 @@ Has deshabilitado esta cuenta Error de seguridad: ¡Acceso a archivo inválido! No se ha encontrado ninguna aplicación para compartir la URI - Compartir URI con... -
El registro se realiza con tu número de teléfono y Quicksy automáticamente—basado en los teléfonos de tu agenda de contactos—te sugerirá posibles contactos.

Registrándote en Quicksy aceptas nuestra política de privacidad.]]>
+ Compartir URI con… + Quicksy es un derivado del popular cliente XMPP Conversations con detección automática de contactos.<br><br>El registro se realiza con tu número de teléfono y Quicksy automáticamente—basado en los teléfonos de tu agenda de contactos—te sugerirá posibles contactos.<br><br>Registrándote en Quicksy aceptas nuestra <a href=https://quicksy.im/#privacy>política de privacidad</a>. Aceptar y continuar - Una guía te ayudará en el proceso de creación de la cuenta en conversations.im.¹\nCuando selecciones conversations.im como proveedor podrás comunicarte con usuarios de otros servidores proporcionándoles tu dirección XMPP completa. + Una guía te ayudará en el proceso de creación de la cuenta en conversations.im.¹ +\nCuando selecciones conversations.im como proveedor podrás comunicarte con usuarios de otros servidores proporcionándoles tu dirección XMPP completa. Tu dirección XMPP completa será: %s Crear cuenta Usar otro proveedor de mi elección @@ -567,7 +567,7 @@ El registro falló. Prueba de nuevo más tarde Error en el registro: La contraseña es demasiado débil Elige a los participantes - Creando conversación en grupo... + Creando un chat de grupo… Invitar de nuevo Deshabilitar Corto @@ -585,7 +585,7 @@ Este dispositivo ya no está en uso Ordenador Teléfono móvil - Tablet + Tableta Navegador Consola Pago requerido @@ -597,11 +597,11 @@ Servidor no encontrado Tiempo de espera agotado al servidor remoto No se ha podido actualizar la cuenta - Reportar a esta dirección XMPP por enviar mensajes no deseados + Reporta esta dirección XMPP como spam. Eliminar identidades OMEMO Regenerar tus clave OMEMO. Todos tus contactos tendrán que verificarte de nuevo. Usa esta opción como último recurso. Eliminar claves seleccionadas - Debes estar conectado para publicar la imagen de perfil + Necesitas estar conectado para publicar un avatar. Mostrar mensaje de error Mensaje de error Optimización de datos habilitado @@ -628,7 +628,7 @@ Limpiar datos privados Limpiar datos privados de ficheros descargados (Pueden volver a descargarse desde el servidor) Enlace desde una fuente de confianza - Vas a verificar las claves OMEMO de %1$s después de hacer click en el enlace. Esto solo es seguro si conseguiste este enlace desde una fuente de confianza donde solo %2$s pudo haber publicado el enlace + Está a punto de verificar las claves OMEMO de %1$s después de hacer clic en un enlace. Esto solo es seguro si siguió este enlace desde una fuente confiable donde solo %2$s podría haber publicado este enlace. Está a punto de verificar las claves OMEMO de su propia cuenta. Esto solamente es seguro si ha seguido este enlace desde una fuente segura, donde solo usted lo haya publicado. Continuar Verificar claves OMEMO @@ -681,7 +681,7 @@ Conectado ahora mismo Reintentar descifrado Fallo de sesión - Downgraded SASL mechanism + Mecanismo SASL degradado El servidor requiere registro en su página web Abrir página web No se ha encontrado aplicación para abrir el sitio web @@ -699,7 +699,7 @@ Mensaje Los mensajes privados están deshabilitados Aplicaciones protegidas - Para seguir recibiendo notificaciones, incluso cuando la pantalla está apagada, necesitas añadir Conversations a la lista de aplicaciones protegidas. + Para recibir notificaciones de mensajes incluso cuando la pantalla está apagada, debe agregar Conversations a la lista de aplicaciones protegidas. ¿Aceptar certificado desconocido? El certificado del servidor no está firmado por una Autoridad Certificadora conocida. ¿Aceptar nombre del servidor no coincidente? @@ -745,7 +745,7 @@ Mostrar ubicación Compartir No se ha podido empezar la grabación - Por favor, espera... + Espere por favor… Permitir a %1$s acceder al micrófono Buscar mensajes GIF @@ -788,7 +788,7 @@ Ver galería Participantes Galería - Fichero omitido por violación de seguridad + El archivo se omitió debido a una violación de seguridad. Calidad del video Calidad más baja indica archivos más pequeños Medio (360p) @@ -818,8 +818,8 @@ ¿Estás seguro de que quieres abortar el proceso de registro? No - Verificando... - Solicitando mensaje SMS... + Verificando… + Solicitando un mensaje de texto… El código que has introducido no es correcto. El código que te hemos enviado ha expirado. Error desconocido de red. @@ -848,8 +848,8 @@ Este canal hará tu dirección XMPP visible públicamente e-book Original (sin comprimir) - Abrir con... - Foto de perfil en Conversations + Abrir con… + Establecer la foto del perfil Elige una cuenta Restaurar copia de respaldo Restaurar @@ -867,14 +867,14 @@ Dirección XMPP Por favor, proporciona un nombre para el canal Por favor, proporciona una dirección XMPP - Esto es una dirección XMPP. Por favor, proporciona un nombre - Creando canal público... + Esta es una dirección XMPP. Introduce un nombre. + Creando un canal público… Esta canal ya existe Te has unido a un canal existente No se ha podido guardar la configuración del canal Permitir a cualquiera editar el asunto Permitir a cualquiera invitar a otros contactos - Todos pueden editar el asunto + Cualquiera puede editar el tema. Los propietarios pueden editar el asunto. Los administradores pueden editar el asunto. Los propietarios pueden invitar a otros contactos. @@ -905,7 +905,7 @@ Esta cuenta ya fue configurada Por favor ingrese la contraseña para esta cuenta No se ha podido realizar esta acción - Unirse a canal público... + Uniéndose a un canal público… La aplicación de compartir no concedió permisos para acceder a este fichero. jabber.network @@ -918,6 +918,8 @@ Hacer una llamada Llamada entrante Videollamada entrante + ¿Cambiar a videollamada? + ¿Añadir pistas adicionales? Conectando Conectado Reconectando @@ -965,7 +967,7 @@ Ayuda Cambiar a conversación Tu micrófono no está disponible - Solo puedes hacer una llamada a la vez + Solo se puede hacer una llamada a la vez. Volver a la llamada en curso No se ha podido cambiar de cámara Fijar en la parte superior @@ -1009,4 +1011,6 @@ Fallo temporal de autenticación Eliminar imagen de perfil Las llamadas están deshabilitadas cuando se usa Tor - + Cambiar a vídeo + Rechazar petición de cambiar a vídeo + \ No newline at end of file diff --git a/src/main/res/values-fa/strings.xml b/src/main/res/values-fa/strings.xml deleted file mode 100644 index c757504ac22ffabf690af242fcb45db770882057..0000000000000000000000000000000000000000 --- a/src/main/res/values-fa/strings.xml +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/src/main/res/values-gl/strings.xml b/src/main/res/values-gl/strings.xml index dd5cb3508d84c574af27224a084dfda5492d8b47..77df6a8e0558c2c67a3ba20ee070db040b344bd5 100644 --- a/src/main/res/values-gl/strings.xml +++ b/src/main/res/values-gl/strings.xml @@ -31,13 +31,10 @@ hai %d minutos %d conversa sen ler - - %d conversas sen ler - enviando… - Descifrando a mensaxe. Agarda por favor... + Descifrando a mensaxe. Agarda por favor… Mensaxe cifrado con OpenPGP O alcume xa está en uso Alcume non válido @@ -56,7 +53,7 @@ Desexas eliminar o marcador %s? As conversas deste marcador non se eliminarán. Rexistrar nova conta no servidor Cambiar o contrasinal no servidor - Compartir con + Compartir con… Comezar conversa Convidar contacto Convidar @@ -84,12 +81,16 @@ Erro ao enviar Preparándose para enviar a imaxe Preparándose para enviar imaxes - Compartindo ficheiros. Agarda por favor... + Compartindo ficheiros. Agarda… Baleirar historial Eliminar historial da conversa - ¿Queres eliminar as mensaxes desta conversa?\n\nAviso: Esto non lle afecta as mensaxes gardadas noutros dispositivos ou servidores. + ¿Queres eliminar tódalas mensaxes desta conversa\? +\n +\nAviso: Esto non lle afecta ás mensaxes gardadas noutros dispositivos ou servidores. Eliminar ficheiro - Tes a certeza de querer eliminar este ficheiro?\n\nAviso: Esto non eliminará as copias de este ficheiro que están gardadas noutros dispositivos ou servidores. + Tes a certeza de querer eliminar este ficheiro\? +\n +\nAviso: Esto non eliminará as copias de este ficheiro que están gardadas noutros dispositivos ou servidores. Pechar a conversa tras baleirar Escoller dispositivo Enviar mensaxe non cifrada @@ -107,7 +108,7 @@ Instalar Instala OpenKeychain por favor ofrecendo… - agardando... + agardando… Clave OpenPGP non atopada Non se cifrou a mensaxe porque o contacto non está publicando a súa chave pública.\n\nPídelle ao contacto que configure OpenPGP. Non se atoparon chaves OpenPGP @@ -126,7 +127,7 @@ Son da notificación para novas mensaxes Ton para as chamadas entrantes Período de graza - O tempo no que as notificacións son silenciadas tras detectar actividade en algún dos teus outros dispositivos. + O tempo no que as notificacións son silenciadas tras detectar actividade nalgún dos teus outros dispositivos. Avanzado Nunca enviar informe de erros Ao enviar trazas do sistema estás axudando ao desenvolvemento @@ -151,7 +152,9 @@ Non se puido converter o ficheiro de imaxe Arquivo non atopado Erro xeral de I/O. ¿Quedaches sen espazo no disco? - A app utilizada para seleccionar esta imaxe non deu permisos suficientes para ler o ficheiro.\n\nUsa un xestor de ficheiros diferente para escoller a imaxe + A app utilizada para seleccionar esta imaxe non deu permisos suficientes para ler o ficheiro. +\n +\nUsa un xestor de ficheiros diferente para escoller a imaxe. A app que usaches para compartir este ficheiro non concedeu os permisos suficientes. Descoñecido Desactivado temporalmente @@ -225,7 +228,7 @@ v\\Impresión dixital OMEMO (orixe da mensaxe) Outros dispositivos Confiar en impresións dixitais OMEMO - Obtendo chaves... + Obtendo chaves… Feito Descifrar Marcadores @@ -251,7 +254,7 @@ Non se puido eliminar a canle Editar o tema da conversa en grupo Asunto - Entrando na conversa en grupo + Entrando na conversa en grupo… Saír Contacto engadido a túa lista de contactos Volver a engadir @@ -261,7 +264,7 @@ Todas leron até aquí Publicar Toca no avatar para elixir a imaxe na galería - Publicando... + Publicando… O servidor rexeitou a túa publicación Non se puido converter a imaxe Non se puido salvar o avatar no disco @@ -368,7 +371,7 @@ Algo saíu mal Obtendo historial desde o servidor Non hai máis historial no servidor - Actualizando.... + Actualizando… Mudou o contrasinal! Non puido mudar o contrasinal Cambiar contrasinal @@ -423,13 +426,13 @@ documento PDF App Android Contacto - Publicouse o avatar + Publicouse o avatar! Enviando %s Ofrecendo %s Ocultar fora de liña - %s está a escribir... + %s está escribindo… %s deixou de escribir - %s están escribindo... + %s están escribindo… %s deixaron de escribir Notificacións de escritura Permitelle aos teus contactos que saiban cando lles estás a escribir @@ -487,7 +490,7 @@ Non se puido procesar o certificado Gardando axustes Axustes de gardado no servidor - Obtendo os axustes de gardado. Por favor agarde... + Obtendo os axustes de gardado. Agarda… Non se obtiveron os axustes gardados Requírese o CAPTCHA Introduza o texto da imaxe superior @@ -541,7 +544,7 @@ Desactivou esta conta Fallo de seguridade: Acceso non válido ao ficheiro! Non se atopou unha app para compartir URI - Compartir URI con... + Compartir URI con…
Podes rexistrarte co teu número de teléfono e Quicksy suxerirache automáticamente —tomando os números da túa libreta de enderezos como referencia— posibles contactos para ti.

Ao rexistrarte aceptas a nosa política de privacidade.]]>
Aceptar e continuar Tes unha guía para crear unha conta en conversations.im¹\nAo escoller conversations.im como provedor poderás comunicarte con outras usuarias de outros provedores con só darlles o teu enderezo XMPP completo. @@ -562,7 +565,7 @@ Fallo no rexistro: inténteo de novo Fallo no rexistro: contrasinal moi feble Escoller participantes - Creando unha conversa en grupo... + Creando conversa en grupo… Convidar de novo Desactivar Breve @@ -595,7 +598,7 @@ Denuncia esta conta XMPP por facer spam. Borrar identidades OMEMO Rexenerar chaves OMEMO. Todos os teus contactos terán que verificar a túa conta de novo. Utiliza esto só como último recurso. - Eliminar as chaves seleccionadas. + Eliminar as chaves seleccionadas Debes ter conexión para publicar o teu avatar. Mostrar mensaxe do fallo Mensaxe de fallo @@ -632,7 +635,7 @@ Retirar confianza a dispositivo Tes a certeza de que queres eliminar a verificación deste dispositivo?\nEste dispositivo e as súas mensaxes serán marcados como \"Non confiable\". - %d segundos + %d segundo %d segundos @@ -640,7 +643,7 @@ %d minutos - %d horas + %d hora %d horas @@ -652,8 +655,8 @@ %d semanas - %dmeses - %dmeses + %d mes + %d meses Borrado automático de mensaxes Borrar mensaxes de xeito automático de este dispositivo que anteriores ao marco temporal configurado. @@ -670,7 +673,7 @@ En liña neste momento Volver a intentar o descifrado Fallo na sesión - Downgraded SASL mechanism + Mecanismo SASL desactualizado O servidor require rexistro no sitio web Abrir sitio web Non se atopou app para abrir sitio web @@ -688,15 +691,15 @@ Mensaxe As mensaxes privadas están desactivadas Apps protexidos - Para seguir recibindo notificacións, incluso cando a pantalla está apagada, precisa engadir Conversations a lista de apps protexidos. + Para seguir recibindo notificacións, incluso cando a pantalla está apagada, tes que engadir Conversations á lista de apps protexidas. ¿Aceptar certificado descoñecido? O certificado do servidor non está asinado por unha autoridade de certificación coñecida. ¿Aceptar un nome de servidor que non coincida? - O servidor non pode autenticarse como \"%s\". O certificado só é válido para: + O servidor non pode autenticarse como \"%s\". O certificado só é válido para: Queres conectarte de todos os xeitos? Detalles do certificado: Unha vez - O escaner de código QR necesita acceso á cámara. + O escaner de código QR necesita acceso á cámara Desprazarse ata a parte inferior Desprazarse cara abaixo logo de enviar unha mensaxe Editar a Mensaxe de Estado @@ -706,7 +709,8 @@ Non se obtivo a lista de dispositivos Non se obtiveron as chaves de cifrado Suxestión: Nalgúns casos, isto pode solucionarse engadíndovos mutuamente as vosas listas de contactos. - ¿Tes a certeza de que queres desactivar o cifrado OMEMO para esta conversa? Isto permitirá que o administrador do teu servidor lea as túas mensaxes, pero pode ser a única forma de comunicarse con persoas que usan clientes obsoletos. + Tes a certeza de querer desactivar o cifrado OMEMO para esta conversa\? +\nIsto permitirá á administración do teu servidor ler as túas mensaxes, pero pode ser a única forma de comunicarse con persoas que usan clientes obsoletos. Desactivar agora Borrador: Cifrado OMEMO @@ -721,8 +725,8 @@ Pequena Mediana Grande - A mensaxe non foi encriptada para este disposivivo - Fallo ao descifrar a mensaxe OMEMO + A mensaxe non foi cifrada para este disposivivo. + Fallo ao descifrar a mensaxe OMEMO. desfacer Compartir Localización está desactivado Fixar posición @@ -734,7 +738,7 @@ Mostrar localización Compartir Non comezou a gravación - Por favor, agarde... + Por favor, agarda… Permitir que %1$s acceda ao micrófono Buscar mensaxes GIF @@ -789,7 +793,7 @@ Indica un país número de teléfono Valida o teu número de teléfono - Quicksy vaiche enviar unha mensaxe SMS (podería ter custos) para validar o teu número de teléfono. Escribe o código de país e número de teléfono. + Quicksy vaiche enviar unha mensaxe SMS (podería ter custos) para validar o teu número de teléfono. Escribe o código de país e número de teléfono:
%s

É correcto, ou quere modificar o número?]]>
%s non é un número de teléfono válido. Por favor escribe o teu número de teléfono. @@ -807,8 +811,8 @@ Seguro que quere cancelar o proceso de rexistro? Si Non - Validando... - Solicitando SMS... + Validando… + Solicitando SMS… O pin introducido non é correcto. O pin que che enviamos caducou. Fallo descoñecido na rede. @@ -837,7 +841,7 @@ Esta canle fará público o teu enderezo XMPP e-book Orixinal (non comprimido) - Abrir con... + Abrir con… Imaxe de perfil en Conversations Elixir conta Restablecer copia de apoio @@ -857,7 +861,7 @@ Por favor, escribe un nome para a canle Por favor, escribe un enderezo XMPP Esto é un enderezo XMPP. Por favor, escribe un nome. - Creando canle pública... + Creando canle pública… Esta canle xa existe Entraches nunha canle existente Non se gardaron os axustes da canle @@ -894,7 +898,7 @@ Esta conta xa foi configurada Introduza o contrasinal de esta conta Non se puido completar a acción - Unirse a canle pública... + Unirse a canle pública… A aplicación que comparte non proporciona permiso para acceder ao ficheiro. jabber.network @@ -971,7 +975,7 @@ Gravar correo de voz Reproducir audio Pausar audio - Engade un contacto, crea o únete a unha conversa en grupo ou descubre canles. + Engade un contacto, crea o únete a unha conversa en grupo ou descubre canles Ver %1$d Participante Ver %1$d Participantes @@ -997,5 +1001,4 @@ As chamadas están desactivadas cando usas Tor Cambiar a vídeo Rexeitar a solicitude para cambiar a vídeo - -
+ \ No newline at end of file diff --git a/src/main/res/values-hr/strings.xml b/src/main/res/values-hr/strings.xml index 440ee1fedbd6003b265df6b09c7e67673481fa3c..2ee8522796f74817086ef7a31c3f1edc2576916f 100644 --- a/src/main/res/values-hr/strings.xml +++ b/src/main/res/values-hr/strings.xml @@ -73,4 +73,18 @@ Odblokiraj Sačuvaj Ok + Pošalji sada + Nikad više ne pitaj + Nije moguće povezati se s računom + Nije moguće povezati se s više računa + Dodirnite za upravljanje svojim računima + Priložite datoteku + Dodati ovaj kontakt koji nedostaje na popis kontakata? + Dodaj kontakt + dostava nije uspjela + Priprema za slanje slike + Priprema za slanje slika + Dijeljenje datoteka. Molimo pričekajte… + Obriši povijest + Obriši povijest razgovora diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index 9fa824317f95f47ae6c8f342994e15fe792906b9..5b1ba6663e07c4e3c324fa4e33d7bcbb0e8467f7 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -31,16 +31,11 @@ %d min fa %d conversazione non letta - - %d conversazioni non lette - - %d conversazioni non lette - invio… - Decifrazione messaggio. Attendere prego... + Decifrazione messaggio. Attendere prego… Messaggio cifrato con OpenPGP Nome utente già in uso Nickname non valido @@ -59,7 +54,7 @@ Vuoi rimuovere %s dai segnalibri? Le conversazioni con questo segnalibro non verranno rimosse. Registra un nuovo profilo sul server Cambia la password sul server - Condividi con + Condividi con… Inizia conversazione Invita contatto Invita @@ -87,7 +82,7 @@ Invio fallito Preparazione per l\'invio dell\'immagine Preparazione per l\'invio delle immagini - Condivisione file. Attendere prego... + Condivisione file. Attendere prego… Pulisci la cronologia Pulisci la cronologia della conversazione Vuoi eliminare tutti i messaggi in questa conversazione?\n\nAttenzione: ciò non influenzerà i messaggi salvati su altri dispositivi o server. @@ -154,7 +149,9 @@ Impossibile convertire l\'immagine File non trovato Errore di I/O generico. Forse hai esaurito lo spazio? - L’app che hai usato per selezionare questa immagine non ha fornito autorizzazioni sufficienti per leggere il file.\n\nUsa un gestore di file differente per scegliere un’immagine + L’app che hai usato per selezionare questa immagine non ha fornito autorizzazioni sufficienti per leggere il file. +\n +\nUsa un gestore di file differente per scegliere un’immagine. L\'app che hai usato per condividere questo file non ha fornito autorizzazioni sufficienti. Sconosciuto Disattivato temporaneamente @@ -228,7 +225,7 @@ v\\Impronta OMEMO (origine del messaggio) Altri dispositivi Fidati delle impronte OMEMO - Ricezione chiavi... + Ricezione chiavi… Fatto Decripta Segnalibri @@ -254,7 +251,7 @@ Distruzione canale fallita Modifica titolo chat di gruppo Argomento - Ingresso nella chat di gruppo... + Ingresso nella chat di gruppo… Abbandona Il contatto ti ha aggiunto alla sua lista contatti Aggiungi anche tu @@ -282,7 +279,9 @@ Attiva La chat di gruppo richiede una password Inserisci la password - Richiedi gli aggiornamenti della presenza dal tuo contatto.\n\nCiò verrà usato per determinare quale app sta usando il tuo contatto. + Prima chiedi gli aggiornamenti della presenza dal tuo contatto. +\n +\nCiò verrà usato per determinare quale app sta usando il tuo contatto. Rechiedi adesso Ignora Attenzione: inviarlo senza aggiornamenti della presenza reciproci può causare problemi inaspettati.\n\nVai nei dettagli del contatto per verificare le tue sottoscrizioni alla presenza. @@ -430,7 +429,7 @@ Invio %s Offrendo %s Nascondi i contatti offline - %s sta digitando... + %s sta digitando… %s ha smesso di digitare %s stanno scrivendo… %s hanno smesso di scrivere @@ -491,7 +490,7 @@ Impossibile analizzare il certificato Preferenze di archiviazione Preferenze di archiviazione lato server - Raccolta preferenze di archiviazione. Attendere prego... + Ricezione preferenze di archiviazione. Attendere prego… Impossibile recuperare le preferenze di archiviazione CAPTCHA necessario Inserisci il testo dell\'immagine soprastante @@ -546,7 +545,7 @@ Hai disattivato questo profilo Errore di sicurezza: accesso file non valido! Nessuna app trovata per condividere l\'URI - Condividi l\'URI con... + Condividi URI con…
Ti registri con il tuo numero di telefono e Quicksy ti suggerirà—in base ai numeri di telefono nella tua rubrica—automaticamente i possibili contatti.

Registrandoti accetti la nostra politica sulla privacy.]]>
Accetta e continua È disponibile una guida per la creazione di un profilo su conversations.im.¹\nQuando scegli conversations.im come fornitore potrai comunicare con utenti di altri fornitori dando il tuo indirizzo XMPP completo. @@ -567,7 +566,7 @@ Registrazione fallita: riprova più tardi Registrazione fallita: password troppo debole Scegli i partecipanti - Creazione chat di gruppo... + Creazione chat di gruppo… Invita di nuovo Disattiva Breve @@ -745,7 +744,7 @@ Mostra la posizione Condividi Impossibile avviare la registrazione - Attendere prego... + Attendere prego… Dai a %1$s l\'accesso al microfono Cerca messaggi GIF @@ -803,7 +802,7 @@ Quicksy invierà un SMS (possono essere applicati costi dal gestore) per verificare il tuo numero. Inserisci il tuo codice nazionale e numero di telefono:
%s

È corretto o vuoi modificare il numero?]]>
%s non è un numero di telefono valido. - Inserisci il tuo numero di telefono: + Inserisci il tuo numero di telefono. Cerca nazioni Verifica %s %s.]]> @@ -905,7 +904,7 @@ Questo profilo è già stato configurato Inserisci la password per questo profilo Impossibile eseguire questa azione - Entra in un canale pubblico... + Entra in un canale pubblico… L\'app di condivisione non ha concesso l\'autorizzazione per accedere a questo file. jabber.network @@ -1013,5 +1012,4 @@ Le chiamate sono disattivate quando si usa Tor Passa al video Rifiuta richiesta di passare al video - - + \ No newline at end of file diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index a0301971361ba2049d1306f59b3f46c35e34808f..f99c7884b79c0863e79d8e5120f3be7e6635fd2c 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -37,7 +37,7 @@ メッセージを復号しています。しばらくお待ちください… OpenPGP 暗号化メッセージ ニックネームは既に使用されています - 不正なニックネーム + このニックネームは使えません 管理者 所有者 調停者 @@ -167,6 +167,7 @@ 検証不可能なドメイン ポリシー違反 互換性のないサーバー + 互換性のない端末 ストリーム エラー ストリームを開く際にエラー TLS @@ -221,7 +222,7 @@ v\\OMEMO フィンガープリント (メッセージ起源) 他のデバイス OMEMO フィンガープリントを信頼 - 鍵の取得中… + 暗号鍵の取得中… 完了 復号 ブックマーク @@ -323,7 +324,7 @@ 確認 再試行 フォアグラウンドサービス - オペレーティングシステムが接続を切断するのを防止します + OSが接続を切断するのを防止します バックアップを作成 バックアップファイルは %s に保存されます バックアップファイルを作成しています @@ -348,7 +349,7 @@ ファイルを開くアプリケーションが見つかりません リンクを開くアプリケーションが見つかりません 連絡先を表示するアプリケーションが見つかりません - ダイナミック タグ + タグ付け 連絡先の下に、読み取り専用タグを表示します 通知を有効化 グループチャットのサーバーが見つかりませんでした @@ -511,7 +512,7 @@ %1$s に外部ストレージへのアクセス権を付与してください %1$s にカメラへのアクセス権を付与 連絡先と同期 - %1$s はあなたのアドレス帳にアクセスして、あなたのXMPP 連絡先名簿と照合する権限を求めています。\nこれにより、連絡先のフルネームとアバターが表示されます。\n\n%1$s は、あなたのサーバーに何かをアップロードすることなく、あなたのアドレス帳を読み込んでローカルに照合するだけです。 + %1$s はあなたのアドレス帳にアクセスして、あなたのXMPP 連絡先名簿と照合する権限を求めています。\nこれにより、連絡先のフルネームとアバターが表示されます。\n\n%1$s は、あなたのサーバーに何かをアップロードすることなく、あなたのアドレス帳を読み込んで照合するだけです。
Quicksyは、それらの電話番号のコピーを保存することはありません。\n\n詳細はプライバシーポリシーをご覧ください。

今、連絡先へのアクセス権限を付与するよう求められます。]]>
すべてのメッセージで通知 メンションされたときにのみ通知 @@ -535,7 +536,7 @@ セキュリティエラー: 不正なファイルアクセス! URI を共有するアプリが見つかりません …で URI を共有 -
電話番号を入力して登録すると、アドレス帳に登録されている電話番号をもとに、Quicksyが自動的に連絡先を提案します。

登録すると、我々のプライバシーポリシーに同意することになります。]]>
+
電話番号を入力して登録すると、アドレス帳に登録されている電話番号をもとに、Quicksyが自動的に連絡先を提案します。

登録すると、我々のプライバシーポリシーに同意することになります。]]>
同意して続行 conversations.im 上にアカウントを作成する設定の指南です。¹\nconversations.im をプロバイダーとして選択した場合、あなたの完全な XMPP アドレスを他のプロバイダーのユーザーに示すことで、その人と連絡をとることができます。 あなたの完全なXMPPアドレスは: %s @@ -606,10 +607,10 @@ バーコードで共有 XMPP URI で共有 HTTP リンクで共有 - 検証前の盲目的な信頼 + 認証前で鍵を使用 認証されていない連絡先からの新規デバイスを信頼するが、認証されている連絡先からの新規デバイスについては手動での確認を求める。 - OMEMO 鍵を盲目的に信用していた。つまり、他の人かもしれないし、誰かが盗聴しているかもしれない。 - 信頼できない + 認証せずOMEMO 鍵を信用しています。このままでは盗聴される危険性があります。 + 信頼されていない 不正な二次元バーコード キャッシュフォルダを消去します (カメラアプリで使用) キャッシュを消去 @@ -752,6 +753,7 @@ メッセージ 着信通話 継続中の通話 + 不在着信 サイレントメッセージ この通知グループは、音を鳴らしてはいけない通知を表示するために使用します。例えば、他のデバイスでアクティブになっているときなどです (猶予期間)。 配信に失敗 @@ -891,8 +893,10 @@ 通話をする 着信通話 着信映像通話 + ビデオ通話に切り替えますか? 接続中 接続しました + 再接続中 通話受入 通話終了 応答 @@ -908,6 +912,8 @@ 電話を切る 継続中の通話 継続中の映像通話 + 通話再接続中 + ビデオ通話再接続中 通話するのに Tor を無効化 着信通話 着信通話・%s @@ -915,8 +921,18 @@ 発信通話 発信通話・%s 不在着信通話 + + %2$sから%1$d件の不在着信 + + + 不在着信%d件 + + + %2$d人から%1$d件の不在着信 + 音声通話 映像通話 + ヘルプ 会話に切り替え マイクが利用できません 1度に1回線の通話のみ。 @@ -958,4 +974,6 @@ XMPPアドレスがみつかりません 一時的な認証失敗 アバターを削除 + Tor使用中のため通話できません + ビデオ通話切替 diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 1d95b5d9acdfa5cb0d270be5d5544e4024525175..94044436e8a95d348c76e14d76a85f1884b2ab22 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -31,7 +31,6 @@ %d分钟前 %d 未读会话 - 发送中… 正在解密信息。请稍候…… @@ -69,7 +68,7 @@ 保存 完成 %1$s已崩溃 - 用你的 XMPP 账户发送堆栈跟踪来帮助持续开发 %1$s + 用你的 XMPP 账户发送堆栈跟踪来帮助持续开发 %1$s。 立即发送 不再询问 账户无法连接 @@ -86,7 +85,9 @@ 清除聊天记录 您确定要删除此聊天中的所有消息吗?\n\n警告:这不会删除存储在其他设备或服务器上的那些消息的副本。 删除文件 - 您确定要删除此文件吗?\n\n 警告:这不会删除存储在其他设备或服务器上的此文件的副本。 + 您确定要删除此文件吗? +\n +\n警告:这不会删除存储在其他设备或服务器上的此文件的副本。 之后关闭此聊天 选择设备 发送未加密的信息 @@ -111,7 +112,7 @@ 因您的联系人未公布其公钥,无法加密您的信息。\n\n请通知您的联系人设置OpenPGP。 常规 接收文件 - 自动接收小于此大小的文件 + 自动接收小于此大小的文件… 附件 通知 振动 @@ -126,14 +127,14 @@ 在其他设备上检测到活动之后,通知在此时间段内将被静音。 高级 从不发送崩溃报告 - 通过发送堆栈跟踪,您可以帮助Conversations持续发展 + 通过发送堆栈跟踪,您可以为开发提供帮助 确认消息 让对方知道你收到并阅读了他们的消息 防止截屏 在应用切换中隐藏应用程序内容并阻止截图 用户界面 OpenKeychain报告一个错误。 - 错误的密钥 + 错误的加密密钥。 接受 产生了一个错误 错误 @@ -148,7 +149,9 @@ 无法转换图片 未找到文件 常规I/O错误。可能是存储空间不足? - 您用来选择图片的程序没有给予读取权限。\n\n </small>尝试其他文件管理器选择图片</small>。 + 你用来选择图片的应用没有提供读取文件的足够权限。 +\n +\n使用不同的文件管理器来选择图片. 你用来共享此文件的应用程序没有提供足够的权限。 未知 暂时不可用 @@ -180,7 +183,7 @@ 发布OpenPGP公钥 移除OpenPGP公钥 您确定要从在线状态中移除OpenPGP公钥吗?\n您的联系人将无法再向您发送 OpenPGP 加密信息。 - OpenPGP公钥已发布 + OpenPGP 公钥已发布。 启用账户 确定? 如果您删除帐户,您的所有聊天记录将会丢失 @@ -222,7 +225,7 @@ v\\OMEMO 指纹 (消息来源) 其他设备 信任的OMEMO指纹 - 获取密钥中 + 获取密钥中… 完成 解密 书签 @@ -276,7 +279,9 @@ 启用 需要密码才能进入该群聊 输入密码 - 请先发送更新在线状态请求。\n\n以判断您的联系人所用的客户端类型。 + 请先请求联系人在线状态更新。 +\n +\n这将被用来判断您的联系人正在使用的聊天应用 现在请求 忽略 警告:在没有相互更新在线状态的情况下发送将会出现未知问题。\n\n前往联系人详情以验证您订阅的在线状态。 @@ -360,7 +365,8 @@ 重新生成OMEMO密钥 清除设备 清除所有其他设备的OMEMO通告?下次设备连接时将重新通告,但可能收不到你发送的消息。 - 此联系人没有可用的密钥。\n从服务器获取密钥失败。也许你的联系人所在服务器发生问题。 + 此联系人没有可用的密钥。 +\n无法从服务器获取新密钥。也许你的联系人所在服务器发生问题了? 没有可以用于这个账户的密钥。\n请确保你有相互的在线状态的订阅。 出错了 正在从服务器获取历史记录 @@ -525,7 +531,9 @@ 仅大图片 已启用节电模式 你的设备正对 %1$s 实施强力电池优化,这可能导致通知延迟甚至消息丢失。\n建议禁用这些优化。 - 你的设备正对 %1$s 实施强力电池优化,这可能导致通知延迟甚至消息丢失。\n你将被请求禁用这些优化。 + 你的设备正对 %1$s 实施强力电池优化,这可能导致通知延迟甚至消息丢失。 +\n +\n你将被请求禁用这些优化。 禁用 选择区域过大 (没有启用的账户) @@ -534,7 +542,7 @@ 发送更正后的消息 您已经验证了该用户。点击“完成”让%s加入群聊。 你已经禁用了此账户 - 安全错误:文件访问无效 + 安全错误:文件访问无效! 未找到可以分享此链接的应用 分享链接……
您注册了电话号码,Quicksy就会根据您的通讯录中的电话号码自动为您建议可能的联系人

签署即表示您同意我们的隐私政策。]]>
@@ -545,7 +553,7 @@ 使用我自己的服务器 输入您的用户名 手动更改在线状态 - 编辑状态信息时,您的状态 + 编辑状态信息时设置您是否有空。 状态信息 有空聊天 在线 @@ -587,11 +595,11 @@ 找不到远程服务器 远程服务器超时 无法更新账户 - 举报此账户发送垃圾信息 + 举报此 XMPP 地址发送垃圾信息。 删除OMEMO身份 重新生成OMEMO密钥。所有联系人都需要再次认证。请将此作为最后的办法。 删除选择的密钥 - 你需要连接才能发布头像 + 你需要连接才能发布头像。 显示出错消息 出错信息 省流量模式已启用 @@ -610,7 +618,7 @@ 分享HTTP链接 验证前盲目信任 自动信任陌生人的设备,但在验证过联系人添加设备时手动确认。 - 盲目信任OMEMO密钥,可能会有人冒充对方发送消息 + 盲目信任的 OMEMO 密钥,表示它们可能时其他人或者某人可能冒充别人发送消息。 不信任的 无效二维码 清理缓存文件夹(由相机应用使用) @@ -645,14 +653,14 @@ %d个月 自动删除消息 - 自动从此设备上删除超过配置时间段的消息 + 自动从此设备上删除超过配置时间段的消息。 消息加密中 由于本地保留期限设置,无法提取消息。 正在压缩视频 相应的对话已关闭。 - 联系人已封禁 + 联系人已封禁。 陌生人的消息也通知 - 提醒来自陌生人的消息与通话 + 提醒来自陌生人的消息与通话。 已收到陌生人的信息 封禁陌生人 封禁整个域名 @@ -711,7 +719,7 @@ 消息未对本设备加密。 - 解密OMEMO消息失败 + 解密OMEMO消息失败。 撤销 位置分享已停用 固定位置 @@ -773,42 +781,42 @@ 高(720p) 已取消 你已经在起草一条消息了。 - 功能不支持。 + 功能未实现 无效国家代码 选择国家 手机号 验证手机号 Quicksy将发送验证码短信(运营商可能收费)。请输入国家代码和手机号:
%s

。电话号码正确吗?]]>
- %s不是有效的电话号码 + %s不是有效的电话号码。 请输入手机号。 搜索国家 验证%s %s。]]> - 已重新发送6位数验证码短信 - 输入6位数的PIN + 已发送另一条6位数验证码短信。 + 请在下方输入6位数的PIN。 重新发送短信 重发短信(%s) 请稍候(%s) 返回 - 已自动从剪贴板粘贴验证码 - 请输入6位代码 + 自动从剪贴板粘贴了可能是PIN码的数据。 + 请输入6位数PIN码。 确定放弃注册? - 正在验证... - 请求短信... + 正在验证… + 正请求短信… 验证码错误。 - 验证码已失效 - 未知网络错误 - 未知服务器应答 + 我们发给你的PIN码已失效。 + 未知网络错误。 + 未知服务器响应。 无法连接服务器。 无法建立安全连接。 - 找不到服务器 - 处理请求时出错 + 找不到服务器。 + 处理请求时出错。 用户输入无效 暂时无法连接。请稍候再试。 - 无网络连接 + 无网络连接. 请在%s后重试 你被限制速率 尝试次数过多 @@ -822,16 +830,16 @@ 拒绝请求 安装Orbot 启动Orbot - 软件商店未安装 + 未安装应用商店。 此频道将公开你的XMPP地址 电子书 原始(未压缩) - 打开方式 - 聊天头像 + 打开方式… + Conversations 个人资料图片 选择账户 恢复备份 恢复 - 输入%s的密码以恢复备份 + 输入%s账户的密码以恢复备份。 请勿使用恢复备份功能来尝试克隆安装的应用程序(同时运行)。恢复备份功能仅用于迁移或丢失原始设备的情况。 无法恢复备份。 无法解密备份。密码是否正确? @@ -843,24 +851,24 @@ 创建公开频道 频道名称 XMPP地址 - 请为频道提供一个名称。 - 请提供XMPP地址。 + 请提供频道名 + 请提供XMPP地址 这是一个XMPP地址。请提供一个名称。 - 创建公开频道 + 创建公开频道… 频道已存在 您加入了一个已经存在的频道 无法配置频道 允许任何成员修改主题 允许任何成员邀请其他人 - 允许任何成员修改主题 - 拥有者可修改主题 - 管理员可修改主题 - 所有者可以邀请其他人 - 允许任何成员邀请其他人 + 任何人可以编辑话题。 + 所有者可修改话题。 + 管理员可修改话题。 + 所有者可以邀请其他人。 + 允许任何成员邀请其他人。 XMPP地址对管理员可见。 - XMPP地址对所有人可见 + XMPP 地址对所有人可见。 此公开频道无成员。邀请成员或使用分享按钮分享地址。 - 此私密群聊无成员 + 此私密群聊无成员。 管理权限 搜索成员 文件过大 @@ -883,8 +891,8 @@ 账户已设置 请输入此账户的密码 无法执行此操作 - 加入公开频道 - 分享程序没有访问文件的权限 + 加入公开频道… + 分享程序没有访问文件的权限。 jabber.network 本地服务器 @@ -939,7 +947,7 @@ 帮助 切换到对话 麦克风不可用 - 只能同时打一通电话 + 一次只能打一通电话。 返回正在进行的通话 无法切换摄像头 置顶 @@ -972,7 +980,7 @@ 服务器不支持生成邀请 没有活跃帐户支持此功能 已启动备份。一旦完成,你会收到通知。 - 无法启用视频 + 无法启用视频。 纯文本文档 不支持注册账户 未找到 XMPP 地址 @@ -981,5 +989,4 @@ 使用 Tor 时通话被禁用 切换到视频 拒绝切换到视频的请求 - - + \ No newline at end of file diff --git a/src/main/res/values/about.xml b/src/main/res/values/about.xml index dd5d32a15fc64a59fab091b0caae4f6d4b18bb9c..d6e064d579889dbfcdb8f480e88a50e7f0b69c32 100644 --- a/src/main/res/values/about.xml +++ b/src/main/res/values/about.xml @@ -31,7 +31,7 @@ Conversations • the very last word in instant messaging. - \n\nCopyright © 2014-2022 Daniel Gultsch + \n\nCopyright © 2014-2023 Daniel Gultsch \n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or @@ -42,7 +42,7 @@ GNU General Public License for more details. \n\nYou should have received a copy of the GNU General Public License along with this program. If not, see https://www.gnu.org/licenses - \n\nDownload the full source code at https://github.com/iNPUTmice/Conversations + \n\nDownload the full source code at https://codeberg.org/iNPUTmice/Conversations \n\n\nLibraries \n\nhttps://webrtc.org\nCopyright (c) 2011, The WebRTC project authors. All rights reserved. (https://webrtc.org/support/license) \n\nhttps://github.com/ypresto/android-transcoder\n(Apache License, Version 2.0) diff --git a/src/quicksy/AndroidManifest.xml b/src/quicksy/AndroidManifest.xml index f82377f0147ae3436d32be99cdd54408edbe5e91..7b03ed1b7189711d18d0f943647edc067baa7119 100644 --- a/src/quicksy/AndroidManifest.xml +++ b/src/quicksy/AndroidManifest.xml @@ -2,10 +2,15 @@ + + + - Zeitspanne, in der Quicksy still bleibt, nachdem es Aktivitäten auf einem anderen Gerät erkannt hat. - Wenn du Absturzberichte einschickst, hilfst du Quicksy stetig zu verbessern + Zeitspanne, in der Quicksy still bleibt, nachdem es Aktivitäten auf einem anderen Gerät erkannt hat + Mit dem Einsenden von Absturzberichten hilfst du bei der Weiterentwicklung von Quicksy Informiere deine Kontakte, wann du Quicksy nutzt Um weiterhin Benachrichtigungen zu erhalten, auch wenn der Bildschirm ausgeschaltet ist, musst du Quicksy zur Liste der geschützten Apps hinzufügen. Quicksy Profilbild @@ -9,4 +9,4 @@ Überprüfung der Serveridentität ist nicht möglich. Unbekannter Sicherheitsfehler. Zeitüberschreitung bei der Verbindung zum Server. - + \ No newline at end of file diff --git a/src/quicksy/res/values-es/strings.xml b/src/quicksy/res/values-es/strings.xml index 7f8d2402290ffbab41fbdddf8722a6309f7e18d1..fb93a9971a8f1e3a31fca5597a4454a9c1550335 100644 --- a/src/quicksy/res/values-es/strings.xml +++ b/src/quicksy/res/values-es/strings.xml @@ -1,12 +1,12 @@ - Periodo de tiempo en el que Quicksy deshabilita las notificaciones tras ver que tienes actividad en otro dispositivo - Si envías registros de error ayudas al desarrollo de Quicksy + Cuánto tiempo Quicksy permanece en silencio después de detectar una actividad en otro dispositivo + Si elige enviar un informe de error, estará ayudando al desarrollo de Quicksy Informar a tus contactos cuando usas Quicksy - Para seguir recibiendo notificaciones, incluso cuando la pantalla está apagada, necesitas añadir Quicksy a la lista de aplicaciones protegidas. - Foto de perfil en Quicksy + Para continuar recibiendo notificaciones incluso cuando la pantalla está apagada, debe agregar Quicksy a la lista de aplicaciones protegidas. + Foto de perfil de Quicksy Quicksy no está disponible en tu país. No se ha podido verificar la identidad del servidor. Error de seguridad desconocido. Se ha superado el tiempo máximo de espera conectando al servidor. - + \ No newline at end of file diff --git a/src/quicksy/res/values-gl/strings.xml b/src/quicksy/res/values-gl/strings.xml index 22b78d01b8948b26f33eec28946880beeeb93f38..0f1343d66ebce6390612b5a6aa5dfe003f8ae508 100644 --- a/src/quicksy/res/values-gl/strings.xml +++ b/src/quicksy/res/values-gl/strings.xml @@ -3,10 +3,10 @@ O período de tempo que Quicksy permanece acalado tras ver actividade noutro dispositivo Enviando trazas do rexistro estás axudando ao desenvolvemento de Quicksy Permitir a todos os teus contactos saber cando estás a utilizar Quicksy - Para seguir recibindo notificacións, mesmo coa pantalla apagada, precisas engadir a Quicksy na lista de apps protexidas. + Para seguir recibindo notificacións, mesmo coa pantalla apagada, tes que engadir a Quicksy á lista de apps protexidas. Imaxe de perfil Quicksy Quicksy non está dispoñible no teu país. Non se puido verificar a identidade do servidor. Fallo de seguridade descoñecido. Caducou a conexión mentras conectaba co servidor. - + \ No newline at end of file diff --git a/src/quicksy/res/values-hr/strings.xml b/src/quicksy/res/values-hr/strings.xml new file mode 100644 index 0000000000000000000000000000000000000000..80b63a28f61c6a710e1f5bd53c56e5ac4a7d8d2f --- /dev/null +++ b/src/quicksy/res/values-hr/strings.xml @@ -0,0 +1,12 @@ + + + Duljina vremena u kojem Quicksy šuti nakon što vidi aktivnost na drugom uređaju + Slanjem tragova hrpe pomažete tekući razvoj Quicksyja + Obavijestite sve svoje kontakte kada koristite Quicksy + Kako biste nastavili primati obavijesti, čak i kada je ekran isključen, trebate dodati Quicksy na popis zaštićenih aplikacija. + Quicksy profilna slika + Quicksy nije dostupan u vašoj zemlji. + Nije moguće potvrditi identitet poslužitelja. + Nepoznata sigurnosna pogreška. + Istek vremena tijekom povezivanja s poslužiteljem. + diff --git a/src/quicksy/res/values-zh-rCN/strings.xml b/src/quicksy/res/values-zh-rCN/strings.xml index 6e6c8e4da05bdfe729725e13ed694f51721e188e..a93ac4a0972342deda54ca89192d99e054f66844 100644 --- a/src/quicksy/res/values-zh-rCN/strings.xml +++ b/src/quicksy/res/values-zh-rCN/strings.xml @@ -1,12 +1,12 @@ 发现在其它设备上的活动后,Conversations保持安静的时间 - 通过发送堆栈跟踪,您可以帮助Quicksy持续发展 + 通过发送堆栈跟踪,您可以帮助 Quicksy 的持续开发 让你的所有联系人知道你使用Quicksy的时间 - 为了在屏幕关闭时也能收到消息提醒,您需要将Quicksy加入受保护的应用列表。 - Quicksy个人资料图片 + 为了在屏幕关闭时也能收到消息提醒,您需要将 Quicksy 加入受保护的应用列表。 + Quicksy 个人资料图片 Quicksy在您的国家无服务。 - 无法确认服务器身份 - 未知安全错误 - 服务器已超时 - + 无法验证服务器身份。 + 未知安全错误。 + 连接到服务器时超时。 + \ No newline at end of file