Detecção de Idioma: Suporte Multilíngue Dinâmico
Este artigo explica como detectamos automaticamente e servimos conteúdo no idioma preferido do usuário.
O Problema: Atendendo Usuários Globais
Usuários vêm de diferentes países falando diferentes idiomas:
-
Índia: Hindi, Bengali, Tâmil, Telugu, Gujarati, Marathi, Kannada, Malaiala, Punjabi, Urdu
-
Europa: Alemão, Francês, Espanhol, Italiano, Português, Russo
-
Ásia: Japonês, Coreano, Chinês
Precisamos detectar sua preferência de idioma e servir conteúdo traduzido automaticamente.
Prioridade de Detecção
Verificamos múltiplas fontes em ordem:
1. Parâmetro de URL (?lang=hi)
2. Sessão (armazenada após a primeira detecção)
3. Cookie (translation_lang ou lang)
4. Cabeçalho Accept-Language do navegador (futuro)
5. Padrão (Inglês)
Por Que Esta Ordem?
Parâmetro de URL primeiro: Permite troca explícita de idioma
Sessão segundo: Persiste durante a sessão de navegação
Cookie terceiro: Persiste entre sessões (30 dias)
Padrão por último: Fallback para novos usuários
Implementação
def get_locale():
# 1. Check URL parameter
lang_param = request.args.get("lang")
if lang_param in valid_langs:
return lang_param
# 2. Check session
if "translation_lang" in session:
return session["translation_lang"]
# 3. Check cookie
# ... (implementation details omitted)
Troca de Idioma
Usuários podem trocar o idioma via URL:
/p/Treo-N100-8-256?lang=hi
Isso dispara:
1. Definir sessão: session["translation_lang"] = "hi"
2. Definir cookie: translation_lang=hi; Max-Age=2592000 (30 dias)
3. Redirecionar: Remover parâmetro lang da URL
Benefício: URLs limpas após seleção de idioma
Idiomas Suportados
Suportamos 20 idiomas:
Idiomas indianos (10):
-
Hindi (hi)
-
Bengali (bn)
-
Tâmil (ta)
-
Telugu (te)
-
Gujarati (gu)
-
Marathi (mr)
-
Kannada (kn)
-
Malaiala (ml)
-
Punjabi (pa)
-
Urdu (ur)
Idiomas europeus (7):
-
Alemão (de)
-
Francês (fr)
-
Espanhol (es)
-
Italiano (it)
-
Português (pt)
-
Russo (ru)
Idiomas asiáticos (3):
-
Japonês (ja)
-
Coreano (ko)
-
Chinês (zh)
Tradução de Conteúdo
Diferentes tipos de conteúdo usam diferentes métodos de tradução:
Modelos Estáticos (Flask-Babel)
Navegação, botões, rótulos traduzidos via arquivos .po:
{{ _('Add to Cart') }} → "कार्ट में जोड़ें" (Hindi)
Conteúdo Dinâmico (TranslationManager)
Nomes de produtos, características traduzidos via tabelas de frases:
"Mini PC" → "मिनी पीसी" (Hindi)
Conteúdo Longo (DeepSeek AI)
Descrições de produtos, artigos traduzidos via IA:
"Compact office computer..." → "कॉम्पैक्ट ऑफिस कंप्यूटर..." (Hindi)
Veja: Sistema de Tradução para detalhes
Formatação Regional
A seleção de idioma também afeta a formatação:
Formato de Número
Inglês: 1,234.56
Europeu: 1.234,56 (separadores invertidos)
Indiano: 1,23,456 (agrupamento lakhs/crores)
Formato de Data
Inglês: 18 de fevereiro de 2026
Europeu: 18.02.2026
Indiano: 18/02/2026
Moeda
Inglês: ₹1,234
Europeu: €1.234
Internacional: $1,234
Interface de Seleção de Idioma
Usuários podem trocar o idioma via menu suspenso:
Localização: Barra de navegação superior
Exibição: Ícone de bandeira + nome do idioma
Comportamento: Recarregar página com ?lang=<código>
Considerações de SEO
Estrutura de URL
Usamos URL única para todos os idiomas (sem prefixos /hi/, /de/):
Benefício: Arquitetura mais simples, sem problemas de conteúdo duplicado
Desvantagem: Menor valor de SEO por idioma
Tags Hreflang
Adicionamos links de idiomas alternativos:
<link rel="alternate" hreflang="en" href="https://www.thinvent.in/p/Treo-N100">
<link rel="alternate" hreflang="hi" href="https://www.thinvent.in/p/Treo-N100?lang=hi">
<link rel="alternate" hreflang="de" href="https://www.thinvent.in/p/Treo-N100?lang=de">
Benefício: Google sabe qual versão de idioma mostrar
Estratégia de Fallback
Se a tradução estiver faltando para o idioma selecionado:
1. Tentar Inglês: A maior parte do conteúdo tem versão em inglês
2. Mostrar original: Melhor que nada
3. Enfileirar para tradução: Adicionar à fila de tradução para processamento em lote
Desempenho
Cache
Traduções são armazenadas em cache na memória:
Tabelas de frases: Carregadas uma vez na inicialização
Traduções de IA: Armazenadas em cache no banco de dados
Benefício: Sem sobrecarga de tradução por requisição
Carregamento Preguiçoso (Lazy Loading)
Traduções carregadas apenas quando necessário:
Descrições de produtos: Carregadas na visualização da página do produto
Conteúdo da página de consulta: Carregado na visualização da página de consulta
Benefício: Carregamento inicial de página mais rápido
Referências
Conceitos Técnicos
-
Internacionalização (i18n) - Wikipedia
-
Negociação de conteúdo - Wikipedia
Bibliotecas
-
Flask-Babel - Tradução de modelos
-
Babel - Biblioteca de internacionalização
Artigos Relacionados
-
Sistema de Tradução - Abordagem híbrida de três tecnologias
-
Geração de Conteúdo por IA - Traduções DeepSeek
Resumo
A detecção de idioma usa um sistema de prioridade:
Ordem de detecção:
-
✅ Parâmetro de URL (
?lang=hi) -
✅ Sessão (durante a navegação)
-
✅ Cookie (30 dias)
-
✅ Padrão (Inglês)
Suportado:
-
✅ 20 idiomas (10 indianos, 7 europeus, 3 asiáticos)
-
✅ Formatação regional (números, datas, moeda)
-
✅ Tags SEO hreflang
Métodos de tradução:
-
✅ Flask-Babel (modelos estáticos)
-
✅ TranslationManager (nomes de produtos, características)
-
✅ DeepSeek IA (descrições, artigos)
Desempenho:
-
✅ Cache em memória
-
✅ Carregamento preguiçoso
-
✅ Cache de banco de dados para traduções de IA
Isso permite detecção automática de idioma e uma experiência multilíngue perfeita.