Um site que funciona perfeitamente no país onde foi criado pode estar quebrado silenciosamente em outros doze. Um botão de finalização de compra que nunca foi traduzido na Itália, preços mostrados em dólares para visitantes alemães, um banner de consentimento que cobre a página inteira na França, uma versão de idioma que os mecanismos de busca nunca encontram porque seu hreflang aponta para a URL errada. Nada disso aparece quando a equipe testa a partir do escritório.
O motivo é simples: a maior parte do que muda entre mercados é decidida pela localização do visitante. Para ver o que um cliente local vê, é preciso testar a partir daquele mercado. Este guia aborda como executar QA de localização entre mercados em escala: o que verificar, como visualizar cada mercado como um visitante local o faria, e um pequeno verificador que detecta automaticamente os bugs mais comuns.
Por que os bugs de localização se escondem
Sites localizados raramente servem uma única página fixa por idioma. Eles decidem o que mostrar no momento da requisição, com base em sinais que o visitante envia:
- Localização, a partir do endereço IP: moeda, preços, opções de envio, banners legais, disponibilidade de produtos e, às vezes, o próprio idioma.
- Preferências de idioma, a partir do navegador: qual tradução exibir e como formatar datas e números.
- A URL, como
/de/oude.example.com: a versão que foi solicitada ao site, que pode ou não corresponder às outras duas.
Os testes feitos na sede geralmente cobrem apenas uma combinação: o próprio país do escritório, um navegador em inglês e a URL padrão. As revisões de tradução verificam as palavras, mas não a página como ela é efetivamente servida. Os bugs vivem nas combinações que ninguém testou.
O que quebra em um mercado
| Bug | Exemplo | Como geralmente acontece |
|---|---|---|
| Strings não traduzidas | ”Add to cart” no site italiano | Novos recursos são lançados com strings em inglês que nunca chegam ao fluxo de tradução |
| Moeda ou formato de preço errado | $49.99 mostrado a visitantes alemães, ou 49.99 € em vez de 49,99 € | A moeda é definida a partir da URL em um lugar e a partir do IP em outro |
| Hreflang quebrado | Uma versão de idioma aponta para um 404 ou para outro idioma | URLs alteradas após o lançamento, alternates não atualizados |
Atributo lang ausente ou errado | lang="en" na página em alemão | Um template compartilhado com atributo fixo |
| Loops de redirecionamento ou redirecionamentos forçados | Um visitante na Áustria é enviado para a loja alemã e não consegue voltar | Geo-redirecionamentos que ignoram uma escolha explícita |
| Camadas legais e de consentimento | Um banner cobrindo o conteúdo em um país da UE | Configuração de consentimento específica do país |
| Transbordamento de layout | Rótulos em alemão quebrando botões, texto da direita para a esquerda quebrando um grid | Designs testados apenas com strings curtas em inglês |
Vários desses problemas afetam diretamente a busca. Uma página com o atributo lang errado ou alternates quebrados pode ser indexada no idioma errado, ou não ser indexada de forma alguma. Nosso guia sobre usar hreflang para encontrar cada versão de idioma de uma página mostra como mapear os alternates de um site e identificar os que não levam a lugar nenhum.
Etapa 1: ver cada mercado como um visitante local
O requisito central é solicitar cada página de dentro do mercado, com um navegador configurado como o de um visitante local. Na prática, isso significa três coisas que precisam estar alinhadas:
- Um endereço IP no mercado. Proxies residenciais com segmentação por país ou cidade fornecem um endereço em uma conexão residencial local, que é o que a lógica de geolocalização do site espera. Nossos proxies residenciais cobrem mais de 195 países, com segmentação por cidade onde necessário.
- O idioma e a localidade do mercado. Configure o cabeçalho de idioma e a localidade do navegador para corresponder.
- O fuso horário do mercado, se você testar em um navegador real, pois alguns sites o usam como mais um sinal de localização.
Se essas três coisas não estiverem alinhadas, você testa uma combinação que nenhum cliente real tem, e pode acabar perseguindo bugs que não existem. Nosso guia sobre alinhar geolocalização, fuso horário e localidade do proxy mostra como derivar os três a partir de uma única configuração.
Teste também com uma sessão nova para cada mercado. Cookies de uma visita anterior podem fixar o site no último país testado, o que esconde bugs de lógica de geolocalização.
Etapa 2: verificar cada mercado da mesma forma
A revisão visual não escala para dezenas de mercados e milhares de páginas, mas a maioria dos bugs de localização pode ser detectada no HTML. A função abaixo verifica uma página localizada em busca de quatro dos problemas mais comuns: o atributo lang, strings em inglês remanescentes, preços na moeda errada e uma entrada de hreflang ausente para o mercado.
import re
from lxml import html as lxml_html
def market_problems(page_html, market):
"""Things that only break in one market, checked on one localized page.
market: {"lang": "de", "currency": "€", "leftovers": ["Add to cart", "Free shipping"]}
"""
doc = lxml_html.fromstring(page_html)
problems = []
lang = (doc.get("lang") or "").lower()
if not lang.startswith(market["lang"]):
problems.append(f"html lang is {lang or 'missing'}, expected {market['lang']}")
text = " ".join(" ".join(doc.itertext()).split())
for phrase in market["leftovers"]:
if phrase.lower() in text.lower():
problems.append(f"untranslated text: {phrase!r}")
prices = re.findall(r"[$€£¥₩R]\$?\s?\d[\d.,]*|\d[\d.,]*\s?[$€£¥₩]", text)
wrong = [p for p in prices if market["currency"] not in p]
if wrong:
problems.append(f"{len(wrong)} of {len(prices)} prices not in {market['currency']}, e.g. {wrong[0]!r}")
if not doc.xpath(f"//link[@rel='alternate'][starts-with(@hreflang, '{market['lang']}')]"):
problems.append(f"no hreflang entry for {market['lang']}")
return problems
Executando em duas páginas (HTML ilustrativo, não um site real):
from locqa import market_problems
markets = {
"de": {"lang": "de", "currency": "€", "leftovers": ["Add to cart", "Free shipping"]},
"fr": {"lang": "fr", "currency": "€", "leftovers": ["Add to cart", "Free shipping"]},
}
pages = { # in practice: the same product page, fetched from inside each market
"de": '<html lang="de"><head><link rel="alternate" hreflang="de" href="/de/p/1"></head>'
'<body><h1>Wasserkocher</h1><p>49,99 €</p><p>Free shipping</p></body></html>',
"fr": '<html lang="fr"><head><link rel="alternate" hreflang="fr" href="/fr/p/1"></head>'
'<body><h1>Bouilloire</h1><p>$49.99</p><p>Ajouter au panier</p></body></html>',
}
for code, page in pages.items():
print(code, market_problems(page, markets[code]) or "ok")
de ["untranslated text: 'Free shipping'"]
fr ["1 of 1 prices not in €, e.g. '$49.99'"]
A página em alemão tem uma frase em inglês remanescente; a página em francês mostra um preço em dólares. Ambas passariam em uma revisão de tradução, porque as strings traduzidas em si estão corretas.
Construa a lista de frases remanescentes a partir da sua própria interface: rótulos de botões, mensagens de envio e finalização de compra, mensagens de erro. Essas são as strings mais frequentemente adicionadas tardiamente. Os formatos de preço exigem cuidado além do símbolo da moeda, já que o mesmo símbolo pode ser escrito de várias formas; nosso guia sobre normalizar preços, números e datas entre localidades mostra como analisá-los de forma confiável.
Etapa 3: executar em uma agenda regular
A localização quebra após os lançamentos, não apenas no lançamento. Um novo recurso, uma mudança de template ou uma atualização de preços podem quebrar um mercado enquanto todos os outros parecem bem. Um ritmo prático:
- A cada lançamento: um pequeno conjunto de páginas-chave (home, uma categoria, um produto, carrinho, finalização de compra) em cada mercado.
- Semanalmente: uma amostra mais ampla de páginas por mercado, incluindo as alteradas recentemente.
- Após qualquer mudança na lógica de geolocalização, preços ou consentimento: uma verificação completa.
Reporte os resultados por mercado e por verificação, para que cada equipe veja seus próprios problemas. O mercado com mais falhas costuma ser o que tem menos testes locais.
Coisas que a automação não vai detectar
Alguns problemas ainda exigem uma pessoa que conheça o mercado: uma tradução que está correta, mas soa errada, uma imagem ou cor com um significado local infeliz, uma exigência legal que o template não cobre. As verificações automatizadas liberam as pessoas para dedicar seu tempo de revisão a isso, em vez de caçar sinais de dólar.
Alguns sites também mostram camadas diferentes de consentimento e privacidade por país, o que muda tanto o que os usuários veem quanto o que um teste automatizado consegue alcançar. Nosso estudo sobre muros de consentimento por país mostra o quanto isso varia pela UE.
Perguntas frequentes
O que é QA de localização?
Testar se cada versão de idioma e mercado de um site funciona e é lida corretamente por visitantes locais: traduções, formatos de moeda e preço, layout, avisos legais, redirecionamentos e os sinais que os mecanismos de busca usam para encontrar cada versão.
Por que não posso testar outros mercados com uma VPN?
Você pode, para uma olhada rápida, mas muitos sites reconhecem endereços de VPN e datacenter e os tratam de forma diferente das conexões domésticas, então você pode não ver o que um cliente local real vê. IPs residenciais no mercado estão mais próximos da experiência real.
Quais páginas devo testar em cada mercado?
No mínimo a página inicial, uma página de categoria, uma página de produto, o carrinho e a finalização de compra, além de qualquer página com preços ou texto legal. Amplie para uma amostra rotativa de páginas alteradas recentemente.
Como os bugs de localização afetam o SEO?
Atributos lang errados, alternates de hreflang quebrados e geo-redirecionamentos forçados podem fazer com que os mecanismos de busca indexem a versão de idioma errada, ou deixem de indexar uma versão inteiramente, o que custa visibilidade naquele mercado.
Conclusão
Os bugs de localização se escondem nos mercados de onde ninguém testa. Veja cada mercado como um visitante local o faria, com um IP, idioma e fuso horário alinhados, e execute as mesmas verificações automatizadas em cada mercado após cada lançamento. Capture os problemas mecânicos (atributos de idioma, strings remanescentes, moedas, hreflang) por máquina, e reserve a revisão humana para o que apenas um leitor local pode julgar.