diff options
Diffstat (limited to 'src/main')
7 files changed, 125 insertions, 82 deletions
diff --git a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java index 9dfe179c1..fe1871eaf 100644 --- a/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java +++ b/src/main/java/eu/siacs/conversations/services/MessageArchiveService.java @@ -3,7 +3,9 @@ package eu.siacs.conversations.services; import android.util.Log; import java.math.BigInteger; +import java.util.ArrayList; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import eu.siacs.conversations.Config; @@ -22,6 +24,7 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { private final XmppConnectionService mXmppConnectionService; private final HashSet<Query> queries = new HashSet<Query>(); + private ArrayList<Query> pendingQueries = new ArrayList<Query>(); public enum PagingOrder { NORMAL, @@ -83,18 +86,41 @@ public class MessageArchiveService implements OnAdvancedStreamFeaturesLoaded { } } + public void executePendingQueries(final Account account) { + List<Query> pending = new ArrayList<>(); + synchronized(this.pendingQueries) { + for(Iterator<Query> iterator = this.pendingQueries.iterator(); iterator.hasNext();) { + Query query = iterator.next(); + if (query.getAccount() == account) { + pending.add(query); + iterator.remove(); + } + } + } + for(Query query : pending) { + this.execute(query); + } + } + private void execute(final Query query) { - Log.d(Config.LOGTAG,query.getAccount().getJid().toBareJid().toString()+": running mam query "+query.toString()); - IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(query); - this.mXmppConnectionService.sendIqPacket(query.getAccount(), packet, new OnIqPacketReceived() { + final Account account= query.getAccount(); + if (account.getStatus() == Account.State.ONLINE) { + Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": running mam query " + query.toString()); + IqPacket packet = this.mXmppConnectionService.getIqGenerator().queryMessageArchiveManagement(query); + this.mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() { @Override public void onIqPacketReceived(Account account, IqPacket packet) { if (packet.getType() == IqPacket.TYPE_ERROR) { - Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": error executing mam: "+packet.toString()); + Log.d(Config.LOGTAG, account.getJid().toBareJid().toString() + ": error executing mam: " + packet.toString()); finalizeQuery(query); } } }); + } else { + synchronized (this.pendingQueries) { + this.pendingQueries.add(query); + } + } } private void finalizeQuery(Query query) { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 9b1ecdeae..ef93dcc79 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -160,6 +160,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa for (Conversation conversation : account.pendingConferenceJoins) { joinMuc(conversation); } + mMessageArchiveService.executePendingQueries(account); mJingleConnectionManager.cancelInTransmission(); List<Conversation> conversations = getConversations(); for (Conversation conversation : conversations) { @@ -2085,6 +2086,16 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } + public void clearConversationHistory(final Conversation conversation) { + conversation.clearMessages(); + new Thread(new Runnable() { + @Override + public void run() { + databaseBackend.deleteMessagesInConversation(conversation); + } + }).start(); + } + public interface OnConversationUpdate { public void onConversationUpdate(); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index a5efe12e0..6656de2b3 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -491,7 +491,7 @@ public class ConversationActivity extends XmppActivity implements @Override public void onClick(DialogInterface dialog, int which) { - conversation.clearMessages(); + ConversationActivity.this.xmppConnectionService.clearConversationHistory(conversation); if (endConversationCheckBox.isChecked()) { endConversation(conversation); } else { diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 320626991..478586b92 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -268,7 +268,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { @Override public void onClick(View v) { - startDonwloadable(message); + startDownloadable(message); } }); viewHolder.download_button.setOnLongClickListener(openContextMenu); @@ -284,7 +284,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { @Override public void onClick(View v) { - openDonwloadable(file); + openDownloadable(file); } }); viewHolder.download_button.setOnLongClickListener(openContextMenu); @@ -438,6 +438,8 @@ public class MessageAdapter extends ArrayAdapter<Message> { } view.setLayoutParams(view.getLayoutParams()); return view; + } else if (viewHolder.messageBody == null || viewHolder.image == null) { + return view; //avoiding weird platform bugs } else if (type == RECEIVED) { Contact contact = message.getContact(); if (contact != null) { @@ -446,38 +448,36 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder.contact_picture.setImageBitmap(activity.avatarService().get(getDisplayedMucCounterpart(message.getCounterpart()), activity.getPixel(48))); } - } else if (type == SENT && viewHolder.contact_picture != null) { + } else if (type == SENT) { viewHolder.contact_picture.setImageBitmap(activity.avatarService().get(account, activity.getPixel(48))); } - if (viewHolder != null && viewHolder.contact_picture != null) { - viewHolder.contact_picture - .setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View v) { - if (MessageAdapter.this.mOnContactPictureClickedListener != null) { - MessageAdapter.this.mOnContactPictureClickedListener - .onContactPictureClicked(message); - } + viewHolder.contact_picture + .setOnClickListener(new OnClickListener() { + @Override + public void onClick(View v) { + if (MessageAdapter.this.mOnContactPictureClickedListener != null) { + MessageAdapter.this.mOnContactPictureClickedListener + .onContactPictureClicked(message); } - }); - viewHolder.contact_picture - .setOnLongClickListener(new OnLongClickListener() { - - @Override - public boolean onLongClick(View v) { - if (MessageAdapter.this.mOnContactPictureLongClickedListener != null) { - MessageAdapter.this.mOnContactPictureLongClickedListener - .onContactPictureLongClicked(message); - return true; - } else { - return false; - } + + } + }); + viewHolder.contact_picture + .setOnLongClickListener(new OnLongClickListener() { + + @Override + public boolean onLongClick(View v) { + if (MessageAdapter.this.mOnContactPictureLongClickedListener != null) { + MessageAdapter.this.mOnContactPictureLongClickedListener + .onContactPictureLongClicked(message); + return true; + } else { + return false; } - }); - } + } + }); if (message.getDownloadable() != null && message.getDownloadable().getStatus() != Downloadable.STATUS_UPLOADING) { Downloadable d = message.getDownloadable(); @@ -546,7 +546,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { return view; } - public void startDonwloadable(Message message) { + public void startDownloadable(Message message) { Downloadable downloadable = message.getDownloadable(); if (downloadable != null) { if (!downloadable.start()) { @@ -556,7 +556,7 @@ public class MessageAdapter extends ArrayAdapter<Message> { } } - public void openDonwloadable(DownloadableFile file) { + public void openDownloadable(DownloadableFile file) { if (!file.exists()) { Toast.makeText(activity,R.string.file_deleted,Toast.LENGTH_SHORT).show(); return; diff --git a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java index 2aa6f5738..a09b4d0fe 100644 --- a/src/main/java/eu/siacs/conversations/utils/DNSHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/DNSHelper.java @@ -140,23 +140,17 @@ public class DNSHelper { } ArrayList<Bundle> values = new ArrayList<>(); for (SRV srv : result) { - Bundle namePort = new Bundle(); - namePort.putString("name", srv.getName()); - namePort.putInt("port", srv.getPort()); + boolean added = false; if (ips6.containsKey(srv.getName())) { - ArrayList<String> ip = ips6.get(srv.getName()); - Collections.shuffle(ip, rnd); - namePort.putString("ip", ip.get(0)); - values.add(namePort); + values.add(createNamePortBundle(srv.getName(),srv.getPort(),ips6)); + added = true; } if (ips4.containsKey(srv.getName())) { - ArrayList<String> ip = ips4.get(srv.getName()); - Collections.shuffle(ip, rnd); - namePort.putString("ip", ip.get(0)); - values.add(namePort); + values.add(createNamePortBundle(srv.getName(),srv.getPort(),ips4)); + added = true; } - if (!ips6.containsKey(srv.getName()) && !ips4.containsKey(srv.getName())) { - values.add(namePort); + if (!added) { + values.add(createNamePortBundle(srv.getName(),srv.getPort(),null)); } } bundle.putParcelableArrayList("values", values); @@ -168,6 +162,18 @@ public class DNSHelper { return bundle; } + private static Bundle createNamePortBundle(String name, int port, TreeMap<String, ArrayList<String>> ips) { + Bundle namePort = new Bundle(); + namePort.putString("name", name); + namePort.putInt("port", port); + if (ips!=null) { + ArrayList<String> ip = ips.get(name); + Collections.shuffle(ip, new Random()); + namePort.putString("ip", ip.get(0)); + } + return namePort; + } + final protected static char[] hexArray = "0123456789ABCDEF".toCharArray(); public static String bytesToHex(byte[] bytes) { diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index aad54aeb3..e02c0f026 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -7,7 +7,7 @@ <string name="action_accounts">Gestionar cuentas</string> <string name="action_end_conversation">Terminar conversación</string> <string name="action_contact_details">Detalles del contacto</string> - <string name="action_muc_details">Detalles de la conferencia</string> + <string name="action_muc_details">Detalles de conversación en grupo</string> <string name="action_secure">Conversación segura</string> <string name="action_add_account">Añadir cuenta</string> <string name="action_edit_contact">Editar contacto</string> @@ -15,7 +15,7 @@ <string name="action_add_phone_book">Añadir a contactos del teléfono</string> <string name="title_activity_manage_accounts">Gestionar Cuentas</string> <string name="title_activity_settings">Ajustes</string> - <string name="title_activity_conference_details">Detalles de Conferencia</string> + <string name="title_activity_conference_details">Detalles de Conversación en grupo</string> <string name="title_activity_contact_details">Detalles del Contacto</string> <string name="title_activity_conversations">Conversations</string> <string name="title_activity_sharewith">Compartir con Conversación</string> @@ -34,7 +34,7 @@ <string name="participant">Participante</string> <string name="visitor">Visitante</string> <string name="remove_contact_text">¿Quieres eliminar a %s de tu lista? La conversación asociada a esta cuenta no se eliminará.</string> - <string name="remove_bookmark_text">¿Quieres eliminar %s de tus marcadores? La conversación de la conferencia asociada con este marcador no se eliminará.</string> + <string name="remove_bookmark_text">¿Quieres eliminar %s de tus marcadores? La conversación asociada con este marcador no se eliminará.</string> <string name="register_account">Registrar nueva cuenta en servidor</string> <string name="share_with">Compartir con</string> <string name="start_conversation">Comenzar conversación</string> @@ -67,8 +67,8 @@ <string name="also_end_conversation">Terminar esta conversación más tarde</string> <string name="choose_presence">Selecciona recurso del contacto</string> <string name="send_plain_text_message">Enviar mensaje de texto</string> - <string name="send_otr_message">Enviar mensaje encriptado con OTR</string> - <string name="send_pgp_message">Enviar mensaje encriptado con OpenPGP</string> + <string name="send_otr_message">Enviar mensaje cifrado con OTR</string> + <string name="send_pgp_message">Enviar mensaje cifrado con OpenPGP</string> <string name="your_nick_has_been_changed">Tu apodo se ha modificado</string> <string name="download_image">Descargar imagen</string> <string name="image_offered_for_download"><i>Archivo de imagen ofrecido para descarga</i></string> @@ -84,7 +84,7 @@ <string name="contact_has_no_pgp_key">Conversations no ha podido encriptar tus mensajes porque el contacto no está anunciando su clave publica.\n\n<small>Por favor, pide a tu contacto que configure OpenPGP.</small></string> <string name="no_pgp_keys">Claves OpenPGP no encontradas</string> <string name="contacts_have_no_pgp_keys">Conversations no ha podido encriptar tus mensajes porque tus contactos no están anunciando su clave publica.\n\n<small>Por favor, pide a tus contactos que configuren OpenPGP.</small></string> - <string name="encrypted_message_received"><i>Mensaje encriptado recibido. Pulsa para ver.</i></string> + <string name="encrypted_message_received"><i>Mensaje cifrado recibido. Pulsa para ver.</i></string> <string name="encrypted_image_received"><i>Imagen encriptada recibida. Pulsa para ver.</i></string> <string name="image_file"><i>Imagen recibida. Pulsa para ver</i></string> <string name="pref_general">General</string> @@ -99,12 +99,12 @@ <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_conference_notifications">Notif. conversación grupo</string> + <string name="pref_conference_notifications_summary">Siempre notifica cuando llega un mensaje a una conversación en grupo 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_advanced_options">Opciones avanzadas</string> - <string name="pref_never_send_crash">Nunca enviar errores</string> + <string name="pref_never_send_crash">Nunca informar de errores</string> <string name="pref_never_send_crash_summary">Si envías registros de error ayudas al desarrollo de Conversations</string> <string name="pref_confirm_messages">Confirmar Mensajes</string> <string name="pref_confirm_messages_summary">Permitir a tus contactos saber cuando recibes y lees un mensaje</string> @@ -171,7 +171,7 @@ <string name="contact_status_extended_away">Ausencia extendida</string> <string name="contact_status_do_not_disturb">No molestar</string> <string name="contact_status_offline">Desconectado</string> - <string name="muc_details_conference">Conferencia</string> + <string name="muc_details_conference">Conversación en grupo</string> <string name="muc_details_other_members">Otros Miembros</string> <string name="server_info_carbon_messages">XEP-0280: Message Carbons</string> <string name="server_info_stream_management">XEP-0198: Stream Management</string> @@ -187,31 +187,31 @@ <string name="last_seen_day">Visto última vez hace 1 día</string> <string name="last_seen_days">Visto última vez hace %d días</string> <string name="never_seen">Nunca visto</string> - <string name="install_openkeychain">Mensaje encriptado. Por favor instala OpenKeychain para desencriptar.</string> + <string name="install_openkeychain">Mensaje cifrado. Por favor instala OpenKeychain para desencriptar.</string> <string name="unknown_otr_fingerprint">Huella digital OTR desconocida</string> - <string name="openpgp_messages_found">Encontrado mensaje encriptado con OpenPGP</string> + <string name="openpgp_messages_found">Encontrado mensaje cifrado con OpenPGP</string> <string name="reception_failed">Error al recibir</string> <string name="your_fingerprint">Tu huella digital</string> <string name="otr_fingerprint">Huella digital OTR</string> <string name="verify">Verificar</string> <string name="decrypt">Desencriptar</string> - <string name="conferences">Conferencias</string> + <string name="conferences">Convers. Grupo</string> <string name="search">Buscar</string> <string name="create_contact">Crear Contacto</string> - <string name="join_conference">Unirse a Conferencia</string> + <string name="join_conference">Unirse a Conversación grupo</string> <string name="delete_contact">Eliminar Contacto</string> <string name="view_contact_details">Ver detalles del contacto</string> <string name="create">Crear</string> <string name="contact_already_exists">El contacto ya existe</string> <string name="join">Unirse</string> - <string name="conference_address">Dirección de la Conferencia</string> - <string name="conference_address_example">nombre@conferencia.ejemplo.com</string> + <string name="conference_address">Dirección</string> + <string name="conference_address_example">nombre@salas.ejemplo.com</string> <string name="save_as_bookmark">Guardar en marcadores</string> <string name="delete_bookmark">Eliminar marcador</string> <string name="bookmark_already_exists">Este marcador ya exsite</string> <string name="you">Tú</string> - <string name="action_edit_subject">Editar asunto de la conferencia</string> - <string name="conference_not_found">Conferencia no encontrada</string> + <string name="action_edit_subject">Editar asunto de la conversación</string> + <string name="conference_not_found">Conversación en grupo no encontrada</string> <string name="leave">Salir</string> <string name="contact_added_you">El contacto te ha añadido a su lista de contactos</string> <string name="add_back">Añadir contacto</string> @@ -238,19 +238,19 @@ <string name="disable_notifications_for_this_conversation">Deshabilitar notificaciones para esta conversación</string> <string name="notifications_disabled">Las notificaciones están deshabilitadas</string> <string name="enable">Habilitar</string> - <string name="conference_requires_password">La conferencia requiere contraseña</string> + <string name="conference_requires_password">La conversación en grupo requiere contraseña</string> <string name="enter_password">Introduce la contraseña</string> <string name="missing_presence_updates">Suscripción de actualizaciones de presencia del contacto perdida</string> <string name="request_presence_updates">Por favor, solicita la suscripción de presencia a tu contacto primero.\n\n<small>Esto será usado para determinar qué cliente(s) está usando tu contacto.</small></string> <string name="request_now">Solicitar ahora</string> <string name="delete_fingerprint">Eliminar huella digital OTR</string> - <string name="sure_delete_fingerprint">¿Estás seguro que quieres eliminar esta huella digital OTR?</string> + <string name="sure_delete_fingerprint">¿Estás seguro de que quieres eliminar esta huella digital OTR?</string> <string name="ignore">Ignorar</string> <string name="without_mutual_presence_updates"><b>Aviso:</b> Enviando esto sin suscripción de presencia por ambas partes podría causar problemas inesperados.\n\n<small>Verficia la suscripción de presencia en detalles del contacto.</small></string> <string name="pref_encryption_settings">Ajustes de encriptación</string> - <string name="pref_force_encryption">Forzar encriptación end-to-end</string> - <string name="pref_force_encryption_summary">Siempre enviar mensajes encriptados (excepto para conferencias)</string> - <string name="pref_dont_save_encrypted">No guardar mensajes encriptados</string> + <string name="pref_force_encryption">Forzar cifrado end-to-end</string> + <string name="pref_force_encryption_summary">Siempre enviar mensajes cifrados (excepto para conversaciones en grupo)</string> + <string name="pref_dont_save_encrypted">No guardar mensajes cifrados</string> <string name="pref_dont_save_encrypted_summary">Aviso: Esto podría llevar a pérdida de mensajes</string> <string name="pref_enable_legacy_ssl">Habilitar SSL heredado</string> <string name="pref_enable_legacy_ssl_summary">Habilita soporte SSLv3 para servidores heredados. Advertencia: SSLv3 se considera no seguro.</string> @@ -265,12 +265,12 @@ <string name="pref_use_indicate_received_summary">Cuando el contacto reciba el mensaje será indicado con una marca verde. Cuidado, esto podría no funcionar en todos los casos.</string> <string name="pref_use_send_button_to_indicate_status_summary">El color del botón enviar indica el estado del contacto</string> <string name="pref_expert_options_other">Otros</string> - <string name="pref_conference_name">Nombre de conferencia</string> - <string name="pref_conference_name_summary">Usar el asunto de la conferencia en lugar del identificador jabber como nombre de conferencia</string> + <string name="pref_conference_name">Nombre conversación grupo</string> + <string name="pref_conference_name_summary">Usar el asunto de la conversación en lugar del identificador jabber como nombre en las conversaciones en grupo</string> <string name="toast_message_otr_fingerprint">¡Huella digital OTR copiada al portapapeles!</string> - <string name="conference_banned">Tu entrada a esta conferencia ha sido prohibida</string> - <string name="conference_members_only">Esta conferencia es solo para miembros</string> - <string name="conference_kicked">Has sido expulsado de esta conferencia</string> + <string name="conference_banned">Tu entrada a esta conversación ha sido prohibida</string> + <string name="conference_members_only">Esta conversación es solo para miembros</string> + <string name="conference_kicked">Has sido expulsado de esta conversación</string> <string name="using_account">Usando cuenta %s</string> <string name="checking_image">Comprobando imagen en servidor HTTP</string> <string name="image_file_deleted">El archivo de imagen ha sido eliminado</string> @@ -309,7 +309,7 @@ <string name="conversations_foreground_service">Conversations</string> <string name="touch_to_disable">Pulsa para deshabilitar servicio en primer plano</string> <string name="pref_keep_foreground_service">Servicio en primer plano</string> - <string name="pref_keep_foreground_service_summary">Mantener el servicio en primier plano previene que el sistema cierre la conexión</string> + <string name="pref_keep_foreground_service_summary">Mantener el servicio en primer plano previene que el sistema cierre la conexión</string> <string name="choose_file">Seleccionar archivo</string> <string name="receiving_file">Recibiendo archivo %1$s (%2$d%% completado)</string> <string name="download_file">Descargar archivo %s</string> @@ -328,10 +328,10 @@ <string name="pref_show_dynamic_tags">Mostrar etiquetas</string> <string name="pref_show_dynamic_tags_summary">Muestra información en forma de etiquetas debajo de los contactos</string> <string name="enable_notifications">Habilitar notificaciones</string> - <string name="conference_with">Crear conferencia con…</string> - <string name="no_conference_server_found">No se ha encontrado el servidor de conferencias</string> - <string name="conference_creation_failed">¡La creación de la conferencia ha fallado!</string> - <string name="conference_created">¡Conferencia creada!</string> + <string name="conference_with">Crear conversación en grupo</string> + <string name="no_conference_server_found">No se ha encontrado el servidor para crear la conversación en grupo</string> + <string name="conference_creation_failed">¡La creación de la conversación en grupo ha fallado!</string> + <string name="conference_created">¡Conversación en grupo creada!</string> <string name="secret_accepted">¡Secreto aceptado!</string> <string name="reset">Reinicializar</string> <string name="account_image_description">Imagen de perfil</string> diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index dab7471db..703dab9d3 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -217,7 +217,7 @@ <string name="add_back">Add back</string> <string name="contact_has_read_up_to_this_point">%s ha letto fino a questo punto</string> <string name="publish">Pubblica</string> - <string name="touch_to_choose_picture">Tocca l\'avatar per selezionare l\'immagine dalla gallaria</string> + <string name="touch_to_choose_picture">Tocca l\'avatar per selezionare l\'immagine dalla galleria</string> <string name="publish_avatar_explanation">Nota bene: tutti i contatti sottoscritti agli aggiornamenti della tua presenza avranno il permesso di vedere questa immagine.</string> <string name="publishing">Pubblicazione…</string> <string name="error_publish_avatar_server_reject">Il server ha rifiutato la tua pubblicazione</string> |