Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added assets/i18n-pt-br/integrations-cursor.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added assets/i18n-pt-br/providers.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions gui/src/components/QuotaBars.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -180,6 +180,8 @@ function bcp47(locale: Locale): string {
return "tr-TR";
case "vi":
return "vi-VN";
case "pt-BR":
return "pt-BR";
default: {
const _exhaustive: never = locale;
return _exhaustive;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ function bcp47(locale: Locale): string {
case "ja": return "ja-JP";
case "tr": return "tr-TR";
case "vi": return "vi-VN";
case "pt-BR": return "pt-BR";
default: {
const _exhaustive: never = locale;
return _exhaustive;
Expand Down
2 changes: 2 additions & 0 deletions gui/src/i18n/catalogs.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import { ru } from "./ru";
import { ja } from "./ja";
import { tr } from "./tr";
import { vi } from "./vi";
import { ptBR } from "./pt-BR";
import { LAB_CATALOG_OVERRIDES, type LabLocale } from "./lab-translations";

/** React-free locale catalog registry for formatters and other shared helpers. */
Expand All @@ -33,6 +34,7 @@ export const DICTS: Record<Locale, Record<TKey, string>> = {
ja: withLabTranslations("ja", ja),
tr: withLabTranslations("tr", tr),
vi: withLabTranslations("vi", vi),
"pt-BR": withLabTranslations("pt-BR", ptBR),
};

/** Native language names shown by the language picker, kept inside i18n rather than UI metadata. */
Expand Down
66 changes: 65 additions & 1 deletion gui/src/i18n/lab-translations.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import type { TKey } from "./en";

export type LabLocale = "en" | "de" | "fr" | "ko" | "zh" | "zh-TW" | "ru" | "ja" | "tr" | "vi";
export type LabLocale = "en" | "de" | "fr" | "ko" | "zh" | "zh-TW" | "ru" | "ja" | "tr" | "vi" | "pt-BR";
export type LabCatalogKey = Exclude<Extract<TKey, `lab.${string}`>, `lab.production.${string}`>;
export type LabSupplementKey =
| "subjectKindUnknown"
Expand Down Expand Up @@ -514,6 +514,57 @@ const vi: Record<LabCatalogKey, string> = {
"lab.layer.task_effectiveness": "Hiệu quả tác vụ",
};


const ptBR: Record<LabCatalogKey, string> = {
"lab.title": "Laboratório de Compatibilidade",
"lab.subtitle": "Matriz de pareceres de compatibilidade somente leitura baseada em evidências de projeção do laboratório.",
"lab.loadFailed": "Não foi possível carregar os dados do laboratório de compatibilidade",
"lab.projectionUnavailable": "A projeção do laboratório não está disponível. Execute os testes de conformidade ou sondagens ativas primeiro.",
"lab.projectionIncompatible": "O esquema de projeção do laboratório é incompatível. Reconstrua a projeção.",
"lab.statusTitle": "Status da projeção",
"lab.matrixTitle": "Matriz de compatibilidade",
"lab.verdictsTitle": "Registros de pareceres",
"lab.filter.layer": "Camada de evidência",
"lab.filter.verdict": "Parecer",
"lab.filter.subject": "ID do sujeito",
"lab.filter.all": "Todos",
"lab.col.subject": "Sujeito",
"lab.col.layer": "Camada",
"lab.col.suite": "Suite",
"lab.col.verdict": "Parecer",
"lab.col.asOf": "Em",
"lab.col.protocol": "Conformidade de protocolo",
"lab.col.live": "Compatibilidade de rota ativa",
"lab.col.task": "Eficácia da tarefa",
"lab.empty": "Nenhum parecer de compatibilidade na projeção ainda.",
"lab.subjectKind": "Tipo",
"lab.observationCount": "Observações",
"lab.eventCount": "Eventos",
"lab.verdictCount": "Pareceres",
"lab.subjectCount": "Sujeitos",
"lab.builtAt": "Construído em",
"lab.loading": "Carregando evidências de compatibilidade…",
"lab.loadMore": "Carregar mais",
"lab.detailTitle": "Detalhes do parecer",
"lab.detailClose": "Fechar",
"lab.detailSubject": "Sujeito",
"lab.detailObservations": "Observações",
"lab.detailEvents": "Eventos de evidência",
"lab.detailArtifacts": "Metadados do artefato",
"lab.detailLoadFailed": "Não foi possível carregar os detalhes do parecer",
"lab.refresh": "Atualizar",
"lab.verdict.UNKNOWN": "Desconhecido",
"lab.verdict.CLAIMED": "Declarado",
"lab.verdict.PROBED": "Sondado",
"lab.verdict.VERIFIED": "Verificado",
"lab.verdict.DEGRADED": "Degradado",
"lab.verdict.BLOCKED": "Bloqueado",
"lab.verdict.UNSUPPORTED": "Não suportado",
"lab.layer.protocol_conformance": "Conformidade de protocolo",
"lab.layer.live_route_compatibility": "Compatibilidade de rota ativa",
"lab.layer.task_effectiveness": "Eficácia da tarefa",
};

export const LAB_CATALOG_OVERRIDES: Record<LabLocale, Record<LabCatalogKey, string>> = {
en,
de,
Expand All @@ -525,6 +576,7 @@ export const LAB_CATALOG_OVERRIDES: Record<LabLocale, Record<LabCatalogKey, stri
ja,
tr,
vi,
"pt-BR": ptBR,
};

const supplements: Record<LabLocale, Record<LabSupplementKey, string>> = {
Expand Down Expand Up @@ -648,6 +700,18 @@ const supplements: Record<LabLocale, Record<LabSupplementKey, string>> = {
"community.activeRecords": "Bản ghi đang hoạt động",
"community.revokedRecords": "Bản ghi đã thu hồi",
},
"pt-BR": {
subjectKindUnknown: "Desconhecido",
"artifact.present": "Presente",
"artifact.corrupt": "Corrompido",
"artifact.purged_unavailable": "Expurgado / indisponível",
selectVerdict: "Visualizar parecer para {subject}",
"community.title": "Evidência da comunidade",
"community.notLocalVerdict": "Contexto somente leitura não confiável. Não incluído neste parecer local.",
"community.bundles": "Pacotes de evidência",
"community.activeRecords": "Registros ativos",
"community.revokedRecords": "Registros revogados",
},
};

export function labSupplement(
Expand Down
27 changes: 27 additions & 0 deletions gui/src/i18n/log-guard-labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -298,6 +298,33 @@ const LABELS: Record<Locale, Record<LogGuardLabelKey, string>> = {
"error.database_error": "Không thể cập nhật cơ sở dữ liệu nhật ký Codex.",
"error.config_write_failed": "Cơ sở dữ liệu đã thay đổi nhưng OpenCodex không thể lưu cài đặt bảo vệ. Vui lòng sửa lỗi lưu trữ cấu hình, sau đó chạy Sửa chữa.",
},
"pt-BR": {
compact: "Compactar",
compactComplete: "Compactação concluída (lógica / espaço recuperado no disco)",
pagesUnit: "páginas",
compactPartial: "Compactação parcial (lógica / espaço recuperado no disco)",
confirmCompact: "Confirmar compactação",
cancel: "Cancelar",
inspectionOnly: "Apenas inspeção",
externalSqliteHome: "Armazenamento SQLite externo",
inspectionUnavailable: "A inspeção de logs de diagnóstico está indisponível.",
metricsSkippedLarge: "Métricas de linhas ignoradas: o banco de dados excede {threshold}, e a leitura bloquearia o proxy.",
protection: "Proteção",
compat: "Compatibilidade",
quiet: "Silencioso",
disable: "Desativar proteção",
repair: "Reparar proteção",
applying: "Aplicando proteção…",
"error.generic": "Não foi possível alterar a proteção de logs do Codex.",
"error.codex_running": "Feche o Codex antes de alterar a proteção de logs.",
"error.process_enumeration_failed": "Não foi possível verificar se o Codex está finalizado. A proteção não foi alterada.",
"error.busy": "O banco de dados de logs do Codex está ocupado. Feche o Codex e tente novamente.",
"error.unsupported_schema": "Este esquema de logs do Codex não é suportado para proteção.",
"error.trigger_collision": "Um nome de trigger reservado do Log Guard já está em uso. A proteção não foi alterada.",
"error.unsafe_path": "O caminho do banco de dados de logs do Codex falhou na verificação de segurança.",
"error.database_error": "Não foi possível atualizar o banco de dados de logs do Codex.",
"error.config_write_failed": "O banco de dados mudou, mas o OpenCodex não conseguiu salvar a configuração de proteção. Corrija o armazenamento de config e execute Reparar.",
},
};

export function logGuardLabel(locale: Locale, key: LogGuardLabelKey): string {
Expand Down
12 changes: 12 additions & 0 deletions gui/src/i18n/log-guard-operation-labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -133,6 +133,18 @@ const LABELS: Record<Locale, Record<LogGuardOperationLabelKey, string>> = {
"error.auto_vacuum_not_incremental": "Cơ sở dữ liệu nhật ký Codex này không được định cấu hình cho tính năng incremental vacuum, do đó không thể thu hồi dung lượng nếu không xây dựng lại hoàn toàn.",
"error.integrity_check_failed": "Cơ sở dữ liệu nhật ký Codex không vượt qua được kiểm tra tính toàn vẹn. Không có dung lượng nào được thu hồi.",
},
"pt-BR": {
applying: "Aplicando alteração do Log Guard…",
"error.generic": "Não foi possível atualizar o armazenamento de logs do Codex.",
"error.codex_running": "Feche o Codex antes de alterar o armazenamento de logs do Codex.",
"error.process_enumeration_failed": "Não foi possível verificar se o Codex foi finalizado. A operação do Log Guard não foi iniciada.",
"error.busy": "O banco de dados de logs do Codex está ocupado. Feche o Codex e tente novamente.",
"error.unsupported_schema": "Este esquema de logs do Codex não é suportado para esta operação.",
"error.unsafe_path": "O caminho do banco de dados de logs do Codex falhou na verificação de segurança.",
"error.database_error": "Não foi possível atualizar o banco de dados de logs do Codex.",
"error.auto_vacuum_not_incremental": "Este banco de dados de logs do Codex não está configurado para vacuum incremental; o espaço não pode ser recuperado sem uma recriação completa.",
"error.integrity_check_failed": "O banco de dados de logs do Codex falhou na verificação de integridade. Nenhum espaço foi recuperado.",
},
};

export function logGuardOperationLabel(locale: Locale, key: LogGuardOperationLabelKey): string {
Expand Down
5 changes: 5 additions & 0 deletions gui/src/i18n/log-guard-state-labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,11 @@ const LABELS: Record<Locale, StateLabels> = {
protection: { off: "Tắt", active: "Đang hoạt động", drifted: "Cần sửa chữa", unsupported: "Không được hỗ trợ", unknown: "Không xác định" },
mode: { off: "Tắt", compat: "Tương thích", quiet: "Yên tĩnh", collision: "Không xác định" },
},
"pt-BR": {
schema: { compatible: "Compatível", missing: "Banco de dados não encontrado", unreadable: "Banco de dados indisponível", unsupported: "Não suportado" },
protection: { off: "Desativada", active: "Ativa", drifted: "Requer reparo", unsupported: "Não suportada", unknown: "Desconhecido" },
mode: { off: "Desativado", compat: "Compatibilidade", quiet: "Silencioso", collision: "Desconhecido" },
},
};

export function logGuardSchemaStateLabel(locale: Locale, state: LogGuardSchemaState): string {
Expand Down
2 changes: 1 addition & 1 deletion gui/src/i18n/native-main-copy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { NATIVE_MAIN_TRANSLATIONS, type NativeMainTKey } from "./native-main-tra

export type NativeMainTFn = (key: NativeMainTKey, vars?: Record<string, string | number>) => string;

/** Closed, nine-locale namespace like the adjacent Log Guard label modules.
/** Closed, eleven-locale namespace like the adjacent Log Guard label modules.
* Keep these keys out of the global catalog contract used by existing screens.
*/
export function nativeMainTranslator(locale: Locale): NativeMainTFn {
Expand Down
40 changes: 39 additions & 1 deletion gui/src/i18n/native-main-translations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -382,4 +382,42 @@ export const NATIVE_MAIN_TRANSLATIONS = {
"nativeMain.confirm": "Xác nhận thay đổi đăng nhập gốc",
"nativeMain.unavailable": "Không thể thay đổi hồ sơ. Hãy kiểm tra mã chẩn đoán trước khi tiếp tục."
},
} satisfies Record<"en" | "de" | "fr" | "ko" | "zh" | "zh-TW" | "ru" | "ja" | "tr" | "vi", Record<NativeMainTKey, string>>;
"pt-BR": {
"nativeMain.title": "Login principal do Codex nativo",
"nativeMain.manage": "Gerenciar login principal",
"nativeMain.close": "Fechar gerenciador de login principal",
"nativeMain.separate": "Estes controles alteram o login nativo do Codex, não a conta selecionada para a próxima requisição do Pool.",
"nativeMain.home": "CODEX_HOME em vigor",
"nativeMain.current": "Perfil ativo registrado",
"nativeMain.unregistered": "Não registrado",
"nativeMain.physicalHint": "Este diretório home pertence ao servidor OpenCodex, que pode ser um computador diferente. O backend verifica o login físico antes de qualquer alternância.",
"nativeMain.busyOther": "Outra operação de login nativo já está em execução. Conclua ou cancele-a primeiro.",
"nativeMain.working": "Processando…",
"nativeMain.changed": "O diretório home, o perfil ativo ou o estado de recuperação mudou. Revise o estado atualizado e confirme novamente.",
"nativeMain.error": "Não foi possível confirmar a operação. Leia o estado atualizado antes de tentar novamente; uma resposta perdida não comprova a reversão. Use o comando de diagnóstico do servidor abaixo.",
"nativeMain.doctorHint": "Execute {cmd} no servidor para obter detalhes.",
"nativeMain.saved": "Login atual salvo como um perfil. O login físico não foi alterado.",
"nativeMain.restart": "Alteração de login concluída. Reinicie o Codex nativo usando o CODEX_HOME exibido antes de continuar.",
"nativeMain.done": "Operação concluída. O servidor não solicitou a reinicialização do Codex nativo.",
"nativeMain.refreshFailed": "Não foi possível atualizar todas as informações da conta. Uma alteração concluída não foi desfeita. Atualize antes de outra operação.",
"nativeMain.refresh": "Atualizar status",
"nativeMain.unsupported": "Este armazenamento de credenciais não é suportado. O gerenciamento de perfis nativos requer o armazenamento em arquivo.",
"nativeMain.recoveryHint": "Uma transação interrompida precisa de recuperação. Recuperar conclui a reconciliação; reverter desfaz a transação pendente. Nenhuma ação é executada até que você confirme.",
"nativeMain.recover": "Recuperar alteração interrompida",
"nativeMain.rollback": "Reverter transação pendente",
"nativeMain.empty": "Nenhum perfil nativo registrado ainda. Salve o login atual primeiro.",
"nativeMain.active": "Ativo",
"nativeMain.switchTo": "Alternar login nativo para {label}",
"nativeMain.switch": "Alternar",
"nativeMain.restore": "Retornar ao exibido anteriormente: {label}",
"nativeMain.restoreHint": "Este atalho seleciona o perfil exibido antes da sua última alternância, não um histórico de transações verificado pelo servidor. Ele é mantido apenas nesta página.",
"nativeMain.label": "Rótulo do perfil",
"nativeMain.save": "Salvar atual como perfil",
"nativeMain.saveHint": "Para um login ativo já registrado, salvar atualiza seu rótulo. Isso não adiciona um novo login.",
"nativeMain.confirmHint": "Isso altera apenas o login nativo no diretório home abaixo. Feche o Codex nativo naquele computador primeiro. A estratégia de Pool, membros, chaves de provedor e dados de tarefas/histórico não são editados por este painel.",
"nativeMain.stopped": "Eu parei o Codex nativo usando este CODEX_HOME e compreendo que uma reinicialização pode ser necessária.",
"nativeMain.cancel": "Cancelar",
"nativeMain.confirm": "Confirmar alteração de login nativo",
"nativeMain.unavailable": "Alterações de perfil indisponíveis. Verifique o código de diagnóstico antes de continuar."
},
} satisfies Record<"en" | "de" | "fr" | "ko" | "zh" | "zh-TW" | "ru" | "ja" | "tr" | "vi" | "pt-BR", Record<NativeMainTKey, string>>;
Loading
Loading