Pular para o conteúdo principal

Opções avançadas de personalização

Você pode editar configurações mais personalizadas na Página de Configuração Estendida -> Configurações do Desenvolvedor -> Configuração do Usuário que não são editáveis na interface para usuários avançados. Veja a última nota para mais detalhes sobre os parâmetros. A config embutida atual pode ser encontrada aqui.

Regras do Usuário

Com Regras é possível personalizar a configuração de um site específico, decidindo qual conteúdo precisa ser traduzido ou não, ou ajustando o estilo das páginas, etc.

[
{
"matches": "www.google.com",
"selectors": [".title"]
},
{
"matches": "*.twitter.com",
"selectors": [".text"],
"excludeSelectors": ["nav", " footer"]
}
]

Use matches para corresponder ao site correspondente. Curingas são permitidos, por exemplo, *.google.com, www.google.com/test/*, file://*.

Usar selectors substitui o escopo de tradução inteligente, traduzindo apenas os elementos correspondentes a esse seletor.

Use excludeSelectors para excluir elementos sem traduzir a posição.

Use a família de seletores additional para aumentar ou diminuir o alcance da tradução com base na tradução inteligente.

[
{
"matches": "www.google.com",
"additionalSelectors": [],
"additionalExcludeSelectors": []
}
]

Se você quiser traduzir uma região tratando os elementos como um todo e não separando-os, pode usar o seletor atomicBlockSelectors. Por exemplo, perfis do Instagram. Note que usar atomicBlockSelectors requer selecionar com selectors antes de usar atomicBlockSelectors.

{
"matches": "https://www.instagram.com/*",
"selectors": [
"div._aa_c h1",
"li._acaz div[role=\"menuitem\"]"
]
"atomicBlockSelectors": [
"div. ._aa_c h1",
"li._acaz div[role=\"menuitem\"]"
]
}

Se a tradução resultar em páginas desalinhadas, texto sobreposto e outros casos extremos, você pode usar globalStyles para ajustar o estilo da página e corrigir isso. Por exemplo, o cabeçalho do YouTube, que é usado para remover a altura máxima da página original.

{
"matches": "www.google.com",
"globalStyles": { ".title": "max-height:unset;" }
}

Melhorias na consolidação das regras do usuário

Suporte a partir da versão 0.7.4. Tomando como exemplo a omissão da zona sem tradução

{
"matches": "https://www.elektrotechnik.rwth-aachen.de/*",
"additionalExcludeSelectors.remove": [".notranslate", "[translate=no]"]
}

As operações de adição e remoção modificam as regras fornecidas por padrão e não precisam ser substituídas em sua totalidade, como era anteriormente.

CSS Injetado

CSS Injetado permite que você injete estilos personalizados na web globalmente. Pode ser usado com translationClasses de Regras.

".immersive-translate-target-wrapper img { width: 16px; height: 16px }"

Também é possível estilizar o site de uma maneira mais personalizada, como um gerenciador de estilo web regular. (até mesmo utilizando display:none para remover anúncios)

.title {
color: red;
}

Configuração do Usuário

A configuração permite que você personalize a configuração deste plugin, como serviços de tradução, opções de tradução específicas de idioma, etc.

{
"translationService": "tencent",
"translationServices": {
"tencent": {
"secretId": "xxx",
"secretKey": "xxx",
"matches": ["*.twitter.com"]
}
} ,
"translationUrlPattern": {
"excludeMatches": ["www.google.com"]
},
"translationLanguagePattern": {
"matches": ["en"]
},
"translationTheme". "none",
"translationThemePatterns": {
"underline": {
"matches": ["discord.com"]
}
},
"generalRule": {
"_comment": "",
"normalizeBody": "",
" injectedCss": [],
"additionalInjectedCss": [],
"wrapperPrefix": "smart",
"wrapperSuffix": "smart",
"isPdf": false,
"isTransformPreTagNewLine ": false,
"urlChangeDelay": 20,
"isShowUserscriptPagePopup": true,
"observeUrlChange": true,
"paragraphMinTextCount": 8,
" paragraphMinWordCount": 2,
"blockMinTextCount": 32,
"blockMinWordCount": 5,
"containerMinTextCount": 18,
"lineBreakMaxTextCount": 0,
" globalAttributes": {},
"globalStyles": {},
"selectors": [],
"preWhitespaceDetectedTags": ["DIV", "SPAN"],
"stayOriginalSelectors": [],
" additionalSelectors": [],
"atomicBlockTags": [],
"excludeSelectors": [],
"additionalExcludeSelectors": [],
"translationClasses": [],
" atomicBlockSelectors": [],
"excludeTags": [],
"metaTags": ["META", "SCRIPT", "STYLE", "NOSCRIPT"],
"additionalExcludeTags": [],
" stayOriginalTags": ["CODE", "TT", "IMG", "SUP"],
"additionalStayOriginalTags": [],
"inlineTags": [],
"additionalInlineTags": [],
" extraInlineSelectors": [],
"additionalInlineSelectors": [],
"extraBlockSelectors": [],
"allBlockTags": [],
"pdfNewParagraphLineHeight": 2.4 ,
"pdfNewParagraphIndent": 1.2,
"pdfNewParagraphIndentRightIndentPx": 130,
"fingerCountToToggleTranslagePageWhenTouching": 4
},
"rules": [
{
"matches": "www.google.com",
"selectors": [".class"]
}
]
}

Os campos de regra em rules podem usar todos os campos em generalRule. As rules têm a maior prioridade, mesclando a generalRule e as regras para essa rule quando uma rule específica para um site específico é correspondida.

Introduzindo alguns dos campos comuns da Configuração.

Não mostrar serviços de tradução não configurados no painel pop-up

"showUnconfiguredTranslationServiceInPopup": false

Configuração dos serviços de tradução

Use translationService para selecionar o mecanismo de tradução padrão, que atualmente suporta:

| "tencent"
| "google"
| "deepl"
| "baidu"
| "volc"
| "youdao"
| "caiyun"
| "openl"
| "bing"
| "transmart"

Use translationServices para configurar o apikey de cada serviço de tradução, diferentes provedores de serviço precisam de diferentes parâmetros, e suas chaves de API podem ser solicitadas no centro de desenvolvedores de seus respectivos sites.

Por exemplo, o Tradutor Tencent, você precisa configurar secretId, secretKey. Você pode acessar o Tencent Cloud para solicitar uma chave de API com 5 milhões de caracteres gratuitos por mês. Consulte aqui para o processo de aplicação.

"translationServices": {
"tencent": {
"secretId": "xxx",
"secretKey": "xxx",
"matches":["*.twitter.com"],
"limit": 3,
"apiUrl":"",
" maxTextGroupLengthPerRequest": 25,
"maxTextLengthPerRequest": 1800
}
}

Campo matches, usando este serviço de tradução para um site específico.

O campo limit, que especifica o número máximo de solicitações por segundo para este serviço de tradução (alguns serviços limitam o número máximo de solicitações por segundo).

Campo maxTextGroupLengthPerRequest, número máximo de parágrafos por solicitação

Campo maxTextLengthPerRequest, número máximo de caracteres por solicitação

apiUrl permite que você personalize o endereço da interface de tradução.

Sempre traduzir sites específicos

translationUrlPattern configura sites que são sempre traduzidos, e sites que nunca são traduzidos.

  • Configuração matches sempre traduz o site.
  • excludeMatches configura sites que nunca são traduzidos.

Os valores de configuração podem ser nomes de domínio ou URLs com *, como: www.google.com/mail/*

"translationUrlPattern": {
"matches": ["stackoverflow.com"]
"excludeMatches": ["www.google.com/mail/*"]
}

Sempre traduzir idiomas específicos

translationLanguagePattern, configura o idioma que é sempre traduzido e o idioma que nunca é traduzido.

  • matches configura o idioma que é sempre traduzido, por exemplo, en,
  • excludeMatches configura os idiomas que nunca são traduzidos.

Formato de exibição da tradução

translationTheme é o formato de exibição da tradução, e atualmente suporta os seguintes estilos:

| "none"
| "dashed"
| "dotted"
| "underline"
| "mask"
| "paper"
| "highlight"
| "blockquote"
| "weakening"
| "italic"
| "bold"
| "thinDashed".

Nome correspondente em chinês:

{
"none": "none",
"dashed": "sublinhado pontilhado",
"dotted": "sublinhado pontilhado",
"underline": "sublinhado linha reta",
"mask": "efeito de desfoque",
"paper": "efeito de sombra em papel branco",
"highlight": "realce",
"blockquote": "estilo de citação",
"weakening": "enfraquecimento",
"italic": "itálico",
"bold": "negrito",
"thinDashed": "sublinhado tracejado fino"
}

translationThemePatterns permite que você configure diferentes estilos de tradução para diferentes sites.

"translationThemePatterns": {
"underline": {
"matches": ["discord.com"]
}
}

Tradução de Mensagens de Fluxo de Página da Classe GPT

{
"matches": ["chat.openai.com"],
"excludeSelectors": [".markdown *"],
"aiRule": {
"streamingSelector": ".result-streaming.markdown ",
"messageWrapperSelector": ".markdown",
"streamingChange": true
}
}

Regras

rules é um objeto array que permite configurar regras para sites especiais, como ter o Twitter traduzindo apenas uma certa parte de uma região:

{
"rules": [
{
"id": "twitter",
"matches": ["twitter.com", "mobile.twitter.com", "tweetdeck.twitter.com"],
"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)"
],
"extraInlineSelectors": ["[data-testid=\"tweetText\"] div"]
}
]
}

As rules embutidas atuais podem ser encontradas aqui.

Alguns dos campos importantes são selecionados abaixo para ilustração:

export interface Rule {
// Corresponder ao site
id?: string; // Cada regra de adaptação tem seu próprio id, se os usuários quiserem reutilizar essa regra além dessa alteração, eles precisam adicionar esse id correspondente à sua própria regra para reutilizá-la
matches?: string | string[]; // Esta regra corresponderá apenas ao site aqui. Esta regra corresponderá apenas a sites aqui.
excludeMatches?: string | string[]; // Excluir sites específicos.
selectorMatches?: string | string[]; // Corresponder com um seletor sem especificar todos os URLs
excludeSelectorMatches?: string | string[]; // Excluir regras, como acima.

// Especificar o alcance das traduções
selectors?: string | string[]; // Traduzir apenas elementos que correspondem
excludeSelectors?: string | string[]; // Excluir elementos, não traduzir correspondências
excludeTags?: string | string[]; // Excluir Tags, não traduzir Tags correspondentes

// anexar intervalos de tradução em vez de substituir
additionalSelectors?: string | string[]; // anexar intervalos de tradução. Anexar locais de tradução às regiões traduzidas inteligentemente.
additionalExcludeSelectors?: string | string[]; // Anexar elementos excluídos para que a tradução inteligente não traduza locais específicos.
additionalExcludeTags?: string | string[]; // Tags de exclusão adicionais

// Deixar como está
stayOriginalSelectors?: string | string[]; // Elementos correspondentes serão deixados como estão. Comumente usado em tags de sites de fórum.
stayOriginalTags?: string | string[]; // Tags correspondentes serão deixadas como estão, por exemplo, `code`

// Traduções regionais
atomicBlockSelectors?: string | string[]; // Seletores regionais, elementos correspondentes serão tratados como um todo, não traduzidos em seções.
atomicBlockTags?: string | string[]; // Seletores de Tag de área, igual ao acima

// Bloco ou Inline
extraBlockSelectors?: string | string[]; // Seletores extras, elementos correspondentes serão tratados como elementos de bloco, não traduzidos em uma linha.
extraInlineSelectors?: string | string[]; // Seletores extras que serão usados como elementos inline.

inlineTags?: string | string[]; // Tag correspondida será usada como um elemento inline
preWhitespaceDetectedTags?: string | string[]; // Tag correspondida será automaticamente encapsulada

// Estilo de tradução
translationClasses? string | string | string[]; // Adicionar Classes adicionais à tradução

// Estilos Globais
globalStyles?: Record<string, string>; // Modificar estilos de página, útil se a tradução causar bagunça na página. `
globalAttributes?: Record<string, Record<string, string>>; // Modificar atributos de elementos de página

// Estilos incorporados
injectedCss?: string | string[]; // Incorporar estilos CSS
additionalInjectedCss?: string | string[]; // Estilos CSS adicionais em vez de substituí-los.

// Contexto
wrapperPrefix?: string; // O prefixo da área de tradução, padrão é smart, com ou sem quebras de linha dependendo do número de caracteres.
wrapperSuffix?: string; // Sufixo da área de tradução

// Número de caracteres para encapsular a tradução
blockMinTextCount?: number; // Número mínimo de caracteres para encapsular a tradução como um bloco, caso contrário, a tradução é um elemento inline.
blockMinWordCount?: number; // Igual ao acima. Se você quiser que eles estejam sempre em nova linha, pode colocar 0 em ambos.

// Número mínimo de caracteres que podem ser traduzidos do conteúdo
containerMinTextCount?: number; // Número mínimo de caracteres que um elemento deve conter antes de ser traduzido, padrão é 18
paragraphMinTextCount?: number; // Número mínimo de caracteres para o parágrafo, maior que o número de caracteres que o conteúdo deve conter. número, qualquer coisa maior que isso será traduzida
paragraphMinWordCount?: number; // Número mínimo de palavras no parágrafo original

// Quebras de linha forçadas para parágrafos longos
lineBreakMaxTextCount?: number; // Número máximo de caracteres no parágrafo a ser forçado a quebrar ao traduzir um parágrafo longo.

// Quando iniciar a tradução.
urlChangeDelay?: number; // Quantos milissegundos para atrasar a tradução após entrar na página. Para esperar a inicialização da página, o padrão é 250ms
observeUrlChange?: boolean; // Detectar quando o endereço da URL mudou e iniciar a tradução novamente, verdadeiro por padrão.

// Móvel
isShowUserscriptPagePopup?: boolean; // Mostrar o pop-up da página em dispositivos móveis. janela flutuante, verdadeiro por padrão.
fingerCountToToggleTranslagePageWhenTouching?: number; // Traduções quando quatro dedos tocam, pode ser configurado para 0, 2, 3, 4, 5

// Traduções de streaming de IA
aiRule: {
streamingSelector. string; // Seletor para marcar o elemento sendo traduzido na página web gpt
messageWrapperSelector: string; // Seletor do corpo da mensagem
streamingChange: boolean; // Se a mensagem é atualizada incrementalmente ou totalmente para a iteração da página web da classe gpt. gpt é incremental
};
}

Mais explicações

Diferença entre bloco e inline, se você quiser saber mais, pode ver aqui

  • O elemento de bloco ocupa uma única linha, e vários elementos de bloco vizinhos ocupam cada um uma nova linha.
  • O elemento inline não ocupa uma única linha; vários elementos inline vizinhos são dispostos na mesma linha, e uma nova linha não é criada até que uma linha seja demais.