Back to home@grstein

dsh-locale-ptbr

Pacote de idioma Português (Brasil) para a GUI Web do DeepSeek Harness

Stars
0
Language
JavaScript
Created
Aug 31, 2026
Updated
Aug 31, 2026
GitHub repo

Introduction

dsh-locale-ptbr

Pacote de idioma Português (Brasil) para a GUI Web do DeepSeek Harness.

Instalado em um profile, ele acrescenta "Português (Brasil)" a Configurações → Geral e traduz a interface ao vivo. Nada no repositório do harness é alterado.

Instalar

dsh plugin --profile web add github:grstein/dsh-locale-ptbr
dsh --profile web --dump-config   # confere a camada "# == @grstein/dsh-locale-ptbr"
dsh web                           # ou: dsh --profile <outro-perfil>

dsh plugin encaminha para o pnpm dentro do diretório do profile, então qualquer especificador aceito pelo pnpm serve (github:, um caminho local, um registry interno).

O idioma entra em Configurações → Geral → Idioma. Um navegador configurado em português seleciona Português (Brasil) sozinho no primeiro acesso; a escolha explícita fica gravada em locale.preference no settings.yaml do seu $DSH_HOME e vale por usuário.

A GUI do DeepSeek Harness em português

Remover: dsh plugin --profile web remove @grstein/dsh-locale-ptbr.

dsh web é o atalho do profile web e não aceita --profile; um profile próprio que inclua o bundle @deepseek-ai/dsh-web-app sobe com dsh --profile <nome>.

O que é traduzido

A cópia de produto da GUI Web: 33 namespaces e 1.029 chaves — conversa, trajetória, cards de ferramenta, workspace, configurações, aprovações, jobs, subagentes, comandos.

Não é traduzido, por design do harness: o texto gerado pelo modelo, dados de usuário/provedor/protocolo, a saída do CLI e do terminal, a documentação, e a cópia de boot renderizada antes do serviço de locale ativar. Texto capturado no momento do registro (por exemplo, descrições de comando no registry) mantém o idioma do registro até um novo registro.

Chaves ainda não traduzidas caem automaticamente em inglês pela cadeia de fallback pt-BR → en, então o pacote nunca mostra chave crua.

Estrutura

CaminhoPapel
dicts/<ns>.jsonFonte de tradução, um arquivo por namespace ({ namespace, entries })
client.jsMetade browser gerada: addLanguage + um register por namespace
index.jsMetade Node (vazia); existe porque o Loader do host varre o manifesto dsh.client
cordis.patch.ymlCamada do bundle que insere a row locale-ptbr
keys.lock.jsonConjunto de chaves e placeholders do harness alvo
GLOSSARY.mdTerminologia pt-BR obrigatória
tools/extract-keys.mjsVarredura AST de um checkout do harness → keys.lock.json + en.snapshot.json
tools/sync.mjsCompara o pacote com um harness mais novo e gera o delta de tradução
tools/build-client.mjsdicts/*.jsonclient.js
tools/check-parity.mjsGate: chaves, placeholders e client.js atualizado
tools/check-runtime.mjsGate: o artefato registra 1 idioma + 33 dicionários e descarta limpo
.github/workflows/ci (gates a cada push) e drift (vigia o harness toda segunda)

Não versionados: en.snapshot.json (texto em inglês de cada chave, fonte de tradução) e .work/ (arquivos de delta). Ambos são regeneráveis a partir de um checkout do harness.

Traduzir ou corrigir

npm install       # uma vez: o único dev dependency é o typescript, usado pela extração
# edite dicts/<ns>.json
npm run build     # regenera client.js
npm test          # paridade de chaves, placeholders, artefato e registro em runtime

Envie client.js regenerado junto com a alteração do dicionário: o gate falha se ele estiver desatualizado.

Acompanhar uma versão nova do harness

git -C /caminho/para/deepseek-harness pull      # ou clone raso da tag desejada
node tools/sync.mjs /caminho/para/deepseek-harness           # relatório; sai 1 se houver diferença
node tools/sync.mjs /caminho/para/deepseek-harness --apply   # adota o novo conjunto de chaves

O relatório separa três tipos de diferença, porque cada um dá trabalho diferente:

TipoO que aconteceuEfeito se nada for feito
addedO harness registra uma chave que o pacote ainda não traduzA chave aparece em inglês (fallback), nunca crua
removedO harness deixou de registrar a chave--apply remove a entrada de dicts/; o gate rejeita chave desconhecida
rewordedO texto em inglês mudouA tradução antiga continua exibida e pode estar errada

--apply reescreve keys.lock.json e en.snapshot.json, remove as chaves obsoletas de dicts/, regenera client.js e grava .work/<ns>.delta.json com apenas o que precisa de tradutor — o texto em inglês das chaves novas e, para as reformuladas, o inglês novo ao lado da tradução atual. Chaves novas não recebem texto automático de propósito: chave ausente cai em inglês, enquanto um inglês copiado para dentro do dicionário pareceria traduzido e nunca mais seria revisto.

Traduza os arquivos de delta para dentro de dicts/, e então:

npm run build && npm test

A extração exige um checkout de código-fonte do harness (ela lê packages/*/*/src pela AST); o pacote publicado no npm não traz as fontes. Um git clone --depth 1 da tag correspondente basta.

Vigilância automática

.github/workflows/drift.yml roda toda segunda-feira: faz checkout do deepseek-ai/deepseek-harness, executa tools/sync.mjs e, havendo diferença, abre (ou comenta em) uma issue com o relatório. Assim a defasagem aparece sozinha, sem depender de alguém lembrar de conferir a cada release.

Versionamento do pacote

Suba a versão em package.json a cada conjunto de traduções e anote no CHANGELOG do release qual harnessVersion ele mira — keys.lock.json guarda esse alvo. Como o fallback para inglês nunca quebra a UI, um pacote defasado degrada aos poucos em vez de falhar.

Alvo atual: @deepseek-ai/dsh-client-locale 0.1.2-alpha.1. O histórico de versões está no CHANGELOG.

Contribuir com uma correção de tradução

Divergências de terminologia são resolvidas pelo GLOSSARY.md, que é a autoridade do pacote: mudar uma palavra que ele fixa significa mudar o glossário e todos os arquivos afetados, não só um deles.

  1. Edite dicts/<ns>.json (apenas valores; chaves e placeholders são intocáveis).
  2. npm run build && npm test.
  3. Abra um PR com o client.js regenerado junto.

Relação com o projeto oficial

Este pacote é ecossistema, não um fork. O CONTRIBUTING do DeepSeek Harness declara que o projeto não aceita pull requests externos no momento e indica a criação de plugins próprios, marcados com o tópico dsh-plugin, como a forma de contribuir. É exatamente o que este repositório é.

Um pt-BR embutido no repositório oficial também seria caro tecnicamente: LOCALE_IDS é um par tipado ['zh', 'en'] e a forma register(ns, { zh, en }) exige os dois dicionários completos, então um terceiro idioma interno viraria erro de compilação em toda a árvore de plugins. addLanguage + register(ns, locale, dict) existem no runtime justamente para pacotes externos, com cadeia de fallback até en para tolerar tradução incompleta.