Bastidores

Desenvolvimento· Arrumando a casa · parte 20

O idioma certo na tela pode virar o errado no servidor.

Veja como organizo URLs e mensagens com Paraglide JS e guardo o idioma escolhido para respostas e comunicações posteriores.

Uma URL com o prefixo /pt-br ao lado de mensagens em JSON compiladas por idioma.

Uma tela no idioma certo não garante que o e-mail enviado depois saia no mesmo idioma. O idioma precisa acompanhar o pedido e continuar gravado quando o processamento sai do navegador.

Defini esse padrão em 5 de novembro, quando um produto que ainda não apresentei aqui ganhou a versão brasileira. Ele vale para todo produto com mais de um idioma, inclusive os novos. A regra cobre desde a URL pública até o texto produzido no servidor.

As mensagens curtas ficam juntas no pacote

Nos produtos web em TypeScript, uso Paraglide JS 2 num pacote packages/i18n. A regra vale para Astro, SPA React e API Hono em Workers. As mensagens ficam em JSON por idioma e são compiladas no build com chaves tipadas.

Cada build do navegador leva um idioma só. Essa organização define com clareza onde mora o texto curto de interface: telas, moldura do site, botões e erros entram no catálogo de mensagens. Cada chave tipada representa o texto exato que a interface deve renderizar.

Para documentos longos ou com estrutura, o tratamento é diferente. Textos de jurídico, blog, metodologia, e-mails com blocos e prompts de IA ficam em arquivos de conteúdo por idioma. Essa separação respeita o ciclo de vida de cada documento sem sobrecarregar o catálogo de interface.

Essa divisão também orienta a manutenção contínua do código. Ajustar um botão exige alterar apenas o arquivo JSON do catálogo; atualizar termos de uso mexe apenas nos arquivos de conteúdo. A separação mantém os arquivos de tradução limpos e fáceis de auditar.

A URL mostra o idioma da página pública

As páginas públicas levam prefixo do idioma, slug traduzido, hreflang e link de troca de idioma. O visitante encontra um caminho claro e previsível para a versão que deseja abrir. Não adoto redirecionamento automático por país ou navegador.

O português do Brasil usa pt-BR como código e /pt-br como prefixo de URL quando não é o idioma base. A base de onde nascem os produtos novos já vem configurada com en-US na raiz e pt-BR em /pt-br.

A estrutura da URL faz parte da arquitetura de conteúdo público. O slug traduzido mantém a semântica da página em cada língua, e o link de troca dá acesso imediato à outra opção. As tags hreflang informam aos buscadores a relação direta entre as versões equivalentes.

A revisão de uma página pública confere a rota completa junto com o conteúdo visível. Uma tradução correta no corpo da página perde utilidade se faltar o cabeçalho de idioma ou o link alternativo. O padrão reúne esses elementos para validar a experiência inteira do visitante.

O servidor recebe o idioma em cada chamada

No servidor, passo sempre { locale } explícito em cada mensagem, nunca um idioma global. O isolate do Worker atende pedidos simultâneos de origens diferentes. O app manda o idioma num cabeçalho em toda chamada para garantir o contexto certo na resposta.

Usar variáveis globais de idioma causaria vazamento de contexto entre requisições concorrentes. No modelo de execução dos Workers, um pedido em inglês e outro em português podem compartilhar a mesma instância. O parâmetro explícito em cada função elimina qualquer risco de contaminação cruzada.

O trabalho com idiomas não termina quando a resposta chega ao navegador. O idioma fica gravado no registro (tentativa, lead, usuário) para tudo o que sai depois: e-mail, PDF, lembrete. Essa informação precisa continuar persistida para acompanhar o ciclo de vida da conta.

Uma tela traduzida não encerra a localização do produto. Se a verificação parar na interface web, comunicações disparadas horas depois podem sair no idioma padrão errado. O padrão exige persistir a preferência no banco desde o primeiro contato.

A revisão alcança os produtos existentes

No gate, bun i18n:check falha com chave ausente ou variável perdida. Tradução feita por modelo é revisada antes de publicar. A validação automatizada impede que chaves esquecidas quebrem a interface em produção.

Apps nativos usam o catálogo da plataforma: Localizable.xcstrings no iOS e i18next no React Native, como no Garfim. O padrão respeita os ecossistemas nativos onde eles já possuem convenções estabelecidas.

A situação em 5 de novembro mostra o estado da transição: dois produtos que ainda não apresentei aqui já seguem o padrão. O site do ClipLeve tem páginas duplicadas em /en/, sem mensagens compiladas. O app do Garfim segue o item dos nativos, e o site dele ainda vai ser conferido. A padronização dos que divergem fica para outra sessão.

O erro mais custoso de idioma aparece horas depois no servidor ou na caixa de entrada do usuário. Guardar a escolha no registro e exigir { locale } explícito em cada chamada resolve o problema na raiz. Para outra decisão técnica compartilhada, veja como organizei o roteamento de IA pelo OpenRouter.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s