Updates Spanish translations.

Updates Spanish translations.

--- src/status_im/translations/es.cljs
+++ src/status_im/translations/es.cljs
@@ -2,50 +2,67 @@

 (def translations
   {
-   ;common
+   ;;common
    :members-title                         "Miembros"
    :not-implemented                       "¡No se ha implementado!"
    :chat-name                             "Nombre del chat"
    :notifications-title                   "Notificaciones y sonidos"
    :offline                               "Desconectado"
-
-   ;drawer
-   :invite-friends                        "Invitar amigos"
-   :faq                                   "Preguntas más frecuentes"
-   :switch-users                          "Cambiar usuarios"
-
-   ;chat
+   :search-for                            "Buscar..."
+   :cancel                                "Cancelar"
+   :next                                  "Siguiente"
+   :open                                  "Abrir"
+   :description                           "Descripción"
+   :url                                   "URL"
+   :type-a-message                        "Escribe un mensaje..."
+   :type-a-command                        "Comienza escribiendo un comando..."
+   :error                                 "Error"
+   :unknown-status-go-error               "Error de status-go desconocido"
+   :node-unavailable                      "No existe un nodo en funcionamiento"
+   :yes                                   "Sí"
+   :no                                    "No"
+
+   :camera-access-error                   "Para conceder el permiso requerido de la cámara, por favor dirígete a los ajustes del sistema y asegúrate que Status > Cámara está seleccionado."
+   :photos-access-error                   "Para conceder el permiso requerido de fotos, por favor dirígete a los ajustes del sistema y asegúrate de que Status > Fotos está seleccionado."
+
+   ;;drawer
+   :switch-users                          "Cambio de usuario"
+   :current-network                       "Red actual"
+
+   ;;chat
    :is-typing                             "está escribiendo"
    :and-you                               "y tú"
    :search-chat                           "Buscar chat"
    :members                               {:one   "1 miembro"
                                            :other "{{count}} miembros"
                                            :zero  "sin miembros"}
-   :members-active                        {:one   "1 miembro, 1 activo"
-                                           :other "{{count}} miembros, {{count}} activos"
-                                           :zero  " sin miembros"}
+   :members-active                        {:one   "1 miembro"
+                                           :other "{{count}} miembros"
+                                           :zero  "sin miembros"}
+   :public-group-status                   "Público"
    :active-online                         "En línea"
    :active-unknown                        "Desconocido"
    :available                             "Disponible"
-   :no-messages                           "No hay mensajes"
+   :no-messages                           "Sin mensajes"
    :suggestions-requests                  "Peticiones"
    :suggestions-commands                  "Comandos"
-
-   ;sync
+   :faucet-success                        "La petición de la fuente ha sido recibida"
+   :faucet-error                          "La petición de la fuente falló"
+
+   ;;sync
    :sync-in-progress                      "Sincronizando..."
    :sync-synced                           "Sincronizado"

-   ;messages
-   :status-sending                        "Enviando"
+   ;;messages
    :status-pending                        "Pendiente"
    :status-sent                           "Enviado"
    :status-seen-by-everyone               "Visto por todos"
    :status-seen                           "Visto"
    :status-delivered                      "Entregado"
-   :status-failed                         "Fallido"
-
-   ;datetime
-   :datetime-ago-format                   "{{ago}} {{number}} {{time-intervals}}"
+   :status-failed                         "Fallído"
+
+   ;;datetime
+   :datetime-ago-format                   "{{number}} {{time-intervals}} {{ago}}"
    :datetime-second                       {:one   "segundo"
                                            :other "segundos"}
    :datetime-minute                       {:one   "minuto"
@@ -54,254 +71,295 @@
                                            :other "horas"}
    :datetime-day                          {:one   "día"
                                            :other "días"}
-   :datetime-multiple                     "s"
    :datetime-ago                          "hace"
    :datetime-yesterday                    "ayer"
    :datetime-today                        "hoy"

-   ;profile
+   ;;profile
    :profile                               "Perfil"
-   :report-user                           "DENUNCIAR AL USUARIO"
+   :edit-profile                          "Editar perfil"
    :message                               "Mensaje"
-   :username                              "Nombre de usuario"
    :not-specified                         "No especificado"
    :public-key                            "Clave pública"
    :phone-number                          "Número de teléfono"
-   :email                                 "Correo electrónico"
-   :profile-no-status                     "Sin estado"
+   :update-status                         "Actualiza tu estado..."
+   :add-a-status                          "Añade un estado..."
+   :status-prompt                         "Establece tu estado. Usando #hastags permitirás que los demás te encuentren y podrás hablar sobre lo que tengas en mente"
    :add-to-contacts                       "Añadir a contactos"
-   :error-incorrect-name                  "Por favor, selecciona otro nombre"
-   :error-incorrect-email                 "Correo electrónico incorrecto"
+   :in-contacts                           "En contactos"
+   :remove-from-contacts                  "Eliminar de contactos"
+   :start-conversation                    "Empezar conversación"
+   :send-transaction                      "Enviar transacción"
+   :testnet-text                          "Estás en la red de prueba {{testnet}}. No envíes ETH o SNT real a tu dirección"
+   :mainnet-text                          "Estás en la red principal. Se enviará ETH real"

    ;;make_photo
-   :image-source-title                    "Imagen de perfil"
-   :image-source-make-photo               "Capturar"
+   :image-source-title                    "Imágen de perfil"
+   :image-source-make-photo               "Captura"
    :image-source-gallery                  "Seleccionar de la galería"
-   :image-source-cancel                   "Cancelar"

    ;;sharing
-   :sharing-copy-to-clipboard             "Copiar"
+   :sharing-copy-to-clipboard             "Copiar al portapapeles"
    :sharing-share                         "Compartir..."
    :sharing-cancel                        "Cancelar"

-   ;sign-up
-   :contacts-syncronized                  "Se han sincronizado tus contactos"
-   :confirmation-code                     (str "¡Gracias! Te hemos enviado un mensaje de texto con un código"
-                                               "de confirmación. Por favor, introducelo para confirmar tu número de teléfono")
-   :incorrect-code                        (str "Lo sentimos, el código era incorrecto. Por favor escríbelo de nuevo.")
-   :generate-passphrase                   (str "Generaré una frase de respaldo para que puedas restaurar tu contraseña"
-                                               "o iniciar sesión desde otro dispositivo")
-   :phew-here-is-your-passphrase          "*Uf* ha sido difícil, aquí está tu contraseña, * escríbela y ¡guárdala en un sitio seguro! * La necesitarás para recuperar tu cuenta."
+   :browsing-title                        "Navegar"
+   :browsing-browse                       "@browse"
+   :browsing-open-in-web-browser          "Abrir en el navegador"
+   :browsing-cancel                       "Cancelar"
+
+   ;;sign-up
+   :contacts-syncronized                  "Tus contactos se han sincronizado"
+   :confirmation-code                     (str "¡Gracias! Has enviado un mensaje de texto con un código de confirmación. "
+                                               "Por favor danos ese código para confirmar tu número de teléfono")
+   :incorrect-code                        (str "Lo sentimos, el código es incorrecto, por favor inténtalo nuevamente")
+   :phew-here-is-your-passphrase          "*Uff*, ha sido difícil. Aquí esta tu frase de respaldo, *¡anótala y mantenla a salvo!* La vas a necesitar para recuperar tu cuenta."
    :here-is-your-passphrase               "Aquí está tu frase de respaldo, *escríbela y ¡guárdala en un sitio seguro! *La necesitarás para recuperar tu cuenta."
-   :written-down                          "Asegúrate de haberla escrito de manera segura"
-   :phone-number-required                 "Toca aquí para escribir tu número de teléfono y encontraré a tus amigos"
-   :intro-status                          "¡Habla conmigo para configurar tu cuenta y cambiar tu configuración!"
-   :intro-message1                        "Bienvenido a Status\n¡Toca este mensaje para configurar tu contraseña y empezar!"
+   :here-is-your-signing-phrase           "Aquí está tu frase para firmar. La vas a usar para firmar tus transacciones. *¡Anótala y mantenla a salvo!*"
+   :phone-number-required                 "Toca aquí para validar tu número de teléfono y encontraré a tus amigos."
+   :shake-your-phone                      "¿Has encontrado un error o tienes alguna sugerencia? ¡Simplemente ~agíta~ tu teléfono!"
+   :intro-status                          "Habla conmigo para configurar tu cuenta y cambiar tus ajustes."
+   :intro-message1                        "¡Bienvenido a Status!\nToca este mensaje para establecer tu clave y empezar."
    :account-generation-message            "Dame un segundo, ¡tengo que hacer unas cálculos para generar tu cuenta!"
-
-   ;chats
+   :move-to-internal-failure-message      "Tenemos que mover algunos archivos importantes del almacenamiento externo al interno. Para ello necesitamos tu permiso. No usaremos el almacenamiento externo en versiones futuras."
+   :debug-enabled                         "¡El servidor de depuración ha sido activado! Ahora puedes ejecutar *status-dev-cli scan* para encontrar el servidor en tu ordenador desde la misma red."
+
+   ;;phone types
+   :phone-e164                            "Internacional 1"
+   :phone-international                   "Internacional 2"
+   :phone-national                        "Nacional"
+   :phone-significant                     "Importante"
+
+   ;;chats
    :chats                                 "Chats"
-   :new-chat                              "Chat nuevo"
-   :new-group-chat                        "Grupo de chat nuevo"
-
-   ;discover
+   :delete-chat                           "Eliminar chat"
+   :new-group-chat                        "Nuevo chat grupal"
+   :new-public-group-chat                 "Unirse a nuevo chat público"
+   :edit-chats                            "Editar chats"
+   :search-chats                          "Buscar chats"
+   :empty-topic                           "Limpiar tema"
+   :topic-format                          "Formato incorrecto [a-z0-9\\-]+"
+   :public-group-topic                    "Tema"
+
+   ;;discover
    :discover                              "Descubrir"
-   :none                                  "Ninguno"
+   :none                                  "Nada"
    :search-tags                           "Escribe tus etiquetas de búsqueda aquí"
-   :popular-tags                          "Etiquetas populares"
-   :recent                                "Reciente"
-   :no-statuses-discovered                "No se han encontrado Status"
-
-   ;settings
+   :popular-tags                          "#hashtags populares"
+   :recent                                "Estados recientes"
+   :no-statuses-found                     "No se han encontrado estados"
+   :chat                                  "Chat"
+   :all                                   "Todo"
+   :public-chats                          "Chats públicos"
+   :soon                                  "Pronto"
+   :public-chat-user-count                "{{count}} personas"
+   :dapps                                 "ÐApps"
+   :dapp-profile                          "Perfil ÐApp"
+   :no-statuses-discovered                "No se han descubierto estados"
+   :no-statuses-discovered-body           "Cuando alguien publique\nun estado lo verás aquí."
+   :no-hashtags-discovered-title          "No se han descubierto #hashtags"
+   :no-hashtags-discovered-body           "Cuando un #hashtag se vuelva\npopular lo verás aquí."
+
+   ;;settings
    :settings                              "Ajustes"

-   ;contacts
+   ;;contacts
    :contacts                              "Contactos"
-   :new-contact                           "Un contacto nuevo"
-   :show-all                              "MOSTRAR TODOS"
-   :contacts-group-dapps                  "ÐApps"
-   :contacts-group-people                 "Gente"
-   :contacts-group-new-chat               "Empezar un chat nuevo"
+   :new-contact                           "Contacto nuevo"
+   :delete-contact                        "Eliminar contacto"
+   :delete-contact-confirmation           "Este contacto será eliminado de tus contactos"
+   :remove-from-group                     "Eliminar del grupo"
+   :edit-contacts                         "Editar contactos"
+   :search-contacts                       "Buscar contactos"
+   :contacts-group-new-chat               "Empezar un nuevo chat"
+   :choose-from-contacts                  "Elegir de los contactos"
    :no-contacts                           "No hay contactos todavía"
-   :show-qr                               "Mostrar QR"
-
-   ;group-settings
+   :show-qr                               "Mostrar código QR"
+   :enter-address                         "Introducir dirección"
+   :more                                  "más"
+
+   ;;group-settings
    :remove                                "Eliminar"
    :save                                  "Guardar"
-   :change-color                          "Cambiar el color"
-   :clear-history                         "Borrar el historial"
-   :delete-and-leave                      "Borrar y salir"
-   :chat-settings                         "Ajustes del chat"
+   :delete                                "Eliminar"
+   :clear-history                         "Limpiar historial"
+   :mute-notifications                    "Silenciar notificaciones"
+   :leave-chat                            "Abandonar chat"
+   :chat-settings                         "Ajustes de chat"
    :edit                                  "Editar"
    :add-members                           "Añadir miembros"
-   :blue                                  "Azul"
-   :purple                                "Púrpura"
-   :green                                 "Verde"
-   :red                                   "Rojo"
-
-   ;commands
-   :money-command-description             "Enviar dinero"
-   :location-command-description          "Enviar ubicación"
-   :phone-command-description             "Enviar número de teléfono"
-   :phone-request-text                    "Solicitud de número de teléfono"
-   :confirmation-code-command-description "Enviar código de confirmación"
-   :confirmation-code-request-text        "Solicitud de código de confirmación"
-   :send-command-description              "Enviar comando"
-   :request-command-description           "Enviar solicitud"
-   :keypair-password-command-description  ""
-   :help-command-description              "Ayuda"
-   :request                               "Solicitar"
+
+   ;;commands
    :chat-send-eth                         "{{amount}} ETH"
-   :chat-send-eth-to                      "{{amount}} ETH a {{chat-name}}"
-   :chat-send-eth-from                    "{{amount}} ETH de{{chat-name}}"
-
-   ;new-group
-   :group-chat-name                       "Nombre del chat"
-   :empty-group-chat-name                 "Por favor, escribe un nombre"
-   :illegal-group-chat-name               "Por favor, selecciona otro nombre"
-
-   ;participants
-   :add-participants                      "Agregar participantes"
-   :remove-participants                   "Eliminar participantes"
-
-   ;protocol
-   :received-invitation                   "invitación de chat recibida"
-   :removed-from-chat                     "te ha eliminado del grupo de chat"
-   :left                                  "salió"
-   :invited                               "invitado"
-   :removed                               "eliminado"
+
+   ;;location command
+   :your-current-location                 "Tu ubicación actual"
+   :places-nearby                         "Lugares cercanos"
+   :search-results                        "Buscar resultados"
+   :dropped-pin                           "Marcador puesto"
+   :location                              "Ubicación"
+   :open-map                              "Abrir Mapa"
+   :sharing-copy-to-clipboard-address     "Copiar dirección"
+   :sharing-copy-to-clipboard-coordinates "Copiar coordenadas"
+
+   ;;new-group
+   :new-group                             "Nuevo grupo"
+   :reorder-groups                        "Reordenar grupos"
+   :edit-group                            "Editar grupo"
+   :delete-group                          "Eliminar grupo"
+   :delete-group-confirmation             "Este grupo será eliminado de tus grupos. Esto no afectará a tus contactos"
+   :delete-group-prompt                   "Esto no afectará a tus contactos"
+   :contact-s                             {:one   "contacto"
+                                           :other "contactos"}
+
+   ;;protocol
+   :received-invitation                   "recibió invitación de chat"
+   :removed-from-chat                     "fue eliminado del chat"
+   :left                                  "Se salió"
+   :invited                               "fue invitado"
+   :removed                               "fue eliminado"
    :You                                   "Tú"

-   ;new-contact
-   :add-new-contact                       "Añadir un nuevo contacto"
-   :import-qr                             "Importar"
-   :scan-qr                               "Escanear QR"
+   ;;new-contact
+   :add-new-contact                       "Agregar nuevo contacto"
+   :scan-qr                               "Escanear código QR"
    :name                                  "Nombre"
-   :whisper-identity                      "Identidad de susurro"
-   :address-explication                   "Tal vez aquí debería haber algún texto explicando qué es una dirección y dónde buscarla"
-   :enter-valid-address                   "Por favor, escribe una dirección válida o escanea un código QR "
-   :contact-already-added                 "Ya se ha añadido el contacto"
-   :can-not-add-yourself                  "No puedes agregarte"
+   :address-explication                   "Tu clave pública se usa para generar tu dirección en Ethereum y es una serie de números y letras. La puedes encontrar fácilmente en tu perfil"
+   :enter-valid-public-key                "Por favor introduce una clave pública válida o escanea un código QR"
+   :contact-already-added                 "El contacto se ha agregado"
+   :can-not-add-yourself                  "No te puedes agregar a tí mismo"
    :unknown-address                       "Dirección desconocida"

-
-   ;login
+   ;;login
    :connect                               "Conectar"
    :address                               "Dirección"
    :password                              "Contraseña"
-   :login                                 "Iniciar sesión"
+   :sign-in-to-status                     "Iniciar sesión en Status"
+   :sign-in                               "Iniciar sesión"
    :wrong-password                        "Contraseña incorrecta"
-
-   ;recover
-   :recover-from-passphrase               "Recuperar con tu frase de respaldo"
-   :recover-explain                       "Por favor, escribe la frase de respaldo a modo de contraseña para poder entrar"
-   :passphrase                            "Frase de respaldo"
+   :enter-password                        "Ingresar contraseña"
+
+   ;;recover
+   :passphrase                            "Frase clave"
    :recover                               "Recuperar"
-   :enter-valid-passphrase                "Por favor, escribe la frase de respaldo"
-   :enter-valid-password                  "Por favor, escribe la contraseña"
-
-   ;accounts
-   :recover-access                        "Recuperar el acceso"
-   :add-account                           "Añadir cuenta"
-
-   ;wallet-qr-code
+   :twelve-words-in-correct-order         "12 palabras en el orden correcto"
+
+   ;;accounts
+   :recover-access                        "Recuperar acceso"
+   :create-new-account                    "Crear una nueva cuenta"
+
+   ;;wallet-qr-code
    :done                                  "Hecho"
+
+   ;;validation
+   :invalid-phone                         "Número de teléfono inválido"
+   :amount                                "Cantidad"
+
+   ;;transactions
+   :confirm                               "Confirmar"
+   :transaction                           "Transacción"
+   :unsigned-transaction-expired          "Transación sin firmar expirada"
+   :status                                "Estado"
+   :recipient                             "Destinatario"
+   :to                                    "Para"
+   :from                                  "De"
+   :data                                  "Datos"
+   :got-it                                "Entendido"
+   :block                                 "Bloquear"
+   :hash                                  "Hash"
+   :gas-limit                             "Límite de gas"
+   :gas-price                             "Precio del gas"
+   :gas-used                              "Gas usado"
+   :cost-fee                              "Costo/Tarifa"
+   :nonce                                 "Mientras tanto"
+   :confirmations                         "Confirmaciones"
+   :confirmations-helper-text             "Por favor espera al menos a que haya 12 confirmaciones para asegurarte de que tu transacción es procesada con seguridad"
+   :copy-transaction-hash                 "Copiar hash de transacción"
+   :open-on-etherscan                     "Abrir en Etherscan.io"
+
+   ;;webview
+   :web-view-error                        "oops, error"
+
+   ;;testfairy warning
+   :testfairy-title                       "¡Advertencia!"
+   :testfairy-message                     "Estás usando una aplicación instalada desde una versión nocturna. Por motivos de prueba esta versión incluye grabación de la sesión si se usa conexión wifi, así que todas las interacciones con esta aplicación se guardan (así como vídeo y registros) y pueden ser usadas por nuestro equipo de desarrollo para investigar posibles problemas. Los video/registros no incluyen tus contraseñas. La grabación se realiza solo si la app está instalada desde una versión nocturna. Nada se graba si la app está instalada desde la PlayStore o desde TestFlight."
+
+   ;; wallet
+   :wallet                                "Cartera"
+   :wallets                               "Carteras"
+   :your-wallets                          "Tus carteras"
    :main-wallet                           "Cartera principal"
-
-   ;validation
-   :invalid-phone                         "El número de teléfono no es válido"
-   :amount                                "Cantidad"
-   :not-enough-eth                        (str "No hay suficiente ETH en conjunto "
-                                               "({{balance}} ETH)")
-   ;transactions
-   :confirm-transactions                  {:one   "Confirmar transacción"
-                                           :other "Confirmar {{count}} transacciones"
-                                           :zero  "No hay transacciones"}
-   :status                                "Estado"
-   :pending-confirmation                  "Confirmación pendiente"
-   :recipient                             "Beneficiario"
-   :one-more-item                         "Un elemento más"
-   :fee                                   "Tasa"
-   :value                                 "Valor"
-
-   ;:webview
-   :web-view-error                        "oops, error"
-
-   :confirm                               "Confirmar"
-   :phone-national                        "Nacional"
-   :transactions-confirmed                {:one   "Transacción confirmada"
-                                           :other "{{count}} transacciones confirmadas"
-                                           :zero  "No hay transacciones confirmadas"}
-   :public-group-topic                    "Tema"
-   :debug-enabled                         "¡El servidor de depuración se ha puesto en marcha! Ahora puede añadir su DApp ejecutando *status-dev-cli scan* desde su ordenador"
-   :new-public-group-chat                 "Unirse al chat público"
-   :share-qr                              "Compartir QR"
-   :feedback                              "¿Tiene comentarios?\n¡Agite su teléfono!"
-   :twelve-words-in-correct-order         "12 palabras en el orden correcto"
-   :remove-from-contacts                  "Eliminar de los contactos"
-   :delete-chat                           "Eliminar chat"
-   :edit-chats                            "Editar chats"
-   :sign-in                               "Registrarse"
-   :create-new-account                    "Crear nueva cuenta"
-   :sign-in-to-status                     "Registrarse en Estado"
-   :got-it                                "Entendido"
-   :move-to-internal-failure-message      "Necesitamos mover algunos archivos importantes del almacenamiento externo al interno. Para ello, necesitamos su permiso. No usaremos el almacenamiento externo en futuras versiones."
-   :edit-group                            "Editar grupo"
-   :delete-group                          "Eliminar grupo"
-   :browsing-title                        "Examinar"
-   :reorder-groups                        "Reordenar grupos"
-   :browsing-cancel                       "Cancelar"
-   :faucet-success                        "La solicitud de clave se ha recibido"
-   :choose-from-contacts                  "Elegir entre contactos"
-   :new-group                             "Nuevo grupo"
-   :phone-e164                            "Internacional 1"
-   :remove-from-group                     "Eliminar del grupo"
-   :search-contacts                       "Buscar contactos"
-   :transaction                           "Transacción"
-   :public-group-status                   "Público"
-   :leave-chat                            "Salir del chat"
-   :start-conversation                    "Iniciar conversación"
-   :topic-format                          "Formato incorrecto [a-z0-9\\-]+"
-   :enter-valid-public-key                "Introduzca una clave pública válida o escanee un código QR"
-   :faucet-error                          "Error de solicitud de clave"
-   :phone-significant                     "Significativo"
-   :search-for                            "Buscar..."
-   :phone-international                   "Internacional 2"
-   :enter-address                         "Introducir dirección"
-   :send-transaction                      "Enviar transacción"
-   :delete-contact                        "Borrar contacto"
-   :mute-notifications                    "Silenciar notificaciones"
-
-
-   :contact-s                             {:one   "contacto"
-                                           :other "contactos"}
-   :group-name                            "Nombre del grupo"
-   :next                                  "Siguiente"
-   :from                                  "De"
-   :search-chats                          "Buscar chats"
-   :in-contacts                           "En los contactos"
-
-   :type-a-message                        "Escribir un mensaje..."
-   :type-a-command                        "Comenzar escribiendo un comando..."
-   :shake-your-phone                      "¿Ha encontrar un error o tiene una sugerencia? ¡Solo tiene que ~agitar~ su teléfono!"
-   :status-prompt                         "Cree un estado para ayudar a la gente a conocer las cosas que está ofreciendo. También puede usar #hashtags."
-   :add-a-status                          "Añadir un estado..."
-   :error                                 "Error"
-   :edit-contacts                         "Editar contactos"
-   :more                                  "más"
-   :cancel                                "Cancelar"
-   :no-statuses-found                     "No se han encontrado estados"
-   :swow-qr                               "Mostrar QR"
-   :browsing-open-in-web-browser          "Abrir en el navegador web"
-   :delete-group-prompt                   "Esto no afectará a los contactos"
-   :edit-profile                          "Editar perfil"
-
-
-   :enter-password-transactions           {:one   "Confirmar transacción introduciendo su contraseña"
-                                           :other "Confirmar transacciones introduciendo su contraseña"}
-   :unsigned-transactions                 "Transacciones no firmadas"
-   :empty-topic                           "Tema vacío"
-   :to                                    "A"
-   :group-members                         "Miembros del grupo"
-   :estimated-fee                         "Cuota est."
-   :data                                  "Datos"})
+   :wallet-error                          "Error cargando datos"
+   :wallet-send                           "Enviar"
+   :wallet-request                        "Solicitar"
+   :wallet-exchange                       "Intercambio"
+   :wallet-assets                         "Activos"
+   :wallet-add-asset                      "Añadir activo"
+   :wallet-total-value                    "Valor total"
+   :wallet-settings                       "Ajustes de cartera"
+   :signing-phrase-description            "Firma la transación poniendo tu contraseña. Asegúrate de que las palabras de arriba coinciden con tu frase de firmas secreta"
+   :wallet-insufficient-funds             "Fondos insuficientes"
+   :request-transaction                   "Solicitar transacción"
+   :send-request                          "Enviar solicitud"
+   :share                                 "Compartir"
+   :eth                                   "ETH"
+   :currency                              "Divisa"
+   :usd-currency                          "USD"
+   :transactions                          "Transacciones"
+   :transaction-details                   "Detalles de la transación"
+   :transaction-failed                    "Transacción fallida"
+   :transactions-sign                     "Firmar"
+   :transactions-sign-all                 "Firmar todo"
+   :transactions-sign-transaction         "Firmar transacción"
+   :transactions-sign-later               "Firmar después"
+   :transactions-delete                   "Eliminar transación"
+   :transactions-delete-content           "La transacción será eliminada de la lista 'Sin firmar'"
+   :transactions-history                  "Historial"
+   :transactions-unsigned                 "Sin firmar"
+   :transactions-history-empty            "No hay transacciones en tu historial todavía"
+   :transactions-unsigned-empty           "No tienes ninguna transacción sin firmar"
+   :transactions-filter-title             "Filtrar historial"
+   :transactions-filter-tokens            "Tokens"
+   :transactions-filter-type              "Tipo"
+   :transactions-filter-select-all        "Seleccionar todo"
+   :view-transaction-details              "Ver detalles de la transacción"
+   :transaction-description               "Espera hasta al menos 12 confirmaciones para asegurarte de que la transacción es procesada con seguridad"
+   :transaction-sent                      "Transacción enviada"
+   :transaction-moved-text                "La transacción permanecerá en la lista 'Sin firmar' durante los siguientes 5 minutos"
+   :transaction-moved-title               "Transacción movida"
+   :sign-later-title                      "¿Firmar transacción mas tarde?"
+   :sign-later-text                       "Comprueba el historial de transacciones para firmar esta transacción"
+   :not-applicable                        "No aplicable para transacciones sin firmar"
+
+   ;; Wallet Send
+   :wallet-choose-recipient               "Eligir destinatario"
+   :wallet-choose-from-contacts           "Elegir de los Contactos"
+   :wallet-address-from-clipboard         "Usar Dirección del Portapapeles"
+   :wallet-invalid-address                "Dirección inválida: \n {{data}}"
+   :wallet-browse-photos                  "Navegar Imágenes"
+   :validation-amount-invalid-number      "La cantidad no es un número válido"
+   :validation-amount-is-too-precise      "La cantidad es demasiado precisa. La mínima unidad que puedes enviar es 1 Wei (1x10^-18 ETH)"
+
+
+
+   ;; network settings
+   :new-network                           "Nueva red"
+   :add-network                           "Añadir red"
+   :add-new-network                       "Añadir nueva red"
+   :existing-networks                     "Redes existentes"
+   :add-json-file                         "Añadir un archivo JSON"
+   :paste-json-as-text                    "Pegar JSON como texto"
+   :paste-json                            "Pegar JSON"
+   :specify-rpc-url                       "Especificar una URL RPC"
+   :edit-network-config                   "Editar configuración de red"
+   :connected                             "Conectado"
+   :process-json                          "Procesar JSON"
+   :error-processing-json                 "Error procesando JSON"
+   :rpc-url                               "RPC URL"
+   :remove-network                        "Eliminar red"
+   :network-settings                      "Ajustes de red"
+   :edit-network-warning                  "Cuidado, editar los datos de red puede deshabilitar esta red para tí"
+   :connecting-requires-login             "Conectarse a otra red requiere inicio de sesión"
+   :close-app-title                       "¡Advertencia!"
+   :close-app-content                     "La app se detendrá y cerrará. Cuando la vuelvas a abrir, la red seleccionada será usada"
+   :close-app-button                      "Confirmar"})


Improved french translation

Improved french translation

Signed-off-by: Julien Eluard <c768e13f1ba4c3ebed2909a1fc1e4b50bb021a2f@gmail.com>

--- src/status_im/translations/fr.cljs
+++ src/status_im/translations/fr.cljs
@@ -13,6 +13,8 @@
    :next                                  "Suivant"
    :open                                  "Ouvrir"
    :description                           "Description"
+   :enter-url                             "Entrer l'URL"
+   :open-dapp                             "Ouvrir une ÐApp"
    :url                                   "URL"
    :type-a-message                        "Saisissez un message..."
    :type-a-command                        "Saisissez une commande..."
@@ -27,7 +29,8 @@

    ;;drawer
    :switch-users                          "Changer d'utilisateur"
-   :current-network                       "Le réseau actuel"
+   :current-network                       "Réseau actuel"
+   :logout                                "Déconnexion"

    ;;chat
    :is-typing                             "écrit..."
@@ -63,7 +66,7 @@
    :status-failed                         "Échec"

    ;;datetime
-   :datetime-ago-format                   "{{number}} {{time-intervals}} {{ago}}"
+   :datetime-ago-format                   "{{ago}} {{number}} {{time-intervals}}"
    :datetime-second                       {:one   "seconde"
                                            :other "secondes"}
    :datetime-minute                       {:one   "minute"
@@ -78,12 +81,15 @@

    ;;profile
    :profile                               "Profil"
+   :view-profile                          "Voir profil"
    :edit-profile                          "Modifier profil"
+   :main-currency                         "Devise principale"
    :message                               "Message"
    :not-specified                         "Non spécifié"
    :public-key                            "Clé publique"
    :phone-number                          "Numéro de téléphone"
    :update-status                         "Actualisez votre statut..."
+   :share-contact-code                    "Partager mon code contact"
    :add-a-status                          "Ajoutez un statut..."
    :status-prompt                         "Créez un nouveau statut pour partager vos intérêts avec tout le monde. Vous pouvez aussi utiliser les #hashtags."
    :add-to-contacts                       "Ajouter aux contacts"
@@ -131,8 +137,14 @@
    :phone-significant                     "Significatif"

    ;;chats
+   :new                                   "Nouveau"
+   :new-chat                              "Nouveau chat"
+   :start-new-chat                        "Démarrer un chat"
+   :start-group-chat                      "Démarrer un groupe"
+   :invite-friends                        "Inviter des amis"
    :chats                                 "Chats"
    :delete-chat                           "Supprimer chat"
+   :group-chat                            "Groupe"
    :new-group-chat                        "Nouveau chat de groupe"
    :new-public-group-chat                 "Rejoindre chat public"
    :edit-chats                            "Modifier chats"
@@ -185,6 +197,7 @@
    :clear-history                         "Effacer l'historique"
    :mute-notifications                    "Couper le son des notifications"
    :leave-chat                            "Quitter le chat"
+   :leave-group-chat                      "Quitter le groupe"
    :chat-settings                         "Paramètres de chat"
    :edit                                  "Modifier"
    :add-members                           "Ajouter des membres"
@@ -249,7 +262,7 @@
    :confirm                               "Confirmer"
    :transaction                           "Transaction"
    :unsigned-transaction-expired          "La transaction non signée a expiré"
-   :status                                "Statut"
+   :status                                "Status"
    :recipient                             "Destinataire"
    :to                                    "à"
    :from                                  "de"
@@ -287,9 +300,14 @@
    :wallet-add-asset                      "Ajouter un actif"
    :wallet-total-value                    "Valeur totale"
    :wallet-settings                       "Paramètres du portefeuille"
+   :wallet-manage-assets                  "Gérer les actifs"
    :signing-phrase-description            "Signez la transaction en saisissant votre mot de passe. Assurez-vous que les mots ci-dessus correspondent à votre phrase de signature secrète"
    :wallet-insufficient-funds             "Fonds insuffisants"
    :request-transaction                   "Effectuer une transaction"
+   :receive-transaction                   "Recevoir une transaction"
+   :new-transaction                       "Nouvelle Transaction"
+   :transaction-history                   "Historique des transactions"
+
    :send-request                          "Envoyer la requête"
    :share                                 "Partager"
    :eth                                   "ETH"
@@ -337,19 +355,27 @@
    :add-network                           "Ajouter un réseau"
    :add-new-network                       "Ajouter un nouveau réseau"
    :existing-networks                     "Réseaux existants"
+   :existing-wnodes                       "Serveurs de mail existants"
    :add-json-file                         "Ajouter un fichier JSON"
-   :paste-json-as-text                    "Coller JSON en texte"
-   :paste-json                            "Coller JSON"
+   :paste-json-as-text                    "Coller un JSON comme texte"
+   :paste-json                            "Coller un JSON"
    :specify-rpc-url                       "Préciser une URL RPC"
    :edit-network-config                   "Modifier la configuration réseau"
    :connected                             "Connecté"
    :process-json                          "Interpréter le JSON"
    :error-processing-json                 "Erreur survenue lors de l'interprétation du JSON"
    :rpc-url                               "URL RPC"
+   :network                               "Réseau"
    :remove-network                        "Supprimer le réseau"
+   :offline-messaging-settings            "Configuration de la messagerie hors-ligne"
    :network-settings                      "Paramètres réseau"
    :edit-network-warning                  "Soyez prudent, la modification des données réseau pourrait rendre ce réseau inutilisable pour vous"
    :connecting-requires-login             "Il faut s'identifier pour se connecter à un nouveau réseau"
    :close-app-title                       "Avertissement!"
    :close-app-content                     "L'application va s'arrêter et se fermer. Lors de la prochaine ouverture, le réseau sélectionné sera utilisé"
-   :close-app-button                      "Confirmer"})
+   :close-app-button                      "Confirmer"
+
+   ;; browser
+   :browser                               "Navigateur"
+   :enter-dapp-url                        "Entrer l'URL d'une ÐApp"
+   :selected-dapps                        "ÐApps sélectionnées"})


Fixes #2348: Update korean translation (#2359)

* translations: Update korean translation

--- src/status_im/translations/ko.cljs
+++ src/status_im/translations/ko.cljs
@@ -2,8 +2,8 @@

 (def translations
   {
-   ;common
-   :members-title                         "회원"
+   ;;common
+   :members-title                         "멤버"
    :not-implemented                       "!구현되지 않음"
    :chat-name                             "채팅 이름"
    :notifications-title                   "알림 및 소리"
@@ -11,31 +11,34 @@
    :search-for                            "검색하기..."
    :cancel                                "취소"
    :next                                  "다음"
+   :open                                  "열기"
+   :description                           "설명"
+   :url                                   "URL"
    :type-a-message                        "메시지 입력..."
    :type-a-command                        "명령 입력..."
    :error                                 "오류"
-
-   :camera-access-error                   "카메라 권한을 승인하려면 시스템 설정에서 권한 > 카메라가 선택되어 있는지 확인해 주세요."
-   :photos-access-error                   "사진 접근 권한을 승인하려면 시스템 설정에서 권한 > 사진이 선택되어 있는지 확인해 주세요."
-
-   ;drawer
-   :invite-friends                        "친구 초대"
-   :faq                                   "FAQ"
+   :unknown-status-go-error               "알 수 없는 status-go 오류"
+   :node-unavailable                      "사용 가능한 Ethereum 노드가 없습니다."
+   :yes                                   "예"
+   :no                                    "아니오"
+
+   :camera-access-error                   "카메라 권한을 승인하려면 시스템 앱 설정에서 Status > 권한 > 카메라가 선택되어 있는지 확인해 주세요."
+   :photos-access-error                   "사진 접근 권한을 승인하려면 시스템 앱 설정에서 Status > 권한 > 사진이 선택되어 있는지 확인해 주세요."
+
+   ;;drawer
    :switch-users                          "사용자 전환"
-   :feedback                              "건의사항이 있나요?\n폰을 흔들어 보세요!"
-   :view-all                              "모두 모기"
    :current-network                       "현재 네트워크"

-   ;chat
-   :is-typing                             "이(가) 입력 중"
-   :and-you                               "그리고 나"
+   ;;chat
+   :is-typing                             "이(가) 입력 중입니다"
+   :and-you                               "그리고 당신"
    :search-chat                           "채팅 검색"
-   :members                               {:one   "회원 1명"
-                                           :other "회원 {{count}}명"
-                                           :zero  "회원 없음"}
-   :members-active                        {:one   "회원 1명, 활성 1명"
-                                           :other "회원 {{count}}명, 활성 {{count}}명"
-                                           :zero  "회원 없음"}
+   :members                               {:one   "멤버 1명"
+                                           :other "멤버 {{count}}명"
+                                           :zero  "멤버 없음"}
+   :members-active                        {:one   "멤버 1명"
+                                           :other "멤버 {{count}}명"
+                                           :zero  "멤버 없음"}
    :public-group-status                   "공개"
    :active-online                         "온라인"
    :active-unknown                        "상태 알 수 없음"
@@ -46,12 +49,11 @@
    :faucet-success                        "Faucet 요청이 도착했습니다"
    :faucet-error                          "Faucet 요청 오류"

-   ;sync
+   ;;sync
    :sync-in-progress                      "동기화 중..."
    :sync-synced                           "동기화됨"

-   ;messages
-   :status-sending                        "전송중"
+   ;;messages
    :status-pending                        "보류중"
    :status-sent                           "전송됨"
    :status-seen-by-everyone               "모두 읽음"
@@ -59,7 +61,7 @@
    :status-delivered                      "전송됨"
    :status-failed                         "실패"

-   ;datetime
+   ;;datetime
    :datetime-ago-format                   "{{number}}{{time-intervals}} {{ago}}"
    :datetime-second                       {:one   "초"
                                            :other "초"}
@@ -69,38 +71,32 @@
                                            :other "시간"}
    :datetime-day                          {:one   "일"
                                            :other "일"}
-   :datetime-multiple                     ""
    :datetime-ago                          "전"
    :datetime-yesterday                    "어제"
    :datetime-today                        "오늘"

-   ;profile
+   ;;profile
    :profile                               "프로필"
-   :edit-profile                          "프로필 수정"
-   :report-user                           "사용자 신고하기"
+   :edit-profile                          "프로필 편집"
    :message                               "메시지"
-   :username                              "사용자명"
-   :not-specified                         "입력하지 않음"
-   :public-key                            "공개키"
-   :phone-number                          "전화번호"
-   :email                                 "이메일"
-   :update-status                         "상태 업데이트..."
-   :add-a-status                          "상태 추가하기..."
-   :status-prompt                         "상태 메시지를 추가하여 당신이 제공할 수 있는 것들에 대해 사람들에게 알려주세요. #해시태그를 이용할 수도 있습니다."
+   :not-specified                         "지정되지 않음"
+   :public-key                            "공개 키"
+   :phone-number                          "휴대전화 번호"
+   :update-status                         "상태 메시지 업데이트..."
+   :add-a-status                          "상태 메시지 추가..."
+   :status-prompt                         "상태 메시지를 설정하세요. #해시태그를 사용하여 다른 사람이 날 찾는 것을 도울 수 있습니다."
    :add-to-contacts                       "연락처에 추가"
-   :in-contacts                           "연락처에 추가됨"
-   :remove-from-contacts                  "연락처에서 삭제"
-   :start-conversation                    "채팅 시작하기"
+   :in-contacts                           "연락처에 있음"
+   :remove-from-contacts                  "연락처에서 제거"
+   :start-conversation                    "대화하기"
    :send-transaction                      "송금하기"
-   :share-qr                              "QR코드 공유"
-   :error-incorrect-name                  "다른 이름을 선택해 주세요"
-   :error-incorrect-email                 "잘못된 이메일"
+   :testnet-text                          "현재 {{testnet}} 테스트 네트워크에 있습니다. 이 주소로 진짜 ETH나 SNT를 보내지 마세요!"
+   :mainnet-text                          "메인 네트워크에 있습니다. 진짜 ETH가 전송될 것입니다."

    ;;make_photo
    :image-source-title                    "프로필 이미지"
-   :image-source-make-photo               "캡쳐"
+   :image-source-make-photo               "캡처"
    :image-source-gallery                  "갤러리에서 선택하기"
-   :image-source-cancel                   "취소"

    ;;sharing
    :sharing-copy-to-clipboard             "클립보드로 복사"
@@ -111,33 +107,30 @@
    :browsing-open-in-web-browser          "웹 브라우저로 열기"
    :browsing-cancel                       "취소"

-   ;sign-up
+   ;;sign-up
    :contacts-syncronized                  "연락처가 동기화되었습니다"
-   :confirmation-code                     (str "감사합니다! 확인 코드 문자 메시지를 보내드렸습니다. "
-                                               "전화번호를 확인하려면 해당 코드를 입력해 주세요")
-   :incorrect-code                        (str "죄송하지만 잘못된 코드입니다. 다시 입력해 주세요")
-   :generate-passphrase                   (str "계정을 복원하거나 다른 기기에서 로그인할 수 있도록 "
-                                               "암호문을 생성해 드리겠습니다")
-   :phew-here-is-your-passphrase          "*휴~*어려운 작업이었네요. 여기 암호문이 있습니다. *이걸 적어두시고 안전하게 보관하세요!* 계정을 복구할 때 필요합니다."
-   :here-is-your-passphrase               "여기 암호문이 있습니다. *이걸 적어두시고 안전하게 보관하세요!* 계정을 복구할 때 필요합니다."
-   :written-down                          "암호문을 안전하게 적어 두었는지 확인해 주세요"
-   :phone-number-required                 "여기를 탭하여 전화번호를 입력하시면 친구들을 찾아드리겠습니다"
+   :confirmation-code                     (str "감사합니다! 확인 코드를 문자 메시지로 보내 드렸습니다. "
+                                               "전화번호 검증을 위해 확인 코드를 입력해 주세요")
+   :incorrect-code                        (str "잘못된 코드입니다. 다시 입력해 주세요")
+   :phew-here-is-your-passphrase          "휴~ 꽤 어려웠어요. 이것이 당신의 암호문입니다. *이걸 적어두신 다음 안전한 곳에 보관하세요!* 계정을 복구할 때 필요합니다."
+   :here-is-your-passphrase               "이것이 당신의 암호문입니다. *이걸 적어두신 다음 안전한 곳에 보관하세요!* 계정을 복구할 때 필요합니다."
+   :here-is-your-signing-phrase           "이건 당신의 서명 문구입니다. 거래를 승인할 때 필요합니다. *이걸 적어두신 다음 안전한 곳에 보관하세요!*"
+   :phone-number-required                 "여기를 눌러 전화번호를 검증하시면 친구들을 찾아드리겠습니다"
    :shake-your-phone                      "버그나 건의사항이 있나요? 폰을 ~흔들어~ 보세요!"
    :intro-status                          "계정을 설정하고 설정을 변경하려면 저와 채팅하세요!"
-   :intro-message1                        "'Status'에 오신 것을 환영합니다\n이 메시지를 탭하여 비밀번호를 설정하고 시작하세요!"
-   :account-generation-message            "잠깐만요, 계정 생성을 위해 수학 연산 작업 좀 할게요!"
-   :move-to-internal-failure-message      "일부 중요 파일을 내부 저장소에서 외부 저장소로 이동해야 합니다. 이 작업은 권한이 필요합니다. 차기 버전에서는 외부 저장소를 사용하지 않을 예정입니다."
-   :debug-enabled                         "디버그 서버가 공개되었습니다! 같은 네트워크에 있는 컴퓨터에서 *status-dev-cli scan*을 실행하여 서버를 찾을 수 있습니다."
-
-   ;phone types
-   :phone-e164                            "국제 번호 포맷 1"
-   :phone-international                   "국제 번호 포맷 2"
-   :phone-national                        "국내 번호 포맷"
-   :phone-significant                     "0을 제외한 포맷"
-
-   ;chats
+   :intro-message1                        "Status에 오신 것을 환영합니다!\n이 메시지를 탭하여 비밀번호를 설정하고 시작하세요!"
+   :account-generation-message            "잠시만요, 계정을 만들려면 엄청 복잡한 수학 문제를 풀어야 합니다. 기다려 주세요!"
+   :move-to-internal-failure-message      "몇몇 중요한 파일을 외부 저장소에서 내부 저장소로 옮기기 위해 권한이 필요합니다. 추후 버전에서는 외부 저장소를 사용하지 않을 것입니다."
+   :debug-enabled                         "디버그 서버가 시작되었습니다! 같은 네트워크 상의 컴퓨터에서 *status-dev-cli scan*를 실행하여 디버그 서버를 확인하세요."
+
+   ;;phone types
+   :phone-e164                            "국제전화 1"
+   :phone-international                   "국제전화 2"
+   :phone-national                        "국내"
+   :phone-significant                     "전국 전화번호"
+
+   ;;chats
    :chats                                 "채팅"
-   :new-chat                              "새 채팅"
    :delete-chat                           "채팅 삭제"
    :new-group-chat                        "새 그룹 채팅"
    :new-public-group-chat                 "공개 채팅에 참여하기"
@@ -147,167 +140,225 @@
    :topic-format                          "잘못된 포맷 [a-z0-9\\-]+"
    :public-group-topic                    "토픽"

-   ;discover
+   ;;discover
    :discover                              "찾아보기"
    :none                                  "없음"
-   :search-tags                           "여기에 검색 태그를 입력하세요"
-   :popular-tags                          "인기 태그"
-   :recent                                "최근"
-   :no-statuses-discovered                "발견된 상태 정보가 없습니다"
-   :no-statuses-found                     "상태 정보가 없습니다"
-
-   ;settings
+   :search-tags                           "검색할 태그를 입력하세요"
+   :popular-tags                          "인기 급상승 태그"
+   :recent                                "최근 상태 메시지"
+   :no-statuses-found                     "발견된 메시지 없음"
+   :chat                                  "채팅"
+   :all                                   "전체"
+   :public-chats                          "공개 채팅방"
+   :soon                                  "곧"
+   :public-chat-user-count                "{{count}}명"
+   :dapps                                 "ÐApps"
+   :dapp-profile                          "ÐApp 프로필"
+   :no-statuses-discovered                "발견된 상태 메시지 없음"
+   :no-statuses-discovered-body           "누군가가 상태 메시지를 올리면\n여기 나타납니다."
+   :no-hashtags-discovered-title          "발견된 해시태그 없음"
+   :no-hashtags-discovered-body           "유명세를 탄 해시태그가\n여기 나타납니다."
+
+   ;;settings
    :settings                              "설정"

-   ;contacts
+   ;;contacts
    :contacts                              "연락처"
    :new-contact                           "새 연락처"
    :delete-contact                        "연락처 삭제"
    :delete-contact-confirmation           "이 연락처가 삭제됩니다"
-   :remove-from-group                     "채팅에서 제거"
+   :remove-from-group                     "그룹에서 삭제"
    :edit-contacts                         "연락처 편집"
    :search-contacts                       "연락처 검색"
-   :show-all                              "모두 표시"
-   :contacts-group-dapps                  "ÐApps"
-   :contacts-group-people                 "사람들"
-   :contacts-group-new-chat               "새 채팅 시작하기"
+   :contacts-group-new-chat               "새 채팅 시작"
    :choose-from-contacts                  "연락처에서 선택하기"
-   :no-contacts                           "연락처가 아직 없습니다"
+   :no-contacts                           "아직 연락처가 없습니다"
    :show-qr                               "QR코드 표시"
    :enter-address                         "주소 입력"
    :more                                  "더보기"

-   ;group-settings
+   ;;group-settings
    :remove                                "제거"
    :save                                  "저장"
    :delete                                "삭제"
-   :change-color                          "색상 변경"
-   :clear-history                         "대화내용 삭제"
-   :mute-notifications                    "알림 받지 않기"
+   :clear-history                         "대화내역 삭제"
+   :mute-notifications                    "알림 비활성화"
    :leave-chat                            "채팅방 나가기"
-   :delete-and-leave                      "삭제하고 나가기"
-   :chat-settings                         "채팅 설정"
+   :chat-settings                         "채팅방 설정"
    :edit                                  "편집"
-   :add-members                           "대화상대 추가"
-   :blue                                  "파란색"
-   :purple                                "보라색"
-   :green                                 "녹색"
-   :red                                   "빨간색"
-
-   ;commands
-   :money-command-description             "송금하기"
-   :location-command-description          "위치정보 보내기"
-   :phone-command-description             "전화번호 보내기"
-   :phone-request-text                    "전화번호 요청"
-   :confirmation-code-command-description "확인 코드 보내기"
-   :confirmation-code-request-text        "확인 코드 요청"
-   :send-command-description              "위치정보 보내기"
-   :request-command-description           "요청 보내기"
-   :keypair-password-command-description  ""
-   :help-command-description              "도움말"
-   :request                               "요청"
+   :add-members                           "멤버 추가"
+
+   ;;commands
    :chat-send-eth                         "{{amount}} ETH"
-   :chat-send-eth-to                      "{{amount}} ETH 송금인: {{chat-name}}"
-   :chat-send-eth-from                    "{{amount}} ETH 수금인: {{chat-name}}"
-
-   ;new-group
-   :group-chat-name                       "채팅 이름"
-   :empty-group-chat-name                 "이름을 입력해 주세요"
-   :illegal-group-chat-name               "다른 이름을 선택해 주세요"
-   :new-group                             "새로운 채팅 만들기"
-   :reorder-groups                        "채팅 순서 바꾸기"
-   :group-name                            "채팅 이름"
-   :edit-group                            "채팅 편집"
-   :delete-group                          "채팅 삭제"
-   :delete-group-confirmation             "해당 채팅이 삭제됩니다. 연락처에는 영향을 주지 않습니다."
-   :delete-group-prompt                   "연락처에는 영향을 주지 않습니다"
-   :group-members                         "채팅 멤버"
+
+   ;;location command
+   :your-current-location                 "현재 위치"
+   :places-nearby                         "주변 장소"
+   :search-results                        "검색 결과"
+   :dropped-pin                           "핀한 곳"
+   :location                              "위치"
+   :open-map                              "지도 열기"
+   :sharing-copy-to-clipboard-address     "주소 복사"
+   :sharing-copy-to-clipboard-coordinates "좌표 복사"
+
+   ;;new-group
+   :new-group                             "새 그룹"
+   :reorder-groups                        "그룹 재정렬"
+   :edit-group                            "그룹 편집"
+   :delete-group                          "그룹 삭제"
+   :delete-group-confirmation             "이 그룹을 그룹 목록에서 삭제합니다. 연락처에는 영향을 미치지 않습니다."
+   :delete-group-prompt                   "연락처에는 영향이 없습니다"
    :contact-s                             {:one   "연락처"
                                            :other "연락처"}
-   ;participants
-   :add-participants                      "대화상대 추가"
-   :remove-participants                   "대화상대 제거"
-
-   ;protocol
-   :received-invitation                   "채팅 초대를 받았습니다"
-   :removed-from-chat                     "귀하는 그룹 채팅에서 제거되었습니다"
-   :left                                  "나감"
+
+   ;;protocol
+   :received-invitation                   "채팅방 초대"
+   :removed-from-chat                     "그룹 채팅방에서 쫓겨났습니다"
+   :left                                  "떠남"
    :invited                               "초대됨"
-   :removed                               "제거됨"
-   :You                                   "귀하"
-
-   ;new-contact
-   :add-new-contact                       "새 연락처 추가하기"
-   :import-qr                             "가져오기"
+   :removed                               "쫓겨남"
+   :You                                   "당신"
+
+   ;;new-contact
+   :add-new-contact                       "새 연락처 추가"
    :scan-qr                               "QR코드 스캔"
-   :swow-qr                               "QR코드 보기"
    :name                                  "이름"
-   :whisper-identity                      "Whisper 아이디"
-   :address-explication                   "여기에는 주소가 어떻게 되는지, 그리고 해당 주소를 어디에서 찾을지를 설명하는 글이 있어야 합니다"
-   :enter-valid-address                   "유효한 주소를 입력하거나 QR 코드를 스캔해 주세요"
-   :enter-valid-public-key                "유효한 공개키를 입력하거나 QR코드를 스캔하세요"
-   :contact-already-added                 "해당 연락처는 이미 추가되었습니다"
-   :can-not-add-yourself                  "나 자신을 추가할 수는 없습니다"
+   :address-explication                   "공개 키는 Ethereum 주소를 생성하기 위해 사용되며 숫자와 알파벳으로 이루어져 있습니다. 당신의 프로필에서 쉽게 찾을 수 있습니다."
+   :enter-valid-public-key                "올바른 공개 키를 입력하거나 QR 코드를 스캔하세요"
+   :contact-already-added                 "이미 추가되어 있는 연락처입니다."
+   :can-not-add-yourself                  "자기 자신을 추가할 수 없습니다"
    :unknown-address                       "알 수 없는 주소"

-
-   ;login
-   :connect                               "연결"
+   ;;login
+   :connect                               "접속"
    :address                               "주소"
    :password                              "비밀번호"
-   :login                                 "로그인"
    :sign-in-to-status                     "Status에 로그인"
    :sign-in                               "로그인"
    :wrong-password                        "잘못된 비밀번호"
-
-   ;recover
-   :recover-from-passphrase               "암호문에서 복구하기"
-   :recover-explain                       "계정을 복구하려면 비밀번호에 대한 암호문을 입력해 주세요"
+   :enter-password                        "비밀번호 입력"
+
+   ;;recover
    :passphrase                            "암호문"
-   :recover                               "복구하기"
-   :enter-valid-passphrase                "암호문을 입력해 주세요"
-   :enter-valid-password                  "비밀번호를 입력해 주세요"
-   :twelve-words-in-correct-order         "12개의 단어를 올바른 순서로 입력하세요"
-
-   ;accounts
-   :recover-access                        "계정 복구하기"
-   :add-account                           "계정 추가"
+   :recover                               "복구"
+   :twelve-words-in-correct-order         "12개 단어를 올바른 순서로 입력하세요"
+
+   ;;accounts
+   :recover-access                        "계정 복구"
    :create-new-account                    "새 계정 생성"

-   ;wallet-qr-code
-   :done                                  "확인"
-   :main-wallet                           "메인 지갑"
-
-   ;validation
+   ;;wallet-qr-code
+   :done                                  "완료"
+
+   ;;validation
    :invalid-phone                         "잘못된 전화번호"
-   :amount                                "금액"
-   :not-enough-eth                        (str "ETH 잔고가 부족합니다 "
-                                               "({{balance}} ETH)")
-   ;transactions
+   :amount                                "액수"
+
+   ;;transactions
    :confirm                               "승인"
-   :confirm-transactions                  {:one   "거래 승인"
-                                           :other "{{count}}개의 거래 승인"
-                                           :zero  "거래 없음"}
-   :transactions-confirmed                {:one   "거래 승인됨"
-                                           :other "{{count}}개의 거래가 확인됨"
-                                           :zero  "승인된 거래 없음"}
    :transaction                           "거래"
-   :unsigned-transactions                 "서명되지 않은 거래"
-   :no-unsigned-transactions              "서명되지 않은 거래 없음"
-   :enter-password-transactions           {:one   "비밀번호를 입력하여 거래를 승인합니다."
-                                           :other "비밀번호를 입력하여 거래들을 승인합니다."}
+   :unsigned-transaction-expired          "승인되지 않은 거래 만료됨"
    :status                                "상태"
-   :pending-confirmation                  "승인 보류중"
-   :recipient                             "수취인"
-   :one-more-item                         "항목 추가"
-   :fee                                   "수수료"
-   :estimated-fee                         "예상 수수료"
-   :value                                 "금액"
-   :to                                    "수신인"
-   :from                                  "발신인"
+   :recipient                             "수신인"
+   :to                                    "수신자"
+   :from                                  "송금자"
    :data                                  "데이터"
-   :got-it                                "확인함"
-   :contract-creation                     "계약 생성"
-
-   ;:webview
-   :web-view-error                        "이런! 오류입니다"})
+   :got-it                                "알겠습니다"
+   :block                                 "블록"
+   :hash                                  "해시값"
+   :gas-limit                             "최대 가스 사용량"
+   :gas-price                             "가스 가격"
+   :gas-used                              "가스 사용량"
+   :cost-fee                              "비용"
+   :nonce                                 "Nonce"
+   :confirmations                         "이체확인(컨펌)"
+   :confirmations-helper-text             "거래가 안전하게 처리된 것을 확실히 하기 위해 이체확인이 12개를 넘어갈 때 까지 기다려주세요"
+   :copy-transaction-hash                 "거래 해시값 복사"
+   :open-on-etherscan                     "Etherscan.io에서 보기"
+
+   ;;webview
+   :web-view-error                        "이런, 오류입니다"
+
+   ;;testfairy warning
+   :testfairy-title                       "경고!"
+   :testfairy-message                     "나이틀리 빌드에서 설치된 앱을 사용중입니다. 이 빌드에는 테스트를 위해 세션 녹화 기능이 포함되어 있으며, Wi-Fi가 연결되어 있을 시 앱과의 모든 상호작용이 (비디오와 로그로) 저장됩니다. 이 데이터는 개발자들이 문제를 확인하기 위해 사용할 수 있습니다. 녹화된 정보에 비밀번호는 포함되어 있지 않습니다. 세션 녹화는 앱이 나이틀리 빌드에서 설치되었을 때만 진행됩니다. Play 스토어 또는 TestFlight를 통해 설치했을 시에는 녹화가 진행되지 않습니다."
+
+   ;; wallet
+   :wallet                                "지갑"
+   :wallets                               "지갑들"
+   :your-wallets                          "내 지갑"
+   :main-wallet                           "주 지갑"
+   :wallet-error                          "데이터 로딩 중 오류 발생"
+   :wallet-send                           "송금"
+   :wallet-request                        "요청"
+   :wallet-exchange                       "거래소"
+   :wallet-assets                         "자산"
+   :wallet-add-asset                      "자산 추가"
+   :wallet-total-value                    "총자산"
+   :wallet-settings                       "지갑 설정"
+   :signing-phrase-description            "거래를 승인하려면 비밀번호를 입력하세요. 위에 있는 단어들이 당신의 서명 문구와 일치하는지 확인하세요."
+   :wallet-insufficient-funds             "자금 부족"
+   :request-transaction                   "거래 요청"
+   :send-request                          "요청 전송"
+   :share                                 "공유"
+   :eth                                   "ETH"
+   :currency                              "통화"
+   :usd-currency                          "USD"
+   :transactions                          "거래"
+   :transaction-details                   "거래 세부정보"
+   :transaction-failed                    "거래 실패"
+   :transactions-sign                     "승인"
+   :transactions-sign-all                 "모두 승인"
+   :transactions-sign-transaction         "거래 승인"
+   :transactions-sign-later               "나중에 승인"
+   :transactions-delete                   "거래 삭제"
+   :transactions-delete-content           "거래가 '승인되지 않음' 목록에서 삭제됩니다"
+   :transactions-history                  "거래 내역"
+   :transactions-unsigned                 "승인되지 않음"
+   :transactions-history-empty            "아직 거래 내역이 없습니다"
+   :transactions-unsigned-empty           "승인되지 않은 거래가 없습니다"
+   :transactions-filter-title             "거래 내역 필터"
+   :transactions-filter-tokens            "토큰"
+   :transactions-filter-type              "종류"
+   :transactions-filter-select-all        "모두 선택"
+   :view-transaction-details              "거래 세부정보 보기"
+   :transaction-description               "거래가 안전하게 처리된 것을 확실히 하기 위해 이체확인이 12개를 넘어갈 때 까지 기다려주세요"
+   :transaction-sent                      "거래 전송됨"
+   :transaction-moved-text                "다음 5분간 거래가 '승인되지 않음' 목록에 남아있을 것입니다"
+   :transaction-moved-title               "거래 옮겨짐"
+   :sign-later-title                      "거래를 나중에 승인할까요?"
+   :sign-later-text                       "이 거래를 승인하려면 거래 내역을 확인하세요"
+   :not-applicable                        "승인되지 않은 거래에 사용할 수 없음"
+
+   ;; Wallet Send
+   :wallet-choose-recipient               "수신인 선택"
+   :wallet-choose-from-contacts           "연락처에서 선택"
+   :wallet-address-from-clipboard         "클립보드에서 가져오기"
+   :wallet-invalid-address                "잘못된 주소: \n {{data}}"
+   :wallet-browse-photos                  "사진 보기"
+   :validation-amount-invalid-number      "잘못된 액수입니다"
+   :validation-amount-is-too-precise      "액수가 너무 정확합니다. 최소 송금 단위는 1 Wei (1x10^-18 ETH) 입니다."
+
+
+
+   ;; network settings
+   :new-network                           "새 네트워크"
+   :add-network                           "네트워크 추가"
+   :add-new-network                       "새 네트워크 추가"
+   :existing-networks                     "기존 네트워크"
+   :add-json-file                         "JSON 파일 추가"
+   :paste-json-as-text                    "JSON 텍스트로 붙여넣기"
+   :paste-json                            "JSON 붙여넣기"
+   :specify-rpc-url                       "RPC URL을 지정하세요"
+   :edit-network-config                   "네트워크 설정 편집"
+   :connected                             "연결됨"
+   :process-json                          "JSON 처리"
+   :error-processing-json                 "JSON 처리중 오류 발생"
+   :rpc-url                               "RPC URL"
+   :remove-network                        "네트워크 제거"
+   :network-settings                      "네트워크 설정"
+   :edit-network-warning                  "주의하십시오. 네트워크 설정을 편집하면 이 네트워크를 사용하지 못할 수 있습니다."
+   :connecting-requires-login             "다른 네트워크에 연결하기 위해서는 로그인이 필요합니다"
+   :close-app-title                       "경고!"
+   :close-app-content                     "앱이 닫힐 것입니다. 앱을 다시 열었을 때 설정된 네트워크가 사용될 것입니다"
+   :close-app-button                      "확인"})


Updated stackdriver to omit events with nil as the metric value

--- src/riemann/stackdriver.clj
+++ src/riemann/stackdriver.clj
@@ -13,24 +13,14 @@
   (let [service ((:name opts) event)]
      (replace service #"\s+" ".")))

-(defmulti generate-datapoint (fn [opts event] (sequential? event)))
-
-(defmethod generate-datapoint false
-  [opts event]
-  (let [value (:metric event)
-        service (metric-name opts event)]
-    {:name service
-     :value (if (nil? value) 0 value)
-     :collected_at (long (:time event))}))
-
-(defmethod generate-datapoint true
-  [opts event]
-  (mapv
-   #(let [value (:metric %)
-          service (metric-name opts %)]
-     {:name service
-      :value (if (nil? value) 0 value)
-      :collected_at (long (:time %))}) event))
+(defn generate-datapoint
+  [opts event-or-events]
+  (let [events (if (sequential? event-or-events) event-or-events (list event-or-events))]
+    (map (fn [event]
+      {:name (metric-name opts event)
+       :value (:metric event)
+       :collected_at (long (:time event))})
+    events)))

 (defn post-datapoint
   "Post the riemann metrics datapoints."
@@ -49,6 +39,6 @@
     (fn [event]
       (let [post-data {:timestamp (swap! ts #(max (inc %) (long (riemann.time/unix-time))))
                        :proto_version 1
-                       :data (generate-datapoint opts event)}
+                       :data (generate-datapoint opts (remove (comp nil? :metric) event))}
             json-data (generate-string post-data)]
         (post-datapoint (:api-key opts) gateway-url json-data)))))


code org

code org

--- src-cljs/cljsbuild_ui/pages/main.cljs
+++ src-cljs/cljsbuild_ui/pages/main.cljs
@@ -226,6 +226,22 @@
   (str dir
        (when (not= (last dir) path-separator)
           path-separator)))
+
+(defn- validate-new-project [fldr nme]
+  (cond
+    (blank? nme)
+      "Please enter a project name."
+
+    (.test #"[^a-z0-9_-]" nme)
+      "Only a-z, hyphens, and underscores please."
+
+    (not (letter? (first nme)))
+      "First character must be a letter (a-z)."
+
+    (file-exists? (str fldr path-separator nme))
+      "Folder already exists."
+
+    :else nil))

 ;;------------------------------------------------------------------------------
 ;; State-effecting
@@ -488,22 +504,6 @@

     ;; go to the next step
     (swap! state assoc :new-project-step 3)))
-
-(defn- validate-new-project [fldr nme]
-  (cond
-    (blank? nme)
-      "Please enter a project name."
-
-    (.test #"[^a-z0-9_-]" nme)
-      "Only a-z, hyphens, and underscores please."
-
-    (not (letter? (first nme)))
-      "First character must be a letter (a-z)."
-
-    (file-exists? (str fldr path-separator nme))
-      "Folder already exists."
-
-    :else nil))

 (defn- click-create-project-btn []
   (let [current-state @state


only select if you weren't already editing the name

--- src-cljs/frontend/components/hud.cljs
+++ src-cljs/frontend/components/hud.cljs
@@ -193,8 +193,9 @@
     om/IInitState (init-state [_] {:editing-name? false
                                    :new-name ""})
     om/IDidUpdate
-    (did-update [_ _ _]
-      (when (and (om/get-state owner :editing-name?)
+    (did-update [_ _ prev-props]
+      (when (and (not (:editing-name? prev-props))
+                 (om/get-state owner :editing-name?)
                  (om/get-node owner "name-edit"))
         (.focus (om/get-node owner "name-edit"))
         (.select (goog.dom.Range/createFromNodeContents (om/get-node owner "name-edit")))))


Tutorial 1 - a basic window.

Tutorial 1 - a basic window.

--- src/opengl_sandbox/tut1.clj
+++ src/opengl_sandbox/tut1.clj
@@ -1,5 +1,13 @@
 (ns opengl-sandbox.tut1
    (:import [org.lwjgl.opengl DisplayMode Display]))

+(defn game-loop []
+  (while (not (Display/isCloseRequested))
+   (Display/update)))
+
 (defn run []
-  (println "Running tutorial 1"))
+  (println "Running tutorial 1")
+  (Display/setDisplayMode (DisplayMode. 800 600))
+  (Display/setTitle "Tutorial 1")
+  (Display/create)
+  (game-loop))


bugfix convergence check in sync context, remove logged-compute-graph ctor, disable disconnect-all! in remove-vertex!

--- src/thi/ng/fabric/core.cljc
+++ src/thi/ng/fabric/core.cljc
@@ -14,7 +14,7 @@
         [clojure.core.reducers :as r]
         [cljs.core.async :as a :refer [chan close! <! >! alts! timeout]])]))

-#?(:clj (taoensso.timbre/set-level! :warn))
+;;#?(:clj (taoensso.timbre/set-level! :warn))

 ;; (warn :free-ram (.freeMemory (Runtime/getRuntime)))

@@ -233,9 +233,9 @@
   (remove-vertex!
     [_ v]
     (when (get-in @state [:vertices (:id v)])
+      (notify-watches @watches [:remove-vertex v])
       (swap! state update :vertices dissoc (:id v))
-      (disconnect-all! v)
-      (notify-watches @watches [:remove-vertex v])
+      ;;(disconnect-all! v)
       true))
   (vertex-for-id
     [_ id] (get-in @state [:vertices id]))
@@ -260,10 +260,6 @@

 (defn compute-graph
   [] (InMemoryGraph. (atom {:vertices {} :next-id 0}) (atom {})))
-
-#_(defn logged-compute-graph
-    ([log-chan] (LoggedGraph. (compute-graph) log-chan))
-    ([g log-chan] (LoggedGraph. g log-chan)))

 (defn eager-async-vertex-processor
   [{:keys [id] :as vertex} ctx]
@@ -372,14 +368,14 @@
       (include-vertex! [_ v] (err/unsupported!))
       (execute!
         [_]
-        (add-watch! g :remove-vertex watch-id (fn [evt] (signal! (peek evt) sync-vertex-signal)))
+        (add-watch! g :remove-vertex watch-id (fn [[__ v]] (signal! v sync-vertex-signal)))
         (let [t0 (now)]
           (loop [i 0, colls 0, sigs 0]
             (if (<= i max-iter)
               (let [verts (vertices g)
                     sigs' (sig-fn verts s-thresh)
                     colls' (coll-fn verts c-thresh)]
-                (if (and (pos? sigs') (pos? colls'))
+                (if (or (pos? sigs') (pos? colls'))
                   (recur (inc i) (long (+ colls colls')) (long (+ sigs sigs')))
                   (do (remove-watch! g :remove-vertex watch-id)
                       (execution-result :converged colls sigs t0 {:iterations i}))))
@@ -437,7 +433,7 @@
         (when (should-signal? v s-thresh)
           (signal! v async-vertex-signal))
         #_(when (should-collect? v c-thresh)
-          (collect! v))
+            (collect! v))
         _)
       (execute!
         [_]


Web review changes

Web review changes

--- src/clj/org/openforis/ceo/handler.clj
+++ src/clj/org/openforis/ceo/handler.clj
@@ -29,9 +29,9 @@
 ;; FIXME: Fill these in as you make pages.
 (def view-routes #{"/"
                    "/about"
-                   "/accout"
+                   "/account"
                    "/collection"
-                   "/create-instituion"
+                   "/create-institution"
                    "/create-project"
                    "/geo-dash"
                    "/geo-dash/geo-dash-help" ; TODO flatten url structure
@@ -67,7 +67,7 @@
                  "/request-institution-membership" :post
                  "/send-to-mailing-list"           :post
                  "/unsubscribe-mailing-list"       :post
-                 ;; Project API
+                 ;; Projects API
                  "/dump-project-aggregate-data" :get
                  "/dump-project-raw-data"       :get
                  "/get-all-projects"            :get
@@ -128,13 +128,12 @@
                             (= request-method :get))
                        (render-page uri)

-                       (and (contains? api-routes uri)
-                            (= request-method (api-routes uri)))
+                       (= request-method (api-routes uri))
                        (api-handler uri)

                        (and (contains? proxy-routes uri)
                             (= request-method :get))
-                       (data-response "")
+                       (data-response "") ; FIXME missing proxy implementation

                        :else
                        not-found-page)]


remove extra table prefixes

remove extra table prefixes

--- src/clj_money/models/transactions.clj
+++ src/clj_money/models/transactions.clj
@@ -525,7 +525,7 @@
   (with-storage [s storage-spec]
     (select-transaction-items
       s
-      {:i.account-id account-id}
+      {:account-id account-id}
       {:count true})))

 (defn unreconciled-items-by-account
@@ -534,7 +534,7 @@
   (with-storage [s storage-spec]
     (let [account (accounts/find-by-id storage-spec account-id)]
       (map #(after-item-read % account)
-           (select-transaction-items s {:i.account-id account-id
+           (select-transaction-items s {:account-id account-id
                                         :reconciliation-id nil})))))

 (defn- process-item-upserts


Be more clear about binding failures

Be more clear about binding failures

Second time through server start attempt, I'm getting a binding
failure because the address is already in use. Make the error a little
more clear, though this approach isn't much of an improvement (the error
message only gets better for this specific error).

Then again, there's an error handler further up the stack that provides
the real error message. That reduces my motivation to get this correct.

--- src/com/frereth/common/zmq_socket.clj
+++ src/com/frereth/common/zmq_socket.clj
@@ -4,6 +4,7 @@
              [common :as mq-cmn]
              [core :as mq]
              [curve :as curve]]
+            [clojure.pprint :refer (pprint)]
             [clojure.spec :as s]
             [com.frereth.common
              [schema :as schema]
@@ -118,9 +119,15 @@
              (try
                (mq/bind! sock uri)
                (catch ExceptionInfo ex
-                 (log/error ex (str "Problem binding\n"
-                                    (util/pretty url)
-                                    "\nAre you having internet issues?"))
+                 (let [cause (.getCause ex)
+                       errno (.getErrorCode cause)]
+                   ;; TODO: Find a symbolic constant to eliminate this magic number
+                   ;; (it's EADDRINUSE)
+                   (if (= 98 errno)
+                     (log/error ex "Address already in use")
+                     (log/error ex (str "Problem binding\n"
+                                        (util/pretty url)
+                                        "\nAre you having internet issues?"))))
                  (throw ex)))
              (try
                (mq/connect! sock uri)


Unsigned transactions back button doesnt cancel transactions anymore

--- src/status_im/transactions/screens/unsigned_transactions.cljs
+++ src/status_im/transactions/screens/unsigned_transactions.cljs
@@ -17,8 +17,7 @@
 (defn toolbar-view [transactions]
   [toolbar/toolbar
    {:background-color st/transactions-toolbar-background
-    :nav-action       (act/close-white #(do (rf/dispatch [:deny-transactions])
-                                            (rf/dispatch [:navigate-back])))
+    :nav-action       (act/close-white #(rf/dispatch [:navigate-back]))
     :border-style     st/toolbar-border
     :custom-content   [rn/view {:style st/toolbar-title-container}
                        [rn/text {:style st/toolbar-title-text


WIP fileset API name revisitation

WIP fileset API name revisitation

--- boot/core/src/boot/core.clj
+++ boot/core/src/boot/core.clj
@@ -270,10 +270,16 @@

 ;; Tempdir and Fileset API ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

-(defn temp-dir!
+(defmacro- deprecate! [was is & [args]]
+  `(defn ^:deprecated ~was
+     (util/warn "%s was deprecated, please use %s instead\n" '~was '~is)
+     (~is ~@args)))
+
+(defn tmp-dir!
   "Creates a boot-managed temporary directory, returning a java.io.File."
   []
   (temp-dir** nil :cache))
+(deprecate! temp-dir! tmp-dir!)

 (defn cache-dir!
   "Returns a directory which is managed by boot but whose contents will not be
@@ -294,34 +300,39 @@

 ;; TmpFile API

-(defn tmppath
+(defn tmp-path
   "Returns the tmpfile's path relative to the fileset root."
   [tmpfile]
   (tmpd/path tmpfile))
-
-(defn tmpdir
+(deprecate! tmppath tmp-path)
+
+(defn tmp-dir
   "Returns the temporary directory containing the tmpfile."
   [tmpfile]
   (tmpd/dir tmpfile))
-
-(defn tmpfile
+(deprecate! tmpdir tmp-dir)
+
+(defn tmp-file
   "Returns the java.io.File object for the tmpfile."
   [tmpfile]
   (tmpd/file tmpfile))
-
-(defn tmptime
+(deprecate! tmpfile tmp-file)
+
+(defn tmp-time
   "Returns the last modified timestamp for the tmpfile."
   [tmpfile]
   (tmpd/time tmpfile))
+(deprecate! tmptime tmp-time)

 ;; TmpFileSet API

-(defn tmpget
+(defn tmp-get
   "Given a fileset and a path, returns the associated TmpFile record. If the
   not-found argument is specified and the TmpFile is not in the fileset then
   not-found is returned, otherwise nil."
   [fileset path & [not-found]]
   (get-in fileset [:tree path] not-found))
+(deprecate! tmpget tmp-get)

 (defn user-dirs
   "Get a list of directories containing files that originated in the project's


Move `:errors` into channel `error-ch`

Move `:errors` into channel `error-ch`

--- src-cljs/frontend/controllers/controls.cljs
+++ src-cljs/frontend/controllers/controls.cljs
@@ -1219,13 +1219,13 @@

 (defmethod post-control-event! :project-feature-flag-checked
   [target message {:keys [project-id flag value]} previous-state current-state]
-  (let [api-ch (get-in current-state [:comms :api])
-        project-name (vcs-url/project-name project-id)
-        comms (get-in current-state [:comms])]
+  (let [project-name (vcs-url/project-name project-id)
+        api-ch (get-in current-state [:comms :api])
+        error-ch (get-in current-state [:comms :errors])]
     (go (let [api-result (<! (ajax/managed-ajax :put (api-path/settings-path (:navigation-data current-state))
                                                 :params {:feature_flags {flag value}}))]
           (when (not= :success (:status api-result))
-            (put! (:errors comms) [:api-error api-result]))
+            (put! error-ch [:api-error api-result]))
           (ajax/ajax :get (api-path/settings-path (:navigation-data current-state)) :project-settings api-ch :context {:project-name project-name})))))

 (defmethod post-control-event! :project-experiments-feedback-clicked


CMR-688-2: Uncommented code in ingest util.

--- system-int-test/src/cmr/system_int_test/utils/ingest_util.clj
+++ system-int-test/src/cmr/system_int_test/utils/ingest_util.clj
@@ -173,4 +173,4 @@
          (create-provider provider-guid provider-id grant-all?))
        (f)
        (finally
-         #_(reset))))))
+         (reset))))))


Improved handling if state is not known

Improved handling if state is not known

A redirect to the original-uri, if it exists, resolves some of the
causes of this issue.

--- src/cylon/oauth/client/web_client.clj
+++ src/cylon/oauth/client/web_client.clj
@@ -73,7 +73,11 @@
               tok (get-token-by-id state-store state)]

           (if (nil? tok)
-            {:status 400 :body "Unexpected user state"}
+            (let [session (session session-store req)
+                  original-uri (:cylon/original-uri session)]
+              (if original-uri
+                (redirect original-uri)
+                {:status 400 :body "Unexpected user state"}))

             (let [code (get params "code")


update project

update project

--- vif-navigator/project.clj
+++ vif-navigator/project.clj
@@ -22,7 +22,6 @@
                                  {:dependencies [[org.clojure-android/tools.nrepl "0.2.6"]]
                                   :target-path  "target/debug"
                                   :android      {:aot                     :all-with-unused
-                                                 ;:rename-manifest-package "ru.vif.debug"
                                                  :manifest-options        {:app-name "VifNavigator - debug"}}}]
                        :release
                                 [:android-common
@@ -37,6 +36,7 @@
                                                 :ignore-log-priority [:debug :verbose]
                                                 :aot                 :all-with-unused
                                                 :build-type          :release}}]
+
                        :lean
                                 [:release
                                  {:dependencies ^:replace [[org.skummet/clojure-android "1.7.0-alpha5-r2" :use-resources true]
@@ -78,5 +78,5 @@

                       }
-            :aliases {"build" ["droid" "doall" "-e"]}
+            :aliases {"build" [["droid" "doall" "-e"]]}
             )


Add tests for numerics.

Add tests for numerics.

--- test/zweikopf/core_test.clj
+++ test/zweikopf/core_test.clj
@@ -10,13 +10,19 @@

 (deftest clojurize-test
   (ruby-eval "require 'date'")
+  (testing "Numbers"
+    (testing "Integer"
+      (is (= 123 (clojurize (ruby-eval "123")))))
+    (testing "Floating point"
+      (is (= 123.45 (clojurize (ruby-eval "123.45")))))
+    (testing "Big Decimals"
+      (is (= 12.34M (clojurize (ruby-eval "require 'bigdecimal'; BigDecimal.new(12.34,4)"))))))
   (testing "Empty hash"
     (is (= {} (clojurize (ruby-eval "{}")))))
   (testing "Non-empty hash"
     (is (= {:a 1 :b 2} (clojurize (ruby-eval "{:a => 1, :b =>2 }")))))
   (testing "Deep hash"
     (is (= {:a 1 :b {:c 3 :d 4}} (clojurize (ruby-eval "{:a => 1, :b => {:c => 3, :d =>4}}")))))
-
   (testing "Empty array"
     (is (= [] (clojurize (ruby-eval "[]")))))
   (testing "Non-empty array"
@@ -32,6 +38,16 @@
         (is (= #inst "2013-02-19T12:34:56" date))))))

 (deftest rubyize-test
+  (testing "Numbers"
+    (testing "Integer"
+      (is (= (ruby-eval "123")
+             (rubyize 123))))
+    (testing "Floating point"
+      (is (= (ruby-eval "123.45")
+             (rubyize 123.45))))
+    (testing "Big Decimals"
+      (is (= (ruby-eval "require 'bigdecimal'; BigDecimal.new(12.34,4)")
+             (rubyize 12.34M)))))
   (testing "Emtpy hash"
     (is (.equals (ruby-eval "{}") (rubyize {}))))
   (testing "Non-emtpy hash"


(MAINT) Prefer time/seconds over time/secs

The latter is deprecated in favor of the former. Unit tests no longer
emit warnings about this.

--- src/clojure/puppetlabs/ssl_utils/simple.clj
+++ src/clojure/puppetlabs/ssl_utils/simple.clj
@@ -44,7 +44,7 @@
    :post [(validity-date-range? %)]}
   (let [now        (time/now)
         not-before (time/minus now (time/days 1))
-        not-after  (time/plus now (time/secs ca-ttl))]
+        not-after  (time/plus now (time/seconds ca-ttl))]
     {:not-before (.toDate not-before)
      :not-after  (.toDate not-after)}))


Changed printing of test errors to better identify failed test cases.

--- src/clojush/problems/software/number_IO.clj
+++ src/clojush/problems/software/number_IO.clj
@@ -278,7 +278,10 @@
     (println "Test total error for best:" best-total-test-error)
     (println (format "Test mean error for best: %.5f" (double (/ best-total-test-error (count best-test-errors)))))
     (when (<= (:total-error best) 1.0E-4)
-      (println "Test errors for best:" best-test-errors))
+      (doseq [[i [num-error lev-dist]] (map vector
+                                            (range)
+                                            (partition 2 best-test-errors))]
+        (println (format "Test Case  %3d | Numeric Error: %19.14f | Levenshtein Distance: %d" i (float num-error) lev-dist))))
     (println ";;------------------------------")
     (println "Outputs of best individual on training cases:")
     (error-function best-program :train true)


Callgraph now loads with (most) CGClasses

--- src/com/madeye/clojure/callgraph/loader.clj
+++ src/com/madeye/clojure/callgraph/loader.clj
@@ -3,6 +3,7 @@

 (use 'clostache.parser)
 (require '[clojure.string :as str])
+(require '[clojure.set :as set])

 (defrecord Callgraph [classes])
 (defrecord CGClass [name methods])
@@ -69,7 +70,8 @@
 (defn add-class-to-callgraph-if-not-exists
   [cg cgclass]
   (if (nil? (get-class-from-callgraph cg (:name cgclass)))
-    (assoc cg :classes (assoc (:classes cg) (keyword (:name cgclass)) cgclass))))
+    (assoc cg :classes (assoc (:classes cg) (keyword (:name cgclass)) cgclass))
+    cg))

 (defn add-method-to-callgraph
   [cg class-name method-name]
@@ -94,8 +96,18 @@
     :class (process-callgraph-class-row cg row)
     :method (process-callgraph-method-row cg row)))

+(defn process-callgraph
+  [data]
+  (loop [remaining data cg (create-callgraph)]
+    (if (not (empty? remaining))
+      (do
+        ;(println "remaining:" (count remaining) ",cg:" cg)
+        (recur (rest remaining) (process-callgraph-row cg (first remaining)))
+      )
+      cg)))
+
 (defn parse-callgraph
   [cgfile]
   (let [data (load-data cgfile)
-        class-names (clojure.set/union (set (map :dest-class data)) (set (map :src-class data)))]
+        class-names (set/union (set (map :dest-class data)) (set (map :src-class data)))]
     (reduce #(add-class-to-callgraph %1 (create-class %2)) (create-callgraph) class-names)))


:lipstick: Cosmetic changes on auth data events.

--- frontend/src/uxbox/main/data/auth.cljs
+++ frontend/src/uxbox/main/data/auth.cljs
@@ -38,10 +38,6 @@
       (rx/of du/fetch-profile
              (rt/navigate :dashboard-projects)))))

-(defn logged-in?
-  [v]
-  (= (ptk/type v) ::logged-in))
-
 ;; --- Login

 (s/def ::login-params
@@ -50,7 +46,7 @@
 (defn login
   [{:keys [username password] :as data}]
   (s/assert ::login-params data)
-  (reify
+  (ptk/reify ::login
     ptk/UpdateEvent
     (update [_ state]
       (merge state (dissoc initial-state :route :router)))


Subgraph is more descriptive than section.

--- src/klangmeister/sound/synthesis.cljs
+++ src/klangmeister/sound/synthesis.cljs
@@ -2,24 +2,24 @@

 ; Definitions

-(defn section
+(defn subgraph
   ([input output] {:input input :output output})
-  ([singleton] (section singleton singleton)))
+  ([singleton] (subgraph singleton singleton)))

 (defn source
   "A graph of synthesis nodes without an input, so another graph can't connect to it."
   [node]
-  (section nil node))
+  (subgraph nil node))

 (defn sink
   "A graph of synthesis nodes without an output, so it can't connect to another graph."
   [node]
-  (section node nil))
+  (subgraph node nil))

 ; Plumbing

 (defn run-with
-  "Convert a synth (actually a reader fn) into a concrete section by supplying context and timing."
+  "Convert a synth (actually a reader fn) into a concrete subgraph by supplying context and timing."
   [synth context at duration]
   (synth context at duration))

@@ -34,7 +34,7 @@

 (defn gain [level]
   (fn [context at duration]
-    (section
+    (subgraph
       (doto (.createGain context)
         (-> .-gain (plug level context at duration))))))

@@ -55,7 +55,7 @@
           (+ dx x))
         at
         corners)
-      (section audio-node))))
+      (subgraph audio-node))))

 (defn adshr [attack decay sustain hold release]
   (envelope [attack 1.0] [decay sustain] [hold sustain] [release 0]))
@@ -87,7 +87,7 @@
   (fapply
     (fn [graph1 graph2]
       (.connect (:output graph1) (:input graph2))
-      (section (:input graph1) (:output graph2)))
+      (subgraph (:input graph1) (:output graph2)))
     upstream-synth
     downstream-synth))

@@ -107,7 +107,7 @@
           (.connect (:output graph) (:input downstream))
           (when (:input graph)
             (.connect (:output upstream) (:input graph)))))
-      (section (:input upstream) (:output downstream)))))
+      (subgraph (:input upstream) (:output downstream)))))

 ; Noise
@@ -164,12 +164,12 @@
 (defn biquad-filter
   ([type freq q]
    (fn [context at duration]
-     (section
+     (subgraph
        (doto (-> (biquad-filter type freq) (run-with context at duration) :output)
          (-> .-Q (plug q context at duration))))))
   ([type freq]
    (fn [context at duration]
-     (section
+     (subgraph
        (doto (.createBiquadFilter context)
          (-> .-frequency .-value (set! 0))
          (-> .-frequency (plug freq context at duration))
@@ -183,14 +183,14 @@

 (defn stereo-panner [pan]
   (fn [context at duration]
-    (section
+    (subgraph
       (doto (.createStereoPanner context)
         (-> .-pan (plug pan context at duration))))))

 (defn delay-line
   [time]
   (fn [context at duration]
-    (section
+    (subgraph
       (let [maximum 5]
         (doto (.createDelay context maximum)
           (-> .-delayTime (plug time context at duration)))))))
@@ -198,7 +198,7 @@
 (defn convolver
   [generate-bit!]
   (fn [context at duration]
-    (section
+    (subgraph
       (doto (.createConvolver context)
         (-> .-buffer (set! (buffer generate-bit! context (+ duration 1.0))))))))


CMR-488: Added test for dataset id with slashes.

--- test/cmr/system_int_test/search/collection_retrieval_test.clj
+++ test/cmr/system_int_test/search/collection_retrieval_test.clj
@@ -28,4 +28,18 @@
       (let [response (search/get-concept-by-concept-id "C1111-CMR_PROV1")]
         (is (= 404 (:status response)))
         (re-find #"Failed to retrieve concept C1111-CMR_PROV1 from metadata-db:" (:body response))
-        (re-find #"Concept with concept-id \[C1111-CMR_PROV1\] does not exist" (:body response))))))+        (re-find #"Concept with concept-id \[C1111-CMR_PROV1\] does not exist" (:body response))))))
+
+(deftest search-with-slashes-in-dataset-id
+  (let [coll1 (d/ingest "CMR_PROV1" (dc/collection {:entry-title "Dataset1"}))
+        coll2 (d/ingest "CMR_PROV1" (dc/collection {:entry-title "Dataset/With/Slashes"}))
+        coll3 (d/ingest "CMR_PROV1" (dc/collection {:entry-title "Dataset3"}))
+        coll4 (d/ingest "CMR_PROV1" (dc/collection {:entry-title "Dataset/With/More/Slashes"}))
+        coll5 (d/ingest "CMR_PROV1" (dc/collection {}))]
+
+    (index/refresh-elastic-index)
+
+    (testing "search for dataset with slashes"
+      (are [dataset-id items] (d/refs-match? items (search/find-refs :collection {:dataset-id dataset-id}))
+           "Dataset/With/Slashes" [coll2]
+           "BLAH" []))))


Fix user.clj

Fix user.clj

--- src/user.clj
+++ src/user.clj
@@ -6,21 +6,19 @@
             [mtgcollection.mtgjson :as mtgjson]
             [mtgcollection.schema :as schema]))

-(defn mtg-json-data []
-  (-> "AllSets-x.json" io/resource io/reader json/parse-stream))
+(defn- mtg-json-data []
+  (-> "AllSets-x.json" io/resource io/reader json/parse-stream vals))

-(defn insert-set-and-card-data [conn sets]
-  (->> sets
-       (map mtgjson/set-tx-data)
-       (apply concat)
-       (api/transact conn)))
+(defn- load-mtgjson-into-datomic []
+  (let [conn (api/connect db-uri)]
+    (doseq [json (mtg-json-data)]
+      (let [set-data (mtgjson/set-tx-data json)]
+        (println (get json "code") (get json "name"))
+        (api/transact conn set-data)))))

 (defn reset-db []
   (let [db-uri (env :datomic-uri)]
     (api/delete-database db-uri)
     (api/create-database db-uri)
     (schema/setup-db-schema db-uri)
-    (let [conn (api/connect db-uri)]
-      (->> (mtg-json-data)
-           vals
-           (insert-set-and-card-data conn)))))
+    (load-mtgjson-into-datomic)))


[#2228] Decrease log level from INFO to DEBUG

--- backend/src/akvo/lumen/http/client.clj
+++ backend/src/akvo/lumen/http/client.clj
@@ -33,7 +33,7 @@
                              (some? (:socket-timeout %))))
 (defn get* [url opts]
   {:pre [(req-pre-condition opts)]}
-  (log/info :ulr url :opts opts)
+  (log/debug :ulr url :opts opts)
   (client/get url opts))

 (defn post* [url opts]


fix missing var error

fix missing var error

--- src/main/shadow/cljs/devtools/cli.clj
+++ src/main/shadow/cljs/devtools/cli.clj
@@ -208,5 +208,6 @@
 (defn test-all []
   (api/test-all))

-(defn test-affected [test-ns]
-  (api/test-affected [(cljs/ns->cljs-file test-ns)]))+(comment
+  (defn test-affected [test-ns]
+    (api/test-affected [(cljs/ns->cljs-file test-ns)])))


add example based testing on undo

add example based testing on undo