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
This commit is contained in:
David Baker 2017-06-13 11:39:37 +01:00
parent 24f1bd1460
commit aab87233c3
2 changed files with 137 additions and 1 deletions

46
scripts/copy-i18n.py Executable file
View file

@ -0,0 +1,46 @@
#!/usr/bin/env python
import json
import sys
import os
if len(sys.argv) < 3:
print "Usage: %s <source> <dest>" % (sys.argv[0],)
print "eg. %s pt_BR.json pt.json" % (sys.argv[0],)
print
print "Adds any translations to <dest> that exist in <source> but not <dest>"
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)

View file

@ -875,5 +875,95 @@
"Tagged as: ": "Marcado como: ", "Tagged as: ": "Marcado como: ",
"You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.", "You have <a>disabled</a> URL previews by default.": "Você <a>desabilitou</a> pré-visualizações de links por padrão.",
"You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> pré-visualizações de links por padrão.", "You have <a>enabled</a> URL previews by default.": "Você <a>habilitou</a> 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 <span></span> homeserver, or you can pick a <a>different server</a>.": "Este será seu nome de conta no Servidor de Base <span></span>, ou então você pode escolher um <a>servidor diferente</a>.",
"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 <a>register</a> to use this functionality": "Você deve <a>se registrar</a> 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, <a>click here</a> to send a bug report.": "Caso contrário, <a>clique aqui</a> para enviar um relatório de erros.",
"To link to a room it must have <a>an address</a>.": "Para produzir um link para uma sala, ela necessita ter <a>um endereço</a>.",
"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 <acceptText>accept</acceptText> or <declineText>decline</declineText> this invitation?": "Você gostaria de <acceptText>aceitar</acceptText> ou <declineText>recusar</declineText> 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 <a>log in</a> instead.": "Se você já tem uma conta Matrix, pode também fazer <a>login</a>.",
"Can't connect to homeserver - please check your connectivity, ensure your <a>homeserver's SSL certificate</a> 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 <a>certificado SSL do Servidor de Base</a> é 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 <voiceText>voice</voiceText> or <videoText>video</videoText>.": "Participar por <voiceText>voz</voiceText> ou por <videoText>vídeo</videoText>.",
"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",
"<a>Click here</a> to join the discussion!": "<a>Clique aqui</a> 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",
"<a>Resend all</a> or <a>cancel all</a> now. You can also select individual messages to resend or cancel.": "<a>Reenviar todas</a> ou <a>cancelar todas</a> 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."
} }