Translate
Visão geral
O Translate permite que cada jogador escolha um idioma e leia o conteúdo do seu servidor nele. Você declara os idiomas em uma entry de configuração, escreve os textos em arquivos JSON (o formato é compatível com o plugin Triton, então arquivos existentes podem ser reaproveitados) e os exibe em qualquer lugar que aceite placeholders MiniMessage com <translate_key:your.key>. Cada jogador vê o texto no próprio idioma, com recurso a outro idioma quando um texto está ausente.
Três recursos opcionais complementam: placas traduzidas (uma placa mostra seu texto no idioma de quem a olha), um menu de idiomas e um menu de configurações construídos como pages GUI comuns e a tradução do chat por IA, em que as mensagens do chat são traduzidas para espectadores que falam outro idioma por meio de um provedor de IA ou de um mecanismo de tradução.
As escolhas dos jogadores são armazenadas em artifacts. O idioma é salvo por jogador, assim como as opções de aceitação da tradução de placas e do chat.
Recursos
- Lista de idiomas — cada idioma tem um código, uma bandeira de banner, nome de exibição, locales do cliente, fallbacks e ações a executar quando escolhido.
- Arquivos JSON no estilo Triton — traduções de texto e de placas, com argumentos
%1,%2, carregadas de uma pasta e recarregáveis sem reiniciar. - Cadeia de fallback — o idioma solicitado, depois seus
fallbackLanguagese depois o idioma principal. - Detecção automática — troque opcionalmente para o idioma correspondente ao locale do cliente.
- Placas traduzidas — coloque texto em coordenadas de placas; os jogadores podem desativar no menu de configurações.
- Menus declarados por pages — construa os menus de idioma e de configurações como pages GUI com tipos de botão do Translate.
- Tradução do chat por IA — OpenRouter, OpenAI, DeepSeek, Groq, Mistral, Ollama, Anthropic, Gemini, LibreTranslate, DeepL ou qualquer servidor compatível com OpenAI, com cache.
- Eventos e facts de idioma — dispare entries quando um jogador troca de idioma e teste o idioma atual em criteria.
Instalação
- Instale a extensão GUI para usar os menus de idioma e de configurações (opcional se você usar apenas o comando).
- Opcionalmente, instale a extensão MySQL: o cache de tradução por IA é então salvo no banco de dados; caso contrário, vive apenas na memória.
- Coloque o JAR do Translate em
plugins/Typewriter/extensions/e reinicie o servidor. - Crie a pasta
plugins/Typewriter/Translate/(ela é criada automaticamente no primeiro carregamento) e coloque nela seus arquivos de tradução.json. - Instale o MiniPlaceholders se quiser exibir traduções por placeholders.
Primeiros passos
- No painel web do TypeWriter, abra uma page static e adicione um artifact Player Language: sem ele, o idioma escolhido não é salvo.
- Adicione uma entry Translation Config. Em
languages, adicioneen_GBefr_FR: para cada um, definaname,flag(um código de banner),displayName(por exemplo&3Francais),minecraftCodes(fr_FR,fr_CA) e, opcionalmente,fallbackLanguages. DefinamainLanguagecomoen_GB. - Crie
plugins/Typewriter/Translate/messages.jsoncom este conteúdo e depois publique ou execute/translate reload:
[
{
"type": "text",
"key": "welcome.message",
"languages": {
"en_GB": "&6Welcome to the server, %1!",
"fr_FR": "&6Bienvenue sur le serveur, %1 !"
}
}
]
- Use
<translate_key:welcome.message>em qualquer texto MiniMessage com placeholders (um diálogo, um holograma, um scoreboard). Um jogador que executar/translate fr_FRagora vê o texto em francês. - Para deixar os jogadores escolherem em um menu, construa uma page de menu com a extensão GUI, coloque nela itens
translate_button:LANGUAGE#0,LANGUAGE#1..., referencie-a emlanguageMenuda configuração e dispare Open Language Selector.
Os argumentos de texto %1, %2 só são preenchidos por código que chama a API de tradução com argumentos. O placeholder <translate_key:...> recebe apenas uma chave, então %1 permanece como escrito ali.
Como funciona
O idioma de um jogador é resolvido nesta ordem: a escolha salva, depois o idioma correspondente ao locale do cliente (minecraftCodes) e depois mainLanguage.
Arquivos de tradução
Os arquivos são arquivos .json diretamente na pasta de traduções (translationsFolder, Translate por padrão, dentro de plugins/Typewriter/). Cada arquivo é um array de itens; um arquivo também pode ser um objeto que contém esse array em translations, items, languages, data ou entries. Itens sem um type e um key válidos são ignorados, e um arquivo que falha ao ser interpretado é registrado no log e ignorado.
Um item text tem um key e um objeto languages. Os códigos de cor com & são convertidos. A busca de chaves é tolerante: a chave exata, depois a chave com os prefixos lang_, lang. ou default., depois sem diferenciar maiúsculas de minúsculas e depois uma correspondência com a parte após o último _ ou ..
Um item sign tem locations (world, x, y, z) e lines por idioma. Até 8 linhas são lidas, mas apenas as 4 primeiras (frente) são exibidas.
{
"type": "sign",
"key": "shop.sign",
"locations": [{"world": "world", "x": 100, "y": 64, "z": 200}],
"lines": {
"en_GB": ["&b[Shop]", "&fClick to open", "", ""],
"fr_FR": ["&b[Boutique]", "&fCliquez pour ouvrir", "", ""]
}
}
Uma placa é traduzida quando um jogador a coloca ou edita em uma localização listada, ou clica nela com o botão direito; o jogador vê o idioma dele na placa por meio de uma atualização no lado do cliente. Os jogadores que desativaram a tradução de placas no menu de configurações veem o original.
Menus
Os menus de idioma e de configurações são entries open_gui normais da extensão GUI. O Translate fornece tipos de botão para colocar em seus itens (o campo de tipo de botão de um item do GUI):
| Tipo de botão | Comportamento |
|---|---|
translate_button:LANGUAGE#<n> | O n-ésimo idioma da configuração (a partir de 0). Mostra o código e um marcador no ativo; o clique esquerdo o seleciona. Vazio depois do último idioma. |
translate_button:TOGGLE_CHAT | Mostra e alterna a tradução do chat por IA do jogador (ativada por padrão). |
translate_button:TOGGLE_SIGN | Mostra e alterna a tradução de placas do jogador (ativada por padrão). |
Referencie as pages na Translation Config: languageMenu (e languageMenuViewId para uma view específica) para o seletor, settingsMenu (e settingsMenuViewId) para as configurações. Abra-as com Open Language Selector ou Open Translation Settings. /translate menu abre o menu de idiomas. Se openSelectorCommandOverride estiver definido, esse comando é executado pelo console no lugar ({player} é substituído pelo nome do jogador).
A seleção de idioma pelo menu precisa de um artifact Player Language: sem um, o jogador é avisado de que a escolha não seria salva. As alternâncias também precisam dos artifacts Player AI Preference e Player Sign Preference.
Tradução do chat por IA
Configure aiTranslation na Translation Config. Defina enabled, escolha um provider e informe uma apiKey. A URL base e o modelo assumem, por padrão, os do provedor, a menos que apiBaseUrl ou model seja definido; OPENAI_COMPATIBLE exige apiBaseUrl. Prefira env:VAR_NAME como apiKey para ler a chave de uma variável de ambiente em vez de armazená-la na page.
Quando um jogador conversa, a mensagem é traduzida para o idioma de cada espectador cujo idioma difere do do remetente e que tem a tradução do chat ativada. O texto traduzido substitui a mensagem no chat do espectador, e passar o mouse sobre ele mostra o original. O chat espera no máximo chatTranslationTimeoutMs (800 ms por padrão) pelas traduções e então exibe a mensagem sem tradução aos espectadores que ainda aguardam. As mensagens que correspondem a noTranslateRegex (comandos e números puros por padrão) não são enviadas, o texto que corresponde a censorRegex é substituído por *** antes do envio, e enabledSections deve conter CHAT.
Após três requisições com falha consecutivas, a tradução por IA se desativa até o próximo recarregamento das traduções. Os resultados são armazenados em cache por mensagem e idioma, no banco de dados se a extensão MySQL estiver presente e na memória caso contrário.
Comandos
O comando é /translate, com os aliases /lang e /language. Ele só pode ser executado por jogadores.
| Comando | Descrição |
|---|---|
/translate | Mostra a ajuda. |
/translate <language> | Define o seu idioma pelo nome configurado (por exemplo fr_FR). |
/translate list | Lista os idiomas configurados e marca o seu. |
/translate menu | Abre o seletor de idiomas. |
/translate toggle_ai | Alterna a tradução do chat por IA para você. |
/translate sign set <key> | Marca a placa que você está olhando (a até 5 blocos) como traduzida com esta chave. Exige typewriter.translate.admin. |
/translate sign remove | Remove a marca da placa. Exige typewriter.translate.admin. |
/translate sign info | Mostra a chave, a localização e a tradução da placa. Exige typewriter.translate.admin. |
/translate reload | Recarrega os arquivos de tradução. Exige typewriter.translate.admin. |
/translate sign set apenas grava um marcador e a chave na placa. O texto de fato vem de um item sign em um arquivo JSON com a localização da placa.
Permissões
| Permissão | Concede |
|---|---|
typewriter.translate.admin | /translate reload e /translate sign .... |
Placeholders
Expansão translate do MiniPlaceholders, utilizável como tags MiniMessage. O texto traduzido pode conter marcação MiniMessage e placeholders aninhados.
| Placeholder | Retorna |
|---|---|
<translate_key:some.key> | O texto dessa chave no idioma do espectador. Se ausente, [Translation not found: key] em vermelho. |
<translate_lang> | O código de idioma do espectador, como fr_FR. |
<translate_lang_display> | O nome de exibição do idioma. |
<translate_lang_flag> | O código da bandeira de banner do idioma. |
<translate_count> | Número de traduções carregadas (textos mais placas). |
<translate_languages> | Número de idiomas configurados. |
Entries
10 entradas, geradas a partir do código-fonte da extensão.
Ações4
- Open Language Selector ActionOpen the language selection menu
- Open Translation Settings ActionOpen the translation settings menu
- Reload Translations ActionReload translation files from disk
- Set Language ActionSet a player's translation language
Eventos1
- Player Language Change EventTriggered when a player changes their language
Fatos1
- Player Language FactReturns the player's current language as a numeric value
Artefatos3
- Player Ai Preference ArtifactStores player AI translation preferences
- Player Language ArtifactStores player language preferences
- Player Sign Preference ArtifactStores player sign translation preferences
Manifestos1
- Translation ConfigConfigure the multi-language translation system
Solução de problemas
[Translation not found: key] aparece. A chave não está em nenhum arquivo carregado, ou o arquivo falhou ao carregar. Verifique no log do servidor se há Failed to load translation file, valide o JSON e execute /translate reload. Certifique-se de que o arquivo está diretamente em plugins/Typewriter/Translate/ (subpastas não são lidas) e tem a extensão .json.
O idioma é redefinido a cada login. Nenhum artifact Player Language está publicado, então a escolha não é armazenada. Adicione um.
O menu não faz nada. O log diz No 'languageMenu' configured ou No 'settingsMenu' configured: defina a page do menu na Translation Config. No menu de idiomas, openSelectorCommandOverride tem precedência quando não está vazio.
O idioma não acompanha o idioma do cliente. Sem uma escolha salva, o locale do cliente é usado automaticamente se aparecer em minecraftCodes de um idioma. forceClientLocaleOnJoin também troca o jogador, e sobrescreve a escolha salva dele, sempre que o cliente informa uma mudança de locale que corresponda a outro idioma.
A tradução por IA parou de funcionar. Procure AUTOMATICALLY DISABLED no log: três falhas consecutivas da API a desativam. Corrija a chave, a URL ou o modelo e depois execute /translate reload. apiKey references env var ... not set significa que a variável de ambiente está ausente.
Uma placa não é traduzida. A placa deve estar exatamente nas coordenadas listadas em um item sign de um arquivo JSON, com o nome de mundo correto. O jogador não deve ter desativado a tradução de placas, e a placa é traduzida quando colocada ou clicada com o botão direito.
Extensões relacionadas
- TinyEssentials — seu formato de chat é preservado quando a tradução por IA envolve o renderizador de chat.
- MySQL — cache persistente da tradução por IA.