{nome} na cópia da tradução foi perdido, como pará-lo antes de ficar online
Se {nome} for perdido na cópia da tradução, ocorrerão erros online. O julgamento regular não é confiável. Este artigo usa a biblioteca padrão Python string.Formatter.parse para estruturar os espaços reservados de verificação, com exemplos de síntese corretos e incorretos, scripts diretamente executáveis e limites de revisão manual.
Na cópia traduzida, variáveis como {name} são frequentemente traduzidas juntas, e a página muitas vezes não relata um erro até que o valor seja realmente preenchido. Se você confiar apenas nos olhos humanos ou em expressões regulares para verificar as chaves antes de entrar online, é fácil perdê-las. Este artigo é destinado a desenvolvedores e editores responsáveis pela localização, modelos e verificações de entrega. Ele apresenta como usar a biblioteca padrão Python string.Formatter.parse para realizar verificação estruturada em espaços reservados e explica quais situações ainda exigem revisão manual.
Após a leitura, você terá uma ideia de verificação que pode ser executada diretamente: verifique a identidade do campo, a frequência de ocorrências e as especificações de formato quando a tradução for entregue, em vez de esperar até que o problema seja descoberto online. Os exemplos utilizam amostras sintéticas e o código foi verificado em ambiente isolado, mas isso não representa garantia de todos os arquivos reais ou desempenho do produto. Antes de processar documentos importantes, guarde os originais e revise-os de acordo com os limites e itens de aceitação abaixo.
Espaços reservados perdidos após a tradução? Conclusão de uma frase
Primeiro, use a análise estruturada para extrair os campos na string de formato e depois compare-os um por um com os campos da cópia de origem; se os nomes dos campos, horários de ocorrência ou especificações de formato forem inconsistentes, eles serão rejeitados diretamente e o ajuste da ordem das palavras será deixado para revisão manual.
| sua situação | Práticas recomendadas | razão |
|---|---|---|
| Os nomes das variáveis na tradução são traduzidos | Restaure o nome do campo da interface antes da entrega | O nome da variável pertence ao contrato de interface. Após a alteração, será reportado um erro no preenchimento do valor na página. |
| A tradução está faltando um campo com o mesmo nome uma vez | Rejeite o artigo e verifique se falta tradução | O número de ocorrências do mesmo campo também faz parte do contrato |
| Apenas a posição do campo foi ajustada | Aceite, se a ordem das palavras de leitura é natural | Mudanças na ordem dos campos geralmente não afetam os resultados do preenchimento dos valores |
| As especificações de formato, como casas decimais, foram alteradas | A marcação é inconsistente, confirme de acordo com o protocolo de localização | As especificações de formato também são protegidas e a possibilidade de alterações deve ser decidida por acordo. |
Selecione a sintaxe do formato primeiro
Este artigo trata apenas de espaços reservados no estilo Python str.format e não cobre strings de modelo JavaScript, ICU MessageFormat ou outros sistemas de espaço reservado. Sistemas diferentes têm regras de aninhamento, escape e pluralização muito diferentes, e uma expressão regular não pode reivindicar suporte a todas elas. O exemplo requer o uso de campos nomeados e rejeita campos numerados automaticamente (como {}).
Uma descrição completa da sintaxe do campo pode ser encontrada em Documentação de string Python e formatador.
Chaves com escape não são variáveis
{{name}} representa o texto de exibição {name} e não deve ser contado como um campo. Também pode haver campos aninhados na especificação do formato, como {value:{width}}. O código abaixo lê a especificação recursivamente e mantém uma contagem de ocorrências repetidas do mesmo campo.
from string import Formatter
from collections import Counter
def contract(text, depth=0):
if depth > 5:
raise ValueError("nested format budget")
result = Counter()
for literal, field, spec, conversion in Formatter().parse(text):
if field is None:
continue
if not field or field != field.strip():
raise ValueError("named field without surrounding whitespace required")
result[(field, conversion, spec)] += 1
if spec:
result.update(contract(spec, depth + 1))
return result
assert contract("Hi {name}, total {amount:.2f}") == contract("{name}:金额 {amount:.2f}")
assert contract("{{name}}") == Counter()
assert contract("{name} {name}") != contract("{name}")
assert contract("{value:{width}}")[("width", None, "")] == 1
assert contract("{amount:.2f}") != contract("{amount:.0f}")
for bad in ["Hi {name", "{ name}", "{}"]:
try:
contract(bad)
except ValueError:
pass
else:
raise AssertionError("invalid template accepted")
Este contrato é deliberadamente rigoroso
As especificações de formato também são consideradas conteúdo protegido aqui, portanto, a alteração do número de casas decimais será sinalizada. Algumas tarefas de localização exigem a alteração da forma como os números são apresentados; nesse caso, você deve criar uma regra separada para isso, em vez de cancelar todas as verificações de espaço reservado. O limite de profundidade de aninhamento no exemplo é um orçamento de demonstração e não é um requisito da especificação da linguagem.
A tabela a seguir lista vários tipos comuns de alterações e seus métodos de tratamento correspondentes:
| mudar | O resultado deste exemplo | ação de revisão |
|---|---|---|
| Alterar campos | aceitar | A ordem das palavras de leitura é natural? |
| O mesmo campo está faltando uma vez | rejeitar contrato | Verifique se há traduções faltantes |
| Os nomes das variáveis são traduzidos | rejeitar contrato | Nome do campo da interface de recuperação |
| Mudanças nas especificações decimais | As tags são inconsistentes | Confirme de acordo com o acordo de localização |
📊 Comparação principal
| Tipo de alteração | Se passa na verificação | Ações de acompanhamento |
|---|---|---|
| Alterar campos | passar | A ordem das palavras de leitura é natural? |
| O mesmo campo está faltando uma vez | fracassado | Verifique se há traduções faltantes |
| Os nomes das variáveis são traduzidos | fracassado | Nome do campo da interface de recuperação |
| Mudanças nas especificações decimais | Marcar como inconsistente | Confirme de acordo com o acordo de localização |
🎯 Qual método é adequado para você?
Se você é responsável pela entrega da tradução
Execute uma verificação de estrutura antes da entrega e devolva ao tradutor entradas rejeitadas com nomes de campos ausentes ou alterados.
Se você é responsável por modelos e interfaces
Deixe claro quais nomes de campos pertencem ao contrato de interface e liste-os nas instruções de entrega para facilitar a comparação entre tradutores e revisores.
Se você precisar alterar a forma como os números são apresentados
Desenvolva um protocolo de localização separadamente para as especificações de formato e adicione-o às regras de verificação em vez de desativar a verificação geral.
❓ Perguntas frequentes (FAQ)
1. Este método pode lidar com modelos JavaScript ou ICU MessageFormat?
não pode. Este artigo se concentra apenas nos campos nomeados do estilo Python str.format. As regras de aninhamento, escape e pluralização de outros sistemas precisam ser processadas separadamente.
2. {{name}} será verificado como uma variável?
Não vai. Representa o texto de exibição {name}, que não é contado como um campo quando analisado.
3. Se eu apenas ajustar a posição do campo na frase, ela será rejeitada?
Não vai. Neste caso, alterações nas posições dos campos são aceitas e depois lidas manualmente para verificar se a ordem das palavras está natural.
4. Posso ligar diretamente para format para verificar a tradução?
O código neste artigo apenas analisa e não chama format para preencher o objeto. Não é um modelo de sandbox de segurança. A renderização subsequente também requer restrições nos campos disponíveis, acesso a objetos e contexto de saída, especialmente regras de escape em páginas HTML.
📝 Resumo
Usar a análise estruturada para verificar espaços reservados durante a entrega da tradução pode evitar problemas com nomes de campos, horários e especificações de formato antes de ficar online. Se o idioma é fluente ainda precisa ser julgado separadamente pelo revisor.
Experimente agora: carregue o documento para iniciar a tradução, mantendo o layout original


