Opções Avançadas de Personalização
Esta página destina-se a usuários avançados com alguma experiência em HTML/CSS/JSON. Configurações avançadas podem melhorar significativamente a adaptabilidade, mas também aumentam a chance de criar configurações que "parecem corretas mas não funcionam". Recomenda-se fazer backup antes de editar.
Avisos Antes de Usar
- Acesse em Configurações de Desenvolvedor.
- Faça backup de User Config / User Rules antes de editar, para evitar perda de configuração por erro de formatação.
- Considere a configuração final interna como referência (“Click to expand the final config”) para campos, valores padrão e serviços disponíveis.
Pontos de Entrada e Prioridade
Entradas comuns (Configurações de Desenvolvedor):
- Edit Full User Config: configuração completa (inclui
rules, serviços de tradução, estilos, etc). - Edit User Rules: edita somente o array
rules(aceita apenas array, não inclua{ "rules": [...] }). - Injected CSS: injeção global de CSS.
Prioridade (maior para menor): rules correspondentes > generalRule > configuração padrão interna.
Ao corresponder uma rule, ela é mesclada com generalRule, prevalecendo os campos da rule.
Início Rápido (Requisitos Mais Comuns)
1) Traduzir apenas o conteúdo principal de um site
{
"rules": [
{
"matches": ["example.com"],
"selectors": ["article", ".post-content"],
"excludeSelectors": ["nav", "footer", ".comment"]
}
]
}
2) Sempre/Nunca traduzir
{
"translationUrlPattern": {
"matches": ["stackoverflow.com"],
"excludeMatches": ["www.google.com/mail/*"]
}
}
3) Usar diferentes serviços de tradução por site
{
"translationService": "google",
"translationServices": {
"deepl": {
"matches": ["sci-hub.se"]
}
}
}
4) Estilo da tradução por site
{
"translationTheme": "none",
"translationThemePatterns": {
"underline": {
"matches": ["discord.com"]
}
}
}
5) Corrigir problemas de estilo causados pela tradução
{
"rules": [
{
"matches": ["youtube.com"],
"globalStyles": {
"#video-title": "max-height:unset;"
}
}
]
}
6) Não mostrar serviços de tradução não configurados no painel
{
"showUnconfiguredTranslationServiceInPopup": false
}
Regras e Correspondência
Mesclagem de Regras
generalRule: base de regras comuns a todos os sites.rules: regra específica do site, com prioridade máxima se corresponder.
Campos dentro de rules podem usar a maioria dos campos disponíveis em generalRule.
Formatos comuns de "matches"
matches aceita string ou array:
- Domínio:
example.com - URL completa:
https://example.com/path/ - Curinga:
https://*/*q=* - Corresponder tudo:
*/*://*/*://*/* - Arquivo local:
file://*
Observação: *.twitter.com só corresponde subdomínios, não o domínio raiz twitter.com.
selectors / excludeSelectors
selectors: traduz apenas elementos correspondentes (substitui o escopo padrão).excludeSelectors: elementos a serem excluídos da tradução.
Para apenas adicionar/remover do escopo original, prefira usar .add / .remove (veja próxima seção).
Herança e Modificações Incrementais (.add / .remove)
Para campos array ou objeto, suporte a .add / .remove para modificações incrementais.
Recomenda-se seu uso para evitar sobrescrever regras padrão:
[
{
"id": "twitter",
"selectors.add": ["[data-testid='tweetText'] a"],
"excludeSelectors.add": ["header"]
}
]
Referência Rápida de Campos Comuns (parcial)
Relacionados à correspondência:
matches/excludeMatchesselectorMatches/excludeSelectorMatches
Escopo da tradução:
selectors/excludeSelectors/excludeTagsstayOriginalSelectors/stayOriginalTagsextraInlineSelectors/extraBlockSelectors
Estilo e layout:
translationClasses: classes extras para o texto traduzidoglobalStyles/globalAttributesinjectedCss/additionalInjectedCsswrapperPrefix/wrapperSuffixblockMinTextCount/blockMinWordCount
Momento e mobile:
urlChangeDelay/observeUrlChangeisShowUserscriptPagePopup
Tradução de mensagens em fluxo estilo GPT
{
"matches": ["chat.openai.com"],
"excludeSelectors": [".markdown *"],
"aiRule": {
"streamingSelector": ".result-streaming.markdown",
"messageWrapperSelector": ".markdown",
"streamingChange": true
}
}
Mais detalhes de campos: veja no final em "Apêndice: Referência de Campos de Rule".
Lógica de correspondência em "matches" (resumo)
- Domínio puro (sem
*, sem caminho): compara apenas hostname. - URL completa (sem
*): compara protocolo + host + porta + caminho. - Com
*ou sem protocolo: usa regras de coringa (http/https/file suportados por padrão).
Exemplos comuns:
twitter.com✅ corresponde ahttps://twitter.com/home*.twitter.com✅ corresponde ahttps://mobile.twitter.com, ❌ não corresponde ahttps://twitter.comhttps://twitter.com/homesó corresponde a essa URL exatatwitter.com/*corresponde a todas as rotas sobtwitter.com
Caso de adaptação de site (exemplo com Twitter)
Exemplo de regra interna do Twitter, mostrando uso típico de selectors / excludeSelectors / globalStyles:
[
{
"id": "twitter",
"matches": [
"twitter.com",
"mobile.twitter.com",
"tweetdeck.twitter.com",
"pro.twitter.com",
"https://platform.twitter.com/embed*"
],
"selectors": [
"[data-testid=\"tweetText\"]",
".tweet-text",
".js-quoted-tweet-text",
"[data-testid='card.layoutSmall.detail'] > div:nth-child(2)",
"[data-testid='developerBuiltCardContainer'] > div:nth-child(2)",
"[data-testid='card.layoutLarge.detail'] > div:nth-child(2)",
"[data-testid='cellInnerDiv'] div[data-testid='UserCell'] > div> div:nth-child(2)",
"[data-testid='UserDescription']",
"[data-testid='HoverCard'] div[dir=auto]",
"[data-testid='HoverCard'] span[dir=auto]",
"[data-testid='HoverCard'] [role='dialog'] div[dir=ltr]",
"[data-testid='birdwatch-pivot'] div[dir=ltr]"
],
"excludeSelectors": [
"[aria-describedby][role=button]",
"header",
"[data-testid='radioGroupplayback_rate'] div",
"[data-testid='userFollowIndicator']",
"[class='css-901oao r-14j79pv r-37j5jr r-n6v787 r-16dba41 r-1cwl3u0 r-bcqeeo r-qvutc0']",
"[class='css-175oi2r r-1wbh5a2 r-dnmrzs']"
],
"globalStyles": {
"[data-testid='card.layoutLarge.detail'] > div:nth-child(2)": "-webkit-line-clamp: unset;",
"[data-testid='card.layoutSmall.detail'] > div:nth-child(2)": "-webkit-line-clamp: unset;",
"[data-testid='tweetText']": "-webkit-line-clamp: unset;"
}
}
]
selectors: traduz apenas o conteúdo principal do tweet, evitando nomes/botões.
excludeSelectors: exclui botões, navegação e elementos interativos.
globalStyles: remove o limite de linhas para evitar corte na tradução.
Adaptação personalizada de sites
Você pode reutilizar regras internas via id e modificar incrementando com .add/.remove:
[
{
"id": "twitter",
"selectors.remove": ["[data-testid=\"tweetText\"]"],
"selectors.add": ["[data-testid=\"tweetText\"] a"],
"excludeSelectors.add": ["header"],
"excludeSelectors.remove": []
}
]
Observação:
idherda regras internas, evitando repetição dematches..add/.removesó altera itens no respectivo array, evitando sobrescrever.
IDs internos comuns (parcial):
isEbook: leitor de epubisEbookBuilder: gerador de epub bilínguepdf: página bilíngue para PDF
Lista completa de regras internas:
https://github.com/immersive-translate/next-immersive-translate/blob/main/docs/buildin_config.json
Configurando serviços de tradução
translationService: motor de tradução padrão.translationServices: configurações por serviço e sobrescritas por site.showUnconfiguredTranslationServiceInPopup: esconde serviços não configurados.
Exemplo (com Tencent):
{
"translationService": "tencent",
"translationServices": {
"tencent": {
"secretId": "xxx",
"secretKey": "xxx",
"matches": ["twitter.com"],
"limit": 3,
"maxTextGroupLengthPerRequest": 25,
"maxTextLengthPerRequest": 1800,
"apiUrl": ""
}
}
}
Notas:
matchesdefine onde o serviço é aplicado.limitlimita a taxa de requisições por segundo.maxTextGroupLengthPerRequest/maxTextLengthPerRequestcontrolam o tamanho máximo de cada requisição.apiUrlpermite definir URL personalizada.
Configurando tempo limite da requisição (timeout máximo)
Pode-se definir o timeout (em ms) por serviço. Para serviços Pro, defina proRequestTimeout.
{
"translationServices": {
"openai": {
"requestTimeout": 60000
},
"gemini": {
"proRequestTimeout": 90000
}
}
}
Dicas:
- Timeout muito alto faz aguardar muito; muito baixo, pode falhar frequentemente.
- O valor padrão depende do serviço (consulte a configuração final).
proRequestTimeoutsó surte efeito quandoproviderforpro(serviço para assinantes).
Idioma e Estratégia de Tradução
Sempre/Nunca traduzir certos idiomas
{
"translationLanguagePattern": {
"matches": ["en"],
"excludeMatches": ["zh"]
}
}
Definindo idioma de origem para um site específico
{
"sourceLanguageUrlPattern": {
"en": {
"matches": ["*.google.com"]
}
}
}
Outras configurações globais frequentes
Permitir renderizar tags HTML
Se desejar manter/renderizar HTML na tradução:
{
"enableRenderHtmlTag": true
}
Estilo e tema da tradução
Temas suportados por translationTheme (confira configuração final):
none, grey, dashed, dashedBorder, solidBorder, dotted, underline, mask, opacity,
paper, dividingLine, highlight, marker, marker2, blockquote, weakening, italic,
bold, thinDashed, nativeDotted, wavy, nativeDashed, nativeUnderline, background
Configuração de tema por site:
{
"translationThemePatterns": {
"highlight": {
"matches": ["discord.com"]
}
}
}
Parâmetros AI / Serviços Avançados
temperature
{
"translationServices": {
"openai": {
"temperature": 0.2
}
}
}
Headers e body customizados
{
"translationServices": {
"claude": {
"headerConfigs": {
"anthropic-version": "2023-06-01",
"anthropic-dangerous-direct-browser-access": "true"
},
"bodyConfigs": {
"max_tokens": 2048
}
}
}
}
Como usuários de modelos Gemini podem personalizar configurações
Modelos Gemini vêm com configs padrão internas; para sobrescrever, use modelsOverrides:
{
"translationServices": {
"gemini": {
"modelsOverrides": [
{
"models": ["gemini-2.5-flash", "gemini-2.5-flash-lite"],
"bodyConfigs": {
"temperature": 0.1
}
}
]
}
}
}
Dica: modelsOverrides funciona para outros serviços AI — corresponde pelo nome do modelo.
Obedecer estritamente prompts customizados
Para reduzir "alucinações" em LLMs, o plugin valida a contagem de tokens de resposta vs. requisição. Proporção muito alta/baixa = resultado inválido e uso de serviço secundário. Se seu prompt não for sobre tradução (mas expansão, revisão etc), pode disparar falso positivo; ative o modo estrito para ignorar a validação.
{
"translationServices": {
"claude": {
"strictPrompt": true
}
}
}
Prompts multilíngues personalizados (exemplo)
{
"translationServices": {
"openai": {
"langOverrides": [
{
"id": "auto2ja",
"systemPrompt": "あなたはプロの翻訳エンジンです。",
"prompt": "次のテキストを{{to}}に翻訳してください:\n\n<text>\n{{text}}\n</text>",
"multiplePrompt": "<yaml>\n{{yaml}}\n</yaml>",
"subtitlePrompt": "<yaml_subtitles>\n{{yaml}}\n</yaml_subtitles>"
}
]
}
}
}
Glossário e Tradução Automática
Novo suporte a Glossário AI, válido só para serviços de tradução AI.
MT não usa glossário por padrão (pode degradar resultados). Para forçar (NÃO recomendado):
{
"enableMachineTranslateTerms": true
}
Limpeza do Cache
Cache de tradução é limpo automaticamente a cada 30 dias para evitar sobrecarga.
{
"cacheMaxAgeDay": 30
}
Injected CSS e globalStyles
- Injected CSS: CSS global para correção geral da página.
- globalStyles: aplica CSS por regra, útil para adaptação por site.
Exemplo de Injected CSS:
.immersive-translate-target-wrapper img {
width: 16px;
height: 16px;
}
Dicas de Troubleshooting
*.twitter.comnão cobre domínio raiz; escreva tambémtwitter.com.selectorssubstitui o escopo original; prefira.add/.remove.- Especificar
matchescomoexample.com/pathativa coringa; verifique se precisa da URL completa. - Configuração não funciona? Consulte o resultado de merge final e recarregue a página.
- Vírgula extra no fim do JSON invalida a configuração.
Apêndice: Referência de Campos Rule
Referência dos campos de Rule (documentação, lista parcial); consulte a config final para campos completos ou atualizados.
Dica: para arrays/objetos, use .add / .remove para modificar sem sobrescrever:
export interface Rule {
// Site correspondente
id?: string; // ID de regra interna, para reutilizar regras internas
matches?: string | string[]; // Sites para corresponder esta Rule
excludeMatches?: string | string[]; // Excluir sites específicos
selectorMatches?: string | string[]; // Corresponde por selector CSS, não por URL
excludeSelectorMatches?: string | string[]; // Exclude por selector
// Escopo de tradução
selectors?: string | string[]; // Só traduz elementos correspondentes
excludeSelectors?: string | string[]; // Não traduz elementos correspondentes
excludeTags?: string | string[]; // Não traduz tags correspondentes
// Adição incremental de escopos (caso falhe, use selectors.add / selectors.remove)
additionalSelectors?: string | string[]; // Adiciona seleção para tradução
additionalExcludeSelectors?: string | string[]; // Adiciona exclusão
additionalExcludeTags?: string | string[]; // Adiciona exclusão (algumas versões obsoleto)
// Manter original
stayOriginalSelectors?: string | string[]; // Elementos mantidos originais
stayOriginalTags?: string | string[]; // Tags mantidas originais, ex: code
// Block ou Inline
extraBlockSelectors?: string | string[]; // Elementos são blocos
extraInlineSelectors?: string | string[]; // Elementos são inline
inlineTags?: string | string[]; // Tags como inline
preWhitespaceDetectedTags?: string | string[]; // Tags que detectam quebra de linha automática
// Estilos na tradução
translationClasses?: string | string[]; // Classes extras para o texto traduzido
// Estilos globais
globalStyles?: Record<string, string>; // Modifica CSS da página
globalAttributes?: Record<string, Record<string, string | null>>; // Modifica atributos de elementos
// CSS embutido
injectedCss?: string | string[]; // CSS embutido
additionalInjectedCss?: string | string[]; // CSS adicional
// Contexto
wrapperPrefix?: string; // Prefixo antes da área traduzida
wrapperSuffix?: string; // Sufixo após a área traduzida
// Troca de linha no texto traduzido
blockMinTextCount?: number; // Tamanho mínimo de caracteres para bloco
blockMinWordCount?: number; // Mínimo de palavras por bloco
// Mínimo para traduzir
containerMinTextCount?: number; // Mínimo de caracteres por elemento
paragraphMinTextCount?: number; // Mínimo de caracteres por parágrafo
paragraphMinWordCount?: number; // Mínimo de palavras por parágrafo
// Máximo por linha para forçar quebra
lineBreakMaxTextCount?: number; // Máximo de caracteres por linha
// Momento de iniciar tradução
urlChangeDelay?: number; // Delay após entrar na página
observeUrlChange?: boolean; // Traduz novamente ao mudar URL
// Mobile
isShowUserscriptPagePopup?: boolean; // Mostrar popup em mobile
fingerCountToToggleTranslagePageWhenTouching?: number; // (obsoleto)
// Tradução de streaming AI
aiRule?: {
streamingSelector: string; // Selector para marcar elemento em tradução
messageWrapperSelector: string; // Selector do conteúdo da mensagem
streamingChange: boolean; // Atualização incremental
};
}