Files
Termix/src/locales/pt-BR/translation.json
Luke Gustafson 8ec22b2177 v1.8.0 (#429)
* Dev 1.8.0 (#399)

* Feature request: Add delete confirmation dialog to file manager (#344)

* Feature request: Add delete confirmation dialog to file manager

- Added confirmation dialog before deleting files/folders
- Users must confirm deletion with a warning message
- Works for both Delete key and right-click delete
- Shows different messages for single file, folder, or multiple items
- Includes permanent deletion warning
- Follows existing design patterns using confirmWithToast

* Adds confirmation for deletion of items including folders

Updates the file deletion confirmation logic to distinguish between
deleting multiple items with or without folders. Introduces a new
translation string for a clearer user prompt when folders and their
contents are included in the deletion.

Improves clarity and reduces user error when performing bulk deletions.

* feat: Add Chinese translations for delete confirmation messages

* Adds camelCase support for encrypted field mappings (#342)

Extends encrypted field mappings to include camelCase variants
to support consistency and compatibility with different naming
conventions. Updates reverse mappings for Drizzle ORM to allow
conversion between camelCase and snake_case field names.

Improves integration with systems using mixed naming styles.

* Run code cleanup, add sidebar persistence, fix OIDC credentials, force SSH password.

* Fix snake case mismatching

* Add real client IP

* Fix OIDC credential persistence issue

The issue was that OIDC users were getting a new random Data Encryption Key (DEK)
on every login, which made previously encrypted credentials inaccessible.

Changes:
- Modified setupOIDCUserEncryption() to persist the DEK encrypted with a system-derived key
- Updated authenticateOIDCUser() to properly retrieve and use the persisted DEK
- Ensured OIDC users now have the same encryption persistence as password-based users

This fix ensures that credentials created by OIDC users remain accessible across
multiple login sessions.

* Fix race condition and remove redundant kekSalt for OIDC users

Critical fixes:

1. Race Condition Mitigation:
   - Added read-after-write verification in setupOIDCUserEncryption()
   - Ensures session uses the DEK that's actually in the database
   - Prevents data loss when concurrent logins occur for new OIDC users
   - If race is detected, discards generated DEK and uses stored one

2. Remove Redundant kekSalt Logic:
   - Removed unnecessary kekSalt generation and checks for OIDC users
   - kekSalt is not used in OIDC key derivation (uses userId as salt)
   - Reduces database operations from 4 to 2 per authentication
   - Simplifies code and removes potential confusion

3. Improved Error Handling:
   - systemKey cleanup moved to finally block
   - Ensures sensitive key material is always cleared from memory

These changes ensure data consistency and prevent potential data loss
in high-concurrency scenarios.

* Cleanup OIDC pr and run prettier

* Replace jetbrains mono with caskaydia cove

* Fix alert issues

* Finalize font update

* Feature/german language support (#374)

* v1.7.2 (#364)

* Feature request: Add delete confirmation dialog to file manager (#344)

* Feature request: Add delete confirmation dialog to file manager

- Added confirmation dialog before deleting files/folders
- Users must confirm deletion with a warning message
- Works for both Delete key and right-click delete
- Shows different messages for single file, folder, or multiple items
- Includes permanent deletion warning
- Follows existing design patterns using confirmWithToast

* Adds confirmation for deletion of items including folders

Updates the file deletion confirmation logic to distinguish between
deleting multiple items with or without folders. Introduces a new
translation string for a clearer user prompt when folders and their
contents are included in the deletion.

Improves clarity and reduces user error when performing bulk deletions.

* feat: Add Chinese translations for delete confirmation messages

* Adds camelCase support for encrypted field mappings (#342)

Extends encrypted field mappings to include camelCase variants
to support consistency and compatibility with different naming
conventions. Updates reverse mappings for Drizzle ORM to allow
conversion between camelCase and snake_case field names.

Improves integration with systems using mixed naming styles.

* Run code cleanup, add sidebar persistence, fix OIDC credentials, force SSH password.

* Fix snake case mismatching

* Add real client IP

* Fix OIDC credential persistence issue

The issue was that OIDC users were getting a new random Data Encryption Key (DEK)
on every login, which made previously encrypted credentials inaccessible.

Changes:
- Modified setupOIDCUserEncryption() to persist the DEK encrypted with a system-derived key
- Updated authenticateOIDCUser() to properly retrieve and use the persisted DEK
- Ensured OIDC users now have the same encryption persistence as password-based users

This fix ensures that credentials created by OIDC users remain accessible across
multiple login sessions.

* Fix race condition and remove redundant kekSalt for OIDC users

Critical fixes:

1. Race Condition Mitigation:
   - Added read-after-write verification in setupOIDCUserEncryption()
   - Ensures session uses the DEK that's actually in the database
   - Prevents data loss when concurrent logins occur for new OIDC users
   - If race is detected, discards generated DEK and uses stored one

2. Remove Redundant kekSalt Logic:
   - Removed unnecessary kekSalt generation and checks for OIDC users
   - kekSalt is not used in OIDC key derivation (uses userId as salt)
   - Reduces database operations from 4 to 2 per authentication
   - Simplifies code and removes potential confusion

3. Improved Error Handling:
   - systemKey cleanup moved to finally block
   - Ensures sensitive key material is always cleared from memory

These changes ensure data consistency and prevent potential data loss
in high-concurrency scenarios.

* Cleanup OIDC pr and run prettier

---------

Co-authored-by: Ved Prakash <54140516+thorved@users.noreply.github.com>

* Fix typos and improve wording in README.md

Corrected grammar and punctuation in README.

* Image 7.png

* Rename 3gi3b3os5psf1.png to Image 7.png

* Add video demonstration to README

Added a video demonstration to the README.

* Delete repo-images/Image 7.png

* Add files via upload

* Delete repo-images/Image 7.png

* Add files via upload

* Initial German translation

* German translation (#281)

* German translation (#281)

* Implementation of German language support  (#281)

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: Karmaa <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Ved Prakash <54140516+thorved@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Add germanm support

* Fix SSH Key Password (keyPassword) Field Naming Mismatch Between Frontend and Backend (#375)

* Refactor key_password to keyPassword for consistency across SSH routes

* Standardizes keyPassword field handling and simplifies auth field logic

Standardizes the handling of the `keyPassword` field by converting
`key_password` to camelCase and ensuring consistent output while
preserving resolved credentials. Removes redundant snake_case
fields to avoid duplication.

Simplifies UI handling of authentication fields by allowing
non-relevant fields to persist, delegating filtering logic to the
backend for cleaner and more maintainable code.

Improves code clarity and aligns with consistent data handling
practices.

* Cleanup code + resolve conversion logic

---------

Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* Feature disable password login (#378)

* Add admin toggle to disable password login

* Update src/backend/database/routes/users.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/ui/main-axios.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/ui/Desktop/Admin/AdminSettings.tsx

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/backend/database/routes/users.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/backend/database/routes/users.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Add SSH TOTP authentication support (#350)

* Add SSH TOTP authentication support

- Implement keyboard-interactive authentication for SSH connections
- Add TOTP dialog component for Terminal and File Manager
- Handle TOTP prompts in WebSocket and HTTP connections
- Disable Server Stats for TOTP-enabled servers
- Add i18n support for TOTP-related messages

* Update src/backend/ssh/server-stats.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/backend/ssh/file-manager.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: Karmaa <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Add terminal snippets feature with sidebar UI (#377)

* Add terminal snippets feature with sidebar UI

- Add snippets CRUD API endpoints and database schema
- Implement snippets sidebar accessible from TopNavbar
- Add copy to clipboard functionality
- Include tooltips and optimized styling
- Add English and Chinese translations

* Update src/backend/database/routes/snippets.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Feature engineering improvements (#376)

* chore: add engineering improvements

- Configure Prettier with unified code style rules
- Add husky + lint-staged for automated pre-commit checks
- Add commitlint to enforce conventional commit messages
- Add PR check workflow for CI automation
- Auto-format all files with Prettier
- Fix TypeScript any types in field-crypto.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* chore: enhance development environment

- Add .editorconfig for unified editor settings
- Add .nvmrc to specify Node.js version (20)
- Add useful npm scripts: format, format:check, lint, lint:fix, type-check

* chore: add IDE and Git configuration

- Add VS Code workspace settings for consistent development experience
- Add VS Code extension recommendations (ESLint, Prettier, EditorConfig)
- Add .gitattributes to enforce LF line endings

* refactor: clean up unused variables and empty blocks

- database.ts: Remove unused variables (authManager, format, HTTPS_PORT, etc.)
- database.ts: Fix empty catch blocks with descriptive comments
- database.ts: Add eslint-disable for required middleware parameter
- db/index.ts: Remove unused variables and fix empty catch blocks
- Temporarily remove ESLint from pre-commit to allow incremental fixes

Reduced total errors from 947 to 913 (34 fixes)

* refactor: clean up unused variables and empty blocks in routes

Routes updated:
- credentials.ts: Remove 12 unused variables/imports
- alerts.ts: Remove 1 unused variable
- users.ts: Remove 9 unused variables/imports

Changes:
- Remove unused imports (NextFunction, jwt, UserCrypto, detectKeyType)
- Fix empty catch blocks with descriptive comments
- Prefix reserved parameters with underscore
- Clean up unused error variables in catch blocks

Reduced errors from 913 to 886 (27 fixes)

* refactor: clean up unused variables in routes/ssh.ts

- Remove unused imports (NextFunction, jwt)
- Remove 6 unused variables (result, updateResult, name x3)
- All 8 no-unused-vars errors fixed

* refactor: clean up unused variables and empty blocks in file-manager.ts

- Remove 22 unused variables (linkCount, hostId, userId, content, escapedTempFile, index, code)
- Fix 1 empty catch block
- Simplify multiple route handlers by removing unused destructured parameters

Reduced errors from 878 to 855 (23 fixes)

* refactor: clean up unused variables and empty blocks in utils

database-migration.ts:
- Remove 3 unused variables (encryptedSize, totalOriginalRows, totalMemoryRows)

lazy-field-encryption.ts:
- Fix 6 empty catch blocks with descriptive comments
- Keep error variables where they are used in logging

tunnel.ts:
- Fix multiple empty catch blocks
- Remove empty else blocks
- Partially fixed (10/21 issues resolved)

Reduced errors from 855 to 833 (22 fixes)

* fix: restore error variable in catch block for logging

Fix TypeScript error where error variable was removed from catch block
but still used in logging statements. The error variable is needed for
proper error logging and re-throwing.

* fix: clean up tunnel.ts empty blocks and unused variables

移除了 tunnel.ts 中的空块和未使用的变量:
- 移除 2 个空 else 块
- 修复 2 个空 if 块并添加注释
- 修复空错误处理器并添加注释
- 将未使用的 err 参数重命名为 _err

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty blocks and unused variables in backend utils

修复了后端工具文件中的空块和未使用的变量:
- auth-manager.ts: 移除空 else 块
- system-crypto.ts: 修复空 catch 块并添加注释
- starter.ts: 修复空 catch 块并添加注释
- server-stats.ts: 将未使用的 reject 参数重命名为 _reject
- credentials.ts: 将 connectionTimeout 从 let 改为 const

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty catch blocks in frontend components

修复了前端组件中的空 catch 块:
- Tunnel.tsx: 修复空 catch 块并添加注释
- ServerConfig.tsx: 修复空 catch 块并添加注释
- TerminalKeyboard.tsx: 修复空 catch 块并添加注释
- system-crypto.ts: 修复遗漏的空 catch 块

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty catch blocks in backend utilities

修复了后端工具文件中的 10 个空 catch 块:
- system-crypto.ts: 修复 1 个空 catch 块
- server-stats.ts: 修复 4 个空 catch 块
- auto-ssl-setup.ts: 修复 1 个空 catch 块
- ssh-key-utils.ts: 修复 4 个空 catch 块

所有空块都添加了描述性注释说明为何忽略错误。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty catch blocks in UI hooks and components

修复了 5 个 UI 组件和 hooks 中的空 catch 块:
- useDragToSystemDesktop.ts: 修复 2 个空 catch 块
- HomepageAuth.tsx: 修复 1 个空 catch 块
- HostManagerEditor.tsx: 修复 2 个空 catch 块

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty blocks in file manager and credential editor

修复了 5 个空块:
- FileManagerGrid.tsx: 移除 1 个空 else 块和 1 个空 if 块
- CredentialEditor.tsx: 修复 1 个空 catch 块,移除 2 个空 if/else 块

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up all empty catch blocks in Terminal components

修复了 Terminal 组件中的所有 8 个空 catch 块:
- Desktop/Apps/Terminal/Terminal.tsx: 修复 5 个空 catch 块
- Mobile/Apps/Terminal/Terminal.tsx: 修复 3 个空 catch 块

所有空块都添加了描述性注释。这是空块修复的最后一批。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: remove useless try/catch wrappers

移除了 3 个无用的 try/catch 包装器:
- users.ts: 移除只重新抛出错误的外层 try/catch
- FileManager.tsx: 移除只重新抛出错误的内层 try/catch
- DiffViewer.tsx: 移除只重新抛出错误的内层 try/catch

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: remove unused imports and mark unused parameters

移除了未使用的导入和标记未使用的参数:
- auto-ssl-setup.ts: 移除未使用的 crypto 导入
- user-crypto.ts: 移除未使用的 users 导入
- user-data-import.ts: 移除未使用的 nanoid 导入
- simple-db-ops.ts: 标记未使用的 userId 和 tableName 参数

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unnecessary escape characters in regex patterns

移除了正则表达式中不必要的转义字符:
- users.ts: 修复 5 个 \/ 不必要的转义
- TabContext.tsx: 修复 1 个 \/ 不必要的转义

在字符串形式的正则表达式中,/ 不需要转义。

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>

* feat: enhance server stats widgets and fix TypeScript/ESLint errors (#394)

* feat: add draggable server stats dashboard with customizable widgets

* fix: widget deletion and layout persistence issues

* fix: improve widget deletion UX and add debug logs for persistence

* fix: resolve widget deletion and layout persistence issues

- Add drag handles to widget title bars for precise drag control
- Prevent delete button from triggering drag via event stopPropagation
- Include statsConfig field in all GET/PUT API responses
- Remove debug console logs from production code

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: complete statsConfig field support across all API routes

- Add statsConfig to POST /db/host (create) route
- Add statsConfig to all GET routes for consistent API responses
- Remove incorrect statsConfig schema from HostManagerEditor
- statsConfig is now only managed by Server page layout editor

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: add statsConfig to metrics API response

- Add statsConfig field to SSHHostWithCredentials interface
- Include statsConfig in resolveHostCredentials baseHost object
- Ensures /metrics/:id API returns complete host configuration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: include statsConfig in SSH host create/update requests

The statsConfig field was being dropped by createSSHHost and updateSSHHost
functions in main-axios.ts, preventing layout customization from persisting.

Fixed by adding statsConfig to the submitData object in both functions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: refactor server stats widgets into modular structure

Created dedicated widgets directory with individual components:
- CpuWidget, MemoryWidget, DiskWidget as separate components
- Widget registry for centralized widget configuration
- AddWidgetDialog for user-friendly widget selection
- Updated Server.tsx to use modular widget system

Benefits:
- Better code organization and maintainability
- Easier to add new widget types in the future
- Centralized widget metadata and configuration
- User can now add widgets via dialog interface

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: exit edit mode after saving layout

* feat: add customizable widget sizes with chart visualizations

Add three-tier size system (small/medium/large) for server stats widgets.
Integrate recharts library for visualizing trends in large widgets with
line charts (CPU), area charts (Memory), and radial bar charts (Disk).
Fix layout overflow issues with proper flexbox patterns.

* refactor: simplify server stats widget system

Replaced complex drag-and-drop grid layout with simple checkbox-based
configuration and static responsive grid display.

- Removed react-grid-layout dependency and 6 related packages
- Simplified StatsConfig from complex Widget objects to simple array
- Added Statistics tab in HostManagerEditor for checkbox selection
- Refactored Server.tsx to use CSS Grid instead of ResponsiveGridLayout
- Simplified widget components by removing edit mode and size selection
- Deleted unused AddWidgetDialog and registry files
- Fixed statsConfig serialization in backend routes

Net result: -787 lines of code, cleaner architecture.

* feat: add system, uptime, network and processes widgets

Add four new server statistics widgets:
- SystemWidget: displays hostname, OS, and kernel information
- UptimeWidget: shows server total uptime with formatted display
- NetworkWidget: lists network interfaces with IP and status
- ProcessesWidget: displays top processes by CPU usage

Backend changes:
- Extended SSH metrics collection to gather network, uptime, process, and system data
- Added commands to parse /proc/uptime, ip addr, ps aux output

Frontend changes:
- Created 4 new widget components with consistent styling
- Updated widget type definitions and HostManagerEditor
- Unified all widget heights to 280px for consistent layout
- Added translations for all new widgets (EN/ZH)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: improve widget styling and UX consistency

Enhance all server stats widgets with improved styling and user experience:

Widget improvements:
- Fix hardcoded titles, now use i18n translations for all widgets
- Improve data formatting with consistent translation keys
- Enhance empty state displays with better visual hierarchy
- Add smooth hover transitions and visual feedback
- Standardize spacing and layout patterns across widgets

Specific optimizations:
- CPU: Use translated load average display
- Memory: Translate "Free" label
- Disk: Translate "Available" label
- System: Improve icon colors and spacing consistency
- Network: Better empty state, enhanced card styling
- Processes: Improved card borders and spacing

Visual polish:
- Unified icon sizing and opacity for empty states
- Consistent border radius (rounded-lg)
- Better hover states with subtle transitions
- Enhanced font weights for improved readability

* fix: replace explicit any types with proper TypeScript types

- Replace 'any' with 'unknown' in catch blocks and add type assertions
- Create explicit interfaces for complex objects (HostConfig, TabData, TerminalHandle)
- Fix window/document object type extensions
- Update Electron API type definitions
- Improve type safety in database routes and utilities
- Add proper types to Terminal components (Desktop & Mobile)
- Fix navigation component types (TopNavbar, LeftSidebar, AppView)

Reduces TypeScript lint errors from 394 to 358 (-36 errors)
Fixes 45 @typescript-eslint/no-explicit-any violations

* fix: replace explicit any types with proper TypeScript types

- Create explicit interfaces for Request extensions (AuthenticatedRequest, RequestWithHeaders)
- Add type definitions for WebSocket messages and SSH connection data
- Use generic types in DataCrypto methods instead of any return types
- Define proper interfaces for file manager data structures
- Replace catch block any types with unknown and proper type assertions
- Add HostConfig and TabData interfaces for Server component

Fixes 32 @typescript-eslint/no-explicit-any violations across 5 files

* fix: resolve 6 TypeScript compilation errors

Fixed field name mismatches and generic type issues:
- database.ts: Changed camelCase to snake_case for key_password, private_key, public_key fields
- simple-db-ops.ts: Added explicit generic type parameters to DataCrypto method calls

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve unused variables in backend utils

Fixed @typescript-eslint/no-unused-vars errors in:
- starter.ts: removed unused error variables (2 fixes)
- auto-ssl-setup.ts: removed unused error variable (1 fix)
- ssh-key-utils.ts: removed unused error variables (3 fixes)
- user-crypto.ts: removed unused error variables (5 fixes)
- data-crypto.ts: removed unused plaintextFields and error variables (2 fixes)
- simple-db-ops.ts: removed unused parameters _userId and _tableName (2 fixes)

Total: 15 unused variable errors fixed

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused variable in terminal.ts

Fixed @typescript-eslint/no-unused-vars errors:
- Removed unused userPayload variable (line 123)
- Removed unused cols and rows from destructuring (line 348)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve unused variables in server-stats.ts

Fixed @typescript-eslint/no-unused-vars errors:
- Removed unused _reject parameter in Promise (line 64)
- Removed shadowed now variable in pollStatusesOnce (line 1130)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused variables in tunnel.ts

Removed 5 unused variables:
- Removed unused data parameter from stdout event handler
- Removed hasSourcePassword, hasSourceKey, hasEndpointPassword, hasEndpointKey variables

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused variables in main-axios.ts

Removed 8 unused variables:
- Removed unused type imports (Credential, CredentialData, HostInfo, ApiResponse)
- Removed unused apiPort variable
- Removed unused error variables in 3 catch blocks

* fix: remove unused variables in terminal.ts and starter.ts

Removed 2 unused variables:
- Removed unused JWTPayload type import from terminal.ts
- Removed unused _promise parameter from starter.ts

* fix: remove unused variables in sidebar.tsx

Removed 9 unused variables:
- Removed 5 unused Sheet component imports
- Removed unused SIDEBAR_WIDTH_MOBILE constant
- Removed 3 unused variables from useSidebar destructuring

* fix: remove 13 unused variables in frontend files

- version-check-modal.tsx: removed 4 unused imports and functions
- main.tsx: removed unused isMobile state
- AdminSettings.tsx: removed 8 unused imports and error variables

* fix: remove 28 unused variables across frontend components

Cleaned up unused imports, state variables, and function parameters:
- CredentialsManager.tsx: removed 8 unused variables (Sheet/Select imports)
- FileManager.tsx: removed 10 unused variables (icons, state, functions)
- Terminal.tsx (Desktop): removed 5 unused variables (state, handlers)
- Terminal.tsx (Mobile): removed 5 unused variables (imports, state)

Reduced lint errors from 271 to 236 (35 errors fixed)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 10 unused variables in File Manager and config files

Cleaned up more unused imports, parameters, and variables:
- FileManagerGrid.tsx: removed 4 unused variables (params, function)
- FileManagerContextMenu.tsx: removed Share import
- FileManagerSidebar.tsx: removed onLoadDirectory parameter
- DraggableWindow.tsx: removed Square import
- FileWindow.tsx: removed updateWindow variable
- ServerConfig.tsx: removed 2 unused error parameters

Reduced lint errors from 236 to 222 (14 errors fixed total)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 7 unused variables in widgets and Homepage components

Cleaned up unused imports, parameters, and variables:
- DiskWidget.tsx: removed metricsHistory parameter
- FileManagerContextMenu.tsx: removed ExternalLink import
- Homepage.tsx: removed useTranslation import
- HomepageAlertManager.tsx: removed loading variable
- HomepageAuth.tsx: removed setCookie import (Desktop & Mobile)
- HompageUpdateLog.tsx: removed err parameter

Reduced lint errors from 222 to 216 (6 errors fixed)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 8 unused variables in File Manager and Host Manager components

Cleaned up unused imports, state variables, and function parameters:
- DiffViewer.tsx: removed unused error parameter in catch block
- FileViewer.tsx: removed ReactPlayer import, unused originalContent state,
  node parameters from markdown code components, audio variable
- HostManager.tsx: removed onSelectView and updatedHost parameters
- TunnelViewer.tsx: removed TunnelConnection import

Reduced lint errors from 271 to 208 (63 errors fixed total)

* fix: remove 7 unused variables in UI hooks and components

Cleaned up unused parameters and functions:
- status/index.tsx: removed unused className parameter from StatusIndicator
- useDragToDesktop.ts: removed unused sshHost parameter and from dependency
  arrays (4 occurrences)
- useDragToSystemDesktop.ts: removed unused sshHost parameter and
  getLastSaveDirectory function (29 lines removed)

Continued reducing frontend lint errors

* fix: remove 2 unused variables in hooks and TabContext

- useDragToDesktop.ts: removed unused onSuccess in dragFolderToDesktop
- TabContext.tsx: removed unused useTranslation import and t variable

Continued reducing frontend lint errors

* fix: remove 2 unused variables in Homepage component

- Removed unused isAdmin state variable (changed to setter only)
- Removed unused jwt variable by inlining getCookie check

Continued reducing frontend lint errors

* fix: remove 3 unused variables in Mobile navigation components

- Host.tsx: removed unused Server icon import
- LeftSidebar.tsx: removed unused setHostsLoading setter and err parameter

Continued reducing frontend lint errors

* fix: remove 9 unused variables across multiple files

Fixed unused variables in:
- database-file-encryption.ts: removed currentFingerprint (backend)
- FileManagerContextMenu.tsx: removed ExternalLink import, hasDirectories
- frontend-logger.ts: removed 5 unused shortUrl variables

Continued reducing lint errors

* fix: remove 18 unused variables across 4 files

- HostManagerViewer.tsx: remove 9 unused error variables and parameters
- HostManagerEditor.tsx: remove WidgetType import, hosts/loading states, error variable
- CredentialViewer.tsx: remove 3 unused error variables
- Server.tsx: remove 2 unused error variables

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 9 unused variables across 4 files

- SnippetsSidebar.tsx: remove 3 unused err variables in catch blocks
- TunnelViewer.tsx: remove 2 unused parameters from callback
- DesktopApp.tsx: remove getCookie import and unused state variables
- HomepageAlertManager.tsx: remove 2 unused err variables in catch blocks

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 10 unused variables and imports across 4 navigation files

- Homepage.tsx: remove unused username state variable
- AppView.tsx: remove 3 unused Lucide icon imports
- TopNavbar.tsx: remove 4 unused Accordion component imports
- LeftSidebar.tsx: remove 2 unused variables (err, jwt)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 5 unused variables across 4 user/credentials files

- PasswordReset.tsx: remove unused result variable
- UserProfile.tsx: remove unused Key import and err variable
- version-check-modal.tsx: remove unused setVersionDismissed setter
- CredentialsManager.tsx: remove unused e parameter from handleDragLeave

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 2 unused variables in FileViewer and TerminalWindow

- FileViewer.tsx: remove unused node parameter from code component
- TerminalWindow.tsx: remove unused handleMinimize function

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 10 unused variables in HomepageAuth.tsx

Removed unused variables:
- getCookie import
- dbError prop
- visibility state and toggleVisibility
- error state variable
- result variable in handleInitiatePasswordReset
- token URL parameter
- err parameters in catch blocks
- retryDatabaseConnection function
- Multiple setError(null) calls

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 9 unused variables across multiple files

Files fixed:
- DesktopApp.tsx: Removed _nextView parameter
- TerminalWindow.tsx: Removed minimizeWindow
- Mobile Host.tsx: Removed Server import
- Mobile LeftSidebar.tsx: Removed setHostsLoading, err in catch
- Desktop LeftSidebar.tsx: Removed getCookie, setCookie, onSelectView, getView, setHostsLoading

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 10 unused variables in Mobile files

Files fixed:
- MobileApp.tsx: Removed getCookie, removeTab, isAdmin, id, err parameters
- Mobile/HomepageAuth.tsx: Removed getCookie, error state, result, token, err parameters

All @typescript-eslint/no-unused-vars errors in frontend now resolved!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused t variable in TabContext

Removed useTranslation import and unused t variable
in Mobile TabContext.tsx

All @typescript-eslint/no-unused-vars errors now resolved!
Total fixed: 154 unused variables

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve TypeScript and ESLint errors across the codebase

- Fixed @typescript-eslint/no-unused-vars errors (31 instances)
- Fixed @typescript-eslint/no-explicit-any errors in backend (~22 instances)
- Fixed @typescript-eslint/no-explicit-any errors in frontend (~60 instances)
- Fixed prefer-const errors (5 instances)
- Fixed no-empty-object-type and rules-of-hooks errors
- Added proper type assertions for database operations
- Improved type safety in authentication and encryption modules
- Enhanced type definitions for API routes and SSH operations

All TypeScript compilation errors resolved. Application builds and runs successfully.

* fix: disable react-refresh/only-export-components rule for component files

Disable the react-refresh/only-export-components ESLint rule in files
that export both components and related utilities (hooks, types,
constants). This is a pragmatic solution to maintain code organization
without splitting files unnecessarily.

* style: fix prettier formatting issues

Fix code style issues in translation file and TOTP dialog component
to pass CI prettier check.

* chore: fix rollup optional dependencies installation in CI

Add step to force reinstall rollup after npm ci to fix the known npm
bug with optional dependencies on Linux x64 platform.

* chore: fix lightningcss optional dependencies in CI

Add lightningcss to the force reinstall step to fix npm optional
dependencies bug for both rollup and lightningcss on Linux x64.

* chore: fix npm optional dependencies bug in CI

Remove package-lock.json and node_modules before install to properly
handle optional dependencies for rollup, lightningcss, and tailwindcss
native bindings on Linux x64 platform as recommended by npm.

* Update src/types/index.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Set terminal environment variables for SSH

Added environment variables for terminal configuration.

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Karmaa <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* feat: begin macOS support

* Delete .github/ISSUE_TEMPLATE/bug_report.yml

* Delete .github/ISSUE_TEMPLATE/feature_request.yml

* Add issue template configuration for support links

* Revise support instructions in README.md

Updated support section with new issue reporting instructions and clarified Discord support response times.

* Update repository links and badge URLs in README

* Update links to new orgnanization

* Migrate workflows to Blacksmith (#421)

Co-authored-by: blacksmith-sh[bot] <157653362+blacksmith-sh[bot]@users.noreply.github.com>

* Feature request: Add delete confirmation dialog to file manager (#344)

* Feature request: Add delete confirmation dialog to file manager

- Added confirmation dialog before deleting files/folders
- Users must confirm deletion with a warning message
- Works for both Delete key and right-click delete
- Shows different messages for single file, folder, or multiple items
- Includes permanent deletion warning
- Follows existing design patterns using confirmWithToast

* Adds confirmation for deletion of items including folders

Updates the file deletion confirmation logic to distinguish between
deleting multiple items with or without folders. Introduces a new
translation string for a clearer user prompt when folders and their
contents are included in the deletion.

Improves clarity and reduces user error when performing bulk deletions.

* feat: Add Chinese translations for delete confirmation messages

* Adds camelCase support for encrypted field mappings (#342)

Extends encrypted field mappings to include camelCase variants
to support consistency and compatibility with different naming
conventions. Updates reverse mappings for Drizzle ORM to allow
conversion between camelCase and snake_case field names.

Improves integration with systems using mixed naming styles.

* Run code cleanup, add sidebar persistence, fix OIDC credentials, force SSH password.

* Fix snake case mismatching

* Fix race condition and remove redundant kekSalt for OIDC users

Critical fixes:

1. Race Condition Mitigation:
   - Added read-after-write verification in setupOIDCUserEncryption()
   - Ensures session uses the DEK that's actually in the database
   - Prevents data loss when concurrent logins occur for new OIDC users
   - If race is detected, discards generated DEK and uses stored one

2. Remove Redundant kekSalt Logic:
   - Removed unnecessary kekSalt generation and checks for OIDC users
   - kekSalt is not used in OIDC key derivation (uses userId as salt)
   - Reduces database operations from 4 to 2 per authentication
   - Simplifies code and removes potential confusion

3. Improved Error Handling:
   - systemKey cleanup moved to finally block
   - Ensures sensitive key material is always cleared from memory

These changes ensure data consistency and prevent potential data loss
in high-concurrency scenarios.

* Cleanup OIDC pr and run prettier

* Feature/german language support (#374)

* v1.7.2 (#364)

* Feature request: Add delete confirmation dialog to file manager (#344)

* Feature request: Add delete confirmation dialog to file manager

- Added confirmation dialog before deleting files/folders
- Users must confirm deletion with a warning message
- Works for both Delete key and right-click delete
- Shows different messages for single file, folder, or multiple items
- Includes permanent deletion warning
- Follows existing design patterns using confirmWithToast

* Adds confirmation for deletion of items including folders

Updates the file deletion confirmation logic to distinguish between
deleting multiple items with or without folders. Introduces a new
translation string for a clearer user prompt when folders and their
contents are included in the deletion.

Improves clarity and reduces user error when performing bulk deletions.

* feat: Add Chinese translations for delete confirmation messages

* Adds camelCase support for encrypted field mappings (#342)

Extends encrypted field mappings to include camelCase variants
to support consistency and compatibility with different naming
conventions. Updates reverse mappings for Drizzle ORM to allow
conversion between camelCase and snake_case field names.

Improves integration with systems using mixed naming styles.

* Run code cleanup, add sidebar persistence, fix OIDC credentials, force SSH password.

* Fix snake case mismatching

* Add real client IP

* Fix OIDC credential persistence issue

The issue was that OIDC users were getting a new random Data Encryption Key (DEK)
on every login, which made previously encrypted credentials inaccessible.

Changes:
- Modified setupOIDCUserEncryption() to persist the DEK encrypted with a system-derived key
- Updated authenticateOIDCUser() to properly retrieve and use the persisted DEK
- Ensured OIDC users now have the same encryption persistence as password-based users

This fix ensures that credentials created by OIDC users remain accessible across
multiple login sessions.

* Fix race condition and remove redundant kekSalt for OIDC users

Critical fixes:

1. Race Condition Mitigation:
   - Added read-after-write verification in setupOIDCUserEncryption()
   - Ensures session uses the DEK that's actually in the database
   - Prevents data loss when concurrent logins occur for new OIDC users
   - If race is detected, discards generated DEK and uses stored one

2. Remove Redundant kekSalt Logic:
   - Removed unnecessary kekSalt generation and checks for OIDC users
   - kekSalt is not used in OIDC key derivation (uses userId as salt)
   - Reduces database operations from 4 to 2 per authentication
   - Simplifies code and removes potential confusion

3. Improved Error Handling:
   - systemKey cleanup moved to finally block
   - Ensures sensitive key material is always cleared from memory

These changes ensure data consistency and prevent potential data loss
in high-concurrency scenarios.

* Cleanup OIDC pr and run prettier

---------

Co-authored-by: Ved Prakash <54140516+thorved@users.noreply.github.com>

* Fix typos and improve wording in README.md

Corrected grammar and punctuation in README.

* Image 7.png

* Rename 3gi3b3os5psf1.png to Image 7.png

* Add video demonstration to README

Added a video demonstration to the README.

* Delete repo-images/Image 7.png

* Add files via upload

* Delete repo-images/Image 7.png

* Add files via upload

* Initial German translation

* German translation (#281)

* German translation (#281)

* Implementation of German language support  (#281)

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/locales/de/translation.json

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: Karmaa <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Ved Prakash <54140516+thorved@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Feature disable password login (#378)

* Add admin toggle to disable password login

* Update src/backend/database/routes/users.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/ui/main-axios.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/ui/Desktop/Admin/AdminSettings.tsx

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/backend/database/routes/users.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/backend/database/routes/users.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Add SSH TOTP authentication support (#350)

* Add SSH TOTP authentication support

- Implement keyboard-interactive authentication for SSH connections
- Add TOTP dialog component for Terminal and File Manager
- Handle TOTP prompts in WebSocket and HTTP connections
- Disable Server Stats for TOTP-enabled servers
- Add i18n support for TOTP-related messages

* Update src/backend/ssh/server-stats.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Update src/backend/ssh/file-manager.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: Karmaa <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Add terminal snippets feature with sidebar UI (#377)

* Add terminal snippets feature with sidebar UI

- Add snippets CRUD API endpoints and database schema
- Implement snippets sidebar accessible from TopNavbar
- Add copy to clipboard functionality
- Include tooltips and optimized styling
- Add English and Chinese translations

* Update src/backend/database/routes/snippets.ts

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Feature engineering improvements (#376)

* chore: add engineering improvements

- Configure Prettier with unified code style rules
- Add husky + lint-staged for automated pre-commit checks
- Add commitlint to enforce conventional commit messages
- Add PR check workflow for CI automation
- Auto-format all files with Prettier
- Fix TypeScript any types in field-crypto.ts

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* chore: enhance development environment

- Add .editorconfig for unified editor settings
- Add .nvmrc to specify Node.js version (20)
- Add useful npm scripts: format, format:check, lint, lint:fix, type-check

* chore: add IDE and Git configuration

- Add VS Code workspace settings for consistent development experience
- Add VS Code extension recommendations (ESLint, Prettier, EditorConfig)
- Add .gitattributes to enforce LF line endings

* refactor: clean up unused variables and empty blocks

- database.ts: Remove unused variables (authManager, format, HTTPS_PORT, etc.)
- database.ts: Fix empty catch blocks with descriptive comments
- database.ts: Add eslint-disable for required middleware parameter
- db/index.ts: Remove unused variables and fix empty catch blocks
- Temporarily remove ESLint from pre-commit to allow incremental fixes

Reduced total errors from 947 to 913 (34 fixes)

* refactor: clean up unused variables and empty blocks in routes

Routes updated:
- credentials.ts: Remove 12 unused variables/imports
- alerts.ts: Remove 1 unused variable
- users.ts: Remove 9 unused variables/imports

Changes:
- Remove unused imports (NextFunction, jwt, UserCrypto, detectKeyType)
- Fix empty catch blocks with descriptive comments
- Prefix reserved parameters with underscore
- Clean up unused error variables in catch blocks

Reduced errors from 913 to 886 (27 fixes)

* refactor: clean up unused variables in routes/ssh.ts

- Remove unused imports (NextFunction, jwt)
- Remove 6 unused variables (result, updateResult, name x3)
- All 8 no-unused-vars errors fixed

* refactor: clean up unused variables and empty blocks in file-manager.ts

- Remove 22 unused variables (linkCount, hostId, userId, content, escapedTempFile, index, code)
- Fix 1 empty catch block
- Simplify multiple route handlers by removing unused destructured parameters

Reduced errors from 878 to 855 (23 fixes)

* refactor: clean up unused variables and empty blocks in utils

database-migration.ts:
- Remove 3 unused variables (encryptedSize, totalOriginalRows, totalMemoryRows)

lazy-field-encryption.ts:
- Fix 6 empty catch blocks with descriptive comments
- Keep error variables where they are used in logging

tunnel.ts:
- Fix multiple empty catch blocks
- Remove empty else blocks
- Partially fixed (10/21 issues resolved)

Reduced errors from 855 to 833 (22 fixes)

* fix: restore error variable in catch block for logging

Fix TypeScript error where error variable was removed from catch block
but still used in logging statements. The error variable is needed for
proper error logging and re-throwing.

* fix: clean up tunnel.ts empty blocks and unused variables

移除了 tunnel.ts 中的空块和未使用的变量:
- 移除 2 个空 else 块
- 修复 2 个空 if 块并添加注释
- 修复空错误处理器并添加注释
- 将未使用的 err 参数重命名为 _err

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty blocks and unused variables in backend utils

修复了后端工具文件中的空块和未使用的变量:
- auth-manager.ts: 移除空 else 块
- system-crypto.ts: 修复空 catch 块并添加注释
- starter.ts: 修复空 catch 块并添加注释
- server-stats.ts: 将未使用的 reject 参数重命名为 _reject
- credentials.ts: 将 connectionTimeout 从 let 改为 const

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty catch blocks in frontend components

修复了前端组件中的空 catch 块:
- Tunnel.tsx: 修复空 catch 块并添加注释
- ServerConfig.tsx: 修复空 catch 块并添加注释
- TerminalKeyboard.tsx: 修复空 catch 块并添加注释
- system-crypto.ts: 修复遗漏的空 catch 块

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty catch blocks in backend utilities

修复了后端工具文件中的 10 个空 catch 块:
- system-crypto.ts: 修复 1 个空 catch 块
- server-stats.ts: 修复 4 个空 catch 块
- auto-ssl-setup.ts: 修复 1 个空 catch 块
- ssh-key-utils.ts: 修复 4 个空 catch 块

所有空块都添加了描述性注释说明为何忽略错误。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty catch blocks in UI hooks and components

修复了 5 个 UI 组件和 hooks 中的空 catch 块:
- useDragToSystemDesktop.ts: 修复 2 个空 catch 块
- HomepageAuth.tsx: 修复 1 个空 catch 块
- HostManagerEditor.tsx: 修复 2 个空 catch 块

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up empty blocks in file manager and credential editor

修复了 5 个空块:
- FileManagerGrid.tsx: 移除 1 个空 else 块和 1 个空 if 块
- CredentialEditor.tsx: 修复 1 个空 catch 块,移除 2 个空 if/else 块

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: clean up all empty catch blocks in Terminal components

修复了 Terminal 组件中的所有 8 个空 catch 块:
- Desktop/Apps/Terminal/Terminal.tsx: 修复 5 个空 catch 块
- Mobile/Apps/Terminal/Terminal.tsx: 修复 3 个空 catch 块

所有空块都添加了描述性注释。这是空块修复的最后一批。

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: remove useless try/catch wrappers

移除了 3 个无用的 try/catch 包装器:
- users.ts: 移除只重新抛出错误的外层 try/catch
- FileManager.tsx: 移除只重新抛出错误的内层 try/catch
- DiffViewer.tsx: 移除只重新抛出错误的内层 try/catch

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: remove unused imports and mark unused parameters

移除了未使用的导入和标记未使用的参数:
- auto-ssl-setup.ts: 移除未使用的 crypto 导入
- user-crypto.ts: 移除未使用的 users 导入
- user-data-import.ts: 移除未使用的 nanoid 导入
- simple-db-ops.ts: 标记未使用的 userId 和 tableName 参数

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unnecessary escape characters in regex patterns

移除了正则表达式中不必要的转义字符:
- users.ts: 修复 5 个 \/ 不必要的转义
- TabContext.tsx: 修复 1 个 \/ 不必要的转义

在字符串形式的正则表达式中,/ 不需要转义。

---------

Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>

* feat: enhance server stats widgets and fix TypeScript/ESLint errors (#394)

* feat: add draggable server stats dashboard with customizable widgets

* fix: widget deletion and layout persistence issues

* fix: improve widget deletion UX and add debug logs for persistence

* fix: resolve widget deletion and layout persistence issues

- Add drag handles to widget title bars for precise drag control
- Prevent delete button from triggering drag via event stopPropagation
- Include statsConfig field in all GET/PUT API responses
- Remove debug console logs from production code

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: complete statsConfig field support across all API routes

- Add statsConfig to POST /db/host (create) route
- Add statsConfig to all GET routes for consistent API responses
- Remove incorrect statsConfig schema from HostManagerEditor
- statsConfig is now only managed by Server page layout editor

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: add statsConfig to metrics API response

- Add statsConfig field to SSHHostWithCredentials interface
- Include statsConfig in resolveHostCredentials baseHost object
- Ensures /metrics/:id API returns complete host configuration

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: include statsConfig in SSH host create/update requests

The statsConfig field was being dropped by createSSHHost and updateSSHHost
functions in main-axios.ts, preventing layout customization from persisting.

Fixed by adding statsConfig to the submitData object in both functions.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* feat: refactor server stats widgets into modular structure

Created dedicated widgets directory with individual components:
- CpuWidget, MemoryWidget, DiskWidget as separate components
- Widget registry for centralized widget configuration
- AddWidgetDialog for user-friendly widget selection
- Updated Server.tsx to use modular widget system

Benefits:
- Better code organization and maintainability
- Easier to add new widget types in the future
- Centralized widget metadata and configuration
- User can now add widgets via dialog interface

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: exit edit mode after saving layout

* feat: add customizable widget sizes with chart visualizations

Add three-tier size system (small/medium/large) for server stats widgets.
Integrate recharts library for visualizing trends in large widgets with
line charts (CPU), area charts (Memory), and radial bar charts (Disk).
Fix layout overflow issues with proper flexbox patterns.

* refactor: simplify server stats widget system

Replaced complex drag-and-drop grid layout with simple checkbox-based
configuration and static responsive grid display.

- Removed react-grid-layout dependency and 6 related packages
- Simplified StatsConfig from complex Widget objects to simple array
- Added Statistics tab in HostManagerEditor for checkbox selection
- Refactored Server.tsx to use CSS Grid instead of ResponsiveGridLayout
- Simplified widget components by removing edit mode and size selection
- Deleted unused AddWidgetDialog and registry files
- Fixed statsConfig serialization in backend routes

Net result: -787 lines of code, cleaner architecture.

* feat: add system, uptime, network and processes widgets

Add four new server statistics widgets:
- SystemWidget: displays hostname, OS, and kernel information
- UptimeWidget: shows server total uptime with formatted display
- NetworkWidget: lists network interfaces with IP and status
- ProcessesWidget: displays top processes by CPU usage

Backend changes:
- Extended SSH metrics collection to gather network, uptime, process, and system data
- Added commands to parse /proc/uptime, ip addr, ps aux output

Frontend changes:
- Created 4 new widget components with consistent styling
- Updated widget type definitions and HostManagerEditor
- Unified all widget heights to 280px for consistent layout
- Added translations for all new widgets (EN/ZH)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor: improve widget styling and UX consistency

Enhance all server stats widgets with improved styling and user experience:

Widget improvements:
- Fix hardcoded titles, now use i18n translations for all widgets
- Improve data formatting with consistent translation keys
- Enhance empty state displays with better visual hierarchy
- Add smooth hover transitions and visual feedback
- Standardize spacing and layout patterns across widgets

Specific optimizations:
- CPU: Use translated load average display
- Memory: Translate "Free" label
- Disk: Translate "Available" label
- System: Improve icon colors and spacing consistency
- Network: Better empty state, enhanced card styling
- Processes: Improved card borders and spacing

Visual polish:
- Unified icon sizing and opacity for empty states
- Consistent border radius (rounded-lg)
- Better hover states with subtle transitions
- Enhanced font weights for improved readability

* fix: replace explicit any types with proper TypeScript types

- Replace 'any' with 'unknown' in catch blocks and add type assertions
- Create explicit interfaces for complex objects (HostConfig, TabData, TerminalHandle)
- Fix window/document object type extensions
- Update Electron API type definitions
- Improve type safety in database routes and utilities
- Add proper types to Terminal components (Desktop & Mobile)
- Fix navigation component types (TopNavbar, LeftSidebar, AppView)

Reduces TypeScript lint errors from 394 to 358 (-36 errors)
Fixes 45 @typescript-eslint/no-explicit-any violations

* fix: replace explicit any types with proper TypeScript types

- Create explicit interfaces for Request extensions (AuthenticatedRequest, RequestWithHeaders)
- Add type definitions for WebSocket messages and SSH connection data
- Use generic types in DataCrypto methods instead of any return types
- Define proper interfaces for file manager data structures
- Replace catch block any types with unknown and proper type assertions
- Add HostConfig and TabData interfaces for Server component

Fixes 32 @typescript-eslint/no-explicit-any violations across 5 files

* fix: resolve 6 TypeScript compilation errors

Fixed field name mismatches and generic type issues:
- database.ts: Changed camelCase to snake_case for key_password, private_key, public_key fields
- simple-db-ops.ts: Added explicit generic type parameters to DataCrypto method calls

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve unused variables in backend utils

Fixed @typescript-eslint/no-unused-vars errors in:
- starter.ts: removed unused error variables (2 fixes)
- auto-ssl-setup.ts: removed unused error variable (1 fix)
- ssh-key-utils.ts: removed unused error variables (3 fixes)
- user-crypto.ts: removed unused error variables (5 fixes)
- data-crypto.ts: removed unused plaintextFields and error variables (2 fixes)
- simple-db-ops.ts: removed unused parameters _userId and _tableName (2 fixes)

Total: 15 unused variable errors fixed

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused variable in terminal.ts

Fixed @typescript-eslint/no-unused-vars errors:
- Removed unused userPayload variable (line 123)
- Removed unused cols and rows from destructuring (line 348)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: resolve unused variables in server-stats.ts

Fixed @typescript-eslint/no-unused-vars errors:
- Removed unused _reject parameter in Promise (line 64)
- Removed shadowed now variable in pollStatusesOnce (line 1130)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused variables in tunnel.ts

Removed 5 unused variables:
- Removed unused data parameter from stdout event handler
- Removed hasSourcePassword, hasSourceKey, hasEndpointPassword, hasEndpointKey variables

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove unused variables in main-axios.ts

Removed 8 unused variables:
- Removed unused type imports (Credential, CredentialData, HostInfo, ApiResponse)
- Removed unused apiPort variable
- Removed unused error variables in 3 catch blocks

* fix: remove unused variables in terminal.ts and starter.ts

Removed 2 unused variables:
- Removed unused JWTPayload type import from terminal.ts
- Removed unused _promise parameter from starter.ts

* fix: remove unused variables in sidebar.tsx

Removed 9 unused variables:
- Removed 5 unused Sheet component imports
- Removed unused SIDEBAR_WIDTH_MOBILE constant
- Removed 3 unused variables from useSidebar destructuring

* fix: remove 13 unused variables in frontend files

- version-check-modal.tsx: removed 4 unused imports and functions
- main.tsx: removed unused isMobile state
- AdminSettings.tsx: removed 8 unused imports and error variables

* fix: remove 28 unused variables across frontend components

Cleaned up unused imports, state variables, and function parameters:
- CredentialsManager.tsx: removed 8 unused variables (Sheet/Select imports)
- FileManager.tsx: removed 10 unused variables (icons, state, functions)
- Terminal.tsx (Desktop): removed 5 unused variables (state, handlers)
- Terminal.tsx (Mobile): removed 5 unused variables (imports, state)

Reduced lint errors from 271 to 236 (35 errors fixed)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 10 unused variables in File Manager and config files

Cleaned up more unused imports, parameters, and variables:
- FileManagerGrid.tsx: removed 4 unused variables (params, function)
- FileManagerContextMenu.tsx: removed Share import
- FileManagerSidebar.tsx: removed onLoadDirectory parameter
- DraggableWindow.tsx: removed Square import
- FileWindow.tsx: removed updateWindow variable
- ServerConfig.tsx: removed 2 unused error parameters

Reduced lint errors from 236 to 222 (14 errors fixed total)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>

* fix: remove 7 unused variables in widgets and Homepage components

Cleaned up unused imports, p…

* fix: Improve TOTP reliability, move components around, turn homepage update log into a sheet

* fix: Work more on TOTP, renamed homepage to dashboard and began improvements

* fix: test commit

* fix: Fix server stats login

* feat: Complete layout of Termix dashboard

* feat: Update font for reacent activity

* feat: Connect dashboard to backend and update tab system to be similar to a browser (neither are fully finished)

* feat: Improve dashboard API, improve tab system, various other fixes

* fix: Resize dashboard boxes and reduce server stats size to add scrolling

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix: Improve macOS support

* fix(auth): Fix admin user authentication for /users/db-health endpoint by adding cookie JWT support (#422)

Fixed authentication issue for admin users accessing the /users/db-health endpoint:

- Added JWT token extraction from cookies (req.cookies?.jwt)
- Added support for Bearer token from Authorization header
- Improved error handling for missing and invalid tokens
- Ensured consistent authentication flow for admin users

Changes made:
- Check for JWT token in req.cookies?.jwt
- Support Bearer token from Authorization header
- Return 401 error when token is missing
- Return 401 error when token validation fails

Fixes: https://github.com/Termix-SSH/Support/issues/12

* Update Docker login credentials and image names

* Update docker-image.yml

* Refactor Docker image workflow for registry options

Updated workflow to allow selection of Docker registry and simplified tag handling.

* Update Docker login conditions and tag handling

* Enhance Docker image workflow with better tagging

Updated Docker image workflow to improve tag handling and descriptions.

* Update Docker workflow for tag handling and cleanup

* Update docker-image.yml

* Update Docker workflow inputs and tag logic

Refactor Docker workflow to include version and production inputs, and streamline tag determination.

* Update Docker image workflow for multi-platform builds

* Refactor Docker image tags for clarity

Updated Docker image tags to use multi-line syntax for better readability and added latest tag conditionally.

* Fix typo in exposed ports in Dockerfile

* Update docker-image.yml

* Refactor Docker image workflow for registry handling

Removed registry input and adjusted Docker Hub login condition.

* Handle OIDC users during database import (#424)

* Update Docker image name for GitHub registry

* Fix image name casing in Docker workflow

* Remove untagged image cleanup step from workflow

Removed the step to delete untagged image versions from the workflow.

* Change Docker login to use GHCR credentials

Updated Docker login credentials for GitHub Container Registry.

* Remove cache moving step from Docker workflow

Removed the step to move the build cache in the Docker workflow.

* Refactor Docker image workflow for versioning and builds

* Update docker-image.yml

* Allow OIDC users to import database without password

* Skip import password prompt for OIDC users

* docs: clarify OIDC import unlocking flow

* docs: explain admin import password logic

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: Nikola Novoselec <nikolanovoselec@users.noreply.github.com>

* fix: Fixed various issues with the dashboard, tab bar, and database issues

* feat: Added none password option and fixed some navbar issues (still present)

* fix: Fix tab reload/state loss whenever moving them to the rigbht

* feat: Make tabs auto expand and contract and scroll

* fix: Remove vertical scrolling in the tab bar and dashboard and reduce scrollbar height in tab bar

* feat: Add many terminal customizations

* feat: Add many terminal customizations

* fix: incorrect macOS logo, termix hangs on macOS, and macOS reporting incorrect version

* fix: fix macOS verison build error

* fix: fix macOS build error

* fix: replaced macOS icon

* feat: Added more output types for electron and streamlined the workflow

* fix: Rollup package issue

* fix: Rollup package issue for macOS

* feat: fix macOS/Linux build error

* fix: fix macOS build error

* fix: fix macOS build error and double folder issues

* fix: fix macOS build error

* fix: fix macOS build error

* fix: fix macOS build error

* fix: fix macOS build error

* fix: files uploading as folders instead of raw executable

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing

* fix: macOS build failing and update workflow options

* fix: macOS build failing

* fix: Upload to release not finding a release

* fix: ChaNge platform for upload to release

* fix: Standardize file naming

* fix: Build error with custom tar.gz naming

* fix: Allow .dmg signing

* fix: Fix .dmg signing

* fix: Fix notarize build error

* fix: Fix notarize build error

* fix: Add app specific password

* fix: add developer ID certificate

* fix: macOS app not closing

* fix: cache error

* Add Brazilian Portuguese translation (#425)

* Update Docker image name for GitHub registry

* Fix image name casing in Docker workflow

* Remove untagged image cleanup step from workflow

Removed the step to delete untagged image versions from the workflow.

* Change Docker login to use GHCR credentials

Updated Docker login credentials for GitHub Container Registry.

* Remove cache moving step from Docker workflow

Removed the step to move the build cache in the Docker workflow.

* Refactor Docker image workflow for versioning and builds

* Update docker-image.yml

* Add Brazilian Portuguese translation

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>

* feat: add chocolatey support

* feat: add initial flatpak/homebrew support

* fix: incorrect choco URL

* fix: rename choco package

* fix: updated package lock

* fix: move totp dialog

* feat: centralize SSH tools and allow multi terminal snippets

* fix: Squash commit of several fixes and features for many different elements

* fix: Fix some translations

* fix: pt-BR build error

* fix: npm build error

* fix: npm build error

* feat: rename gh actions

* fix: None auth and Host.tsx edit button issues

* fix: macOS dmg fail

* fix: linux not building x64

* fix: linux not uploading x64

* fix: Password reset issues, ODIC admin auth not filling, and electron x64 build issues

* feat: Squashed commit of fixing "none" authentication and adding a sessions system for mobile, electron, and web

* fix: Replace checkbox in docker build with dropdown

* fix: Issue with electron not displaying site

* fix: Issue with electron not displaying se

* fix: Issue with electron not displaying

* fix: Mobile reporting wrong user-agent

* fix: Nginx runtime error

* fix: JWT not persisting after reboot

* feat: add null to gitnore

* feat: remove sessions after reboot

* fix: File cleanup

* fix: Uncapitalize folder titles and finalize file cleanup

* fix: Build errors after cleanup

* fix: GITHUB_TOKEN issue in electron build

* fix: Random macOS build error

* fix: macOS GH token error

* fix: Incorrect desktop user agent and build issues

* fix: Notarize cleanup

* fix: None auth issues and macOS build failure and rename files for consistency

* fix: Run prettier

* feat: Update readme for iPadOS

* fix: Electron desktop not logging in

* fix: Electron desktop not logging in

* fix: Duplicated CORS headers

* fix: Electron login issues

* fix: Sqlite package fix

* fix: Desktop app login issues and rename version check and host manager folder

* fix: Electron HTTP fix + stripped background fix

* fix: Electron security issues and TOTP/None auth issues

* fix: Server config showing in web view

* fix: Update readme

* fix: Update readme

* [FEATURE] Adjustable Left Menu Width in Web Interface (#427)

#234
Added to LeftSidebar.tsx functionality
Update TopNavbar.tsx to use sidebar dynamic width

Co-authored-by: Robert Coroianu <robert.coroianu@easydo.co>

* fix: Sidebar resize issues and issues with TOTP interfering with password auth

* chore: Run prettier

* fix: Tunnels being same name

* fix: Electron build problems

* fix: Type error

* fix: Linux app image and server conifg issue

* fix: Run linter

* fix: Incorrect android user agent

* fix: No x64 appimage and server config displaying in electron webview

* fix: Electron API and terminal websocket issues

* fix: Android user agent edgecase and electron using web view incorrectly

* feat: Added mobile and electron UI redirecting system

* fix: Fix electron login and mobile redirect

* feat: add Russian translation and readme (#428)

* Update Docker image name for GitHub registry

* Fix image name casing in Docker workflow

* Remove untagged image cleanup step from workflow

Removed the step to delete untagged image versions from the workflow.

* Change Docker login to use GHCR credentials

Updated Docker login credentials for GitHub Container Registry.

* Remove cache moving step from Docker workflow

Removed the step to move the build cache in the Docker workflow.

* Refactor Docker image workflow for versioning and builds

* Update docker-image.yml

* Update print statement from 'Hello' to 'Goodbye'

* Update docker build

* Rename docker-image.yml to docker.yml

* Rename electron-build.yml to electron.yml

* feat: add Russian translation and readme

* feat: Added mobile and electron UI redirecting system

* fix: Fix electron login and mobile redirect

* Update Docker image name for GitHub registry

* Fix image name casing in Docker workflow

* Remove untagged image cleanup step from workflow

Removed the step to delete untagged image versions from the workflow.

* Change Docker login to use GHCR credentials

Updated Docker login credentials for GitHub Container Registry.

* Remove cache moving step from Docker workflow

Removed the step to move the build cache in the Docker workflow.

* Refactor Docker image workflow for versioning and builds

* Update docker-image.yml

* Update print statement from 'Hello' to 'Goodbye'

* Update docker build

* Rename docker-image.yml to docker.yml

* Rename electron-build.yml to electron.yml

* feat: add Russian translation and readme

* fix: Add russian

---------

Co-authored-by: Luke Gustafson <88517757+LukeGus@users.noreply.github.com>
Co-authored-by: root <root@codeserver.192.168.0.5>
Co-authored-by: LukeGus <bugattiguy527@gmail.com>

* fix: remove russian readme

* fix: Revert workflows back to normal

* fix: Session invoking all sessions and mobile success redirect not displaying

* fix: Logging out on one device logs out all on same user

* fix: Improve session clearing (possible RC)

* fix: Linux portable naming incorrect

* fix: Linux desktop not opening

* fix: Linux build failure

* fix: Linux build failure

* fix: Linux build failure

* fix: Linux build failure

* fix: Linux sandbox issue

* fix: Linux sandbox issue

* fix: Linux sandbox issue

* fix: Finalize electron

* fix: Database check failure (release cantidate)

* fix: Run cleanup and final fix for electron

---------

Co-authored-by: Ved Prakash <54140516+thorved@users.noreply.github.com>
Co-authored-by: P3RF3CTION <herzmaximilian@gmail.com>
Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
Co-authored-by: ZacharyZcR <2903735704@qq.com>
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: blacksmith-sh[bot] <157653362+blacksmith-sh[bot]@users.noreply.github.com>
Co-authored-by: suraimu-team <team@suraimu.com>
Co-authored-by: Nikola Novoselec <12149536+nikolanovoselec@users.noreply.github.com>
Co-authored-by: Nikola Novoselec <nikolanovoselec@users.noreply.github.com>
Co-authored-by: xhemp <13650956+xhemp@users.noreply.github.com>
Co-authored-by: Robert Coroianu <robert.coroianu@gmail.com>
Co-authored-by: Robert Coroianu <robert.coroianu@easydo.co>
Co-authored-by: shizaterrorblade <shizaterrorblayde@gmail.com>
Co-authored-by: root <root@codeserver.192.168.0.5>
2025-11-05 10:36:16 -06:00

1493 lines
79 KiB
JSON

{
"credentials": {
"credentialsViewer": "Visualizador de Credenciais",
"manageYourSSHCredentials": "Gerencie suas credenciais SSH com segurança",
"addCredential": "Adicionar Credencial",
"createCredential": "Criar Credencial",
"editCredential": "Editar Credencial",
"viewCredential": "Ver Credencial",
"duplicateCredential": "Duplicar Credencial",
"deleteCredential": "Excluir Credencial",
"updateCredential": "Atualizar Credencial",
"credentialName": "Nome da Credencial",
"credentialDescription": "Descrição",
"username": "Nome de Usuário",
"searchCredentials": "Pesquisar credenciais...",
"selectFolder": "Selecionar Pasta",
"selectAuthType": "Selecionar Tipo de Autenticação",
"allFolders": "Todas as Pastas",
"allAuthTypes": "Todos os Tipos de Autenticação",
"uncategorized": "Sem categoria",
"totalCredentials": "Total",
"keyBased": "Baseado em chave",
"passwordBased": "Baseado em senha",
"folders": "Pastas",
"noCredentialsMatchFilters": "Nenhuma credencial corresponde aos seus filtros",
"noCredentialsYet": "Nenhuma credencial criada ainda",
"createFirstCredential": "Crie sua primeira credencial",
"failedToFetchCredentials": "Falha ao buscar credenciais",
"credentialDeletedSuccessfully": "Credencial excluída com sucesso",
"failedToDeleteCredential": "Falha ao excluir credencial",
"confirmDeleteCredential": "Tem certeza que deseja excluir a credencial \"{{name}}\"?",
"credentialCreatedSuccessfully": "Credencial criada com sucesso",
"credentialUpdatedSuccessfully": "Credencial atualizada com sucesso",
"failedToSaveCredential": "Falha ao salvar credencial",
"failedToFetchCredentialDetails": "Falha ao buscar detalhes da credencial",
"failedToFetchHostsUsing": "Falha ao buscar hosts que usam esta credencial",
"loadingCredentials": "Carregando credenciais...",
"retry": "Tentar novamente",
"noCredentials": "Nenhuma Credencial",
"noCredentialsMessage": "Você ainda não adicionou nenhuma credencial. Clique em \"Adicionar Credencial\" para começar.",
"sshCredentials": "Credenciais SSH",
"credentialsCount": "{{count}} credenciais",
"refresh": "Atualizar",
"passwordRequired": "Senha é obrigatória",
"sshKeyRequired": "Chave SSH é obrigatória",
"credentialAddedSuccessfully": "Credencial \"{{name}}\" adicionada com sucesso",
"general": "Geral",
"description": "Descrição",
"folder": "Pasta",
"tags": "Tags",
"addTagsSpaceToAdd": "Adicionar tags (pressione espaço para adicionar)",
"password": "Senha",
"key": "Chave",
"sshPrivateKey": "Chave Privada SSH",
"upload": "Enviar",
"updateKey": "Atualizar Chave",
"keyPassword": "Senha da Chave (opcional)",
"keyType": "Tipo de Chave",
"keyTypeRSA": "RSA",
"keyTypeECDSA": "ECDSA",
"keyTypeEd25519": "Ed25519",
"updateCredential": "Atualizar Credencial",
"basicInfo": "Informações básicas",
"authentication": "Autenticação",
"organization": "Organização",
"basicInformation": "Informações Básicas",
"basicInformationDescription": "Insira as informações básicas para esta credencial",
"authenticationMethod": "Método de Autenticação",
"authenticationMethodDescription": "Escolha como deseja se autenticar em servidores SSH",
"organizationDescription": "Organize suas credenciais com pastas e tags",
"enterCredentialName": "Digite o nome da credencial",
"enterCredentialDescription": "Digite a descrição (opcional)",
"enterUsername": "Digite o nome de usuário",
"nameIsRequired": "O nome da credencial é obrigatório",
"usernameIsRequired": "Nome de usuário é obrigatório",
"authenticationType": "Tipo de Autenticação",
"passwordAuthDescription": "Usar autenticação por senha",
"sshKeyAuthDescription": "Usar autenticação por chave SSH",
"passwordIsRequired": "Senha é obrigatória",
"sshKeyIsRequired": "Chave SSH é obrigatória",
"sshKeyType": "Tipo de Chave SSH",
"privateKey": "Chave Privada",
"enterPassword": "Digite a senha",
"enterPrivateKey": "Digite a chave privada",
"keyPassphrase": "Frase de senha da chave",
"enterKeyPassphrase": "Digite a frase de senha da chave (opcional)",
"keyPassphraseOptional": "Opcional: deixe vazio se sua chave não tiver frase de senha",
"leaveEmptyToKeepCurrent": "Deixe vazio para manter o valor atual",
"uploadKeyFile": "Enviar Arquivo de Chave",
"generateKeyPairButton": "Gerar Par de Chaves",
"generateKeyPair": "Gerar Par de Chaves",
"generateKeyPairDescription": "Gerar um novo par de chaves SSH. Se você quiser proteger a chave com uma frase de senha, digite-a no campo Senha da Chave abaixo primeiro.",
"deploySSHKey": "Implantar Chave SSH",
"deploySSHKeyDescription": "Implantar chave pública no servidor de destino",
"sourceCredential": "Credencial de Origem",
"targetHost": "Host de Destino",
"deploymentProcess": "Processo de Implantação",
"deploymentProcessDescription": "Isso adicionará com segurança a chave pública ao arquivo ~/.ssh/authorized_keys do host de destino sem sobrescrever chaves existentes. A operação é reversível.",
"chooseHostToDeploy": "Escolha um host para implantar...",
"deploying": "Implantando...",
"name": "Nome",
"noHostsAvailable": "Nenhum host disponível",
"noHostsMatchSearch": "Nenhum host corresponde à sua pesquisa",
"sshKeyGenerationNotImplemented": "Recurso de geração de chaves SSH em breve",
"connectionTestingNotImplemented": "Recurso de teste de conexão em breve",
"testConnection": "Testar Conexão",
"selectOrCreateFolder": "Selecione ou crie pasta",
"noFolder": "Sem pasta",
"orCreateNewFolder": "Ou crie nova pasta",
"addTag": "Adicionar tag",
"saving": "Salvando...",
"overview": "Visão geral",
"security": "Segurança",
"usage": "Uso",
"securityDetails": "Detalhes de segurança",
"securityDetailsDescription": "Ver informações criptografadas da credencial",
"credentialSecured": "Credencial segura",
"credentialSecuredDescription": "Todos os dados sensíveis são criptografados com AES-256",
"passwordAuthentication": "Autenticação por senha",
"keyAuthentication": "Autenticação por chave",
"keyType": "Tipo de chave",
"securityReminder": "Lembrete de segurança",
"securityReminderText": "Nunca compartilhe suas credenciais. Todos os dados são criptografados em repouso.",
"hostsUsingCredential": "Hosts usando esta credencial",
"noHostsUsingCredential": "Nenhum host está usando esta credencial atualmente",
"timesUsed": "Vezes usado",
"lastUsed": "Último uso",
"connectedHosts": "Hosts conectados",
"created": "Criado",
"lastModified": "Última modificação",
"usageStatistics": "Estatísticas de uso",
"copiedToClipboard": "{{field}} copiado para a área de transferência",
"failedToCopy": "Falha ao copiar para a área de transferência",
"sshKey": "Chave SSH",
"createCredentialDescription": "Criar uma nova credencial SSH para acesso seguro",
"editCredentialDescription": "Atualizar as informações da credencial",
"listView": "Lista",
"folderView": "Pastas",
"unknownCredential": "Desconhecido",
"confirmRemoveFromFolder": "Tem certeza que deseja remover \"{{name}}\" da pasta \"{{folder}}\"? A credencial será movida para \"Sem categoria\".",
"removedFromFolder": "Credencial \"{{name}}\" removida da pasta com sucesso",
"failedToRemoveFromFolder": "Falha ao remover credencial da pasta",
"folderRenamed": "Pasta \"{{oldName}}\" renomeada para \"{{newName}}\" com sucesso",
"failedToRenameFolder": "Falha ao renomear pasta",
"movedToFolder": "Credencial \"{{name}}\" movida para \"{{folder}}\" com sucesso",
"failedToMoveToFolder": "Falha ao mover credencial para pasta",
"sshPublicKey": "Chave pública SSH",
"publicKeyNote": "A chave pública é opcional, mas recomendada para validação",
"publicKeyUploaded": "Chave pública enviada",
"uploadPublicKey": "Enviar chave pública",
"uploadPrivateKeyFile": "Enviar arquivo de chave privada",
"uploadPublicKeyFile": "Enviar arquivo de chave pública",
"privateKeyRequiredForGeneration": "A chave privada é necessária para gerar a chave pública",
"failedToGeneratePublicKey": "Falha ao gerar chave pública",
"generatePublicKey": "Gerar a partir da chave privada",
"publicKeyGeneratedSuccessfully": "Chave pública gerada com sucesso",
"detectedKeyType": "Tipo de chave detectado",
"detectingKeyType": "detectando...",
"optional": "Opcional",
"generateKeyPairNew": "Gerar novo par de chaves",
"generateEd25519": "Gerar Ed25519",
"generateECDSA": "Gerar ECDSA",
"generateRSA": "Gerar RSA",
"keyPairGeneratedSuccessfully": "Par de chaves {{keyType}} gerado com sucesso",
"failedToGenerateKeyPair": "Falha ao gerar par de chaves",
"generateKeyPairNote": "Gere um novo par de chaves SSH diretamente. Isso substituirá quaisquer chaves existentes no formulário.",
"invalidKey": "Chave inválida",
"detectionError": "Erro de detecção",
"unknown": "Desconhecido"
},
"dragIndicator": {
"error": "Erro: {{error}}",
"dragging": "Arrastando {{fileName}}",
"preparing": "Preparando {{fileName}}",
"readySingle": "Pronto para baixar {{fileName}}",
"readyMultiple": "Pronto para baixar {{count}} arquivos",
"batchDrag": "Arraste {{count}} arquivos para a área de trabalho",
"dragToDesktop": "Arraste para a área de trabalho",
"canDragAnywhere": "Você pode arrastar arquivos para qualquer lugar na sua área de trabalho"
},
"sshTools": {
"title": "Ferramentas SSH",
"closeTools": "Fechar Ferramentas SSH",
"keyRecording": "Gravação de Teclas",
"startKeyRecording": "Iniciar Gravação de Teclas",
"stopKeyRecording": "Parar Gravação de Teclas",
"selectTerminals": "Selecionar terminais:",
"typeCommands": "Digite comandos (todas as teclas suportadas):",
"commandsWillBeSent": "Os comandos serão enviados para {{count}} terminal(is) selecionado(s).",
"settings": "Configurações",
"enableRightClickCopyPaste": "Habilitar copiar/colar com botão direito",
"shareIdeas": "Tem ideias sobre o que deve vir a seguir nas ferramentas SSH? Compartilhe em"
},
"homepage": {
"loggedInTitle": "Conectado!",
"loggedInMessage": "Você está conectado! Use a barra lateral para acessar todas as ferramentas disponíveis. Para começar, crie um Host SSH na aba Gerenciador SSH. Depois de criado, você pode se conectar a esse host usando os outros apps na barra lateral.",
"failedToLoadAlerts": "Falha ao carregar alertas",
"failedToDismissAlert": "Falha ao dispensar alerta"
},
"serverConfig": {
"title": "Configuração do Servidor",
"description": "Configure a URL do servidor Termix para conectar aos serviços de backend",
"serverUrl": "URL do Servidor",
"enterServerUrl": "Por favor, insira uma URL do servidor",
"testConnectionFirst": "Por favor, teste a conexão primeiro",
"connectionSuccess": "Conexão bem-sucedida!",
"connectionFailed": "Conexão falhou",
"connectionError": "Ocorreu um erro de conexão",
"connected": "Conectado",
"disconnected": "Desconectado",
"configSaved": "Configuração salva com sucesso",
"saveFailed": "Falha ao salvar configuração",
"saveError": "Erro ao salvar configuração",
"saving": "Salvando...",
"saveConfig": "Salvar Configuração",
"helpText": "Digite a URL onde seu servidor Termix está rodando (ex.: http://localhost:30001 ou https://seu-servidor.com)"
},
"versionCheck": {
"error": "Erro na verificação de versão",
"checkFailed": "Falha ao verificar atualizações",
"upToDate": "Aplicativo atualizado",
"currentVersion": "Você está usando a versão {{version}}",
"updateAvailable": "Atualização disponível",
"newVersionAvailable": "Uma nova versão está disponível! Você está usando {{current}}, mas {{latest}} está disponível.",
"releasedOn": "Lançada em {{date}}",
"downloadUpdate": "Baixar Atualização",
"dismiss": "Fechar",
"checking": "Verificando atualizações...",
"checkUpdates": "Verificar Atualizações",
"checkingUpdates": "Verificando atualizações...",
"refresh": "Atualizar",
"updateRequired": "Atualização necessária",
"updateDismissed": "Notificação de atualização dispensada",
"noUpdatesFound": "Nenhuma atualização encontrada"
},
"common": {
"close": "Fechar",
"minimize": "Minimizar",
"online": "Online",
"offline": "Offline",
"continue": "Continuar",
"maintenance": "Manutenção",
"degraded": "Degradado",
"discord": "Discord",
"error": "Erro",
"warning": "Aviso",
"info": "Info",
"success": "Sucesso",
"loading": "Carregando",
"required": "Obrigatório",
"optional": "Opcional",
"clear": "Limpar",
"toggleSidebar": "Alternar Barra Lateral",
"sidebar": "Barra Lateral",
"home": "Início",
"expired": "Expirado",
"expiresToday": "Expira hoje",
"expiresTomorrow": "Expira amanhã",
"expiresInDays": "Expira em {{days}} dias",
"updateAvailable": "Atualização Disponível",
"sshPath": "Caminho SSH",
"localPath": "Caminho Local",
"loading": "Carregando...",
"noAuthCredentials": "Não há credenciais de autenticação disponíveis para este host SSH",
"noReleases": "Sem Versões",
"updatesAndReleases": "Atualizações e Versões",
"newVersionAvailable": "Uma nova versão ({{version}}) está disponível.",
"failedToFetchUpdateInfo": "Falha ao buscar informações de atualização",
"preRelease": "Pré-lançamento",
"loginFailed": "Falha no login",
"noReleasesFound": "Nenhuma versão encontrada.",
"yourBackupCodes": "Seus Códigos de Backup",
"sendResetCode": "Enviar Código de Redefinição",
"verifyCode": "Verificar Código",
"resetPassword": "Redefinir Senha",
"resetCode": "Código de Redefinição",
"newPassword": "Nova Senha",
"sshPath": "Caminho SSH",
"localPath": "Caminho Local",
"folder": "Pasta",
"file": "Arquivo",
"renamedSuccessfully": "renomeado com sucesso",
"deletedSuccessfully": "excluído com sucesso",
"noAuthCredentials": "Não há credenciais de autenticação disponíveis para este host SSH",
"noTunnelConnections": "Não há conexões de túnel configuradas",
"sshTools": "Ferramentas SSH",
"english": "Inglês",
"chinese": "Chinês",
"german": "Alemão",
"cancel": "Cancelar",
"username": "Usuário",
"name": "Nome",
"login": "Entrar",
"logout": "Sair",
"register": "Registrar",
"username": "Usuário",
"password": "Senha",
"version": "Versão",
"confirmPassword": "Confirmar Senha",
"back": "Voltar",
"email": "Email",
"submit": "Enviar",
"cancel": "Cancelar",
"change": "Alterar",
"save": "Salvar",
"delete": "Excluir",
"edit": "Editar",
"add": "Adicionar",
"search": "Buscar",
"loading": "Carregando...",
"error": "Erro",
"success": "Sucesso",
"warning": "Aviso",
"info": "Info",
"confirm": "Confirmar",
"yes": "Sim",
"no": "Não",
"ok": "OK",
"close": "Fechar",
"enabled": "Habilitado",
"disabled": "Desabilitado",
"important": "Importante",
"notEnabled": "Não Habilitado",
"settingUp": "Configurando...",
"back": "Voltar",
"next": "Próximo",
"previous": "Anterior",
"refresh": "Atualizar",
"connect": "Conectar",
"connecting": "Conectando...",
"settings": "Configurações",
"profile": "Perfil",
"help": "Ajuda",
"about": "Sobre",
"language": "Idioma",
"autoDetect": "Detecção Automática",
"changeAccountPassword": "Alterar senha da conta",
"passwordResetTitle": "Redefinir Senha",
"passwordResetDescription": "Você está prestes a redefinir sua senha. Isso fará com que você seja desconectado de todas as sessões ativas.",
"enterSixDigitCode": "Digite o código de 6 dígitos dos logs do container docker para o usuário:",
"enterNewPassword": "Digite sua nova senha para o usuário:",
"passwordsDoNotMatch": "As senhas não correspondem",
"passwordMinLength": "A senha deve ter pelo menos 6 caracteres",
"passwordResetSuccess": "Senha redefinida com sucesso! Você pode agora entrar com sua nova senha.",
"failedToInitiatePasswordReset": "Falha ao iniciar redefinição de senha",
"failedToVerifyResetCode": "Falha ao verificar código de redefinição",
"failedToCompletePasswordReset": "Falha ao completar redefinição de senha",
"documentation": "Documentação",
"retry": "Tentar Novamente",
"checking": "Verificando...",
"checkingDatabase": "Verificando conexão com o banco de dados..."
},
"nav": {
"home": "Início",
"hosts": "Hosts",
"credentials": "Credenciais",
"terminal": "Terminal",
"tunnels": "Túneis",
"fileManager": "Gerenciador de Arquivos",
"serverStats": "Estatísticas do Servidor",
"admin": "Admin",
"userProfile": "Perfil do Usuário",
"tools": "Ferramentas",
"newTab": "Nova Aba",
"splitScreen": "Dividir Tela",
"closeTab": "Fechar Aba",
"sshManager": "Gerenciador SSH",
"hostManager": "Gerenciador de Hosts",
"cannotSplitTab": "Não é possível dividir esta aba",
"tabNavigation": "Navegação de Abas"
},
"admin": {
"title": "Configurações de Admin",
"oidc": "OIDC",
"users": "Usuários",
"userManagement": "Gerenciamento de Usuários",
"makeAdmin": "Tornar Admin",
"removeAdmin": "Remover Admin",
"deleteUser": "Excluir Usuário",
"allowRegistration": "Permitir Registro",
"oidcSettings": "Configurações OIDC",
"clientId": "ID do Cliente",
"clientSecret": "Segredo do Cliente",
"issuerUrl": "URL do Emissor",
"authorizationUrl": "URL de Autorização",
"tokenUrl": "URL do Token",
"updateSettings": "Atualizar Configurações",
"confirmDelete": "Tem certeza que deseja excluir este usuário?",
"confirmMakeAdmin": "Tem certeza que deseja tornar este usuário um admin?",
"confirmRemoveAdmin": "Tem certeza que deseja remover os privilégios de admin deste usuário?",
"externalAuthentication": "Autenticação Externa (OIDC)",
"configureExternalProvider": "Configure o provedor de identidade externo para autenticação OIDC/OAuth2.",
"userIdentifierPath": "Caminho do Identificador do Usuário",
"displayNamePath": "Caminho do Nome de Exibição",
"scopes": "Escopos",
"saving": "Salvando...",
"saveConfiguration": "Salvar Configuração",
"reset": "Redefinir",
"success": "Sucesso",
"loading": "Carregando...",
"refresh": "Atualizar",
"loadingUsers": "Carregando usuários...",
"username": "Usuário",
"type": "Tipo",
"actions": "Ações",
"external": "Externo",
"local": "Local",
"adminManagement": "Gerenciamento de Admin",
"makeUserAdmin": "Tornar Usuário Admin",
"adding": "Adicionando...",
"currentAdmins": "Admins Atuais",
"adminBadge": "Admin",
"removeAdminButton": "Remover Admin",
"general": "Geral",
"userRegistration": "Registro de Usuário",
"allowNewAccountRegistration": "Permitir registro de novas contas",
"missingRequiredFields": "Campos obrigatórios faltando: {{fields}}",
"oidcConfigurationUpdated": "Configuração OIDC atualizada com sucesso!",
"failedToFetchOidcConfig": "Falha ao buscar configuração OIDC",
"failedToFetchRegistrationStatus": "Falha ao buscar status do registro",
"failedToFetchUsers": "Falha ao buscar usuários",
"oidcConfigurationDisabled": "Configuração OIDC desativada com sucesso!",
"failedToUpdateOidcConfig": "Falha ao atualizar configuração OIDC",
"failedToDisableOidcConfig": "Falha ao desativar configuração OIDC",
"enterUsernameToMakeAdmin": "Insira o nome de usuário para tornar admin",
"userIsNowAdmin": "O usuário {{username}} agora é um administrador",
"failedToMakeUserAdmin": "Falha ao tornar o usuário administrador",
"removeAdminStatus": "Remover status de administrador de {{username}}?",
"adminStatusRemoved": "Status de administrador removido de {{username}}",
"failedToRemoveAdminStatus": "Falha ao remover o status de administrador",
"confirmDeleteUser": "Excluir usuário {{username}}? Esta ação não pode ser desfeita.",
"userDeletedSuccessfully": "Usuário {{username}} excluído com sucesso",
"failedToDeleteUser": "Falha ao excluir usuário",
"overrideUserInfoUrl": "Sobrescrever URL de informações do usuário (não obrigatório)",
"databaseSecurity": "Segurança do Banco de Dados",
"encryptionStatus": "Status da Criptografia",
"encryptionEnabled": "Criptografia Ativada",
"enabled": "Ativado",
"disabled": "Desativado",
"keyId": "ID da Chave",
"created": "Criado",
"migrationStatus": "Status da Migração",
"migrationCompleted": "Migração concluída",
"migrationRequired": "Migração necessária",
"deviceProtectedMasterKey": "Chave Mestra Protegida pelo Ambiente",
"legacyKeyStorage": "Armazenamento de Chave Legado",
"masterKeyEncryptedWithDeviceFingerprint": "Chave mestra criptografada com impressão digital do ambiente (proteção KEK ativa)",
"keyNotProtectedByDeviceBinding": "Chave não protegida pela vinculação ao ambiente (atualização recomendada)",
"valid": "Válido",
"initializeDatabaseEncryption": "Initialize Database Encryption",
"enableAes256EncryptionWithDeviceBinding": "Ativar criptografia AES-256 com proteção de chave mestra vinculada ao ambiente. Isso cria segurança de nível empresarial para chaves SSH, senhas e tokens de autenticação.",
"featuresEnabled": "Recursos ativados:",
"aes256GcmAuthenticatedEncryption": "Criptografia autenticada AES-256-GCM",
"deviceFingerprintMasterKeyProtection": "Proteção de chave mestra por impressão digital do ambiente (KEK)",
"pbkdf2KeyDerivation": "Derivação de chave PBKDF2 com 100K iterações",
"automaticKeyManagement": "Gerenciamento e rotação automática de chaves",
"initializing": "Inicializando...",
"initializeEnterpriseEncryption": "Inicializar Criptografia Empresarial",
"migrateExistingData": "Migrar Dados Existentes",
"encryptExistingUnprotectedData": "Criptografar dados não protegidos existentes no seu banco de dados. Este processo é seguro e cria backups automáticos.",
"testMigrationDryRun": "Verificar Compatibilidade de Criptografia",
"migrating": "Migrando...",
"migrateData": "Migrar Dados",
"securityInformation": "Informações de Segurança",
"sshPrivateKeysEncryptedWithAes256": "Chaves privadas SSH e senhas são criptografadas com AES-256-GCM",
"userAuthTokensProtected": "Tokens de autenticação do usuário e segredos 2FA são protegidos",
"masterKeysProtectedByDeviceFingerprint": "Chaves mestras de criptografia são protegidas pela impressão digital do dispositivo (KEK)",
"keysBoundToServerInstance": "Chaves estão vinculadas ao ambiente do servidor atual (migráveis via variáveis de ambiente)",
"pbkdf2HkdfKeyDerivation": "Derivação de chave PBKDF2 + HKDF com 100K iterações",
"backwardCompatibleMigration": "Todos os dados permanecem compatíveis durante a migração",
"enterpriseGradeSecurityActive": "Segurança de Nível Empresarial Ativa",
"masterKeysProtectedByDeviceBinding": "Suas chaves mestras de criptografia são protegidas pela impressão digital do ambiente. Isso usa o nome do host do servidor, caminhos e outras informações do ambiente para gerar chaves de proteção. Para migrar servidores, defina a variável de ambiente DB_ENCRYPTION_KEY no novo servidor.",
"important": "Importante",
"keepEncryptionKeysSecure": "Garanta a segurança dos dados: faça backup regularmente dos arquivos do banco de dados e da configuração do servidor. Para migrar para um novo servidor, defina a variável de ambiente DB_ENCRYPTION_KEY no novo ambiente, ou mantenha a mesma estrutura de nome de host e diretório.",
"loadingEncryptionStatus": "Carregando status da criptografia...",
"testMigrationDescription": "Verifique se os dados existentes podem ser migrados com segurança para o formato criptografado sem realmente modificar nenhum dado",
"serverMigrationGuide": "Guia de Migração do Servidor",
"migrationInstructions": "Para migrar dados criptografados para um novo servidor: 1) Faça backup dos arquivos do banco de dados, 2) Defina a variável de ambiente DB_ENCRYPTION_KEY=\"sua-chave\" no novo servidor, 3) Restaure os arquivos do banco de dados",
"environmentProtection": "Proteção do Ambiente",
"environmentProtectionDesc": "Protege as chaves de criptografia com base nas informações do ambiente do servidor (nome do host, caminhos, etc.), migráveis via variáveis de ambiente",
"verificationCompleted": "Verificação de compatibilidade concluída - nenhum dado foi alterado",
"verificationInProgress": "Verificação concluída",
"dataMigrationCompleted": "Migração de dados concluída com sucesso!",
"migrationCompleted": "Migração concluída",
"verificationFailed": "Falha na verificação de compatibilidade",
"migrationFailed": "Falha na migração",
"runningVerification": "Executando verificação de compatibilidade...",
"startingMigration": "Iniciando migração...",
"hardwareFingerprintSecurity": "Segurança por Impressão Digital de Hardware",
"hardwareBoundEncryption": "Criptografia Vinculada ao Hardware Ativa",
"masterKeysNowProtectedByHardwareFingerprint": "As chaves mestras agora são protegidas por impressão digital real do hardware em vez de variáveis de ambiente",
"cpuSerialNumberDetection": "Detecção do número de série da CPU",
"motherboardUuidIdentification": "Identificação UUID da placa-mãe",
"diskSerialNumberVerification": "Verificação do número de série do disco",
"biosSerialNumberCheck": "Verificação do número de série da BIOS",
"stableMacAddressFiltering": "Filtragem de endereço MAC estável",
"databaseFileEncryption": "Criptografia de Arquivo do Banco de Dados",
"dualLayerProtection": "Proteção em Duas Camadas Ativa",
"bothFieldAndFileEncryptionActive": "Tanto a criptografia em nível de campo quanto em nível de arquivo estão ativas para máxima segurança",
"fieldLevelAes256Encryption": "Criptografia AES-256 em nível de campo para dados sensíveis",
"fileLevelDatabaseEncryption": "Criptografia do banco de dados em nível de arquivo com vinculação ao hardware",
"hardwareBoundFileKeys": "Chaves de criptografia de arquivo vinculadas ao hardware",
"automaticEncryptedBackups": "Criação automática de backup criptografado",
"createEncryptedBackup": "Criar Backup Criptografado",
"creatingBackup": "Criando Backup...",
"backupCreated": "Backup Criado",
"encryptedBackupCreatedSuccessfully": "Backup criptografado criado com sucesso",
"backupCreationFailed": "Falha na criação do backup",
"databaseMigration": "Migração do Banco de Dados",
"exportForMigration": "Exportar para Migração",
"exportDatabaseForHardwareMigration": "Exportar banco de dados como arquivo SQLite com dados descriptografados para migração para novo hardware",
"exportDatabase": "Exportar Banco de Dados SQLite",
"exporting": "Exportando...",
"exportCreated": "Exportação SQLite Criada",
"exportContainsDecryptedData": "A exportação SQLite contém dados descriptografados - mantenha seguro!",
"databaseExportedSuccessfully": "Banco de dados SQLite exportado com sucesso",
"databaseExportFailed": "Falha na exportação do banco de dados SQLite",
"importFromMigration": "Importar da Migração",
"importDatabaseFromAnotherSystem": "Importar banco de dados SQLite de outro sistema ou hardware",
"importDatabase": "Importar Banco de Dados SQLite",
"importing": "Importando...",
"selectedFile": "Arquivo SQLite Selecionado",
"importWillReplaceExistingData": "A importação SQLite substituirá os dados existentes - backup recomendado!",
"pleaseSelectImportFile": "Por favor, selecione um arquivo SQLite para importar",
"databaseImportedSuccessfully": "Banco de dados SQLite importado com sucesso",
"databaseImportFailed": "Falha na importação do banco de dados SQLite",
"manageEncryptionAndBackups": "Gerenciar chaves de criptografia, segurança do banco de dados e operações de backup",
"activeSecurityFeatures": "Medidas e proteções de segurança atualmente ativas",
"deviceBindingTechnology": "Tecnologia avançada de proteção de chave baseada em hardware",
"backupAndRecovery": "Opções seguras de criação de backup e recuperação de banco de dados",
"crossSystemDataTransfer": "Exportar e importar bancos de dados entre diferentes sistemas",
"noMigrationNeeded": "Nenhuma migração necessária",
"encryptionKey": "Chave de Criptografia",
"keyProtection": "Proteção da Chave",
"active": "Ativo",
"legacy": "Legado",
"dataStatus": "Status dos Dados",
"encrypted": "Criptografado",
"needsMigration": "Necessita Migração",
"ready": "Pronto",
"initializeEncryption": "Inicializar Criptografia",
"initialize": "Inicializar",
"test": "Testar",
"migrate": "Migrar",
"backup": "Backup",
"createBackup": "Criar Backup",
"exportImport": "Exportar/Importar",
"export": "Exportar",
"import": "Importar",
"passwordRequired": "Senha necessária",
"confirmExport": "Confirmar Exportação",
"exportDescription": "Exportar hosts SSH e credenciais como arquivo SQLite",
"importDescription": "Importar arquivo SQLite com mesclagem incremental (ignora duplicados)",
"criticalWarning": "Aviso Crítico",
"cannotDisablePasswordLoginWithoutOIDC": "Não é possível desativar o login por senha sem OIDC configurado! Você deve configurar a autenticação OIDC antes de desativar o login por senha, ou perderá o acesso ao Termix.",
"confirmDisablePasswordLogin": "Tem certeza que deseja desativar o login por senha? Certifique-se de que o OIDC está configurado corretamente e funcionando antes de continuar, ou você perderá o acesso à sua instância do Termix.",
"passwordLoginDisabled": "Login por senha desativado com sucesso",
"passwordLoginAndRegistrationDisabled": "Login por senha e registro de novas contas desativados com sucesso",
"requiresPasswordLogin": "Requer login por senha ativado",
"passwordLoginDisabledWarning": "Login por senha está desativado. Certifique-se de que o OIDC está configurado corretamente ou você não conseguirá fazer login no Termix.",
"oidcRequiredWarning": "CRÍTICO: Login por senha está desativado. Se você redefinir ou configurar incorretamente o OIDC, você perderá todo o acesso ao Termix e inutilizará sua instância. Prossiga apenas se tiver absoluta certeza.",
"confirmDisableOIDCWarning": "AVISO: Você está prestes a desativar o OIDC enquanto o login por senha também está desativado. Isso inutilizará sua instância do Termix e você perderá todo o acesso. Tem absoluta certeza de que deseja continuar?",
"allowPasswordLogin": "Permitir login com nome de usuário/senha",
"failedToFetchPasswordLoginStatus": "Falha ao buscar status do login por senha",
"failedToUpdatePasswordLoginStatus": "Falha ao atualizar status do login por senha"
},
"hosts": {
"title": "Gerenciador de Hosts",
"sshHosts": "Hosts SSH",
"noHosts": "Sem Hosts SSH",
"noHostsMessage": "Você ainda não adicionou nenhum host SSH. Clique em \"Adicionar Host\" para começar.",
"loadingHosts": "Carregando hosts...",
"failedToLoadHosts": "Falha ao carregar hosts",
"retry": "Tentar Novamente",
"refresh": "Atualizar",
"hostsCount": "{{count}} hosts",
"importJson": "Importar JSON",
"importing": "Importando...",
"importJsonTitle": "Importar Hosts SSH do JSON",
"importJsonDesc": "Envie um arquivo JSON para importar vários hosts SSH de uma vez (máx. 100).",
"downloadSample": "Baixar Exemplo",
"formatGuide": "Guia de Formato",
"exportCredentialWarning": "Aviso: O host \"{{name}}\" usa autenticação por credencial. O arquivo exportado não incluirá os dados da credencial e precisará ser reconfigurado manualmente após a importação. Deseja continuar?",
"exportSensitiveDataWarning": "Aviso: O host \"{{name}}\" contém dados de autenticação sensíveis (senha/chave SSH). O arquivo exportado incluirá esses dados em texto simples. Mantenha o arquivo seguro e exclua-o após o uso. Deseja continuar?",
"uncategorized": "Sem categoria",
"confirmDelete": "Tem certeza que deseja excluir \"{{name}}\"?",
"failedToDeleteHost": "Falha ao excluir host",
"failedToExportHost": "Falha ao exportar host. Certifique-se de que está logado e tem acesso aos dados do host.",
"jsonMustContainHosts": "O JSON deve conter um array \"hosts\" ou ser um array de hosts",
"noHostsInJson": "Nenhum host encontrado no arquivo JSON",
"maxHostsAllowed": "Máximo de 100 hosts permitidos por importação",
"importCompleted": "Importação concluída: {{success}} com sucesso, {{failed}} falhas",
"importFailed": "Falha na importação",
"importError": "Erro na importação",
"failedToImportJson": "Falha ao importar arquivo JSON",
"connectionDetails": "Detalhes da Conexão",
"organization": "Organização",
"ipAddress": "Endereço IP",
"port": "Porta",
"name": "Nome",
"username": "Usuário",
"folder": "Pasta",
"tags": "Tags",
"pin": "Fixar",
"passwordRequired": "Senha é obrigatória quando usar autenticação por senha",
"sshKeyRequired": "Chave Privada SSH é obrigatória quando usar autenticação por chave",
"keyTypeRequired": "Tipo de Chave é obrigatório quando usar autenticação por chave",
"mustSelectValidSshConfig": "Deve selecionar uma configuração SSH válida da lista",
"addHost": "Adicionar Host",
"editHost": "Editar Host",
"cloneHost": "Clonar Host",
"updateHost": "Atualizar Host",
"hostUpdatedSuccessfully": "Host \"{{name}}\" atualizado com sucesso!",
"hostAddedSuccessfully": "Host \"{{name}}\" adicionado com sucesso!",
"hostDeletedSuccessfully": "Host \"{{name}}\" excluído com sucesso!",
"failedToSaveHost": "Falha ao salvar host. Por favor, tente novamente.",
"enableTerminal": "Habilitar Terminal",
"enableTerminalDesc": "Habilitar/desabilitar visibilidade do host na aba Terminal",
"enableTunnel": "Habilitar Túnel",
"enableTunnelDesc": "Habilitar/desabilitar visibilidade do host na aba Túnel",
"enableFileManager": "Habilitar Gerenciador de Arquivos",
"enableFileManagerDesc": "Habilitar/desabilitar visibilidade do host na aba Gerenciador de Arquivos",
"defaultPath": "Caminho Padrão",
"defaultPathDesc": "Diretório padrão ao abrir o gerenciador de arquivos para este host",
"tunnelConnections": "Conexões de Túnel",
"connection": "Conexão",
"remove": "Remover",
"sourcePort": "Porta de Origem",
"sourcePortDesc": "(Source refere-se aos Detalhes da Conexão Atual na aba Geral)",
"endpointPort": "Porta de Destino",
"endpointSshConfig": "Configuração SSH do Endpoint",
"tunnelForwardDescription": "Este túnel encaminhará o tráfego da porta {{sourcePort}} na máquina de origem (detalhes da conexão atual na aba Geral) para a porta {{endpointPort}} na máquina de destino.",
"maxRetries": "Máximo de Tentativas",
"maxRetriesDescription": "Número máximo de tentativas de reconexão para a conexão do túnel.",
"retryInterval": "Intervalo de Tentativas (segundos)",
"retryIntervalDescription": "Tempo de espera entre tentativas de reconexão.",
"autoStartContainer": "Iniciar Automaticamente ao Lançar Container",
"autoStartDesc": "Iniciar automaticamente este túnel quando o container for iniciado",
"addConnection": "Adicionar Conexão de Túnel",
"sshpassRequired": "sshpass é necessário para autenticação por senha",
"sshpassRequiredDesc": "Para autenticação por senha em túneis, o sshpass deve estar instalado no sistema.",
"otherInstallMethods": "Outros métodos de instalação:",
"debianUbuntuEquivalent": "(Debian/Ubuntu) ou o equivalente para seu SO.",
"or": "ou",
"centosRhelFedora": "CentOS/RHEL/Fedora",
"macos": "macOS",
"windows": "Windows",
"sshServerConfigRequired": "Configuração do Servidor SSH Necessária",
"sshServerConfigDesc": "Para conexões de túnel, o servidor SSH deve ser configurado para permitir o encaminhamento de porta:",
"gatewayPortsYes": "para vincular portas remotas a todas as interfaces",
"allowTcpForwardingYes": "para habilitar o encaminhamento de porta",
"permitRootLoginYes": "se estiver usando usuário root para tunelamento",
"editSshConfig": "Edite /etc/ssh/sshd_config e reinicie o SSH: sudo systemctl restart sshd",
"upload": "Enviar",
"authentication": "Autenticação",
"password": "Senha",
"key": "Chave",
"credential": "Credencial",
"none": "Nenhum",
"selectCredential": "Selecionar Credencial",
"selectCredentialPlaceholder": "Escolha uma credencial...",
"credentialRequired": "Credencial é obrigatória ao usar autenticação por credencial",
"credentialDescription": "Selecionar uma credencial irá sobrescrever o nome de usuário atual e usar os detalhes de autenticação da credencial.",
"sshPrivateKey": "Chave Privada SSH",
"keyPassword": "Senha da Chave",
"keyType": "Tipo de Chave",
"autoDetect": "Detecção Automática",
"rsa": "RSA",
"ed25519": "ED25519",
"ecdsaNistP256": "ECDSA NIST P-256",
"ecdsaNistP384": "ECDSA NIST P-384",
"ecdsaNistP521": "ECDSA NIST P-521",
"dsa": "DSA",
"rsaSha2256": "RSA SHA2-256",
"rsaSha2512": "RSA SHA2-512",
"uploadFile": "Enviar Arquivo",
"pasteKey": "Colar Chave",
"updateKey": "Atualizar Chave",
"existingKey": "Chave Existente (clique para alterar)",
"existingCredential": "Credencial Existente (clique para alterar)",
"addTagsSpaceToAdd": "adicionar tags (espaço para adicionar)",
"terminalBadge": "Terminal",
"tunnelBadge": "Túnel",
"fileManagerBadge": "Gerenciador de Arquivos",
"general": "Geral",
"terminal": "Terminal",
"tunnel": "Túnel",
"fileManager": "Gerenciador de Arquivos",
"hostViewer": "Visualizador de Host",
"confirmRemoveFromFolder": "Tem certeza que deseja remover \"{{name}}\" da pasta \"{{folder}}\"? O host será movido para \"Sem Pasta\".",
"removedFromFolder": "Host \"{{name}}\" removido da pasta com sucesso",
"failedToRemoveFromFolder": "Falha ao remover host da pasta",
"folderRenamed": "Pasta \"{{oldName}}\" renomeada para \"{{newName}}\" com sucesso",
"failedToRenameFolder": "Falha ao renomear pasta",
"movedToFolder": "Host \"{{name}}\" movido para \"{{folder}}\" com sucesso",
"failedToMoveToFolder": "Falha ao mover host para a pasta",
"statistics": "Estatísticas",
"enabledWidgets": "Widgets Habilitados",
"enabledWidgetsDesc": "Selecione quais widgets de estatísticas exibir para este host",
"monitoringConfiguration": "Configuração de Monitoramento",
"monitoringConfigurationDesc": "Configure com que frequência as estatísticas e o status do servidor são verificados",
"statusCheckEnabled": "Habilitar Monitoramento de Status",
"statusCheckEnabledDesc": "Verificar se o servidor está online ou offline",
"statusCheckInterval": "Intervalo de Verificação de Status",
"statusCheckIntervalDesc": "Com que frequência verificar se o host está online (5s - 1h)",
"metricsEnabled": "Habilitar Monitoramento de Métricas",
"metricsEnabledDesc": "Coletar estatísticas de CPU, RAM, disco e outros sistemas",
"metricsInterval": "Intervalo de Coleta de Métricas",
"metricsIntervalDesc": "Com que frequência coletar estatísticas do servidor (5s - 1h)",
"intervalSeconds": "segundos",
"intervalMinutes": "minutos",
"intervalValidation": "Os intervalos de monitoramento devem estar entre 5 segundos e 1 hora (3600 segundos)",
"monitoringDisabled": "O monitoramento do servidor está desabilitado para este host",
"enableMonitoring": "Habilite o monitoramento em Gerenciador de Hosts → aba Estatísticas",
"monitoringDisabledBadge": "Monitoramento Desligado",
"statusMonitoring": "Status",
"metricsMonitoring": "Métricas",
"terminalCustomizationNotice": "Nota: As personalizações do terminal funcionam apenas na versão Desktop Website. Aplicativos Mobile e Electron usam as configurações padrão do terminal do sistema.",
"noneAuthTitle": "Autenticação Interativa por Teclado",
"noneAuthDescription": "Este método de autenticação usará autenticação interativa por teclado ao conectar ao servidor SSH.",
"noneAuthDetails": "A autenticação interativa por teclado permite que o servidor solicite credenciais durante a conexão. Isso é útil para servidores que requerem autenticação multifator ou entrada de senha dinâmica.",
"forceKeyboardInteractive": "Forçar Interativo com Teclado",
"forceKeyboardInteractiveDesc": "Força o uso da autenticação interativa com teclado. Isso é frequentemente necessário para servidores que usam Autenticação de Dois Fatores (TOTP/2FA)."
},
"terminal": {
"title": "Terminal",
"connect": "Conectar ao Host",
"disconnect": "Desconectar",
"clear": "Limpar",
"copy": "Copiar",
"paste": "Colar",
"find": "Localizar",
"fullscreen": "Tela Cheia",
"splitHorizontal": "Dividir Horizontalmente",
"splitVertical": "Dividir Verticalmente",
"closePanel": "Fechar Painel",
"reconnect": "Reconectar",
"sessionEnded": "Sessão Encerrada",
"connectionLost": "Conexão Perdida",
"error": "ERRO: {{message}}",
"disconnected": "Desconectado",
"connectionClosed": "Conexão fechada",
"connectionError": "Erro de conexão: {{message}}",
"connected": "Conectado",
"sshConnected": "Conexão SSH estabelecida",
"authError": "Falha na autenticação: {{message}}",
"unknownError": "Ocorreu um erro desconhecido",
"messageParseError": "Falha ao analisar mensagem do servidor",
"websocketError": "Erro na conexão WebSocket",
"connecting": "Conectando...",
"reconnecting": "Reconectando... ({{attempt}}/{{max}})",
"reconnected": "Reconectado com sucesso",
"maxReconnectAttemptsReached": "Número máximo de tentativas de reconexão atingido",
"connectionTimeout": "Tempo limite de conexão esgotado",
"terminalTitle": "Terminal - {{host}}",
"terminalWithPath": "Terminal - {{host}}:{{path}}",
"runTitle": "Executando {{command}} - {{host}}"
},
"fileManager": {
"title": "Gerenciador de Arquivos",
"file": "Arquivo",
"folder": "Pasta",
"connectToSsh": "Conecte-se ao SSH para usar operações de arquivo",
"uploadFile": "Enviar Arquivo",
"downloadFile": "Baixar",
"edit": "Editar",
"preview": "Visualizar",
"previous": "Anterior",
"next": "Próximo",
"pageXOfY": "Página {{current}} de {{total}}",
"zoomOut": "Diminuir Zoom",
"zoomIn": "Aumentar Zoom",
"newFile": "Novo Arquivo",
"newFolder": "Nova Pasta",
"rename": "Renomear",
"renameItem": "Renomear Item",
"deleteItem": "Excluir Item",
"currentPath": "Caminho Atual",
"uploadFileTitle": "Enviar Arquivo",
"maxFileSize": "Máx: 1GB (JSON) / 5GB (Binário) - Arquivos grandes suportados",
"removeFile": "Remover Arquivo",
"clickToSelectFile": "Clique para selecionar um arquivo",
"chooseFile": "Escolher Arquivo",
"uploading": "Enviando...",
"downloading": "Baixando...",
"uploadingFile": "Enviando {{name}}...",
"uploadingLargeFile": "Enviando arquivo grande {{name}} ({{size}})...",
"downloadingFile": "Baixando {{name}}...",
"creatingFile": "Criando {{name}}...",
"creatingFolder": "Criando {{name}}...",
"deletingItem": "Excluindo {{type}} {{name}}...",
"renamingItem": "Renomeando {{type}} {{oldName}} para {{newName}}...",
"createNewFile": "Criar Novo Arquivo",
"fileName": "Nome do Arquivo",
"creating": "Criando...",
"createFile": "Criar Arquivo",
"createNewFolder": "Criar Nova Pasta",
"folderName": "Nome da Pasta",
"createFolder": "Criar Pasta",
"warningCannotUndo": "Aviso: Esta ação não pode ser desfeita",
"itemPath": "Caminho do Item",
"thisIsDirectory": "Isto é um diretório (será excluído recursivamente)",
"deleting": "Excluindo...",
"currentPathLabel": "Caminho Atual",
"newName": "Novo Nome",
"thisIsDirectoryRename": "Isto é um diretório",
"renaming": "Renomeando...",
"fileUploadedSuccessfully": "Arquivo \"{{name}}\" enviado com sucesso",
"failedToUploadFile": "Falha ao enviar arquivo",
"fileDownloadedSuccessfully": "Arquivo \"{{name}}\" baixado com sucesso",
"failedToDownloadFile": "Falha ao baixar arquivo",
"noFileContent": "Nenhum conteúdo de arquivo recebido",
"filePath": "Caminho do Arquivo",
"fileCreatedSuccessfully": "Arquivo \"{{name}}\" criado com sucesso",
"failedToCreateFile": "Falha ao criar arquivo",
"folderCreatedSuccessfully": "Pasta \"{{name}}\" criada com sucesso",
"failedToCreateFolder": "Falha ao criar pasta",
"failedToCreateItem": "Falha ao criar item",
"operationFailed": "Operação {{operation}} falhou para {{name}}: {{error}}",
"failedToResolveSymlink": "Falha ao resolver link simbólico",
"itemDeletedSuccessfully": "{{type}} excluído com sucesso",
"itemsDeletedSuccessfully": "{{count}} itens excluídos com sucesso",
"failedToDeleteItems": "Falha ao excluir itens",
"dragFilesToUpload": "Arraste arquivos aqui para enviar",
"emptyFolder": "Esta pasta está vazia",
"itemCount": "{{count}} itens",
"selectedCount": "{{count}} selecionados",
"searchFiles": "Pesquisar arquivos...",
"upload": "Enviar",
"selectHostToStart": "Selecione um host para iniciar o gerenciamento de arquivos",
"failedToConnect": "Falha ao conectar ao SSH",
"failedToLoadDirectory": "Falha ao carregar diretório",
"noSSHConnection": "Nenhuma conexão SSH disponível",
"enterFolderName": "Digite o nome da pasta:",
"enterFileName": "Digite o nome do arquivo:",
"copy": "Copiar",
"cut": "Recortar",
"paste": "Colar",
"delete": "Excluir",
"properties": "Propriedades",
"preview": "Visualizar",
"refresh": "Atualizar",
"downloadFiles": "Baixar {{count}} arquivos para o Navegador",
"copyFiles": "Copiar {{count}} itens",
"cutFiles": "Recortar {{count}} itens",
"deleteFiles": "Excluir {{count}} itens",
"filesCopiedToClipboard": "{{count}} itens copiados para a área de transferência",
"filesCutToClipboard": "{{count}} itens recortados para a área de transferência",
"movedItems": "{{count}} itens movidos",
"failedToDeleteItem": "Falha ao excluir item",
"itemRenamedSuccessfully": "{{type}} renomeado com sucesso",
"failedToRenameItem": "Falha ao renomear item",
"upload": "Enviar",
"download": "Baixar",
"newFile": "Novo Arquivo",
"newFolder": "Nova Pasta",
"rename": "Renomear",
"delete": "Excluir",
"permissions": "Permissões",
"size": "Tamanho",
"modified": "Modificado",
"path": "Caminho",
"fileName": "Nome do Arquivo",
"folderName": "Nome da Pasta",
"confirmDelete": "Tem certeza que deseja excluir {{name}}?",
"uploadSuccess": "Arquivo enviado com sucesso",
"uploadFailed": "Falha ao enviar arquivo",
"downloadSuccess": "Arquivo baixado com sucesso",
"downloadFailed": "Falha ao baixar arquivo",
"permissionDenied": "Permissão negada",
"checkDockerLogs": "Verifique os logs do Docker para informações detalhadas do erro",
"internalServerError": "Ocorreu um erro interno do servidor",
"serverError": "Erro do Servidor",
"error": "Erro",
"requestFailed": "Requisição falhou com código de status",
"unknownFileError": "desconhecido",
"cannotReadFile": "Não é possível ler o arquivo",
"noSshSessionId": "Nenhum ID de sessão SSH disponível",
"noFilePath": "Nenhum caminho de arquivo disponível",
"noCurrentHost": "Nenhum host atual disponível",
"fileSavedSuccessfully": "Arquivo salvo com sucesso",
"saveTimeout": "Tempo limite da operação de salvamento esgotado. O arquivo pode ter sido salvo com sucesso, mas a operação demorou muito para ser concluída. Verifique os logs do Docker para confirmação.",
"failedToSaveFile": "Falha ao salvar arquivo",
"folder": "Pasta",
"file": "Arquivo",
"deletedSuccessfully": "excluído com sucesso",
"failedToDeleteItem": "Falha ao excluir item",
"connectToServer": "Conectar a um Servidor",
"selectServerToEdit": "Selecione um servidor da barra lateral para começar a editar arquivos",
"fileOperations": "Operações de Arquivo",
"confirmDeleteMessage": "Tem certeza que deseja excluir <strong>{{name}}</strong>?",
"confirmDeleteSingleItem": "Tem certeza que deseja excluir permanentemente \"{{name}}\"?",
"confirmDeleteMultipleItems": "Tem certeza que deseja excluir permanentemente {{count}} itens?",
"confirmDeleteMultipleItemsWithFolders": "Tem certeza que deseja excluir permanentemente {{count}} itens? Isso inclui pastas e seus conteúdos.",
"confirmDeleteFolder": "Tem certeza que deseja excluir permanentemente a pasta \"{{name}}\" e todo seu conteúdo?",
"deleteDirectoryWarning": "Isso excluirá a pasta e todo seu conteúdo.",
"actionCannotBeUndone": "Esta ação não pode ser desfeita.",
"permanentDeleteWarning": "Esta ação não pode ser desfeita. O(s) item(ns) será(ão) excluído(s) permanentemente do servidor.",
"recent": "Recente",
"pinned": "Fixado",
"folderShortcuts": "Atalhos de Pasta",
"noRecentFiles": "Nenhum arquivo recente.",
"noPinnedFiles": "Nenhum arquivo fixado.",
"enterFolderPath": "Digite o caminho da pasta",
"noShortcuts": "Nenhum atalho.",
"searchFilesAndFolders": "Pesquisar arquivos e pastas...",
"noFilesOrFoldersFound": "Nenhum arquivo ou pasta encontrado.",
"failedToConnectSSH": "Falha ao conectar ao SSH",
"failedToReconnectSSH": "Falha ao reconectar sessão SSH",
"failedToListFiles": "Falha ao listar arquivos",
"fetchHomeDataTimeout": "Tempo limite excedido ao buscar dados iniciais",
"sshStatusCheckTimeout": "Tempo limite excedido na verificação do status SSH",
"sshReconnectionTimeout": "Tempo limite excedido na reconexão SSH",
"saveOperationTimeout": "Tempo limite excedido na operação de salvar",
"cannotSaveFile": "Não é possível salvar o arquivo",
"dragSystemFilesToUpload": "Arraste arquivos do sistema aqui para fazer upload",
"dragFilesToWindowToDownload": "Arraste arquivos para fora da janela para baixar",
"openTerminalHere": "Abrir Terminal Aqui",
"run": "Executar",
"saveToSystem": "Salvar como...",
"selectLocationToSave": "Selecionar Local para Salvar",
"openTerminalInFolder": "Abrir Terminal nesta Pasta",
"openTerminalInFileLocation": "Abrir Terminal no Local do Arquivo",
"terminalWithPath": "Terminal - {{host}}:{{path}}",
"runningFile": "Executando - {{file}}",
"onlyRunExecutableFiles": "Só é possível executar arquivos executáveis",
"noHostSelected": "Nenhum host selecionado",
"starred": "Favoritos",
"shortcuts": "Atalhos",
"directories": "Diretórios",
"removedFromRecentFiles": "\"{{name}}\" removido dos arquivos recentes",
"removeFailed": "Falha ao remover",
"unpinnedSuccessfully": "\"{{name}}\" desfixado com sucesso",
"unpinFailed": "Falha ao desfixar",
"removedShortcut": "Atalho \"{{name}}\" removido",
"removeShortcutFailed": "Falha ao remover atalho",
"clearedAllRecentFiles": "Todos os arquivos recentes foram limpos",
"clearFailed": "Falha ao limpar",
"removeFromRecentFiles": "Remover dos arquivos recentes",
"clearAllRecentFiles": "Limpar todos os arquivos recentes",
"unpinFile": "Desfixar arquivo",
"removeShortcut": "Remover atalho",
"saveFilesToSystem": "Salvar {{count}} arquivos como...",
"saveToSystem": "Salvar como...",
"pinFile": "Fixar arquivo",
"addToShortcuts": "Adicionar aos atalhos",
"selectLocationToSave": "Selecionar local para salvar",
"downloadToDefaultLocation": "Baixar para o local padrão",
"pasteFailed": "Falha ao colar",
"noUndoableActions": "Nenhuma ação pode ser desfeita",
"undoCopySuccess": "Operação de cópia desfeita: {{count}} arquivos copiados foram excluídos",
"undoCopyFailedDelete": "Falha ao desfazer: Não foi possível excluir os arquivos copiados",
"undoCopyFailedNoInfo": "Falha ao desfazer: Não foi possível encontrar informações do arquivo copiado",
"undoMoveSuccess": "Operação de mover desfeita: {{count}} arquivos movidos de volta ao local original",
"undoMoveFailedMove": "Falha ao desfazer: Não foi possível mover os arquivos de volta",
"undoMoveFailedNoInfo": "Falha ao desfazer: Não foi possível encontrar informações do arquivo movido",
"undoDeleteNotSupported": "Operação de exclusão não pode ser desfeita: Os arquivos foram excluídos permanentemente do servidor",
"undoTypeNotSupported": "Tipo de operação de desfazer não suportado",
"undoOperationFailed": "Falha na operação de desfazer",
"unknownError": "Erro desconhecido",
"enterPath": "Digite o caminho...",
"editPath": "Editar caminho",
"confirm": "Confirmar",
"cancel": "Cancelar",
"folderName": "Nome da pasta",
"find": "Localizar...",
"replaceWith": "Substituir por...",
"replace": "Substituir",
"replaceAll": "Substituir Tudo",
"downloadInstead": "Baixar em Vez Disso",
"keyboardShortcuts": "Atalhos do Teclado",
"searchAndReplace": "Localizar & Substituir",
"editing": "Edição",
"navigation": "Navegação",
"code": "Código",
"search": "Pesquisar",
"findNext": "Localizar Próximo",
"findPrevious": "Localizar Anterior",
"save": "Salvar",
"selectAll": "Selecionar Tudo",
"undo": "Desfazer",
"redo": "Refazer",
"goToLine": "Ir para Linha",
"moveLineUp": "Mover Linha para Cima",
"moveLineDown": "Mover Linha para Baixo",
"toggleComment": "Alternar Comentário",
"indent": "Indentar",
"outdent": "Remover Indentação",
"autoComplete": "Auto Completar",
"imageLoadError": "Falha ao carregar imagem",
"zoomIn": "Aumentar Zoom",
"zoomOut": "Diminuir Zoom",
"rotate": "Rotacionar",
"originalSize": "Tamanho Original",
"startTyping": "Comece a digitar...",
"unknownSize": "Tamanho desconhecido",
"fileIsEmpty": "Arquivo está vazio",
"modified": "Modificado",
"largeFileWarning": "Aviso de Arquivo Grande",
"largeFileWarningDesc": "Este arquivo tem {{size}} de tamanho, o que pode causar problemas de desempenho quando aberto como texto.",
"fileNotFoundAndRemoved": "Arquivo \"{{name}}\" não encontrado e foi removido dos arquivos recentes/fixados",
"failedToLoadFile": "Falha ao carregar arquivo: {{error}}",
"serverErrorOccurred": "Ocorreu um erro no servidor. Por favor, tente novamente mais tarde.",
"fileSavedSuccessfully": "Arquivo salvo com sucesso",
"autoSaveFailed": "Falha no salvamento automático",
"fileAutoSaved": "Arquivo salvo automaticamente",
"moveFileFailed": "Falha ao mover {{name}}",
"moveOperationFailed": "Falha na operação de mover",
"canOnlyCompareFiles": "Só é possível comparar dois arquivos",
"comparingFiles": "Comparando arquivos: {{file1}} e {{file2}}",
"dragFailed": "Falha na operação de arrastar",
"filePinnedSuccessfully": "Arquivo \"{{name}}\" fixado com sucesso",
"pinFileFailed": "Falha ao fixar arquivo",
"fileUnpinnedSuccessfully": "Arquivo \"{{name}}\" desfixado com sucesso",
"unpinFileFailed": "Falha ao desfixar arquivo",
"shortcutAddedSuccessfully": "Atalho de pasta \"{{name}}\" adicionado com sucesso",
"addShortcutFailed": "Falha ao adicionar atalho",
"operationCompletedSuccessfully": "{{operation}} {{count}} itens com sucesso",
"operationCompleted": "{{operation}} {{count}} itens",
"downloadFileSuccess": "Arquivo {{name}} baixado com sucesso",
"downloadFileFailed": "Falha no download",
"moveTo": "Mover para {{name}}",
"diffCompareWith": "Comparar diferenças com {{name}}",
"dragOutsideToDownload": "Arraste para fora da janela para baixar ({{count}} arquivos)",
"newFolderDefault": "NovaPasta",
"newFileDefault": "NovoArquivo.txt",
"successfullyMovedItems": "{{count}} itens movidos com sucesso para {{target}}",
"move": "Mover",
"searchInFile": "Pesquisar no arquivo (Ctrl+F)",
"showKeyboardShortcuts": "Mostrar atalhos do teclado",
"startWritingMarkdown": "Comece a escrever seu conteúdo markdown...",
"loadingFileComparison": "Carregando comparação de arquivos...",
"reload": "Recarregar",
"compare": "Comparar",
"sideBySide": "Lado a Lado",
"inline": "Em linha",
"fileComparison": "Comparação de Arquivos: {{file1}} vs {{file2}}",
"fileTooLarge": "Arquivo muito grande: {{error}}",
"sshConnectionFailed": "Falha na conexão SSH. Por favor, verifique sua conexão com {{name}} ({{ip}}:{{port}})",
"loadFileFailed": "Falha ao carregar arquivo: {{error}}"
},
"tunnels": {
"title": "Túneis SSH",
"noSshTunnels": "Sem Túneis SSH",
"createFirstTunnelMessage": "Você ainda não criou nenhum túnel SSH. Configure conexões de túnel no Gerenciador de Hosts para começar.",
"connected": "Conectado",
"disconnected": "Desconectado",
"connecting": "Conectando...",
"disconnecting": "Desconectando...",
"unknownTunnelStatus": "Desconhecido",
"unknown": "Desconhecido",
"error": "Erro",
"failed": "Falhou",
"retrying": "Tentando novamente",
"waiting": "Aguardando",
"waitingForRetry": "Aguardando nova tentativa",
"retryingConnection": "Tentando reconectar",
"canceling": "Cancelando...",
"connect": "Conectar",
"disconnect": "Desconectar",
"cancel": "Cancelar",
"port": "Porta",
"attempt": "Tentativa {{current}} de {{max}}",
"nextRetryIn": "Próxima tentativa em {{seconds}} segundos",
"checkDockerLogs": "Verifique seus logs do Docker para ver o motivo do erro, entre no",
"noTunnelConnections": "Nenhuma conexão de túnel configurada",
"tunnelConnections": "Conexões de Túnel",
"addTunnel": "Adicionar Túnel",
"editTunnel": "Editar Túnel",
"deleteTunnel": "Excluir Túnel",
"tunnelName": "Nome do Túnel",
"localPort": "Porta Local",
"remoteHost": "Host Remoto",
"remotePort": "Porta Remota",
"autoStart": "Iniciar Automaticamente",
"status": "Status",
"active": "Ativo",
"inactive": "Inativo",
"start": "Iniciar",
"stop": "Parar",
"restart": "Reiniciar",
"connectionType": "Tipo de Conexão",
"local": "Local",
"remote": "Remoto",
"dynamic": "Dinâmico",
"noSshTunnels": "Sem Túneis SSH",
"createFirstTunnelMessage": "Crie seu primeiro túnel SSH para começar. Use o Gerenciador SSH para adicionar hosts com conexões de túnel.",
"unknownConnectionStatus": "Desconhecido",
"connected": "Conectado",
"connecting": "Conectando...",
"disconnecting": "Desconectando...",
"disconnected": "Desconectado",
"portMapping": "Porta {{sourcePort}} → {{endpointHost}}:{{endpointPort}}",
"disconnect": "Desconectar",
"connect": "Conectar",
"canceling": "Cancelando...",
"endpointHostNotFound": "Host de destino não encontrado",
"discord": "Discord",
"githubIssue": "issue no GitHub",
"forHelp": "para ajuda"
},
"serverStats": {
"title": "Estatísticas do Servidor",
"cpu": "CPU",
"memory": "Memória",
"disk": "Disco",
"network": "Rede",
"uptime": "Tempo Ativo",
"loadAverage": "Carga Média",
"processes": "Processos",
"connections": "Conexões",
"usage": "Uso",
"available": "Disponível",
"total": "Total",
"free": "Livre",
"used": "Usado",
"percentage": "Porcentagem",
"refreshStatusAndMetrics": "Atualizar status e métricas",
"refreshStatus": "Atualizar Status",
"fileManagerAlreadyOpen": "Gerenciador de Arquivos já está aberto para este host",
"openFileManager": "Abrir Gerenciador de Arquivos",
"cpuCores_one": "{{count}} CPU",
"cpuCores_other": "{{count}} CPUs",
"naCpus": "N/D CPU(s)",
"loadAverage": "Média: {{avg1}}, {{avg5}}, {{avg15}}",
"loadAverageNA": "Média: N/D",
"cpuUsage": "Uso da CPU",
"memoryUsage": "Uso de Memória",
"rootStorageSpace": "Espaço de Armazenamento Root",
"of": "de",
"feedbackMessage": "Tem ideias sobre o que deveria vir a seguir para o gerenciamento do servidor? Compartilhe em",
"failedToFetchHostConfig": "Falha ao buscar configuração do host",
"failedToFetchStatus": "Falha ao buscar status do servidor",
"failedToFetchMetrics": "Falha ao buscar métricas do servidor",
"failedToFetchHomeData": "Falha ao buscar dados da home",
"loadingMetrics": "Carregando métricas...",
"refreshing": "Atualizando...",
"serverOffline": "Servidor Offline",
"cannotFetchMetrics": "Não é possível buscar métricas do servidor offline",
"load": "Carga",
"free": "Livre",
"available": "Disponível"
},
"auth": {
"loginTitle": "Entrar no Termix",
"registerTitle": "Criar Conta",
"loginButton": "Entrar",
"registerButton": "Registrar",
"forgotPassword": "Esqueceu a Senha?",
"rememberMe": "Lembrar de Mim",
"noAccount": "Não tem uma conta?",
"hasAccount": "Já tem uma conta?",
"loginSuccess": "Login realizado com sucesso",
"loginFailed": "Falha no login",
"registerSuccess": "Registro realizado com sucesso",
"registerFailed": "Falha no registro",
"logoutSuccess": "Desconectado com sucesso",
"invalidCredentials": "Usuário ou senha inválidos",
"accountCreated": "Conta criada com sucesso",
"passwordReset": "Link de redefinição de senha enviado",
"twoFactorAuth": "Autenticação de Dois Fatores",
"enterCode": "Digite o código de verificação",
"backupCode": "Ou use o código de backup",
"verifyCode": "Verificar Código",
"enableTwoFactor": "Ativar Autenticação de Dois Fatores",
"disableTwoFactor": "Desativar Autenticação de Dois Fatores",
"scanQRCode": "Escaneie este código QR com seu aplicativo autenticador",
"backupCodes": "Códigos de Backup",
"saveBackupCodes": "Salve estes códigos de backup em um local seguro",
"twoFactorEnabledSuccess": "Autenticação de dois fatores ativada com sucesso!",
"twoFactorDisabled": "Autenticação de dois fatores desativada",
"newBackupCodesGenerated": "Novos códigos de backup gerados",
"backupCodesDownloaded": "Códigos de backup baixados",
"pleaseEnterSixDigitCode": "Por favor, digite um código de 6 dígitos",
"invalidVerificationCode": "Código de verificação inválido",
"failedToDisableTotp": "Falha ao desativar TOTP",
"failedToGenerateBackupCodes": "Falha ao gerar códigos de backup",
"enterPassword": "Digite sua senha",
"lockedOidcAuth": "Bloqueado (Auth OIDC)",
"twoFactorTitle": "Autenticação de Dois Fatores",
"twoFactorProtected": "Sua conta está protegida com autenticação de dois fatores",
"twoFactorActive": "A autenticação de dois fatores está atualmente ativa em sua conta",
"disable2FA": "Desativar 2FA",
"disableTwoFactorWarning": "Desativar a autenticação de dois fatores tornará sua conta menos segura",
"passwordOrTotpCode": "Senha ou Código TOTP",
"or": "Ou",
"generateNewBackupCodesText": "Gere novos códigos de backup se você perdeu os existentes",
"generateNewBackupCodes": "Gerar Novos Códigos de Backup",
"yourBackupCodes": "Seus Códigos de Backup",
"download": "Baixar",
"setupTwoFactorTitle": "Configurar Autenticação de Dois Fatores",
"step1ScanQR": "Passo 1: Escaneie o código QR com seu aplicativo autenticador",
"manualEntryCode": "Código de Entrada Manual",
"cannotScanQRText": "Se você não conseguir escanear o código QR, digite este código manualmente no seu aplicativo autenticador",
"nextVerifyCode": "Próximo: Verificar Código",
"verifyAuthenticator": "Verifique Seu Autenticador",
"step2EnterCode": "Passo 2: Digite o código de 6 dígitos do seu aplicativo autenticador",
"verificationCode": "Código de Verificação",
"back": "Voltar",
"verifyAndEnable": "Verificar e Ativar",
"saveBackupCodesTitle": "Salve Seus Códigos de Backup",
"step3StoreCodesSecurely": "Passo 3: Guarde estes códigos em um local seguro",
"importantBackupCodesText": "Salve estes códigos de backup em um local seguro. Você pode usá-los para acessar sua conta se perder seu dispositivo autenticador.",
"completeSetup": "Concluir Configuração",
"notEnabledText": "A autenticação de dois fatores adiciona uma camada extra de segurança ao exigir um código do seu aplicativo autenticador ao fazer login.",
"enableTwoFactorButton": "Ativar Autenticação de Dois Fatores",
"addExtraSecurityLayer": "Adicione uma camada extra de segurança à sua conta",
"firstUser": "Primeiro Usuário",
"firstUserMessage": "Você é o primeiro usuário e será tornado admin. Você pode ver as configurações de admin no menu suspenso do usuário na barra lateral. Se você acha que isso é um erro, verifique os logs do docker ou crie uma issue no GitHub.",
"external": "Externo",
"loginWithExternal": "Entrar com Provedor Externo",
"loginWithExternalDesc": "Entre usando seu provedor de identidade externo configurado",
"externalNotSupportedInElectron": "A autenticação externa ainda não é suportada no aplicativo Electron. Por favor, use a versão web para login OIDC.",
"resetPasswordButton": "Redefinir Senha",
"sendResetCode": "Enviar Código de Redefinição",
"resetCodeDesc": "Digite seu nome de usuário para receber um código de redefinição de senha. O código será registrado nos logs do container docker.",
"resetCode": "Código de Redefinição",
"verifyCodeButton": "Verificar Código",
"enterResetCode": "Digite o código de 6 dígitos dos logs do container docker para o usuário:",
"goToLogin": "Ir para Login",
"newPassword": "Nova Senha",
"confirmNewPassword": "Confirmar Senha",
"enterNewPassword": "Digite sua nova senha para o usuário:",
"passwordResetSuccess": "Sucesso!",
"signUp": "Cadastrar",
"dataLossWarning": "Redefinir sua senha desta forma excluirá todos os seus hosts SSH salvos, credenciais e outros dados criptografados. Esta ação não pode ser desfeita. Use isso apenas se você esqueceu sua senha e não está logado.",
"sshAuthenticationRequired": "Autenticação SSH Necessária",
"sshNoKeyboardInteractive": "Autenticação Interativa por Teclado Indisponível",
"sshAuthenticationFailed": "Falha na Autenticação",
"sshAuthenticationTimeout": "Tempo Limite de Autenticação",
"sshNoKeyboardInteractiveDescription": "O servidor não suporta autenticação interativa por teclado. Por favor, forneça sua senha ou chave SSH.",
"sshAuthFailedDescription": "As credenciais fornecidas estavam incorretas. Por favor, tente novamente com credenciais válidas.",
"sshTimeoutDescription": "A tentativa de autenticação expirou. Por favor, tente novamente.",
"sshProvideCredentialsDescription": "Por favor, forneça suas credenciais SSH para conectar a este servidor.",
"sshPasswordDescription": "Digite a senha para esta conexão SSH.",
"sshKeyPasswordDescription": "Se sua chave SSH estiver criptografada, digite a senha aqui."
},
"errors": {
"notFound": "Página não encontrada",
"unauthorized": "Acesso não autorizado",
"forbidden": "Acesso proibido",
"serverError": "Erro no servidor",
"networkError": "Erro de rede",
"databaseConnection": "Não foi possível conectar ao banco de dados.",
"unknownError": "Erro desconhecido",
"loginFailed": "Falha no login",
"failedPasswordReset": "Falha ao iniciar redefinição de senha",
"failedVerifyCode": "Falha ao verificar código de redefinição",
"failedCompleteReset": "Falha ao completar redefinição de senha",
"invalidTotpCode": "Código TOTP inválido",
"failedOidcLogin": "Falha ao iniciar login OIDC",
"failedUserInfo": "Falha ao obter informações do usuário após login OIDC",
"oidcAuthFailed": "Falha na autenticação OIDC",
"noTokenReceived": "Nenhum token recebido do login",
"invalidAuthUrl": "URL de autorização inválida recebida do backend",
"invalidInput": "Entrada inválida",
"requiredField": "Este campo é obrigatório",
"minLength": "O comprimento mínimo é {{min}}",
"maxLength": "O comprimento máximo é {{max}}",
"invalidEmail": "Endereço de email inválido",
"passwordMismatch": "As senhas não correspondem",
"weakPassword": "A senha é muito fraca",
"usernameExists": "Nome de usuário já existe",
"emailExists": "Email já existe",
"loadFailed": "Falha ao carregar dados",
"saveError": "Falha ao salvar",
"sessionExpired": "Sessão expirada - por favor, faça login novamente"
},
"messages": {
"saveSuccess": "Salvo com sucesso",
"saveError": "Falha ao salvar",
"deleteSuccess": "Excluído com sucesso",
"deleteError": "Falha ao excluir",
"updateSuccess": "Atualizado com sucesso",
"updateError": "Falha ao atualizar",
"copySuccess": "Copiado para a área de transferência",
"copyError": "Falha ao copiar",
"copiedToClipboard": "{{item}} copiado para a área de transferência",
"connectionEstablished": "Conexão estabelecida",
"connectionClosed": "Conexão fechada",
"reconnecting": "Reconectando...",
"processing": "Processando...",
"pleaseWait": "Por favor, aguarde...",
"registrationDisabled": "O registro de novas contas está atualmente desativado pelo administrador. Por favor, faça login ou entre em contato com um administrador.",
"databaseConnected": "Conectado ao banco de dados com sucesso",
"databaseConnectionFailed": "Falha ao conectar ao servidor de banco de dados",
"checkServerConnection": "Por favor, verifique sua conexão com o servidor e tente novamente",
"resetCodeSent": "Código de redefinição enviado para os logs do Docker",
"codeVerified": "Código verificado com sucesso",
"passwordResetSuccess": "Senha redefinida com sucesso",
"loginSuccess": "Login realizado com sucesso",
"registrationSuccess": "Registro realizado com sucesso"
},
"profile": {
"title": "Perfil do Usuário",
"description": "Gerenciar suas configurações de conta e segurança",
"security": "Segurança",
"changePassword": "Alterar Senha",
"twoFactorAuth": "Autenticação de Dois Fatores",
"accountInfo": "Informações da Conta",
"role": "Função",
"admin": "Administrador",
"user": "Usuário",
"authMethod": "Método de Autenticação",
"local": "Local",
"external": "Externo (OIDC)",
"selectPreferredLanguage": "Selecione seu idioma preferido para a interface",
"currentPassword": "Senha Atual",
"passwordChangedSuccess": "Senha alterada com sucesso! Por favor, faça login novamente.",
"failedToChangePassword": "Falha ao alterar a senha. Por favor, verifique sua senha atual e tente novamente."
},
"user": {
"failedToLoadVersionInfo": "Falha ao carregar informações da versão"
},
"placeholders": {
"enterCode": "000000",
"ipAddress": "127.0.0.1",
"port": "22",
"maxRetries": "3",
"retryInterval": "10",
"language": "Idioma",
"username": "nome de usuário",
"hostname": "nome do host",
"folder": "pasta",
"password": "senha",
"keyPassword": "senha da chave",
"pastePrivateKey": "Cole sua chave privada aqui...",
"pastePublicKey": "Cole sua chave pública aqui...",
"credentialName": "Meu Servidor SSH",
"description": "Descrição da credencial SSH",
"searchCredentials": "Pesquisar credenciais por nome, usuário ou tags...",
"sshConfig": "configuração do endpoint ssh",
"homePath": "/home",
"clientId": "seu-client-id",
"clientSecret": "seu-client-secret",
"authUrl": "https://seu-provedor.com/application/o/authorize/",
"redirectUrl": "https://seu-provedor.com/application/o/termix/",
"tokenUrl": "https://seu-provedor.com/application/o/token/",
"userIdField": "sub",
"usernameField": "name",
"scopes": "openid email profile",
"userinfoUrl": "https://your-provider.com/application/o/userinfo/",
"enterUsername": "Digite o nome de usuário para tornar admin",
"searchHosts": "Procurar hosts por nome, usuário, IP, pasta, tags...",
"enterPassword": "Digite sua senha",
"totpCode": "Código TOTP de 6 dígitos",
"searchHostsAny": "Procurar hosts por qualquer informação...",
"confirmPassword": "Digite sua senha para confirmar",
"typeHere": "Digite aqui",
"fileName": "Digite o nome do arquivo (ex: exemplo.txt)",
"folderName": "Digite o nome da pasta",
"fullPath": "Digite o caminho completo do item",
"currentPath": "Digite o caminho atual do item",
"newName": "Digite o novo nome"
},
"leftSidebar": {
"failedToLoadHosts": "Falha ao carregar hosts",
"noFolder": "Sem Pasta",
"passwordRequired": "Senha é obrigatória",
"failedToDeleteAccount": "Falha ao excluir conta",
"failedToMakeUserAdmin": "Falha ao tornar usuário admin",
"userIsNowAdmin": "Usuário {{username}} agora é um admin",
"removeAdminConfirm": "Tem certeza que deseja remover o status de admin de {{username}}?",
"deleteUserConfirm": "Tem certeza que deseja excluir o usuário {{username}}? Esta ação não pode ser desfeita.",
"deleteAccount": "Excluir Conta",
"closeDeleteAccount": "Fechar Exclusão de Conta",
"deleteAccountWarning": "Esta ação não pode ser desfeita. Isso excluirá permanentemente sua conta e todos os dados associados.",
"deleteAccountWarningDetails": "Excluir sua conta removerá todos os seus dados, incluindo hosts SSH, configurações e preferências. Esta ação é irreversível.",
"deleteAccountWarningShort": "Esta ação é irreversível e excluirá permanentemente sua conta.",
"cannotDeleteAccount": "Não é Possível Excluir Conta",
"lastAdminWarning": "Você é o último usuário administrador. Você não pode excluir sua conta pois isso deixaria o sistema sem administradores. Por favor, torne outro usuário administrador primeiro, ou contate o suporte do sistema.",
"confirmPassword": "Confirmar Senha",
"deleting": "Excluindo...",
"cancel": "Cancelar"
},
"interface": {
"sidebar": "Barra lateral",
"toggleSidebar": "Alternar Barra lateral",
"close": "Fechar",
"online": "Online",
"offline": "Offline",
"maintenance": "Manutenção",
"degraded": "Degradado",
"noTunnelConnections": "Nenhuma conexão de túnel configurada",
"discord": "Discord",
"connectToSshForOperations": "Conecte-se ao SSH para usar operações de arquivos",
"uploadFile": "Enviar Arquivo",
"newFile": "Novo Arquivo",
"newFolder": "Nova Pasta",
"rename": "Renomear",
"deleteItem": "Excluir Item",
"createNewFile": "Criar Novo Arquivo",
"createNewFolder": "Criar Nova Pasta",
"deleteItem": "Excluir Item",
"renameItem": "Renomear Item",
"clickToSelectFile": "Clique para selecionar um arquivo",
"noSshHosts": "Sem Hosts SSH",
"sshHosts": "Hosts SSH",
"importSshHosts": "Importar Hosts SSH do JSON",
"clientId": "ID do Cliente",
"clientSecret": "Segredo do Cliente",
"error": "Erro",
"warning": "Aviso",
"deleteAccount": "Excluir Conta",
"closeDeleteAccount": "Fechar Exclusão de Conta",
"cannotDeleteAccount": "Não é Possível Excluir a Conta",
"confirmPassword": "Confirmar Senha",
"deleting": "Excluindo...",
"externalAuth": "Autenticação Externa (OIDC)",
"configureExternalProvider": "Configurar provedor de identidade externa para",
"waitingForRetry": "Aguardando nova tentativa",
"retryingConnection": "Tentando reconectar",
"resetSplitSizes": "Redefinir tamanhos divididos",
"sshManagerAlreadyOpen": "Gerenciador SSH já está aberto",
"disabledDuringSplitScreen": "Desativado durante tela dividida",
"unknown": "Desconhecido",
"connected": "Conectado",
"disconnected": "Desconectado",
"maxRetriesExhausted": "Número máximo de tentativas esgotado",
"endpointHostNotFound": "Host do endpoint não encontrado",
"administrator": "Administrador",
"user": "Usuário",
"external": "Externo",
"local": "Local",
"saving": "Salvando...",
"saveConfiguration": "Salvar Configuração",
"loading": "Carregando...",
"refresh": "Atualizar",
"adding": "Adicionando...",
"makeAdmin": "Tornar Administrador",
"verifying": "Verificando...",
"verifyAndEnable": "Verificar e Habilitar",
"secretKey": "Chave secreta",
"totpQrCode": "QR Code TOTP",
"passwordRequired": "Senha é obrigatória quando usar autenticação por senha",
"sshKeyRequired": "Chave Privada SSH é obrigatória quando usar autenticação por chave",
"keyTypeRequired": "Tipo de Chave é obrigatório quando usar autenticação por chave",
"validSshConfigRequired": "Deve selecionar uma configuração SSH válida da lista",
"updateHost": "Atualizar Host",
"addHost": "Adicionar Host",
"editHost": "Editar Host",
"pinConnection": "Fixar Conexão",
"authentication": "Autenticação",
"password": "Senha",
"key": "Chave",
"sshPrivateKey": "Chave Privada SSH",
"keyPassword": "Senha da Chave",
"keyType": "Tipo de Chave",
"enableTerminal": "Habilitar Terminal",
"enableTunnel": "Habilitar Túnel",
"enableFileManager": "Habilitar Gerenciador de Arquivos",
"defaultPath": "Caminho Padrão",
"tunnelConnections": "Conexões de Túnel",
"maxRetries": "Máximo de Tentativas",
"upload": "Enviar",
"updateKey": "Atualizar Chave",
"productionFolder": "Produção",
"databaseServer": "Servidor de Banco de Dados",
"developmentServer": "Servidor de Desenvolvimento",
"developmentFolder": "Desenvolvimento",
"webServerProduction": "Servidor Web - Produção",
"unknownError": "Erro desconhecido",
"failedToInitiatePasswordReset": "Falha ao iniciar redefinição de senha",
"failedToVerifyResetCode": "Falha ao verificar código de redefinição",
"failedToCompletePasswordReset": "Falha ao completar redefinição de senha",
"invalidTotpCode": "Código TOTP inválido",
"failedToStartOidcLogin": "Falha ao iniciar login OIDC",
"failedToGetUserInfoAfterOidc": "Falha ao obter informações do usuário após login OIDC",
"loginWithExternalProvider": "Login com provedor externo",
"loginWithExternal": "Login com Provedor Externo",
"sendResetCode": "Enviar Código de Redefinição",
"verifyCode": "Verificar Código",
"resetPassword": "Redefinir Senha",
"login": "Login",
"signUp": "Cadastrar",
"failedToUpdateOidcConfig": "Falha ao atualizar configuração OIDC",
"failedToMakeUserAdmin": "Falha ao tornar usuário administrador",
"failedToStartTotpSetup": "Falha ao iniciar configuração TOTP",
"invalidVerificationCode": "Código de verificação inválido",
"failedToDisableTotp": "Falha ao desabilitar TOTP",
"failedToGenerateBackupCodes": "Falha ao gerar códigos de backup"
},
"mobile": {
"selectHostToStart": "Selecione um host para iniciar sua sessão do terminal",
"limitedSupportMessage": "O suporte móvel do site ainda está em desenvolvimento. Use o aplicativo móvel para uma melhor experiência.",
"mobileAppInProgress": "Aplicativo móvel em desenvolvimento",
"mobileAppInProgressDesc": "Estamos trabalhando em um aplicativo móvel dedicado para proporcionar uma melhor experiência em dispositivos móveis.",
"viewMobileAppDocs": "Instalar Aplicativo Móvel",
"mobileAppDocumentation": "Documentação do Aplicativo Móvel"
}
}