stabilization: server.go split + i18n templates + frontend localization

cmd/verstak-server/server.go (2838→127 строк): разделён на 12 файлов
- config.go, tokens.go, schema.go
- server.go (только struct + NewServer + ListenAndServe)
- routes.go, middleware.go, smtp.go
- handlers_api.go, handlers_user.go, handlers_web_user.go, handlers_admin.go
- templates.go (конвертирован в функции с i18n.T())

frontend: все русские строки заменены на t() вызовы
- App.svelte, FileTreeRow.svelte, ConfirmModal.svelte
- FilePreviewModal.svelte, fileUtils.js

core: gofmt по всему проекту

Все сборки (CLI, server, gui, frontend), go vet, go test проходят.
check-i18n.sh: frontend чист, Go-файлы с кириллицей — только тесты/легаси.
This commit is contained in:
2026-06-02 11:08:29 +08:00
parent 3089d777a8
commit 2fa583d157
33 changed files with 3276 additions and 3067 deletions
+35 -33
View File
@@ -1,3 +1,5 @@
import { t } from './i18n'
export function formatFileSize(bytes) {
if (bytes == null || bytes < 0) return '—'
if (bytes === 0) return '0 B'
@@ -8,51 +10,51 @@ export function formatFileSize(bytes) {
}
const mimeLabels = {
'image/jpeg': 'Изображение JPEG',
'image/png': 'Изображение PNG',
'image/gif': 'Изображение GIF',
'image/webp': 'Изображение WebP',
'image/svg+xml': 'Изображение SVG',
'image/bmp': 'Изображение BMP',
'image/tiff': 'Изображение TIFF',
'image/avif': 'Изображение AVIF',
'application/pdf': 'PDF документ',
'application/msword': 'Документ Word',
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': 'Документ Word',
'application/vnd.ms-excel': 'Таблица Excel',
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': 'Таблица Excel',
'application/vnd.ms-powerpoint': 'Презентация PowerPoint',
'application/vnd.openxmlformats-officedocument.presentationml.presentation': 'Презентация PowerPoint',
'application/zip': 'ZIP архив',
'application/gzip': 'GZIP архив',
'application/x-tar': 'TAR архив',
'application/x-7z-compressed': '7z архив',
'application/x-rar-compressed': 'RAR архив',
'text/plain': 'Текстовый файл',
'text/html': 'HTML файл',
'text/css': 'CSS файл',
'text/javascript': 'JavaScript файл',
'application/json': 'JSON файл',
'application/xml': 'XML файл',
'application/x-yaml': 'YAML файл',
'application/octet-stream': 'Бинарный файл',
'application/x-msdos-program': 'Исполняемый файл',
'inode/directory': 'Папка',
'image/jpeg': t('mime.jpeg'),
'image/png': t('mime.png'),
'image/gif': t('mime.gif'),
'image/webp': t('mime.webp'),
'image/svg+xml': t('mime.svg'),
'image/bmp': t('mime.bmp'),
'image/tiff': t('mime.tiff'),
'image/avif': t('mime.avif'),
'application/pdf': t('mime.pdf'),
'application/msword': t('mime.word'),
'application/vnd.openxmlformats-officedocument.wordprocessingml.document': t('mime.word'),
'application/vnd.ms-excel': t('mime.excel'),
'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet': t('mime.excel'),
'application/vnd.ms-powerpoint': t('mime.ppt'),
'application/vnd.openxmlformats-officedocument.presentationml.presentation': t('mime.ppt'),
'application/zip': t('mime.zip'),
'application/gzip': t('mime.gzip'),
'application/x-tar': t('mime.tar'),
'application/x-7z-compressed': t('mime.sevenz'),
'application/x-rar-compressed': t('mime.rar'),
'text/plain': t('mime.text'),
'text/html': t('mime.html'),
'text/css': t('mime.css'),
'text/javascript': t('mime.js'),
'application/json': t('mime.json'),
'application/xml': t('mime.xml'),
'application/x-yaml': t('mime.yaml'),
'application/octet-stream': t('mime.binary'),
'application/x-msdos-program': t('mime.executable'),
'inode/directory': t('mime.folder'),
}
export function formatMimeType(mime) {
if (!mime) return 'Неизвестно'
if (!mime) return t('mime.unknown')
return mimeLabels[mime] || mime
}
export function formatFileType(item) {
if (item.type === 'folder') return 'Папка'
if (item.type === 'folder') return t('mime.folder')
const mime = (item.mime || '').toLowerCase()
if (mimeLabels[mime]) return mimeLabels[mime]
const name = (item.name || '').toLowerCase()
const ext = name.split('.').pop()
if (ext) return ext.toUpperCase()
return 'Файл'
return t('mime.file')
}
export function getFileKind(item) {