From 89c7477bd658d99bc93963725f0bb96f0762dd6f Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 13 Jun 2017 11:39:37 +0100 Subject: [PATCH 1/2] Add script to copy translations between files So we can fill in missing translations from different dialects Use it to fill in missing strings in pt from pt_BR --- scripts/copy-i18n.py | 46 ++++++++++++++++++++ src/i18n/strings/pt.json | 92 +++++++++++++++++++++++++++++++++++++++- 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100755 scripts/copy-i18n.py diff --git a/scripts/copy-i18n.py b/scripts/copy-i18n.py new file mode 100755 index 0000000000..c3b8d6072e --- /dev/null +++ b/scripts/copy-i18n.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python + +import json +import sys +import os + +if len(sys.argv) < 3: + print "Usage: %s " % (sys.argv[0],) + print "eg. %s pt_BR.json pt.json" % (sys.argv[0],) + print + print "Adds any translations to that exist in but not " + sys.exit(1) + +srcpath = sys.argv[1] +dstpath = sys.argv[2] +tmppath = dstpath + ".tmp" + +with open(srcpath) as f: + src = json.load(f) + +with open(dstpath) as f: + dst = json.load(f) + +toAdd = {} +for k,v in src.iteritems(): + if k not in dst: + print "Adding %s" % (k,) + toAdd[k] = v + +# don't just json.dumps as we'll probably re-order all the keys (and they're +# not in any given order so we can't just sort_keys). Append them to the end. +with open(dstpath) as ifp: + with open(tmppath, 'w') as ofp: + for line in ifp: + strippedline = line.strip() + if strippedline in ('{', '}'): + ofp.write(line) + elif strippedline.endswith(','): + ofp.write(line) + else: + ofp.write(' '+strippedline) + ofp.write(",\n") + toAddStr = json.dumps(toAdd, indent=4, separators=(',', ': '), ensure_ascii=False, encoding="utf8")[1:-1] + ofp.write(toAddStr.encode('utf8')) + +os.rename(tmppath, dstpath) diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 2552455932..356aab5e02 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -871,5 +871,95 @@ "Tagged as: ": "Marcado como: ", "You have disabled URL previews by default.": "Você desabilitou pré-visualizações de links por padrão.", "You have enabled URL previews by default.": "Você habilitou pré-visualizações de links por padrão.", - "You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando." + "You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando.", + + "You have been banned from %(roomName)s by %(userName)s.": "Você foi expulso(a) da sala %(roomName)s por %(userName)s.", + "Send anyway": "Enviar de qualquer maneira", + "This room": "Esta sala", + "Create new room": "Criar nova sala", + "Click on the button below to start chatting!": "Clique no botão abaixo para começar a conversar!", + "Disable markdown formatting": "Desabilitar formatação MarkDown", + "No display name": "Sem nome público de usuária(o)", + "This will be your account name on the homeserver, or you can pick a different server.": "Este será seu nome de conta no Servidor de Base , ou então você pode escolher um servidor diferente.", + "Uploading %(filename)s and %(count)s others.one": "Enviando o arquivo %(filename)s e %(count)s outros arquivos", + "Hide removed messages": "Ocultar mensagens removidas", + "You may wish to login with a different account, or add this email to this account.": "Você pode querer fazer login com uma conta diferente, ou adicionar este e-mail a esta conta.", + "Welcome page": "Página de boas vindas", + "Upload new:": "Enviar novo:", + "Private Chat": "Conversa privada", + "You must register to use this functionality": "Você deve se registrar para poder usar esta funcionalidade", + "And %(count)s more...": "E mais %(count)s...", + "Start chatting": "Iniciar a conversa", + "Public Chat": "Conversa pública", + "Uploading %(filename)s and %(count)s others.zero": "Enviando o arquivo %(filename)s", + "Room contains unknown devices": "Esta sala contém dispositivos desconhecidos", + "Admin tools": "Ferramentas de administração", + "You have been kicked from %(roomName)s by %(userName)s.": "Você foi removido(a) da sala %(roomName)s por %(userName)s.", + "Undecryptable": "Não é possível descriptografar", + "Incoming video call from %(name)s": "Chamada de vídeo de %(name)s recebida", + "Otherwise, click here to send a bug report.": "Caso contrário, clique aqui para enviar um relatório de erros.", + "To link to a room it must have an address.": "Para produzir um link para uma sala, ela necessita ter um endereço.", + "a room": "uma sala", + "Your home server does not support device management.": "O seu Servidor de Base não suporta o gerenciamento de dispositivos.", + "Searching known users": "Buscando pessoas conhecidas", + "Alias (optional)": "Apelido (opcional)", + "Active call (%(roomName)s)": "Chamada ativa (%(roomName)s)", + "Unable to ascertain that the address this invite was sent to matches one associated with your account.": "Não foi possível garantir que o endereço para o qual este convite foi enviado bate com alqum que está associado com sua conta.", + "Error: Problem communicating with the given homeserver.": "Erro: problema de comunicação com o Servidor de Base fornecido.", + "Failed to upload profile picture!": "Falha ao enviar a imagem de perfil!", + "This invitation was sent to an email address which is not associated with this account:": "Este convite foi enviado para um endereço de e-mail que não é associado a esta conta:", + "Show Text Formatting Toolbar": "Exibir barra de formatação de texto", + "Room directory": "Lista pública de salas", + "Failed to fetch avatar URL": "Falha ao obter a URL da imagem de perfil", + "Incoming call from %(name)s": "Chamada de %(name)s recebida", + "Last seen": "Último uso", + "Drop File Here": "Arraste o arquivo aqui", + "Start Chatting": "Iniciar a conversa", + "Would you like to accept or decline this invitation?": "Você gostaria de aceitar ou recusar este convite?", + "Seen by %(userName)s at %(dateTime)s": "Visto por %(userName)s em %(dateTime)s", + "Verified": "Verificado", + "%(roomName)s does not exist.": "%(roomName)s não existe.", + "Enable Notifications": "Habilitar notificações", + "Username not available": "Nome de usuária(o) indisponível", + "Encrypted by a verified device": "Criptografado por um dispositivo verificado", + "(~%(count)s results).other": "(~%(count)s resultados)", + "unknown caller": "a pessoa que está chamando é desconhecida", + "Start authentication": "Iniciar autenticação", + "(~%(count)s results).one": "(~%(count)s resultado)", + "New Password": "Nova senha", + "Username invalid: %(errMessage)s": "Nome de usuária(o) inválido: %(errMessage)s", + "Disable Notifications": "Desabilitar notificações", + "%(count)s new messages.one": "%(count)s nova mensagem", + "Device Name": "Nome do dispositivo", + "Incoming voice call from %(name)s": "Chamada de voz de %(name)s recebida", + "If you already have a Matrix account you can log in instead.": "Se você já tem uma conta Matrix, pode também fazer login.", + "Can't connect to homeserver - please check your connectivity, ensure your homeserver's SSL certificate is trusted, and that a browser extension is not blocking requests.": "Não foi possível conectar ao Servidor de Base. Por favor, confira sua conectividade à internet, garanta que o certificado SSL do Servidor de Base é confiável, e que uma extensão do navegador não esteja bloqueando as requisições de rede.", + "Encrypted by an unverified device": "Criptografado por um dispositivo não verificado", + "Set": "Definir", + "Unencrypted message": "Mensagem não criptografada", + "Join as voice or video.": "Participar por voz ou por vídeo.", + "Uploading %(filename)s and %(count)s others.other": "Enviando o arquivo %(filename)s e %(count)s outros arquivos", + "Username available": "Nome de usuária(o) disponível", + "Close": "Fechar", + "Level:": "Nível:", + "%(count)s new messages.other": "%(count)s novas mensagens", + "Unverified": "Não verificado", + "Click here to join the discussion!": "Clique aqui para participar da conversa!", + "Decline": "Recusar", + "Custom": "Personalizado", + "Add": "Adicionar", + "%(user)s is a": "%(user)s é um(a)", + "Unnamed Room": "Sala sem nome", + "The phone number entered looks invalid": "O número de telefone inserido parece ser inválido", + "Rejoin": "Voltar a participar da sala", + "Create a new chat or reuse an existing one": "Criar uma nova conversa ou reutilizar alguma já existente", + "Resend all or cancel all now. You can also select individual messages to resend or cancel.": "Reenviar todas ou cancelar todas agora. Você também pode selecionar mensagens individuais que queira reenviar ou cancelar.", + "Reason: %(reasonText)s": "Justificativa: %(reasonText)s", + "Home": "Início", + "Something went wrong!": "Algo deu errado!", + "%(userName)s (power %(powerLevelNumber)s)": "%(userName)s (nível de permissão %(powerLevelNumber)s)", + "Start chat": "Iniciar conversa pessoal", + "You already have existing direct chats with this user:": "Você já tem conversas pessoais com esta pessoa:", + "Accept": "Aceitar", + "%(roomName)s is not accessible at this time.": "%(roomName)s não está acessível neste momento." } From 4eb74193351c2639eea37f40b8216e55bfbc3d7c Mon Sep 17 00:00:00 2001 From: David Baker Date: Tue, 13 Jun 2017 11:54:28 +0100 Subject: [PATCH 2/2] Don't put in spurious newline --- scripts/copy-i18n.py | 7 ++++--- src/i18n/strings/pt.json | 1 - 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/copy-i18n.py b/scripts/copy-i18n.py index c3b8d6072e..07b1271239 100755 --- a/scripts/copy-i18n.py +++ b/scripts/copy-i18n.py @@ -38,9 +38,10 @@ with open(dstpath) as ifp: elif strippedline.endswith(','): ofp.write(line) else: - ofp.write(' '+strippedline) - ofp.write(",\n") - toAddStr = json.dumps(toAdd, indent=4, separators=(',', ': '), ensure_ascii=False, encoding="utf8")[1:-1] + ofp.write(' '+strippedline+',') + toAddStr = json.dumps(toAdd, indent=4, separators=(',', ': '), ensure_ascii=False, encoding="utf8").strip("{}\n") + ofp.write("\n") ofp.write(toAddStr.encode('utf8')) + ofp.write("\n") os.rename(tmppath, dstpath) diff --git a/src/i18n/strings/pt.json b/src/i18n/strings/pt.json index 356aab5e02..a8dd8758d4 100644 --- a/src/i18n/strings/pt.json +++ b/src/i18n/strings/pt.json @@ -872,7 +872,6 @@ "You have disabled URL previews by default.": "Você desabilitou pré-visualizações de links por padrão.", "You have enabled URL previews by default.": "Você habilitou pré-visualizações de links por padrão.", "You have entered an invalid contact. Try using their Matrix ID or email address.": "Você inseriu um contato inválido. Tente usar o ID Matrix ou endereço de e-mail da pessoa que está buscando.", - "You have been banned from %(roomName)s by %(userName)s.": "Você foi expulso(a) da sala %(roomName)s por %(userName)s.", "Send anyway": "Enviar de qualquer maneira", "This room": "Esta sala",