Interface: traduz rótulos do núcleo e redesenha o explorador ao trocar de idioma
Achados ao rodar a interface real em inglês e varrer o DOM:
- campos de metadados (EXIF, PDF, MP4), tipos de arquivo e rótulos de
saúde do disco que vêm do núcleo em Rust;
- textos que a interface divide em nós separados ("1 selecionado",
"Sessão: nome", "Imagem · 27 KB", categorias com emoji);
- avisos do visualizador de SQLite.
Datas e títulos de mês são montados em JS no momento do desenho e
ficavam no idioma antigo depois de trocar em Configurações. O
explorador ganha relang() e a janela de Configurações o chama.
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01RRZm8uTVN3WLTwcbrDQAUM
This commit is contained in:
1 parent
bb6f9cbde3
commit
16eced75d9
3 files changed
+60
No files matched your search
@@ -752,6 +752,7 @@ $('#settingsBtn')?.addEventListener('click', () => {
|
|||||||
const patch = { lang: d.querySelector('[name=lang]').value, notify: d.querySelector('[name=notify]').checked, maps: d.querySelector('[name=maps]').checked };
|
const patch = { lang: d.querySelector('[name=lang]').value, notify: d.querySelector('[name=notify]').checked, maps: d.querySelector('[name=maps]').checked };
|
||||||
saveSettings(patch);
|
saveSettings(patch);
|
||||||
setLang(patch.lang);
|
setLang(patch.lang);
|
||||||
|
EX?.relang?.();
|
||||||
toast('Salvo');
|
toast('Salvo');
|
||||||
};
|
};
|
||||||
d.showModal();
|
d.showModal();
|
||||||
|
|||||||
@@ -669,6 +669,8 @@ export function createExplorer(deps) {
|
|||||||
},
|
},
|
||||||
query: () => toQuery(),
|
query: () => toQuery(),
|
||||||
destroy() { E.reloadToken++; stopPv?.(); stopLb?.(); host.innerHTML = ''; },
|
destroy() { E.reloadToken++; stopPv?.(); stopLb?.(); host.innerHTML = ''; },
|
||||||
|
/** Idioma trocado em Configurações: refaz o que foi montado em JS (datas, meses, rótulos). */
|
||||||
|
relang() { paintCrumb(); paintChips(); paintNav(); paintActions(); paintInspector(); relayout(); },
|
||||||
focus() { scroll.focus({ preventScroll: true }); },
|
focus() { scroll.focus({ preventScroll: true }); },
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -448,4 +448,61 @@ export const EN = {
|
|||||||
'diretório do ZIP não encontrado (arquivo possivelmente incompleto)': 'ZIP directory not found (file possibly incomplete)',
|
'diretório do ZIP não encontrado (arquivo possivelmente incompleto)': 'ZIP directory not found (file possibly incomplete)',
|
||||||
'visualizador indisponível': 'viewer unavailable',
|
'visualizador indisponível': 'viewer unavailable',
|
||||||
'© colaboradores do OpenStreetMap': '© OpenStreetMap contributors',
|
'© colaboradores do OpenStreetMap': '© OpenStreetMap contributors',
|
||||||
|
// explorador: textos que a interface divide em nós separados
|
||||||
|
'selecionado': 'selected',
|
||||||
|
'selecionados': 'selected',
|
||||||
|
'selecionado (todos desta vista)': 'selected (all in this view)',
|
||||||
|
'selecionados (todos desta vista)': 'selected (all in this view)',
|
||||||
|
'Sessão: {n}': 'Session: {n}',
|
||||||
|
'🖼 Fotos': '🖼 Photos',
|
||||||
|
'📄 Documentos': '📄 Documents',
|
||||||
|
'🎞 Vídeos': '🎞 Videos',
|
||||||
|
'🎵 Áudio': '🎵 Audio',
|
||||||
|
'🗜 Compactados': '🗜 Archives',
|
||||||
|
'🗄 Bancos de dados': '🗄 Databases',
|
||||||
|
'📦 Outros': '📦 Other',
|
||||||
|
'Imagem · {n}': 'Image · {n}',
|
||||||
|
'Vídeo · {n}': 'Video · {n}',
|
||||||
|
'Áudio · {n}': 'Audio · {n}',
|
||||||
|
'Texto · {n}': 'Text · {n}',
|
||||||
|
'Documento (texto extraído) · {n}': 'Document (extracted text) · {n}',
|
||||||
|
'Conteúdo do arquivo compactado · {n}': 'Archive contents · {n}',
|
||||||
|
'Banco de dados SQLite · {n}': 'SQLite database · {n}',
|
||||||
|
'Dados brutos (hexadecimal) · {n}': 'Raw data (hexadecimal) · {n}',
|
||||||
|
// tipos e campos de metadados vindos do núcleo
|
||||||
|
'Imagem JPEG': 'JPEG image',
|
||||||
|
'Imagem PNG': 'PNG image',
|
||||||
|
'Imagem GIF': 'GIF image',
|
||||||
|
'Imagem BMP': 'BMP image',
|
||||||
|
'Mídia MP4/MOV': 'MP4/MOV media',
|
||||||
|
'Fabricante da câmera': 'Camera make',
|
||||||
|
'Modelo da câmera': 'Camera model',
|
||||||
|
'Data (EXIF)': 'Date (EXIF)',
|
||||||
|
'Foto tirada em': 'Photo taken on',
|
||||||
|
'Nº de série do corpo': 'Body serial number',
|
||||||
|
'Proprietário da câmera': 'Camera owner',
|
||||||
|
'Exposição': 'Exposure',
|
||||||
|
'Distância focal': 'Focal length',
|
||||||
|
'Data do GPS': 'GPS date',
|
||||||
|
'Localização (GPS)': 'Location (GPS)',
|
||||||
|
'Versão do PDF': 'PDF version',
|
||||||
|
'Título': 'Title',
|
||||||
|
'Criado com': 'Created with',
|
||||||
|
'Páginas (aprox.)': 'Pages (approx.)',
|
||||||
|
'Última modificação por': 'Last modified by',
|
||||||
|
'Páginas': 'Pages',
|
||||||
|
'Duração': 'Duration',
|
||||||
|
// saúde do disco e confiança vindas do núcleo
|
||||||
|
'SSD (sem rotação)': 'SSD (no rotation)',
|
||||||
|
'Cache de gravação': 'Write cache',
|
||||||
|
'Segurança ATA': 'ATA security',
|
||||||
|
'{n} (máx. {n})': '{n} (max. {n})',
|
||||||
|
'membro de RAID': 'RAID member',
|
||||||
|
'sem rodapé/estrutura completa: pode estar truncado': 'no footer/complete structure: may be truncated',
|
||||||
|
'vídeo sem índice (moov)': 'video without index (moov)',
|
||||||
|
// visualizador de SQLite
|
||||||
|
'Nenhuma tabela encontrada no esquema. A primeira página pode estar danificada.': 'No table found in the schema. The first page may be damaged.',
|
||||||
|
'Tabela virtual: o conteúdo não fica armazenado como linhas comuns.': 'Virtual table: the content is not stored as ordinary rows.',
|
||||||
|
'Tabela WITHOUT ROWID: as linhas ficam numa árvore de índice, ainda não exibida.': 'WITHOUT ROWID table: the rows live in an index tree, not shown yet.',
|
||||||
|
'Arquivo truncado: o cabeçalho indica {n} páginas, mas só há {n}. Parte dos dados pode estar faltando.': 'Truncated file: the header says {n} pages, but there are only {n}. Part of the data may be missing.',
|
||||||
};
|
};
|
||||||
Reference in new issue
Block a user