Merge https://github.com/siacs/Conversations into development

Beriain created

Change summary

res/layout/activity_contact_details.xml                             |  15 
res/values-ca/arrays.xml                                            |  22 
res/values-ca/strings.xml                                           | 119 
res/values-de/strings.xml                                           |  59 
res/values-es/strings.xml                                           |  28 
res/values-fr/arrays.xml                                            |  22 
res/values-fr/strings.xml                                           |  86 
res/values-fr/styles.xml                                            |  19 
res/values/strings.xml                                              |   8 
res/xml/preferences.xml                                             |   4 
src/eu/siacs/conversations/ui/ContactDetailsActivity.java           |   4 
src/eu/siacs/conversations/xml/TagWriter.java                       |   8 
src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java        |  58 
src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java |   8 
14 files changed, 416 insertions(+), 44 deletions(-)

Detailed changes

res/layout/activity_contact_details.xml 🔗

@@ -14,7 +14,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:padding="8dp"
-        android:text="Contact Details" />
+        android:text="@string/action_contact_details" />
     <RelativeLayout
         android:layout_width="wrap_content"
         android:layout_height="88dp"
@@ -42,7 +42,6 @@
                 android:layout_height="wrap_content"
                 android:paddingLeft="8dp"
                 android:singleLine="true"
-                android:text="something@jabber.example.com"
                 android:textColor="#5b5b5b"
                 android:textSize="18sp" />
 
@@ -51,7 +50,6 @@
                 android:layout_width="fill_parent"
                 android:layout_height="fill_parent"
                 android:paddingLeft="16dp"
-                android:text="online"
                 android:textSize="24sp"
                 android:textStyle="bold" />
         </LinearLayout>
@@ -64,13 +62,12 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:padding="8dp"
-        android:text="Your account" />
+        android:text="@string/your_account" />
     <TextView
         android:id="@+id/details_account"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:paddingLeft="8dp"
-        android:text="julia@jabber.example.com"
         android:textSize="18sp"
         android:textColor="#5b5b5b" />
    <TextView
@@ -78,13 +75,13 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:padding="8dp"
-        android:text="Subscription" />
+        android:text="@string/subscriptions" />
 
     <CheckBox
         android:id="@+id/details_send_presence"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="Send presence updates"
+        android:text="@string/send_presence_updates"
         android:textSize="18sp"
         android:textColor="#5b5b5b" />
 
@@ -92,7 +89,7 @@
         android:id="@+id/details_receive_presence"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:text="Receive presence updates"
+        android:text="@string/receive_presence_updates"
         android:textSize="18sp"
         android:textColor="#5b5b5b" />
         
@@ -112,7 +109,7 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:padding="8dp"
-        android:text="Keys" />
+        android:text="@string/keys" />
 
  <LinearLayout
      android:id="@+id/details_contact_keys"

res/values-ca/arrays.xml 🔗

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <array name="resources">
+        <item>Mòbil</item>
+        <item>Telèfon</item>
+        <item>Tauleta</item>
+        <item>Conversations</item>
+        <item>Android</item>
+    </array>
+    <string-array name="filesizes">
+        <item>mai</item>
+        <item>256 KB</item>
+        <item>512 KB</item>
+        <item>1 MB</item>
+    </string-array>
+    <string-array name="filesizes_values">
+        <item>0</item>
+        <item>262144</item>
+        <item>524288</item>
+        <item>1048576</item>
+    </string-array>
+</resources>

res/values-ca/strings.xml 🔗

@@ -0,0 +1,119 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">Conversations</string>
+    <string name="action_settings">Preferències</string>
+    <string name="action_add">Nova conversa</string>
+    <string name="action_accounts">Gestionar comptes</string>
+    <string name="action_end_conversation">Finalitzar conversa</string>
+    <string name="action_contact_details">Detalls del contacte</string>
+    <string name="action_muc_details">Detalls de la conferència</string>
+    <string name="action_secure">Conversa segura</string>
+    <string name="action_add_account">Afegir compte</string>
+    <string name="title_activity_contacts">Contactes</string>
+    <string name="just_now">ara</string>
+    <string name="sending">enviant&#8230;</string>
+    <string name="announce_pgp">Renovar anunci PGP</string>
+    <string name="encrypted_message">Desxifrant missatge. Espera si us plau&#8230;</string>
+    <string name="conference_details">Detalls de la conferència</string>
+    <string name="nick_in_use">El sobrenom ja està en ús</string>
+    <string name="moderator">Moderador</string>
+    <string name="participant">Participant</string>
+    <string name="visitor">Visitant</string>
+    <string name="enter_new_name">Introdueix un nou nom:</string>
+    <string name="remove_contact_text">Vols eliminar a %s de la teva llista?. La conversa associada a aquest compte no s\'eliminarà.</string>
+    <string name="untrusted_cert_hint">El servidor %s presenta un certificat no confiable, possiblemente auto signat.</string>
+    <string name="account_info">Informació del servidor</string>
+    <string name="register_account">Registrar nou compte al servidor</string>
+    <string name="share_with">Compartir amb</string>
+    <string name="ask_again"><u>Prem per preguntar un altre cop</u></string>
+    <string name="show_otr_key">Emprempta dactilar OTR</string>
+    <string name="no_otr_fingerprint">No s\'ha generat una emprempta dactilar OTR. Simplement continua i comença una conversa xifrada.</string>
+    <string name="start_conversation">Començar conversa</string>
+    <string name="invite_contacts">Convidar contactes</string>
+    <string name="invite_contacts_to_existing">Convidar a conferència existent</string>
+    <string name="new_conference">Crear nova conferència</string>
+    <string name="cancel">Cancel·lar</string>
+    <string name="create_invite">Crear \u0026 Convidar</string>
+    <string name="new_conference_explained">Vols crear una nova conferència amb una adreça generada aleatòriament i convidar als contactes seleccionats a ella?</string>
+    <string name="no_open_mucs">No hi ha conferències existents</string>
+    <string name="invitation_sent">Invitació enviada</string>
+    <string name="account_offline">Compte desconnectat</string>
+    <string name="cant_invite_while_offline">Has d\'estar connectat per convidar contactes a la conferència</string>
+    <string name="crash_report_title">Conversations s\'ha aturat.</string>
+    <string name="crash_report_message">Enviant bolcats de piles ajudes al desenvolupament de Conversations\n<b>Avís:</b> Això usarà el teu compte XMPP per enviar el bolcat de pila al desenvolupador.</string>
+    <string name="send_now">Enviar ara</string>
+    <string name="send_never">No preguntar de nou</string>
+    <string name="problem_connecting_to_account">No s\'ha pogut connectar al compte</string>
+    <string name="problem_connecting_to_accounts">No s\'ha pogut connectar a múltiples comptes</string>
+    <string name="touch_to_fix">Prem aqui per gestionar els teus comptes</string>
+    <string name="attach_file">Enviar arxiu</string>
+    <string name="not_in_roster">El contacte no està a la teva llista. Vols afegir-lo?</string>
+    <string name="add_contact">Afefgir contacte</string>
+    <string name="send_failed">Error a l\'enviar</string>
+    <string name="send_rejected">rebutjat</string>
+    <string name="receiving_image">Rebent arxiu d\'imatge. Espera si us plau&#8230;</string>
+    <string name="preparing_image">Preparant imatge per enviar</string>
+    <string name="action_clear_history">Netejar historial</string>
+    <string name="clear_conversation_history">Netejar historial de conversa</string>
+    <string name="clear_histor_msg">Vols esborrar tots els missatges d\'aquesta conversa?\n\n<b>Avís:</b> Això no afectarà els missatges desats en altres dispositius o servidors.</string>
+    <string name="delete_messages">Esborrar missatges</string>
+    <string name="also_end_conversation">Finalitzar aquesta conversa més tard</string>
+    <string name="choose_presence">Selecciona recurs del contacte</string>
+    <string name="send_message_to_conference">Enviar missatge a conferència</string>
+    <string name="send_plain_text_message">Enviar missatge de text</string>
+    <string name="send_otr_message">Enviar missatge xifrat amb OTR</string>
+    <string name="send_pgp_message">Enviar missatge xifrat amb openPGP</string>
+    <string name="your_nick_has_been_changed">El teu sobrenom s\'ha modificat</string>
+    <string name="download_image">Descarregar imatge</string>
+    <string name="error_loading_image">Error carregant imatge (Fitxer no trobat)</string>
+    <string name="image_offered_for_download"><i>Fitxer d\'imatge ofert per a descàrrega</i></string>
+    <string name="not_connected">No connectat</string>
+    <string name="you_are_offline">Has d\'estar connectat per enviar %s però el teu compte associat a aquesta conversa està desconnectat.</string>
+    <string name="you_are_offline_blank">No pots executar aquesta acció estant desconnectat.</string>
+    <string name="files">fitxers</string>
+    <string name="otr_messages">Missatges xifrats amb OTR</string>
+    <string name="manage_account">Gestionar compte</string>
+    <string name="contact_offline">El teu contacte està desconnectat</string>
+    <string name="contact_offline_otr">Malauradament no és possible enviar missatges xifrats amb OTR a un contacte desconnectat.\nVols enviar el missatge en text pla?</string>
+    <string name="contact_offline_file">Malauradament no és possible enviar fitxers a un contacte desconnectat.</string>
+    <string name="send_unencrypted">Enviar sense xifrar</string>
+    <string name="decryption_failed">Ha fallat el desxiframent. Potser no tinguis la clau privada apropiada.</string>
+    <string name="openkeychain_required">OpenKeychain</string>
+    <string name="openkeychain_required_long">Conversations utilitza una aplicació de tercers anomenada <b>OpenKeychain</b> per xifrar i desxifrar missatges i gestionar les teves claus públiques..\n\nOpenKeychain està publicat sota llicència GPLv3 i disponible a la F-Droid i Google Play.\n\n<small>(Si us plau, reinicieu Conversations després.)</small></string>
+    <string name="restart">Reiniciar</string>
+    <string name="install">Instal·lar</string>
+    <string name="offering">oferint&#8230;</string>
+    <string name="no_pgp_key">Clau openPGP no trobada</string>
+    <string name="contact_has_no_pgp_key">Conversations no ha pogut xifrar els teus missatges perquè el teu contacte no està anunciant la seva clau pública.\n\n<small>Si us plau, demana al teu contacte que configuri openPGP.</small></string>
+    <string name="encrypted_message_received"><i>Missatge xifrat rebut. Prem per desxifrar i veure-ho.</i></string>
+    <string name="encrypted_image_received"><i>Imatge xifrada rebuda. Prem per desxifrar i veure-la.</i></string>
+    <string name="image_file"><i>Imatge rebuda. Prem per veure</i></string>
+    <string name="otr_file_transfer">Xifratge amb OTR no disponible</string>
+    <string name="otr_file_transfer_msg">Malauradament el xifratge amb OTR no està disponible per transferència de fitxers. Pots seleccionar xifratge amb openPGP o no usar xifratge.</string>
+    <string name="use_pgp_encryption">Usa xifratge amb openPGP</string>
+	<string name="pref_xmpp_resource">Recursos XMPP</string>
+    <string name="pref_xmpp_resource_summary">El nom que identifica aquest client amb</string>
+    <string name="pref_accept_files">Acceptar fitxers</string>
+    <string name="pref_accept_files_summary">Accepta fitxers automàticament amb una mida menor a&#8230;</string>
+    <string name="pref_notification_settings">Ajustos de notificacions</string>
+    <string name="pref_notifications">Notificacions</string>
+    <string name="pref_notifications_summary">Notifica quan arriba un nou missatge</string>
+    <string name="pref_vibrate">Vibra</string>
+    <string name="pref_vibrate_summary">Vibra quan arriba un nou missatge</string>
+    <string name="pref_sound">So</string>
+    <string name="pref_sound_summary">Reprodueix el to de trucada amb la notificació</string>
+    <string name="pref_conference_notifications">Notificacions de conferència</string>
+    <string name="pref_conference_notifications_summary">Sempre notifica quan arriba un nou missatge de conferència en comptes de només quan està destacat</string>
+    <string name="pref_notification_grace_period">Notificació del període d\'espera</string>
+    <string name="pref_notification_grace_period_summary">Desactiva les notificacions durant un breu termini després de rebre una còpia de missatges carbon</string>
+    <string name="pref_ui_options">Opcions de UI</string>
+    <string name="pref_use_phone_self_picture">Utilitza l\'avatar de l\'usuari del mòbil</string>
+    <string name="pref_use_phone_sefl_picture_summary">Podries no diferenciar quin compte estàs usant a la conversa</string>
+    <string name="pref_conference_name">Nom de la conferència</string>
+    <string name="pref_conference_name_summary">Utilitza l\'assumpte de la sala per identificar Conferències</string>
+    <string name="pref_advanced_options">Opcions avançades</string>
+    <string name="pref_never_send_crash">Mai enviïs informes d\'errors</string>
+    <string name="pref_never_send_crash_summary">Enviant traces d\'execució ajudes al futur desenvolupament del Conversations.</string>    
+    
+</resources>

res/values-de/strings.xml 🔗

@@ -53,23 +53,23 @@
     <string name="send_failed">Zustellung nicht erfolgreich</string>
     <string name="send_rejected">abgelehnt</string>
     <string name="receiving_image">Empfange Bild. Bitte warten&#8230;</string>
-    <string name="preparing_image">Bereite Bild für die Übertragung vor. Bitte warten&#8230;</string>
-    <string name="action_clear_history">Unterhaltungsverlauf löschen</string>
+    <string name="preparing_image">Bereite Bild für die Übertragung vor</string>
+    <string name="action_clear_history">Verlauf löschen</string>
     <string name="clear_conversation_history">Unterhaltungsverlauf löschen</string>
     <string name="clear_histor_msg">Möchtest du alle Nachrichten in dieser Unterhaltung löschen?\n\n<b>Achtung:</b> Das beeinflust nicht Nachrichten die eventuell auf anderen Geräten gespeichert wurden.</string>
     <string name="delete_messages">Nachrichten löschen</string>
     <string name="also_end_conversation">Diese Unterhaltung danach beenden</string>
     <string name="choose_presence">Choose presence to contact</string>
     <string name="send_message_to_conference">Nachricht an Konferenz schicken</string>
-    <string name="send_plain_text_message">Unverschlüsselte Nachricht schicken</string>
-    <string name="send_otr_message">Nachricht OTR-verschlüsselt verschicken</string>
-    <string name="send_pgp_message">Nachricht openPGP-verschlüsselt verschicken</string>
+    <string name="send_plain_text_message">Unverschlüsselt schreiben</string>
+    <string name="send_otr_message">OTR-verschlüsselt schreiben</string>
+    <string name="send_pgp_message">openPGP-verschlüsselt schreiben</string>
     <string name="your_nick_has_been_changed">Dein Nickname wurde geändert</string>
     <string name="download_image">Bild herunter laden</string>
     <string name="error_loading_image">Fehler beim laden des Bildes. (Datei wurde nicht gefunden)</string>
     <string name="image_offered_for_download"><i>Bild Datei zum Download angeboten</i></string>
     <string name="not_connected">Nicht verbunden</string>
-    <string name="you_are_offline">Du musst online sein um % zu verschicken. Dein Account der mit dieser Unterhaltung verbunden ist aber gerade offline.</string>
+    <string name="you_are_offline">Du musst online sein um %s zu verschicken. Dein Account der mit dieser Unterhaltung verbunden ist aber gerade offline.</string>
     <string name="you_are_offline_blank">Du kannst diese Aktion nicht ausführen so lange du offline bist.</string>
     <string name="files">Dateien</string>
     <string name="otr_messages">OTR-verschlüsselte Nachrichten</string>
@@ -80,7 +80,52 @@
     <string name="send_unencrypted">Unverschlüsselt verschicken</string>
     <string name="decryption_failed">Entschlüsselung fehlgeschlagen. Vielleicht hast du nicht den richtigen Private Key.</string>
     <string name="openkeychain_required">OpenKeychain</string>
-    <string name="openkeychain_required_long">Conversations benutzt eine Third-party-app names <b>OpenKeychain</b> um Nachrichten zu ver- und entschlüsseln und um deine Schlüssel zu verwalten.\n\nOpenKeychain ist GPLv3 lizensiert und bei F-Droid oder Google Play zu bekommen.\n\n<small>(Bitte starte Conversations danach neu)</small></string>
+    <string name="openkeychain_required_long">Conversations benutzt eine Third-party-app names <b>OpenKeychain</b> um Nachrichten zu ver- und entschlüsseln und um deine Schlüssel zu verwalten.\n\nOpenKeychain ist GPLv3 lizenziert und bei F-Droid oder Google Play zu bekommen.\n\n<small>(Bitte starte Conversations danach neu)</small></string>
     <string name="restart">Neustarten</string>
     <string name="install">Installieren</string>
+    <string name="offering">angeboten&#8230;</string>
+    <string name="no_pgp_key">Kein openPGP Schlüssel gefunden</string>
+    <string name="contact_has_no_pgp_key">Conversations ist nicht in der Lage deine Nachrichten zu verschlüsseln weil dein Kontakt sein oder ihren Schlüssel nicht preis gibt.\n\n<small>Bitte sag deinem Kontakt er oder sie möge bitte openPGP einrichten.</small></string>
+    <string name="encrypted_message_received"><i>Verschlüsselte Nachricht erhalten. Drücke hier um sie anzuzeigen und zu entschlüsseln.</i></string>
+    <string name="encrypted_image_received"><i>Verschlüsseltes Bild erhalten. Drücke hier um es anzuzeigen und zu entschlüsseln.</i></string>
+    <string name="image_file"><i>Bild erhalten. Drücke hier um es anzuzeigen.</i></string>
+    <string name="otr_file_transfer">OTR-Verschlüsselung nicht verfügbar</string>
+    <string name="otr_file_transfer_msg">Es ist nicht möglich Datein mitels OTR zu verschlüsseln. Du kannst entweder openPGP wählen oder die Datei nicht verschlüsseln.</string>
+    <string name="use_pgp_encryption">openPGP verwenden</string>
+    <string name="pref_xmpp_resource">XMPP resource</string>
+    <string name="pref_xmpp_resource_summary">Der Name mit dem sich der Client selber identifiziert</string>
+    <string name="pref_accept_files">Dateiannahme</string>
+    <string name="pref_accept_files_summary">Datein die kleiner sind als &#8230; automatisch annehmen</string>
+    <string name="pref_notification_settings">Benachrichtigungseinstellung</string>
+    <string name="pref_notifications">Benachrichtigungen</string>
+    <string name="pref_notifications_summary">Benachrichtige mich wenn eine neu Nachricht ankommt</string>
+    <string name="pref_vibrate">Vibrieren</string>
+    <string name="pref_vibrate_summary">Vibriere wenn eine neue Nachricht ankommt</string>
+    <string name="pref_sound">Klingelton</string>
+    <string name="pref_sound_summary">Spiel Klingelton wenn eine Nachricht ankommt</string>
+    <string name="pref_conference_notifications">Konferenz Benachrichtigungen</string>
+    <string name="pref_conference_notifications_summary">Benachrichtige mich bei jeder Konferenznachricht und nicht nur wenn ich angesprochen werde.</string>
+    <string name="pref_notification_grace_period">Gnadenfrist</string>
+    <string name="pref_notification_grace_period_summary">Deaktiviere Benachrichtigungen für eine kurze Zeit nach erhalt einer Nachricht die von einem anderen Client von Dir kommt.</string>
+    <string name="pref_ui_options">Aussehen</string>
+    <string name="pref_use_phone_self_picture">Benutze Dein Kontaktbild</string>
+    <string name="pref_use_phone_sefl_picture_summary">Wenn du mehrere Accounts hast bist du eventuell nicht mehr in der Lage diese auseinander zu halten.</string>
+    <string name="pref_conference_name">Konferenznamen</string>
+    <string name="pref_conference_name_summary">Benutze das Thema der Konferenz als Name in der Überschicht</string>
+    <string name="pref_advanced_options">Erweiterte Optionen</string>
+    <string name="pref_never_send_crash">Sende niemals Absturzberichte</string>
+    <string name="pref_never_send_crash_summary">Wenn du Absturzberichte einschickst hilfst du Conversations stetig zu verbessern.</string>
+    <string name="openpgp_error">Fehler mit OpenKeychain</string>
+    <string name="error_decrypting_file">Fehler beim entschlüsseln der Datei</string>
+    <string name="error_copying_image_file">Fehler beim Kopieren des Bildes</string>
+    <string name="accept">Annehmen</string>
+    <string name="error">Ein unbekannter Fehler ist aufgetreten</string>
+    <string name="pref_grant_presence_updates">Online Status</string>
+    <string name="pref_grant_presence_updates_summary">Erlaube Kontakten die von Dir erstellt wurden deinen Status zu sehen und frage um Erlaubnis ihren zu sehen.</string>
+    <string name="subscriptions">Abonnements</string>
+    <string name="your_account">Dein Account</string>
+    <string name="keys">Schlüssel</string>
+    <string name="send_presence_updates">Sende Online Status</string>
+    <string name="receive_presence_updates">Empfange Online Status</string>
+    <string name="preemptively_grant">Preemptively grant subscription request</string>
 </resources>

res/values-es/strings.xml 🔗

@@ -92,4 +92,32 @@
     <string name="otr_file_transfer">Encriptación con OTR no disponible</string>
     <string name="otr_file_transfer_msg">Desafortunadamente la encriptación con OTR no está disponible para transferencia de archivos. Puedes selecionar encriptación con openPGP o no usar encriptación.</string>
     <string name="use_pgp_encryption">Usa encriptación con openPGP</string>
+    <string name="pref_xmpp_resource">Recurso</string>
+    <string name="pref_xmpp_resource_summary">El nombre que identifica el cliente que estás utilizando</string>
+    <string name="pref_accept_files">Aceptar archivos</string>
+    <string name="pref_accept_files_summary">Automáticamente aceptar archivos menores que&#8230;</string>
+    <string name="pref_notification_settings">Ajustes de notificación</string>
+    <string name="pref_notifications">Notificaciones</string>
+    <string name="pref_notifications_summary">Notifica cuando llega un nuevo mensaje</string>
+    <string name="pref_vibrate">Vibrar</string>
+    <string name="pref_vibrate_summary">Vibra cuando llega un nuevo mensaje</string>
+    <string name="pref_sound">Sonido</string>
+    <string name="pref_sound_summary">Reproduce tono con la notificación</string>
+    <string name="pref_conference_notifications">Notificaciones de conferencia</string>
+    <string name="pref_conference_notifications_summary">Siempre notifica cuando llega un mensaje de conferencia y no solo cuando llega un mensaje destacado</string>
+    <string name="pref_notification_grace_period">Notificaciones Carbons</string>
+    <string name="pref_notification_grace_period_summary">Deshabilita las notificaciones durante un corto periodo de tiempo después de recibir la copia del mensaje carbon</string>
+    <string name="pref_ui_options">Opciones de interfaz</string>
+    <string name="pref_use_phone_self_picture">Usar foto de contacto del teléfono</string>
+    <string name="pref_use_phone_sefl_picture_summary">Podrías no ser capaz de distinguir que cuenta está utlizando en una conversación</string>
+    <string name="pref_conference_name">Nombre de la conferencia</string>
+    <string name="pref_conference_name_summary">Usa el nombre de la sala para identificar Conferencias</string>
+    <string name="pref_advanced_options">Opciones avanzadas</string>
+    <string name="pref_never_send_crash">Nunca enviar informe de fallos</string>
+    <string name="pref_never_send_crash_summary">Enviando volcados de pilas ayudas al desarrollo de Conversations</string>
+    <string name="openpgp_error">OpenKeychain reportó un error</string>
+    <string name="error_decrypting_file">I/O Error desencriptando fichero</string>
+    <string name="error_copying_image_file">Error copiando archivo de imagen.</string>
+    <string name="accept">Aceptar</string>
+    <string name="error">Ha ocurrido un error</string>
 </resources>

res/values-fr/arrays.xml 🔗

@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+    <array name="resources">
+        <item>Mobile</item>
+        <item>Téléphone</item>
+        <item>Tablette</item>
+        <item>Conversations</item>
+        <item>Android</item>
+    </array>
+    <string-array name="filesizes">
+        <item>jamais</item>
+        <item>256 KB</item>
+        <item>512 KB</item>
+        <item>1 MB</item>
+    </string-array>
+    <string-array name="filesizes_values">
+        <item>0</item>
+        <item>262144</item>
+        <item>524288</item>
+        <item>1048576</item>
+    </string-array>
+</resources>

res/values-fr/strings.xml 🔗

@@ -0,0 +1,86 @@
+<?xml version="1.0" encoding="utf-8"?>
+<resources>
+
+    <string name="app_name">Conversations</string>
+    <string name="action_settings">Paramètres</string>
+    <string name="action_add">Nouvelle conversation</string>
+    <string name="action_accounts">Gérer les comptes</string>
+    <string name="action_end_conversation">Terminer cette conversation</string>
+    <string name="action_contact_details">Détails du contact</string>
+    <string name="action_muc_details">Détails de la conférence</string>
+    <string name="action_secure">Conversation sécurisée</string>
+    <string name="action_add_account">Ajouter un compte</string>
+    <string name="title_activity_contacts">Contacts</string>
+    <string name="just_now">À l\'instant</string>
+    <string name="sending">envoi&#8230;</string>
+    <string name="announce_pgp">Renouveller les annonces PGP</string>
+    <string name="encrypted_message">Déchiffrement du message. Patientez&#8230;</string>
+    <string name="conference_details">Détails de la conférence</string>
+    <string name="nick_in_use">Cet identifiant est déjà utilisé.</string>
+    <string name="moderator">Modérateur</string>
+    <string name="participant">Participant</string>
+    <string name="visitor">Visiteur</string>
+    <string name="enter_new_name">Entrer un nouveau nom:</string>
+    <string name="remove_contact_text">Voulez-vous supprimer %s de votre liste? Les conversations associées à ce compte ne seront pas supprimées.</string>
+    <string name="untrusted_cert_hint">Le serveur %s utilise un certificat non certifié et peut-être auto-signé.</string>
+    <string name="account_info">Informations du serveur</string>
+    <string name="register_account">Créer un nouveau compte sur le serveur</string>
+    <string name="share_with">Partager avec</string>
+    <string name="ask_again"><u>Appuyez pour demander à nouveau</u></string>
+    <string name="show_otr_key">Empreinte OTR</string>
+    <string name="no_otr_fingerprint">Empreinte OTR non générée. Essayez de démarrer une conversation sécurisée.</string>
+    <string name="start_conversation">Démarrer une conversation</string>
+    <string name="invite_contacts">Inviter des contacts</string>
+    <string name="invite_contacts_to_existing">Inviter à une conférence</string>
+    <string name="new_conference">Créer une nouvelle conférence</string>
+    <string name="cancel">Annuler</string>
+    <string name="create_invite">Créer \u0026 invitation</string>
+    <string name="new_conference_explained">Voulez-vous créer une nouvelle conférence avec une adresse générée aléatoirement et inviter les contacts sélectionnés à la rejoindre?</string>
+    <string name="no_open_mucs">Conférences non existantes</string>
+    <string name="invitation_sent">Invitation envoyée</string>
+    <string name="account_offline">Compte hors-ligne</string>
+    <string name="cant_invite_while_offline">Vous devez être en ligne pour inviter des participants à une conférence.</string>
+    <string name="crash_report_title">Conversations s\'est arreté</string>
+    <string name="crash_report_message">En envoyant des logs vous aidez au développement de Conversations\n\n<b>Attention:</b> Votre compte XMPP sera utilisé pour envoyer les logs aux développeurs.</string>
+    <string name="send_now">Envoyer</string>
+    <string name="send_never">Ne plus me demander</string>
+    <string name="problem_connecting_to_account">Impossible de se connecter au compte</string>
+    <string name="problem_connecting_to_accounts">Impossible de se connecter aux comptes</string>
+    <string name="touch_to_fix">Appuyez pour gérer vos comptes</string>
+    <string name="attach_file">Lier un fichier</string>
+    <string name="not_in_roster">Le contact n\'est pas dans votre carnet d\'adresses. Voulez-vous l\'y ajouter?</string>
+    <string name="add_contact">Ajouter un contact</string>
+    <string name="send_failed">Echec de l\'envoi</string>
+    <string name="send_rejected">Rejeté</string>
+    <string name="receiving_image">Réception d\'une image. Patientez&#8230;</string>
+    <string name="preparing_image">Préparation de la transmission de l\'image. Patientez&#8230;</string>
+    <string name="action_clear_history">Vider l\'historique</string>
+    <string name="clear_conversation_history">Vider l\'historique de la conversation</string>
+    <string name="clear_histor_msg">Voulez-vous supprimer tous les messages de cette conversation?\n\n<b>Attention:</b> Les messages seront supprimés uniquement sur ce périphérique.</string>
+    <string name="delete_messages">Supprimer les messages</string>
+    <string name="also_end_conversation">Terminer plus tard cette conversation</string>
+    <string name="choose_presence">Choisir le status de présence</string>
+    <string name="send_message_to_conference">Envoyer un message à la conférence</string>
+    <string name="send_plain_text_message">Envoyer un message</string>
+    <string name="send_otr_message">Envoyer un message sécurisé par OTR</string>
+    <string name="send_pgp_message">Envoyer un message sécurisé par openPGP</string>
+    <string name="your_nick_has_been_changed">Votre identifiant a été changé</string>
+    <string name="download_image">Télecharger l\'image</string>
+    <string name="error_loading_image">Impossible de télécharger l\'image (Fichier non trouvé)</string>
+    <string name="image_offered_for_download"><i>Image proposée au téléchargement.</i></string>
+    <string name="not_connected">Non connecté</string>
+    <string name="you_are_offline">Vous devez être en ligne pour envoyer %s mais votre compte utilisé dans cette conversation est hors-ligne.</string>
+    <string name="you_are_offline_blank">Vous devez être en ligne pour réaliser cette action.</string>
+    <string name="files">Fichiers</string>
+    <string name="otr_messages">Message chiffrés par OTR</string>
+    <string name="manage_account">Gérer les comptes</string>
+    <string name="contact_offline">Votre correspondant est hors-ligne.</string>
+    <string name="contact_offline_otr">Envoyer un message chiffré via OTR à un correspondant hors-ligne n\'est malheureusement pas possible.\nVoulez-vous envoyer ce message sans chiffrement?</string>
+    <string name="contact_offline_file">Envoyer un fichier à un correspondant hors-ligne n\'est malheureusement pas possible.</string>
+    <string name="send_unencrypted">Envoyer en clair</string>
+    <string name="decryption_failed">Echec du déchiffrement. Merci de vérifier la clef privée utilisée.</string>
+    <string name="openkeychain_required">OpenKeychain</string>
+    <string name="openkeychain_required_long">Conversations requiert une application tierce nommée <b>OpenKeychain</b> pour chiffrer et déchiffrer les messages.\n\nOpenKeychain est sous licence GPLv3 et est disponible sur F-Droid et Google Play.\n\n<small>(Merci de redémarrer Conversations apres l\'installation du logiciel)</small></string>
+    <string name="restart">Redémarrer</string>
+    <string name="install">Installer</string>
+</resources>

res/values-fr/styles.xml 🔗

@@ -0,0 +1,19 @@
+<resources xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <style name="sectionHeader" parent="android:Widget.Holo.Light.TextView">
+        <item name="android:drawableBottom">@drawable/section_header</item>
+        <item name="android:drawablePadding">4dp</item>
+        <item name="android:layout_marginTop">8dp</item>
+        <item name="android:textSize">14sp</item>
+        <item name="android:textAllCaps">true</item>
+        <item name="android:textColor">#5b5b5b</item>
+        <item name="android:textStyle">bold</item>
+    </style>
+
+    <style name="Divider">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">1.5dp</item>
+        <item name="android:background">#b7b7b7</item>
+    </style>
+
+</resources>

res/values/strings.xml 🔗

@@ -120,4 +120,12 @@
     <string name="error_copying_image_file">Error copying image file.</string>
     <string name="accept">Accept</string>
     <string name="error">An error has occurred</string>
+    <string name="pref_grant_presence_updates">Grant presence updates</string>
+    <string name="pref_grant_presence_updates_summary">Preemptively grant and ask for presence subscription for contacts you created</string>
+    <string name="subscriptions">Subscriptions</string>
+    <string name="your_account">Your account</string>
+    <string name="keys">Keys</string>
+    <string name="send_presence_updates">Send presence updates</string>
+    <string name="receive_presence_updates">Receive presence updates</string>
+    <string name="ask_for_presence_updates">Ask for presence updates</string>
 </resources>

res/xml/preferences.xml 🔗

@@ -4,8 +4,8 @@
         android:title="General">
         <CheckBoxPreference 
             android:key="grant_new_contacts"
-            android:title="Grant presence updates"
-            android:summary="Preemptively grant and ask for presence subscription for contacts you created"
+            android:title="@string/pref_grant_presence_updates"
+            android:summary="@string/pref_grant_presence_updates_summary"
             android:defaultValue="true"
             />
         <ListPreference 

src/eu/siacs/conversations/ui/ContactDetailsActivity.java 🔗

@@ -173,7 +173,7 @@ public class ContactDetailsActivity extends XmppActivity {
 		if (contact.getSubscriptionOption(Contact.Subscription.FROM)) {
 			send.setChecked(true);
 		} else {
-			send.setText("Preemptively grant subscription request");
+			send.setText(R.string.preemptively_grant);
 			if (contact
 					.getSubscriptionOption(Contact.Subscription.PREEMPTIVE_GRANT)) {
 				send.setChecked(true);
@@ -184,7 +184,7 @@ public class ContactDetailsActivity extends XmppActivity {
 		if (contact.getSubscriptionOption(Contact.Subscription.TO)) {
 			receive.setChecked(true);
 		} else {
-			receive.setText("Ask for presence updates");
+			receive.setText(R.string.ask_for_presence_updates);
 			askAgain.setVisibility(View.VISIBLE);
 			askAgain.setOnClickListener(new OnClickListener() {
 				

src/eu/siacs/conversations/xml/TagWriter.java 🔗

@@ -23,8 +23,12 @@ public class TagWriter {
 				}
 				try {
 					AbstractStanza output = writeQueue.take();
-					outputStream.write(output.toString());
-					outputStream.flush();
+					if (outputStream==null) {
+						shouldStop = true;
+					} else {
+						outputStream.write(output.toString());
+						outputStream.flush();
+					}
 				} catch (IOException e) {
 					shouldStop = true;
 				} catch (InterruptedException e) {

src/eu/siacs/conversations/xmpp/jingle/JingleConnection.java 🔗

@@ -135,7 +135,7 @@ public class JingleConnection {
 	}
 	
 	public void deliverPacket(JinglePacket packet) {
-		
+		boolean returnResult = true;
 		if (packet.isAction("session-terminate")) {
 			Reason reason = packet.getReason();
 			if (reason!=null) {
@@ -143,26 +143,37 @@ public class JingleConnection {
 					this.receiveCancel();
 				} else if (reason.hasChild("success")) {
 					this.receiveSuccess();
+				} else {
+					this.receiveCancel();
 				}
 			} else {
-				Log.d("xmppService","remote terminated for no reason");
 				this.receiveCancel();
 			}
-			} else if (packet.isAction("session-accept")) {
-			receiveAccept(packet);
+		} else if (packet.isAction("session-accept")) {
+			returnResult = receiveAccept(packet);
 		} else if (packet.isAction("transport-info")) {
-			receiveTransportInfo(packet);
+			returnResult = receiveTransportInfo(packet);
 		} else if (packet.isAction("transport-replace")) {
 			if (packet.getJingleContent().hasIbbTransport()) {
-				this.receiveFallbackToIbb(packet);
+				returnResult = this.receiveFallbackToIbb(packet);
 			} else {
+				returnResult = false;
 				Log.d("xmppService","trying to fallback to something unknown"+packet.toString());
 			}
 		} else if (packet.isAction("transport-accept")) {
-			this.receiveTransportAccept(packet);
+			returnResult = this.receiveTransportAccept(packet);
 		} else {
 			Log.d("xmppService","packet arrived in connection. action was "+packet.getAction());
+			returnResult = false;
 		}
+		IqPacket response;
+		if (returnResult) {
+			response = packet.generateRespone(IqPacket.TYPE_RESULT);
+			
+		} else {
+			response = packet.generateRespone(IqPacket.TYPE_ERROR);
+		}
+		account.getXmppConnection().sendIqPacket(response, null);
 	}
 	
 	public void init(Message message) {
@@ -356,17 +367,16 @@ public class JingleConnection {
 		account.getXmppConnection().sendIqPacket(packet,responseListener);
 	}
 	
-	private void receiveAccept(JinglePacket packet) {
+	private boolean receiveAccept(JinglePacket packet) {
 		Content content = packet.getJingleContent();
 		mergeCandidates(JingleCandidate.parse(content.socks5transport().getChildren()));
 		this.status = STATUS_ACCEPTED;
 		mXmppConnectionService.markMessage(message, Message.STATUS_UNSEND);
 		this.connectNextCandidate();
-		IqPacket response = packet.generateRespone(IqPacket.TYPE_RESULT);
-		account.getXmppConnection().sendIqPacket(response, null);
+		return true;
 	}
 
-	private void receiveTransportInfo(JinglePacket packet) {
+	private boolean receiveTransportInfo(JinglePacket packet) {
 		Content content = packet.getJingleContent();
 		if (content.hasSocks5Transport()) {
 			if (content.socks5transport().hasChild("activated")) {
@@ -383,14 +393,17 @@ public class JingleConnection {
 						this.sendCancel();
 					}
 				}
-			} else if (content.socks5transport().hasChild("activated")) {
+				return true;
+			} else if (content.socks5transport().hasChild("proxy-error")) {
 				onProxyActivated.failed();
+				return true;
 			} else if (content.socks5transport().hasChild("candidate-error")) {
 				Log.d("xmppService","received candidate error");
 				this.receivedCandidate = true;
 				if ((status == STATUS_ACCEPTED)&&(this.sentCandidate)) {
 					this.connect();
 				}
+				return true;
 			} else if (content.socks5transport().hasChild("candidate-used")){
 				String cid = content.socks5transport().findChild("candidate-used").getAttribute("cid");
 				if (cid!=null) {
@@ -403,16 +416,16 @@ public class JingleConnection {
 					} else {
 						Log.d("xmppService","ignoring because file is already in transmission or we havent sent our candidate yet");
 					}
+					return true;
 				} else {
-					Log.d("xmppService","couldn't read used candidate");
+					return false;
 				}
 			} else {
-				Log.d("xmppService","empty transport");
+				return false;
 			}
+		} else {
+			return true;
 		}
-		
-		IqPacket response = packet.generateRespone(IqPacket.TYPE_RESULT);
-		account.getXmppConnection().sendIqPacket(response, null);
 	}
 
 	private void connect() {
@@ -502,6 +515,7 @@ public class JingleConnection {
 		this.disconnect();
 		this.status = STATUS_FINISHED;
 		this.mXmppConnectionService.markMessage(this.message, Message.STATUS_RECIEVED);
+		this.mJingleConnectionManager.finishConnection(this);
 	}
 	
 	private void sendFallbackToIbb() {
@@ -514,7 +528,7 @@ public class JingleConnection {
 		this.sendJinglePacket(packet);
 	}
 	
-	private void receiveFallbackToIbb(JinglePacket packet) {
+	private boolean receiveFallbackToIbb(JinglePacket packet) {
 		String receivedBlockSize = packet.getJingleContent().ibbTransport().getAttribute("block-size");
 		if (receivedBlockSize!=null) {
 			int bs = Integer.parseInt(receivedBlockSize);
@@ -531,9 +545,10 @@ public class JingleConnection {
 		content.ibbTransport().setAttribute("block-size", ""+this.ibbBlockSize);
 		answer.setContent(content);
 		this.sendJinglePacket(answer);
+		return true;
 	}
 	
-	private void receiveTransportAccept(JinglePacket packet) {
+	private boolean receiveTransportAccept(JinglePacket packet) {
 		if (packet.getJingleContent().hasIbbTransport()) {
 			String receivedBlockSize = packet.getJingleContent().ibbTransport().getAttribute("block-size");
 			if (receivedBlockSize!=null) {
@@ -555,8 +570,9 @@ public class JingleConnection {
 					JingleConnection.this.transport.send(file, onFileTransmitted);
 				}
 			});
+			return true;
 		} else {
-			Log.d("xmppService","invalid transport accept");
+			return false;
 		}
 	}
 	
@@ -564,12 +580,14 @@ public class JingleConnection {
 		this.status = STATUS_FINISHED;
 		this.mXmppConnectionService.markMessage(this.message, Message.STATUS_SEND);
 		this.disconnect();
+		this.mJingleConnectionManager.finishConnection(this);
 	}
 	
 	private void receiveCancel() {
 		this.disconnect();
 		this.status = STATUS_CANCELED;
 		this.mXmppConnectionService.markMessage(this.message, Message.STATUS_SEND_REJECTED);
+		this.mJingleConnectionManager.finishConnection(this);
 	}
 	
 	private void sendCancel() {

src/eu/siacs/conversations/xmpp/jingle/JingleConnectionManager.java 🔗

@@ -51,15 +51,19 @@ public class JingleConnectionManager {
 	public JingleConnection createNewConnection(Message message) {
 		JingleConnection connection = new JingleConnection(this);
 		connection.init(message);
-		connections.add(connection);
+		this.connections.add(connection);
 		return connection;
 	}
 
 	public JingleConnection createNewConnection(JinglePacket packet) {
 		JingleConnection connection = new JingleConnection(this);
-		connections.add(connection);
+		this.connections.add(connection);
 		return connection;
 	}
+	
+	public void finishConnection(JingleConnection connection) {
+		this.connections.remove(connection);
+	}
 
 	public XmppConnectionService getXmppConnectionService() {
 		return this.xmppConnectionService;