-
State:
+
{t("docker.state")}
{containerState}
diff --git a/src/ui/desktop/apps/file-manager/FileManager.tsx b/src/ui/desktop/apps/file-manager/FileManager.tsx
index 4c698d2a..32cd90e1 100644
--- a/src/ui/desktop/apps/file-manager/FileManager.tsx
+++ b/src/ui/desktop/apps/file-manager/FileManager.tsx
@@ -348,7 +348,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) {
if (result?.requires_totp) {
setTotpRequired(true);
setTotpSessionId(sessionId);
- setTotpPrompt(result.prompt || "Verification code:");
+ setTotpPrompt(result.prompt || t("fileManager.verificationCodePrompt"));
setIsLoading(false);
return;
}
@@ -586,7 +586,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) {
error.message?.includes("established")
) {
toast.error(
- `SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`,
+ t("fileManager.sshConnectionFailed", { name: currentHost?.name, ip: currentHost?.ip, port: currentHost?.port }),
);
} else {
toast.error(t("fileManager.failedToUploadFile"));
@@ -633,7 +633,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) {
error.message?.includes("established")
) {
toast.error(
- `SSH connection failed. Please check your connection to ${currentHost?.name} (${currentHost?.ip}:${currentHost?.port})`,
+ t("fileManager.sshConnectionFailed", { name: currentHost?.name, ip: currentHost?.ip, port: currentHost?.port }),
);
} else {
toast.error(t("fileManager.failedToDownloadFile"));
@@ -1497,7 +1497,7 @@ function FileManagerContent({ initialHost, onClose }: FileManagerProps) {
if (result?.requires_totp) {
setTotpRequired(true);
setTotpSessionId(sessionId);
- setTotpPrompt(result.prompt || "Verification code:");
+ setTotpPrompt(result.prompt || t("fileManager.verificationCodePrompt"));
setIsLoading(false);
return;
}
diff --git a/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx b/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx
index 0dddf5af..aad0f2f6 100644
--- a/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx
+++ b/src/ui/desktop/apps/host-manager/HostManagerEditor.tsx
@@ -1166,7 +1166,7 @@ export function HostManagerEditor({
{t("hosts.terminal")}
-
Docker
+
{t("hosts.docker")}
{t("hosts.tunnel")}
{t("hosts.fileManager")}
@@ -1895,7 +1895,7 @@ export function HostManagerEditor({
{
field.onChange(
@@ -1923,7 +1923,7 @@ export function HostManagerEditor({
field.onChange(
@@ -1945,8 +1945,7 @@ export function HostManagerEditor({
render={({ field }) => (
- {t("hosts.socks5Username")} (
- {t("hosts.optional")})
+ {t("hosts.socks5Username")} {t("hosts.optional")}
(
- {t("hosts.socks5Password")} (
- {t("hosts.optional")})
+ {t("hosts.socks5Password")} {t("hosts.optional")}
{
const currentChain =
@@ -2104,7 +2102,7 @@ export function HostManagerEditor({
{
const currentChain =
@@ -2155,10 +2153,10 @@ export function HostManagerEditor({
- SOCKS4
+ {t("hosts.socks4")}
- SOCKS5
+ {t("hosts.socks5")}
@@ -2167,8 +2165,7 @@ export function HostManagerEditor({
- {t("hosts.socks5Username")} (
- {t("hosts.optional")})
+ {t("hosts.socks5Username")} {t("hosts.optional")}
- {t("hosts.socks5Password")} (
- {t("hosts.optional")})
+ {t("hosts.socks5Password")} {t("hosts.optional")}
- Execute a snippet when the terminal connects
+ {t("hosts.executeSnippetOnConnect")}
);
@@ -2733,9 +2729,9 @@ export function HostManagerEditor({
render={({ field }) => (
- Auto-MOSH
+ {t("hosts.autoMosh")}
- Automatically run MOSH command on connect
+ {t("hosts.autoMoshDesc")}
@@ -2754,11 +2750,10 @@ export function HostManagerEditor({
name="terminalConfig.moshCommand"
render={({ field }) => (
- MOSH Command
+ {t("hosts.moshCommand")}
{
field.onChange(e.target.value.trim());
field.onBlur();
@@ -2766,7 +2761,7 @@ export function HostManagerEditor({
/>
- The MOSH command to execute
+ {t("hosts.moshCommandDesc")}
)}
@@ -2819,11 +2814,10 @@ export function HostManagerEditor({
@@ -2916,7 +2910,7 @@ export function HostManagerEditor({
name="enableDocker"
render={({ field }) => (
- Enable Docker
+ {t("hosts.enableDocker")}
- Enable Docker integration for this host
+ {t("hosts.enableDockerDesc")}
)}
@@ -3075,7 +3069,7 @@ export function HostManagerEditor({
@@ -3094,7 +3088,7 @@ export function HostManagerEditor({
diff --git a/src/ui/desktop/apps/host-manager/HostManagerViewer.tsx b/src/ui/desktop/apps/host-manager/HostManagerViewer.tsx
index 67c56408..8f023d11 100644
--- a/src/ui/desktop/apps/host-manager/HostManagerViewer.tsx
+++ b/src/ui/desktop/apps/host-manager/HostManagerViewer.tsx
@@ -381,7 +381,9 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
URL.revokeObjectURL(url);
toast.success(
- `Exported host configuration for ${host.name || host.username}@${host.ip}`,
+ t("hosts.exportedHostConfig", {
+ name: host.name || `${host.username}@${host.ip}`,
+ }),
);
} catch {
toast.error(t("hosts.failedToExportHost"));
@@ -1072,7 +1074,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
}}
title={
folder !== t("hosts.uncategorized")
- ? "Click to rename folder"
+ ? t("hosts.clickToRenameFolder")
: ""
}
>
@@ -1087,7 +1089,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
startFolderEdit(folder);
}}
className="h-4 w-4 p-0 opacity-50 hover:opacity-100 transition-opacity"
- title="Rename folder"
+ title={t("hosts.renameFolder")}
>
@@ -1234,7 +1236,9 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Remove from folder "{host.folder}"
+ {t("hosts.removeFromFolder", {
+ folder: host.folder,
+ })}
@@ -1254,7 +1258,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Edit host
+ {t("hosts.editHostTooltip")}
@@ -1276,7 +1280,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Delete host
+ {t("hosts.deleteHostTooltip")}
@@ -1294,7 +1298,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Export host
+ {t("hosts.exportHostTooltip")}
@@ -1312,7 +1316,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Clone host
+ {t("hosts.cloneHostTooltip")}
@@ -1384,7 +1388,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
className="text-xs px-1 py-0"
>
- Docker
+ {t("hosts.docker")}
)}
@@ -1414,7 +1418,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Open Terminal
+ {t("hosts.openTerminal")}
)}
@@ -1495,7 +1499,7 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Open Docker
+ {t("hosts.openDocker")}
)}
@@ -1530,10 +1534,10 @@ export function HostManagerViewer({ onEditHost }: SSHManagerHostViewerProps) {
- Click to edit host
+ {t("hosts.clickToEditHost")}
- Drag to move between folders
+ {t("hosts.dragToMoveBetweenFolders")}
diff --git a/src/ui/desktop/apps/terminal/Terminal.tsx b/src/ui/desktop/apps/terminal/Terminal.tsx
index 1512fcce..cd3ec3ec 100644
--- a/src/ui/desktop/apps/terminal/Terminal.tsx
+++ b/src/ui/desktop/apps/terminal/Terminal.tsx
@@ -684,9 +684,7 @@ export const Terminal = forwardRef(
!sudoPromptShownRef.current
) {
sudoPromptShownRef.current = true;
- confirmWithToast(
- t("terminal.sudoPasswordPopupTitle", "Insert password?"),
- async () => {
+ confirmWithToast(t("terminal.sudoPasswordPopupTitle"), async () => {
if (
webSocketRef.current &&
webSocketRef.current.readyState === WebSocket.OPEN
@@ -843,7 +841,7 @@ export const Terminal = forwardRef(
}
} else if (msg.type === "totp_required") {
setTotpRequired(true);
- setTotpPrompt(msg.prompt || "Verification code:");
+ setTotpPrompt(msg.prompt || t("terminal.totpCodeLabel"));
setIsPasswordPrompt(false);
if (connectionTimeoutRef.current) {
clearTimeout(connectionTimeoutRef.current);
@@ -851,7 +849,7 @@ export const Terminal = forwardRef(
}
} else if (msg.type === "password_required") {
setTotpRequired(true);
- setTotpPrompt(msg.prompt || "Password:");
+ setTotpPrompt(msg.prompt || t("common.password"));
setIsPasswordPrompt(true);
if (connectionTimeoutRef.current) {
clearTimeout(connectionTimeoutRef.current);
diff --git a/src/ui/desktop/apps/tools/SSHToolsSidebar.tsx b/src/ui/desktop/apps/tools/SSHToolsSidebar.tsx
index ca36a8a0..9c5ca801 100644
--- a/src/ui/desktop/apps/tools/SSHToolsSidebar.tsx
+++ b/src/ui/desktop/apps/tools/SSHToolsSidebar.tsx
@@ -283,9 +283,9 @@ export function SSHToolsSidebar({
console.error("Failed to fetch command history", err);
const errorMessage =
err?.response?.status === 401
- ? "Authentication required. Please refresh the page."
+ ? t("commandHistory.authRequiredRefresh")
: err?.response?.status === 403
- ? "Data access locked. Please re-authenticate."
+ ? t("commandHistory.dataAccessLockedReauth")
: err?.message || "Failed to load command history";
setHistoryError(errorMessage);
@@ -814,9 +814,7 @@ export function SSHToolsSidebar({
if (sourceFolder !== targetFolder) {
toast.error(
- t("snippets.reorderSameFolder", {
- defaultValue: "Can only reorder snippets within the same folder",
- }),
+ t("snippets.reorderSameFolder"),
);
setDraggedSnippet(null);
setDragOverFolder(null);
@@ -853,16 +851,12 @@ export function SSHToolsSidebar({
try {
await reorderSnippets(updates);
toast.success(
- t("snippets.reorderSuccess", {
- defaultValue: "Snippets reordered successfully",
- }),
+ t("snippets.reorderSuccess"),
);
fetchSnippets();
} catch {
toast.error(
- t("snippets.reorderFailed", {
- defaultValue: "Failed to reorder snippets",
- }),
+ t("snippets.reorderFailed"),
);
}
@@ -901,23 +895,13 @@ export function SSHToolsSidebar({
confirmWithToast(
t("snippets.deleteFolderConfirm", {
name: folderName,
- defaultValue: `Delete folder "${folderName}"? All snippets will be moved to Uncategorized.`,
- }),
async () => {
try {
await deleteSnippetFolder(folderName);
- toast.success(
- t("snippets.deleteFolderSuccess", {
- defaultValue: "Folder deleted successfully",
- }),
- );
+ toast.success(t("snippets.deleteFolderSuccess"));
fetchSnippets();
} catch {
- toast.error(
- t("snippets.deleteFolderFailed", {
- defaultValue: "Failed to delete folder",
- }),
- );
+ toast.error(t("snippets.deleteFolderFailed"));
}
},
"destructive",
@@ -944,22 +928,14 @@ export function SSHToolsSidebar({
color: folderFormData.color || undefined,
icon: folderFormData.icon || undefined,
});
- toast.success(
- t("snippets.updateFolderSuccess", {
- defaultValue: "Folder updated successfully",
- }),
- );
+ toast.success(t("snippets.updateFolderSuccess"));
} else {
await createSnippetFolder({
name: folderFormData.name,
color: folderFormData.color || undefined,
icon: folderFormData.icon || undefined,
});
- toast.success(
- t("snippets.createFolderSuccess", {
- defaultValue: "Folder created successfully",
- }),
- );
+ toast.success(t("snippets.createFolderSuccess"));
}
setShowFolderDialog(false);
@@ -967,12 +943,8 @@ export function SSHToolsSidebar({
} catch {
toast.error(
editingFolder
- ? t("snippets.updateFolderFailed", {
- defaultValue: "Failed to update folder",
- })
- : t("snippets.createFolderFailed", {
- defaultValue: "Failed to create folder",
- }),
+ ? t("snippets.updateFolderFailed")
+ : t("snippets.createFolderFailed"),
);
}
};
@@ -1042,9 +1014,7 @@ export function SSHToolsSidebar({
if (splitAssignments.size === 0) {
toast.error(
- t("splitScreen.error.noAssignments", {
- defaultValue: "Please drag tabs to cells before applying",
- }),
+ t("splitScreen.error.noAssignments"),
);
return;
}
@@ -1054,7 +1024,6 @@ export function SSHToolsSidebar({
if (splitAssignments.size < requiredSlots) {
toast.error(
t("splitScreen.error.fillAllSlots", {
- defaultValue: `Please fill all ${requiredSlots} layout spots before applying`,
count: requiredSlots,
}),
);
@@ -1083,9 +1052,7 @@ export function SSHToolsSidebar({
}
toast.success(
- t("splitScreen.success", {
- defaultValue: "Split screen applied",
- }),
+ t("splitScreen.success"),
);
};
@@ -1099,9 +1066,7 @@ export function SSHToolsSidebar({
setPreviewKey((prev) => prev + 1);
toast.success(
- t("splitScreen.cleared", {
- defaultValue: "Split screen cleared",
- }),
+ t("splitScreen.cleared"),
);
};
@@ -1121,15 +1086,11 @@ export function SSHToolsSidebar({
await deleteCommandFromHistory(activeTerminalHostId, command);
setCommandHistory((prev) => prev.filter((c) => c !== command));
toast.success(
- t("commandHistory.deleteSuccess", {
- defaultValue: "Command deleted from history",
- }),
+ t("commandHistory.deleteSuccess"),
);
} catch {
toast.error(
- t("commandHistory.deleteFailed", {
- defaultValue: "Failed to delete command.",
- }),
+ t("commandHistory.deleteFailed"),
);
}
}
@@ -1159,7 +1120,7 @@ export function SSHToolsSidebar({
variant="outline"
onClick={() => setSidebarWidth(400)}
className="w-[28px] h-[28px]"
- title="Reset sidebar width"
+ title={t("common.resetSidebarWidth")}
>
@@ -1189,10 +1150,10 @@ export function SSHToolsSidebar({
{t("snippets.title")}
- {t("commandHistory.title", { defaultValue: "History" })}
+ {t("commandHistory.title")}
- {t("splitScreen.title", { defaultValue: "Split Screen" })}
+ {t("splitScreen.title")}
@@ -1301,20 +1262,14 @@ export function SSHToolsSidebar({
<>
{selectedSnippetTabIds.length > 0
? t("snippets.executeOnSelected", {
- defaultValue: `Execute on ${selectedSnippetTabIds.length} selected terminal(s)`,
count: selectedSnippetTabIds.length,
})
- : t("snippets.executeOnCurrent", {
- defaultValue:
- "Execute on current terminal (click to select multiple)",
- })}
+ : t("snippets.executeOnCurrent")}
{terminalTabs.map((tab) => (
@@ -1354,9 +1309,7 @@ export function SSHToolsSidebar({
variant="outline"
>
- {t("snippets.newFolder", {
- defaultValue: "New Folder",
- })}
+ {t("snippets.newFolder")}
@@ -1606,9 +1559,7 @@ export function SSHToolsSidebar({
{
setSearchQuery(e.target.value);
@@ -1627,10 +1578,7 @@ export function SSHToolsSidebar({
)}
- {t("commandHistory.tabHint", {
- defaultValue:
- "Use Tab in Terminal to autocomplete from command history",
- })}
+ {t("commandHistory.tabHint")}
@@ -1639,9 +1587,7 @@ export function SSHToolsSidebar({
- {t("commandHistory.error", {
- defaultValue: "Error loading history",
- })}
+ {t("commandHistory.error")}
{historyError}
@@ -1653,32 +1599,23 @@ export function SSHToolsSidebar({
}
variant="outline"
>
- {t("common.retry", { defaultValue: "Retry" })}
+ {t("common.retry")}
) : !activeTerminal ? (
- {t("commandHistory.noTerminal", {
- defaultValue: "No active terminal",
- })}
-
+ {t("commandHistory.noTerminal")}
- {t("commandHistory.noTerminalHint", {
- defaultValue:
- "Open a terminal to see its command history.",
- })}
+ {t("commandHistory.noTerminalHint")}
) : isHistoryLoading && commandHistory.length === 0 ? (
- {t("commandHistory.loading", {
- defaultValue: "Loading command history...",
- })}
-
+ {t("commandHistory.loading")}
) : filteredCommands.length === 0 ? (
@@ -1686,13 +1623,10 @@ export function SSHToolsSidebar({
<>
- {t("commandHistory.noResults", {
- defaultValue: "No commands found",
- })}
+ {t("commandHistory.noResults")}
{t("commandHistory.noResultsHint", {
- defaultValue: `No commands matching "${searchQuery}"`,
query: searchQuery,
})}
@@ -1700,15 +1634,10 @@ export function SSHToolsSidebar({
) : (
<>
- {t("commandHistory.empty", {
- defaultValue: "No command history yet",
- })}
+ {t("commandHistory.empty")}
- {t("commandHistory.emptyHint", {
- defaultValue:
- "Execute commands in the active terminal to build its history.",
- })}
+ {t("commandHistory.emptyHint")}
>
)}
@@ -1739,9 +1668,7 @@ export function SSHToolsSidebar({
e.stopPropagation();
handleCommandDelete(command);
}}
- title={t("commandHistory.deleteTooltip", {
- defaultValue: "Delete command",
- })}
+ title={t("commandHistory.deleteTooltip")}
>
@@ -1769,23 +1696,14 @@ export function SSHToolsSidebar({
>
- {t("splitScreen.none", { defaultValue: "None" })}
+ {t("splitScreen.none")}
- {t("splitScreen.twoSplit", {
- defaultValue: "2-Split",
- })}
-
+ {t("splitScreen.twoSplit")}
- {t("splitScreen.threeSplit", {
- defaultValue: "3-Split",
- })}
-
+ {t("splitScreen.threeSplit")}
- {t("splitScreen.fourSplit", {
- defaultValue: "4-Split",
- })}
-
+ {t("splitScreen.fourSplit")}
@@ -1795,15 +1713,10 @@ export function SSHToolsSidebar({
- {t("splitScreen.dragTabsHint", {
- defaultValue:
- "Drag tabs into the grid below to position them",
- })}
+ {t("splitScreen.dragTabsHint")}
{splittableTabs.map((tab) => {
@@ -1843,9 +1756,7 @@ export function SSHToolsSidebar({
- Remove
+ {t("common.remove")}
>
) : (
- {t("splitScreen.dropHere", {
- defaultValue: "Drop tab here",
- })}
+ {t("splitScreen.dropHere")}
)}
@@ -1927,18 +1836,14 @@ export function SSHToolsSidebar({
className="flex-1"
disabled={splitAssignments.size === 0}
>
- {t("splitScreen.apply", {
- defaultValue: "Apply Split",
- })}
+ {t("splitScreen.apply")}
>
@@ -1948,16 +1853,10 @@ export function SSHToolsSidebar({
- {t("splitScreen.selectMode", {
- defaultValue:
- "Select a split mode to get started",
- })}
+ {t("splitScreen.selectMode")}
- {t("splitScreen.helpText", {
- defaultValue:
- "Choose how many tabs you want to display at once",
- })}
+ {t("splitScreen.helpText")}
)}
@@ -1987,7 +1886,7 @@ export function SSHToolsSidebar({
e.currentTarget.style.backgroundColor = "transparent";
}
}}
- title="Drag to resize sidebar"
+ title={t("common.dragToResizeSidebar")}
/>
)}
@@ -2056,7 +1955,7 @@ export function SSHToolsSidebar({