Analise Accept-Language e ordene preferências de localidade
Accept-Language parece simples, mas interpretá-lo corretamente exige mais do que separar uma string por vírgulas.
Executar grátis
Cada faixa de idioma pode ter um valor de qualidade, itens com pesos iguais precisam manter a ordem original e tags malformadas devem ser rejeitadas antes da negociação de conteúdo. Este analisador transforma um cabeçalho em uma lista previsível de preferências de localidade. Ele normaliza a capitalização usual de idioma, escrita e região, preserva curingas, valida a qualidade e entrega o resultado em ordem decrescente para roteamento, testes, registros ou seleção de localidade no aplicativo.
Transforme o cabeçalho em preferências explícitas
Um cabeçalho Accept-Language reúne várias escolhas em pouco texto. O navegador pode enviar uma localidade regional primeiro, um idioma mais amplo depois e um curinga como último recurso. Interpretar esse valor diretamente em cada rota favorece código repetido e respostas inconsistentes em casos extremos. O analisador produz um array de preferências no qual cada registro tem uma localidade e um valor numérico de qualidade. Entradas sem qualidade explícita recebem o valor padrão 1. A lista é ordenada da maior para a menor qualidade, enquanto itens com o mesmo peso mantêm a posição informada pelo remetente. Essa estabilidade importa porque a posição é o único sinal restante quando os pesos coincidem. A capitalização também é normalizada: idiomas ficam em minúsculas, regiões de duas letras em maiúsculas e escritas de quatro letras com inicial maiúscula. O asterisco permanece intacto para que seu aplicativo reconheça uma alternativa geral, sem confundi-la com uma localidade específica.
Rejeite cedo entradas ambíguas ou malformadas
O cabeçalho normalmente vem de um cliente e cruza uma fronteira de confiança. Corrigir silenciosamente pode transformar um erro de digitação em uma escolha inesperada, portanto o analisador rejeita a entrada em vez de tentar adivinhar. A faixa deve começar com um subtag alfabético e pode continuar com subtags alfanuméricos separados por hífen. Sublinhados, espaços internos, subtags vazios e pontuação não são válidos. O único curinga aceito é um asterisco como faixa completa. O parâmetro de qualidade deve usar q com um valor de 0 a 1 e no máximo três casas decimais; números maiores, negativos, parâmetros desconhecidos e ponto e vírgula repetido geram erro. Itens vazios entre vírgulas também são recusados. O limite declarado do cabeçalho mantém o processamento controlado. Assim, falhas aparecem na entrada da API e um cabeçalho parcialmente interpretado não seleciona conteúdo que o cliente jamais solicitou.
Aplique o resultado à negociação de localidade
A saída ordenada foi criada para alimentar a política de correspondência do seu aplicativo. Percorra as preferências e compare cada localidade com as traduções disponíveis. Você pode tentar primeiro a variante regional exata, depois reduzir fr-CA ao idioma base e finalmente usar o curinga ou o padrão do produto. O analisador não escolhe essa política: localidades aceitas, regras de fallback e tratamento da qualidade zero dependem do aplicativo. Separar análise e seleção facilita testes e reutilização em gateways, páginas renderizadas no servidor, API e pipelines analíticos. Também simplifica a investigação quando alguém recebe o idioma errado, pois os logs podem guardar a lista estruturada em vez de um cabeçalho opaco. Em automações, cada solicitação custa US$ 0,002. A versão do navegador executa localmente a mesma lógica determinística, permitindo que você examine cabeçalhos durante o desenvolvimento sem enviar seu conteúdo para outro lugar.
Casos de uso
Escolha conteúdo localizado
Converta o cabeçalho do navegador em candidatos ordenados antes de compará-los às localidades disponíveis no site.
Teste clientes e proxies
Confira se navegador, SDK ou gateway envia as faixas de idioma e os pesos esperados.
Normalize logs de requisições
Armazene preferências estruturadas para pesquisar e comparar incidentes de roteamento de idioma com consistência.
Perguntas frequentes
O que é retornado?
O resultado contém um array de preferências ordenado por qualidade decrescente. Cada item traz uma localidade normalizada e um valor numérico de qualidade.
O que acontece quando q é omitido?
O item recebe qualidade 1, que é a preferência máxima padrão.
Itens com a mesma qualidade mudam de ordem?
Não. Itens com qualidade igual preservam sua ordem relativa original.
O analisador escolhe uma localidade aceita pelo meu sistema?
Não. Ele interpreta e ordena o cabeçalho; seu aplicativo define correspondência exata, fallback e localidade padrão.
Quais valores malformados geram erro?
Alguns exemplos são tags com sublinhado ou subtags vazios, itens em branco, parâmetros desconhecidos e qualidades fora de 0 a 1 ou com mais de três casas decimais.
Quanto custa uma solicitação de API?
Cada solicitação de API custa US$ 0,002. A ferramenta determinística também pode ser executada localmente nesta página.
Para desenvolvedores — acesso via API
Tudo nesta página está disponível via API. Esta seção é para equipes que querem integrar a ferramenta aos próprios sistemas; quem não precisa disso pode simplesmente usar a ferramenta acima.
Endpoint
Autenticação por token Bearer. Um único POST coloca a tarefa na fila; o resultado chega por webhook ou link assinado.
Chame do seu código
curl -X POST https://api.kit.forhosting.com/web/accept-language-parse \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"text":"en-US,en;q=0.9,fr-CA;q=0.7,*;q=0.1"}'const res = await fetch("https://api.kit.forhosting.com/web/accept-language-parse", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"text": "en-US,en;q=0.9,fr-CA;q=0.7,*;q=0.1"
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/web/accept-language-parse",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"text": "en-US,en;q=0.9,fr-CA;q=0.7,*;q=0.1"
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/web/accept-language-parse", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"text":"en-US,en;q=0.9,fr-CA;q=0.7,*;q=0.1"}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"text":"en-US,en;q=0.9,fr-CA;q=0.7,*;q=0.1"}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/web/accept-language-parse", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Exemplo de requisição
{
"text": "en-US,en;q=0.9,fr-CA;q=0.7,*;q=0.1"
}Exemplo de resposta
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "web.accept_language_parse",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}A API é assíncrona: cada chamada devolve um task_id na hora. Se preferir polling, consulte o status a até 1 requisição por segundo.
Preço
Preço publicado, sem tokens nem créditos escondidos. Tarefa que falha não é cobrada.
Limites
max_chars | 8192 |
Erros
| HTTP | Código | O que significa |
|---|---|---|
401 | unauthorized | Token ausente ou inválido. Confira o header Authorization. |
402 | insufficient_balance | Saldo insuficiente para esta tarefa. Faça uma recarga e tente de novo. |
404 | unknown_type | Esse tipo de tarefa não existe. Confira o campo type no catálogo. |
429 | rate_limited | Muitas requisições em pouco tempo. Espere um instante e tente de novo. |