feat: move session sharing and collab rooms into a plugin (B12)

This commit is contained in:
LukeGus committed 2026-09-23 23:42:46 -05:00
1 parent 791d8656a1
commit a276f6898c
207 files changed
+35771 -11072

No files matched your search

+2 -150
View File
@@ -30,6 +30,7 @@ import { useIsMobile } from "@/hooks/use-mobile";
import { resetPermissionsCache } from "@/hooks/use-permissions";
import { MobileBottomBar } from "@/shell/MobileBottomBar";
import { AppRail, type RailView } from "@/sidebar/AppRail";
import { ComponentSlot } from "@/shell/ActionSlot";
import {
isCoreRailView,
railItemLabel,
@@ -81,27 +82,10 @@ const AlertManager = lazy(() =>
const SshToolsPanel = lazy(() =>
import("@/sidebar/SshToolsPanel").then((m) => ({ default: m.SshToolsPanel })),
);
const CollabPanel = lazy(() =>
import("@/sidebar/CollabPanel").then((m) => ({ default: m.CollabPanel })),
);
const MacrosPanel = lazy(() =>
import("@/sidebar/MacrosPanel").then((m) => ({ default: m.MacrosPanel })),
);
const ShareSessionModal = lazy(() =>
import("@/features/session-sharing/ShareSessionModal").then((m) => ({
default: m.ShareSessionModal,
})),
);
/** What a session tab's handle gives the shell's share dialog. */
interface ShareTarget {
hostId: number;
sessionId: string;
protocol: "ssh";
tabInstanceId?: string;
}
const SessionLogsPanel = lazy(() =>
import("@/sidebar/SessionLogsPanel").then((m) => ({
default: m.SessionLogsPanel,
@@ -614,7 +598,6 @@ export function AppShell({
// Once those panels can themselves be the active tab, activeTabId points at
// the panel and the lookup misses, so remember the last terminal instead.
const [lastTerminalTabId, setLastTerminalTabId] = useState(activeTabId);
const [shareTarget, setShareTarget] = useState<ShareTarget | null>(null);
useEffect(() => {
const active = tabs.find((t) => t.id === activeTabId);
if (active && getTabType(active.type)?.commandTarget) {
@@ -1554,7 +1537,6 @@ export function AppShell({
initialPath?: string;
joinSharedSessionId?: string | null;
joinShareId?: string | null;
collabRoomId?: string;
},
options?: {
data?: Record<string, unknown>;
@@ -1616,7 +1598,6 @@ export function AppShell({
joinShareId,
initialFilePath,
initialPath,
collabRoomId: restore?.collabRoomId,
},
];
}
@@ -1654,7 +1635,6 @@ export function AppShell({
joinShareId,
initialFilePath,
initialPath,
collabRoomId: restore?.collabRoomId,
data: options?.data,
},
];
@@ -1729,52 +1709,6 @@ export function AppShell({
return id;
}
// Invite awareness: rooms are discovered by polling, so a room that has
// never been shown to this browser gets one toast with an Open action.
useEffect(() => {
const SEEN_KEY = "termix:collab-rooms-seen";
let cancelled = false;
const check = async () => {
try {
const { listCollabRooms } = await import("@/api/collab-api");
const { rooms = [] } = await listCollabRooms();
if (cancelled) return;
let seen: string[] = [];
try {
seen = JSON.parse(localStorage.getItem(SEEN_KEY) ?? "[]");
} catch {
seen = [];
}
const seenSet = new Set(seen);
const fresh = rooms.filter((room) => !seenSet.has(room.id));
if (fresh.length === 0) return;
localStorage.setItem(
SEEN_KEY,
JSON.stringify([...seenSet, ...fresh.map((room) => room.id)]),
);
// The first poll after login only records what already exists.
if (seen.length === 0) return;
for (const room of fresh) {
if (room.ownerUserId === userId) continue;
toast(t("collab.invitedTo", { name: room.name }), {
action: {
label: t("collab.openRoom"),
onClick: () => setRailView("collab"),
},
});
}
} catch {
/* next poll */
}
};
void check();
const timer = setInterval(() => void check(), 60_000);
return () => {
cancelled = true;
clearInterval(timer);
};
}, []);
const openSingletonTab = useCallback(
// `host` optionally preselects a host for a singleton plugin tab.
function openSingletonTab(
@@ -1962,24 +1896,6 @@ export function AppShell({
else handle.refresh?.();
}
function openShareForTab(id: string) {
const tab = tabs.find((t) => t.id === id);
if (!tab) return;
const ref = tab.terminalRef?.current as TabHandle | null | undefined;
// A session tab either opens its own share dialog or hands over what
// the shell's dialog needs.
const target = (
ref?.getShareTarget as (() => ShareTarget | null) | undefined
)?.();
if (target) {
setShareTarget(target);
} else if (ref?.canShare?.()) {
ref.openShareModal?.();
} else {
toast.error(t("sessionSharing.notReadyToShare"));
}
}
function closeTab(id: string) {
const tab = tabs.find((t) => t.id === id);
const confirmEnabled = localStorage.getItem("confirmTabClose") === "true";
@@ -2609,58 +2525,6 @@ export function AppShell({
</div>
)}
{railView === "collab" && (
<div className="flex-1 min-h-0 overflow-y-auto">
<CollabPanel
onOpenRoom={(room) => {
const roomHost: Host = {
id: `collab-${room.id}`,
name: room.name,
username: "",
ip: "",
port: 0,
folder: "",
online: false,
cpu: null,
ram: null,
lastAccess: new Date().toISOString(),
authType: "none",
enableTerminal: false,
enableCommandHistory: false,
enableTunnel: false,
enableFileManager: false,
enableDocker: false,
enableProxmox: false,
enableProxmoxStats: false,
enableTmuxMonitor: false,
enableTerminalToolbar: false,
enableAiAssistant: false,
enableSsh: false,
enableRdp: false,
enableVnc: false,
enableTelnet: false,
sshPort: 22,
rdpPort: 3389,
vncPort: 5900,
telnetPort: 23,
serverTunnels: [],
quickActions: [],
};
openTab(roomHost, "collab", {
instanceId:
typeof crypto.randomUUID === "function"
? crypto.randomUUID()
: `${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`,
restoredSessionId: null,
savedLabel: room.name,
collabRoomId: room.id,
});
if (isMobile) setSidebarOpen(false);
}}
/>
</div>
)}
{railView === "session-logs" && (
<div className="relative flex-1 min-h-0 flex flex-col">
<SessionLogsPanel />
@@ -2921,7 +2785,6 @@ export function AppShell({
void invokeAction("files.openHost", targetTab.host);
}
}}
onOpenShare={openShareForTab}
isAppFullscreen={isAppFullscreen}
onToggleAppFullscreen={toggleAppFullscreen}
rightDockOpen={rightRailView !== null}
@@ -3046,18 +2909,7 @@ export function AppShell({
</div>
</div>
{shareTarget && (
<Suspense fallback={null}>
<ShareSessionModal
open
onClose={() => setShareTarget(null)}
hostId={shareTarget.hostId}
sessionId={shareTarget.sessionId}
protocol={shareTarget.protocol}
tabInstanceId={shareTarget.tabInstanceId}
/>
</Suspense>
)}
<ComponentSlot slotId="shell.overlay" />
{commandPaletteOpen && (
<Suspense fallback={null}>
-240
View File
@@ -1,240 +0,0 @@
import axios from "axios";
import { authApi, handleApiError } from "@/main-axios";
import { resolveApiBaseUrl } from "@/api/session-sharing-api";
export interface CollabRoom {
id: string;
name: string;
ownerUserId: string;
persistent: boolean;
presenterUserId: string | null;
stageProtocol: string | null;
stageHostId: number | null;
stageShareId: string | null;
guestLinkEnabled: boolean;
createdAt: string;
endedAt: string | null;
}
export interface CollabRoomMember {
userId: string;
username: string;
roomRole: string;
createdAt: string;
}
export interface CollabOnlineUser {
userId: string;
username: string;
}
export interface CollabStage {
presenterUserId: string | null;
protocol: "ssh" | "rdp" | "vnc" | "telnet" | null;
hostId: number | null;
shareId: string | null;
sessionId?: string;
controllerUserId?: string | null;
connectParams?: { token: string };
}
export interface CollabRoomDetail {
room: CollabRoom;
me: string;
isHost: boolean;
members: CollabRoomMember[];
online: CollabOnlineUser[];
stage: CollabStage;
controllerUserId: string | null;
controlRequests: CollabControlRequest[];
/** Where live room events are served, as /plugin-ws/<id>/<path>. */
eventsWsPath: string;
}
export interface CollabControlRequest {
userId: string;
username: string;
requestedAt: string;
}
export async function listCollabRooms(): Promise<{ rooms: CollabRoom[] }> {
try {
const response = await authApi.get("/collab/rooms");
return response.data;
} catch (error) {
throw handleApiError(error, "list collab rooms");
}
}
export async function createCollabRoom(
name: string,
persistent: boolean,
): Promise<{ room: CollabRoom }> {
try {
const response = await authApi.post("/collab/rooms", { name, persistent });
return response.data;
} catch (error) {
throw handleApiError(error, "create collab room");
}
}
export async function getCollabRoom(roomId: string): Promise<CollabRoomDetail> {
try {
const response = await authApi.get(`/collab/rooms/${roomId}`);
return response.data;
} catch (error) {
throw handleApiError(error, "get collab room");
}
}
export async function inviteCollabMembers(
roomId: string,
targets: { userIds?: string[]; roleIds?: number[] },
): Promise<void> {
try {
await authApi.post(`/collab/rooms/${roomId}/members`, targets);
} catch (error) {
throw handleApiError(error, "invite collab members");
}
}
export async function removeCollabMember(
roomId: string,
userId: string,
): Promise<void> {
try {
await authApi.delete(`/collab/rooms/${roomId}/members/${userId}`);
} catch (error) {
throw handleApiError(error, "remove collab member");
}
}
export async function presentCollabStage(
roomId: string,
input: { protocol: string; sessionId: string; hostId: number },
): Promise<{ stage: CollabStage }> {
try {
const response = await authApi.post(
`/collab/rooms/${roomId}/present`,
input,
);
return response.data;
} catch (error) {
throw handleApiError(error, "start presenting");
}
}
export async function stopCollabStage(roomId: string): Promise<void> {
try {
await authApi.post(`/collab/rooms/${roomId}/stop`);
} catch (error) {
throw handleApiError(error, "stop presenting");
}
}
export async function getCollabStage(
roomId: string,
): Promise<{ stage: CollabStage | null }> {
try {
const response = await authApi.get(`/collab/rooms/${roomId}/stage`);
return response.data;
} catch (error) {
throw handleApiError(error, "resolve collab stage");
}
}
export async function setCollabStageControl(
roomId: string,
userId: string | null,
): Promise<void> {
try {
await authApi.post(`/collab/rooms/${roomId}/control`, { userId });
} catch (error) {
throw handleApiError(error, "change stage control");
}
}
export async function requestCollabStageControl(
roomId: string,
): Promise<{ request: CollabControlRequest }> {
try {
const response = await authApi.post(
`/collab/rooms/${roomId}/control/request`,
);
return response.data;
} catch (error) {
throw handleApiError(error, "request stage control");
}
}
export async function listCollabControlRequests(
roomId: string,
): Promise<{ requests: CollabControlRequest[] }> {
try {
const response = await authApi.get(
`/collab/rooms/${roomId}/control/requests`,
);
return response.data;
} catch (error) {
throw handleApiError(error, "list control requests");
}
}
export async function dismissCollabControlRequest(
roomId: string,
userId: string,
): Promise<void> {
try {
await authApi.delete(`/collab/rooms/${roomId}/control/requests/${userId}`);
} catch (error) {
throw handleApiError(error, "dismiss control request");
}
}
export async function endCollabRoom(roomId: string): Promise<void> {
try {
await authApi.post(`/collab/rooms/${roomId}/end`);
} catch (error) {
throw handleApiError(error, "end collab room");
}
}
export async function deleteCollabRoom(roomId: string): Promise<void> {
try {
await authApi.delete(`/collab/rooms/${roomId}`);
} catch (error) {
throw handleApiError(error, "delete collab room");
}
}
export async function setCollabGuestLink(
roomId: string,
enabled: boolean,
): Promise<{ guestLinkToken: string | null }> {
try {
const response = await authApi.post(`/collab/rooms/${roomId}/guest-link`, {
enabled,
});
return response.data;
} catch (error) {
throw handleApiError(error, "update guest link");
}
}
export interface CollabGuestStage {
protocol: "ssh" | "rdp" | "vnc" | "telnet";
shareId: string;
wsPath?: string;
connectParams?: { token: string };
}
/** Anonymous: guests poll this to follow the presenter. Throws on 404/429. */
export async function resolveCollabGuestStage(
token: string,
): Promise<{ roomName: string; stage: CollabGuestStage | null }> {
const baseUrl = await resolveApiBaseUrl();
const response = await axios.get(
`${baseUrl}/collab/guest/${encodeURIComponent(token)}`,
);
return response.data;
}
+16 -2
View File
@@ -2,6 +2,9 @@ import { authApi } from "@/main-axios";
import { createTtlRequestCache } from "@/lib/ttl-request-cache";
import type { TerminalTheme } from "@/lib/terminal-themes";
import type { CustomKeybinding } from "@/types/keybindings";
import { invokeAction, isActionRegistered } from "@/shell/action-registry";
const SHARED_WITH_ME_ACTION = "sessions.sharedWithMe";
// OPEN TABS API
// ============================================================================
@@ -84,10 +87,21 @@ export async function addOpenTab(tab: OpenTabUpsertPayload): Promise<void> {
await authApi.post("/open-tabs", tab);
}
/**
* The caller's live sessions, plus sessions other users shared with them,
* which the session sharing plugin answers through an action (none while it
* is off).
*/
export async function getActiveSessions(): Promise<ActiveSessionInfo[]> {
return activeSessionsCache.get(async () => {
const response = await authApi.get("/open-tabs/active-sessions");
return Array.isArray(response.data) ? response.data : [];
const [response, shared] = await Promise.all([
authApi.get("/open-tabs/active-sessions"),
isActionRegistered(SHARED_WITH_ME_ACTION)
? invokeAction(SHARED_WITH_ME_ACTION).catch(() => [])
: Promise.resolve([]),
]);
const own = Array.isArray(response.data) ? response.data : [];
return Array.isArray(shared) ? [...own, ...shared] : own;
});
}
-181
View File
@@ -1,181 +0,0 @@
import axios from "axios";
import { getBasePath } from "@/lib/base-path";
import { isElectron } from "@/lib/electron";
import { authApi, handleApiError } from "@/main-axios";
export interface ResolvedShareLink {
protocol: "ssh" | "rdp" | "vnc" | "telnet";
permissionLevel: "read-only" | "read-write";
wsPath: string;
connectParams?: { token: string };
}
export type ShareLinkErrorKind = "not-found" | "rate-limited" | "unknown";
export class ShareLinkError extends Error {
constructor(
message: string,
public readonly kind: ShareLinkErrorKind,
) {
super(message);
this.name = "ShareLinkError";
}
}
const isDev = (): boolean =>
!isElectron() &&
process.env.NODE_ENV === "development" &&
(window.location.port === "3000" ||
window.location.port === "5173" ||
window.location.port === "");
// Guests have no session/JWT, so this deliberately builds a bare base URL
// rather than going through main-axios's authenticated instances. The
// desktop app always runs its embedded local backend as the source of
// truth, so a share link opened there always resolves against it --
// joining a session hosted on someone else's remote server isn't
// supported from the desktop app today.
export async function resolveApiBaseUrl(): Promise<string> {
if (isDev()) {
const protocol = window.location.protocol === "https:" ? "https" : "http";
return `${protocol}://localhost:30001`;
}
if (isElectron()) {
return "http://127.0.0.1:30001";
}
return getBasePath();
}
export async function resolveShareLink(
linkToken: string,
): Promise<ResolvedShareLink> {
const baseUrl = await resolveApiBaseUrl();
try {
const response = await axios.get(
`${baseUrl}/session-sharing/resolve/${encodeURIComponent(linkToken)}`,
);
return response.data;
} catch (error) {
if (axios.isAxiosError(error)) {
if (error.response?.status === 404) {
throw new ShareLinkError(
"Share link is invalid, expired, or revoked",
"not-found",
);
}
if (error.response?.status === 429) {
throw new ShareLinkError(
"Too many attempts, please try again shortly",
"rate-limited",
);
}
}
throw new ShareLinkError("Failed to resolve share link", "unknown");
}
}
// ============================================================================
// SESSION SHARING (authenticated owner-side API)
// ============================================================================
export type SessionShareProtocol = "ssh" | "rdp" | "vnc" | "telnet";
export type SessionShareType = "link" | "user";
export type SessionSharePermissionLevel = "read-only" | "read-write";
export interface SessionShareRecord {
id: string;
hostId: number;
ownerUserId: string;
protocol: SessionShareProtocol;
sessionId: string;
tabInstanceId: string | null;
shareType: SessionShareType;
targetUserId: string | null;
linkToken: string | null;
permissionLevel: SessionSharePermissionLevel;
createdAt: string;
expiresAt: string;
revokedAt: string | null;
lastJoinedAt: string | null;
joinCount: number;
}
export interface CreateSessionShareRequest {
hostId: number;
sessionId: string;
tabInstanceId?: string;
protocol: SessionShareProtocol;
shareType: SessionShareType;
targetUserId?: string;
permissionLevel: SessionSharePermissionLevel;
expiryHours?: number;
}
export interface CreateSessionShareResponse {
shareId: string;
linkToken: string | null;
expiresAt: string;
}
export async function createSessionShare(
request: CreateSessionShareRequest,
): Promise<CreateSessionShareResponse> {
try {
const response = await authApi.post("/session-sharing/create", request);
return response.data;
} catch (error) {
throw handleApiError(error, "create session share");
}
}
export async function getActiveSessionShares(
hostId: number,
): Promise<{ shares: SessionShareRecord[] }> {
try {
const response = await authApi.get(
`/session-sharing/host/${hostId}/active`,
);
return response.data;
} catch (error) {
throw handleApiError(error, "fetch active session shares");
}
}
export async function revokeSessionShare(
shareId: string,
): Promise<{ success: true }> {
try {
const response = await authApi.delete(`/session-sharing/${shareId}`);
return response.data;
} catch (error) {
throw handleApiError(error, "revoke session share");
}
}
// ============================================================================
// GLOBAL ADMIN TOGGLE
// ============================================================================
export async function getSessionSharingGloballyEnabled(): Promise<{
enabled: boolean;
}> {
try {
const response = await authApi.get("/users/session-sharing-enabled");
return response.data;
} catch (error) {
throw handleApiError(error, "fetch session sharing enabled setting");
}
}
export async function updateSessionSharingGloballyEnabled(
enabled: boolean,
): Promise<{ enabled: boolean }> {
try {
const response = await authApi.patch("/users/session-sharing-enabled", {
enabled,
});
return response.data;
} catch (error) {
throw handleApiError(error, "update session sharing enabled setting");
}
}
-122
View File
@@ -1,122 +0,0 @@
import { useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { AlertCircle, Eye, Presentation, Users } from "lucide-react";
import { RemoteDisplay } from "@/features/remote-display/RemoteDisplay";
import {
GuestTerminalView,
type SessionParticipantInfo,
} from "@/features/session-sharing/SharedSessionView";
import {
resolveCollabGuestStage,
type CollabGuestStage,
} from "@/api/collab-api";
const POLL_MS = 5000;
/**
* Anonymous guest page for a collab room (?view=collab-guest&token=...).
* Guests have no account and no event channel, so they poll the public
* resolve endpoint and remount the viewer whenever the stage share changes.
*/
export default function CollabGuestView() {
const { t } = useTranslation();
const token = new URLSearchParams(window.location.search).get("token");
const [roomName, setRoomName] = useState<string | null>(null);
const [stage, setStage] = useState<CollabGuestStage | null>(null);
const [error, setError] = useState<string | null>(null);
const [participantCount, setParticipantCount] = useState(0);
const stageShareIdRef = useRef<string | null>(null);
useEffect(() => {
if (!token) {
setError(t("collab.guest.linkInvalid"));
return;
}
let cancelled = false;
const poll = async () => {
try {
const result = await resolveCollabGuestStage(token);
if (cancelled) return;
setRoomName(result.roomName);
setError(null);
const nextShareId = result.stage?.shareId ?? null;
// Tokens are minted per resolve; only swap the viewer on a real change.
if (nextShareId !== stageShareIdRef.current) {
stageShareIdRef.current = nextShareId;
setStage(result.stage);
setParticipantCount(0);
}
} catch {
if (!cancelled) setError(t("collab.guest.linkInvalid"));
}
};
void poll();
const timer = setInterval(() => void poll(), POLL_MS);
return () => {
cancelled = true;
clearInterval(timer);
};
}, [token, t]);
return (
<div
className="fixed inset-0 flex flex-col"
style={{ backgroundColor: "var(--bg-base)", color: "var(--foreground)" }}
>
<div className="flex items-center gap-2 px-3 py-2 border-b border-border text-sm shrink-0">
<Presentation className="size-4 text-muted-foreground shrink-0" />
<span className="font-semibold truncate min-w-0">
{roomName ?? t("collab.guest.title")}
</span>
<div className="flex items-center gap-3 shrink-0 ml-auto text-xs text-muted-foreground">
{participantCount >= 2 && (
<span className="flex items-center gap-1">
<Users className="size-3.5" />
{participantCount}
</span>
)}
<span className="flex items-center gap-1">
<Eye className="size-3.5" />
{t("sessionSharing.guestView.readOnlyBadge")}
</span>
</div>
</div>
<div className="relative flex-1 min-h-0">
{error ? (
<Note icon={<AlertCircle className="size-8" />} text={error} />
) : !stage ? (
<Note
icon={<Presentation className="size-8" />}
text={t("collab.guest.waiting")}
/>
) : stage.protocol === "ssh" ? (
<GuestTerminalView
key={stage.shareId}
share={{ permissionLevel: "read-only" }}
wsPath={stage.wsPath ?? ""}
hideBadges
onParticipantsChange={(participants: SessionParticipantInfo[]) =>
setParticipantCount(participants.length)
}
/>
) : stage.connectParams?.token ? (
<RemoteDisplay
key={stage.shareId}
token={stage.connectParams.token}
protocol={stage.protocol}
isVisible
/>
) : null}
</div>
</div>
);
}
function Note({ icon, text }: { icon: React.ReactNode; text: string }) {
return (
<div className="flex h-full flex-col items-center justify-center gap-3 text-muted-foreground">
{icon}
<p className="text-sm">{text}</p>
</div>
);
}
@@ -1,287 +0,0 @@
import { useState } from "react";
import { useTranslation } from "react-i18next";
import {
Check,
Crown,
Hand,
MonitorUp,
MousePointerClick,
UserMinus,
Users,
X,
} from "lucide-react";
import { Badge } from "@/components/badge";
import { Button } from "@/components/button";
import {
AlertDialog,
AlertDialogAction,
AlertDialogCancel,
AlertDialogContent,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogHeader,
AlertDialogTitle,
} from "@/components/alert-dialog";
import type { CollabControlRequest, CollabRoomDetail } from "@/api/collab-api";
interface CollabMembersSidebarProps {
detail: CollabRoomDetail;
onClose: () => void;
onInvite: () => void;
onControl: (userId: string | null) => Promise<void>;
onDismissRequest: (userId: string) => Promise<void>;
onRemoveMember: (userId: string) => Promise<void>;
}
export function CollabMembersSidebar({
detail,
onClose,
onInvite,
onControl,
onDismissRequest,
onRemoveMember,
}: CollabMembersSidebarProps) {
const { t } = useTranslation();
const [removing, setRemoving] = useState<{
userId: string;
username: string;
} | null>(null);
const [busyUserId, setBusyUserId] = useState<string | null>(null);
const onlineIds = new Set(detail.online.map((user) => user.userId));
const presenterUserId = detail.stage.presenterUserId;
const canManageControl = detail.isHost || presenterUserId === detail.me;
const canControl =
canManageControl &&
detail.stage.protocol === "ssh" &&
!!detail.stage.shareId;
async function run(userId: string, action: () => Promise<void>) {
setBusyUserId(userId);
try {
await action();
} finally {
setBusyUserId(null);
}
}
async function grant(request: CollabControlRequest) {
await run(request.userId, async () => {
await onControl(request.userId);
});
}
return (
<aside
id="collab-members-sidebar"
aria-label={t("collab.membersPanel")}
className="absolute inset-y-0 right-0 z-30 flex h-full w-[min(20rem,100%)] shrink-0 flex-col border-l border-border bg-background shadow-xl lg:static lg:z-auto lg:shadow-none"
>
<header className="flex h-11 items-center gap-2 border-b border-border px-3">
<Users className="size-4 text-muted-foreground" />
<h2 className="flex-1 text-sm font-semibold">
{t("collab.membersWithCount", { count: detail.members.length })}
</h2>
{detail.isHost && (
<Button size="sm" variant="outline" onClick={onInvite}>
{t("collab.invite")}
</Button>
)}
<Button
size="icon-sm"
variant="ghost"
aria-label={t("common.close")}
onClick={onClose}
>
<X className="size-4" />
</Button>
</header>
{canManageControl && (
<section className="border-b border-border p-3" aria-live="polite">
<div className="mb-2 flex items-center gap-2">
<Hand className="size-3.5 text-muted-foreground" />
<h3 className="text-xs font-semibold uppercase tracking-wide">
{t("collab.controlQueue")}
</h3>
{detail.controlRequests.length > 0 && (
<Badge variant="default" className="ml-auto text-xs">
{detail.controlRequests.length}
</Badge>
)}
</div>
{detail.controlRequests.length === 0 ? (
<p className="text-xs text-muted-foreground">
{t("collab.noControlRequests")}
</p>
) : (
<div className="flex flex-col gap-2">
{detail.controlRequests.map((request) => (
<div
key={request.userId}
className="flex items-center gap-2 border border-border p-2"
>
<div className="min-w-0 flex-1">
<p className="truncate text-xs font-medium">
{request.username}
</p>
<p className="text-xs text-muted-foreground">
{new Date(request.requestedAt).toLocaleTimeString([], {
hour: "2-digit",
minute: "2-digit",
})}
</p>
</div>
<Button
size="icon-sm"
aria-label={t("collab.grantControlTo", {
name: request.username,
})}
disabled={busyUserId === request.userId}
onClick={() => void grant(request)}
>
<Check className="size-3.5" />
</Button>
<Button
size="icon-sm"
variant="outline"
aria-label={t("collab.dismissControlRequest", {
name: request.username,
})}
disabled={busyUserId === request.userId}
onClick={() =>
void run(request.userId, () =>
onDismissRequest(request.userId),
)
}
>
<X className="size-3.5" />
</Button>
</div>
))}
</div>
)}
</section>
)}
<section className="min-h-0 flex-1 overflow-y-auto p-2">
<h3 className="sr-only">{t("collab.members")}</h3>
<div className="flex flex-col gap-1">
{detail.members.map((member) => {
const isOnline = onlineIds.has(member.userId);
const isPresenter = member.userId === presenterUserId;
const hasControl = member.userId === detail.controllerUserId;
return (
<div
key={member.userId}
className="group flex min-h-11 items-center gap-2 border border-transparent px-2 py-1.5 hover:border-border hover:bg-muted/40"
>
<span
className={`size-2 shrink-0 rounded-full ${
isOnline ? "bg-green-500" : "bg-muted-foreground/30"
}`}
aria-label={t(isOnline ? "collab.online" : "collab.offline")}
role="img"
/>
<div className="min-w-0 flex-1">
<p className="truncate text-xs font-medium">
{member.username}
{member.userId === detail.me && (
<span className="ml-1 text-muted-foreground">
{t("collab.you")}
</span>
)}
</p>
<div className="mt-0.5 flex items-center gap-1.5 text-xs text-muted-foreground">
{member.roomRole === "host" && (
<span className="flex items-center gap-1">
<Crown className="size-3" /> {t("collab.hostBadge")}
</span>
)}
{isPresenter && (
<span className="flex items-center gap-1">
<MonitorUp className="size-3" />
{t("collab.presenterBadge")}
</span>
)}
{hasControl && (
<span className="flex items-center gap-1">
<MousePointerClick className="size-3" />
{t("collab.controlBadge")}
</span>
)}
</div>
</div>
{canControl && !isPresenter && (
<Button
size="icon-sm"
variant={hasControl ? "default" : "ghost"}
aria-label={t(
hasControl
? "collab.revokeControl"
: "collab.grantControlTo",
{ name: member.username },
)}
disabled={busyUserId === member.userId}
onClick={() =>
void run(member.userId, () =>
onControl(hasControl ? null : member.userId),
)
}
>
<MousePointerClick className="size-3.5" />
</Button>
)}
{detail.isHost && member.userId !== detail.room.ownerUserId && (
<Button
size="icon-sm"
variant="ghost"
aria-label={t("collab.removeMember", {
name: member.username,
})}
onClick={() =>
setRemoving({
userId: member.userId,
username: member.username,
})
}
>
<UserMinus className="size-3.5" />
</Button>
)}
</div>
);
})}
</div>
</section>
<AlertDialog
open={Boolean(removing)}
onOpenChange={(open) => {
if (!open) setRemoving(null);
}}
>
<AlertDialogContent>
<AlertDialogHeader>
<AlertDialogTitle>{t("collab.removeMemberTitle")}</AlertDialogTitle>
<AlertDialogDescription>
{t("collab.removeMemberDescription", {
name: removing?.username,
})}
</AlertDialogDescription>
</AlertDialogHeader>
<AlertDialogFooter>
<AlertDialogCancel>{t("common.cancel")}</AlertDialogCancel>
<AlertDialogAction
className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
onClick={() => {
if (removing) void onRemoveMember(removing.userId);
}}
>
{t("collab.deleteMember")}
</AlertDialogAction>
</AlertDialogFooter>
</AlertDialogContent>
</AlertDialog>
</aside>
);
}
File diff suppressed because it is too large. Load diff
@@ -1,59 +0,0 @@
import { useMemo } from "react";
import { useActionSlot } from "@/hooks/use-action-slot";
import { invokeAction, isActionRegistered } from "@/shell/action-registry";
import { PluginViewPlaceholder } from "@/plugin-host/PluginViewPlaceholder";
/**
* A remote desktop session drawn by whichever plugin provides one.
*
* Collab rooms and shared-session links show RDP, VNC and Telnet streams
* without knowing how they are drawn. The provider contributes a component
* to this slot and handles the token action below.
*/
export const REMOTE_DISPLAY_SLOT = "session.remoteDisplay";
export const REMOTE_SESSION_TOKEN_ACTION = "session.remoteDisplay.token";
export interface RemoteDisplayProps {
token: string;
protocol: string;
isVisible: boolean;
onConnect?: () => void;
onError?: (error: string) => void;
}
export function RemoteDisplay(props: RemoteDisplayProps) {
const contributions = useActionSlot(REMOTE_DISPLAY_SLOT);
const provider = useMemo(
() =>
contributions.find(
(contribution) =>
contribution.kind === "component" && contribution.component,
),
[contributions],
);
if (!provider?.component) {
return <PluginViewPlaceholder kind="tab" viewId={props.protocol} />;
}
const Display = provider.component;
return <Display {...(props as unknown as Record<string, unknown>)} />;
}
export interface RemoteSessionToken {
token: string;
connectionId: string;
}
/** Mints a session token for presenting a host, through the provider. */
export async function createRemoteSessionToken(
hostId: number,
origin: unknown,
protocol: string,
): Promise<RemoteSessionToken | null> {
if (!isActionRegistered(REMOTE_SESSION_TOKEN_ACTION)) return null;
return (await invokeAction(
REMOTE_SESSION_TOKEN_ACTION,
hostId,
origin,
protocol,
)) as RemoteSessionToken | null;
}
@@ -1,429 +0,0 @@
import { useEffect, useMemo, useState } from "react";
import { useTranslation } from "react-i18next";
import { Check, Copy, Link2, Search, Shield, User, Users } from "lucide-react";
import { toast } from "sonner";
import { Button } from "@/components/button";
import { Input } from "@/components/input";
import {
Dialog,
DialogContent,
DialogDescription,
DialogHeader,
DialogTitle,
} from "@/components/dialog";
import {
DropdownMenu,
DropdownMenuContent,
DropdownMenuItem,
DropdownMenuTrigger,
} from "@/components/dropdown-menu";
import { getUserList } from "@/main-axios";
import {
createSessionShare,
getActiveSessionShares,
revokeSessionShare,
type SessionShareProtocol,
type SessionSharePermissionLevel,
type SessionShareRecord,
} from "@/api/session-sharing-api";
const EXPIRY_PRESETS = [
{ key: "oneHour", hours: 1 },
{ key: "oneDay", hours: 24 },
{ key: "sevenDays", hours: 24 * 7 },
{ key: "thirtyDays", hours: 24 * 30 },
{ key: "custom", hours: undefined },
] as const;
type ExpiryPresetKey = (typeof EXPIRY_PRESETS)[number]["key"];
export function ShareSessionModal({
open,
onClose,
hostId,
sessionId,
protocol,
tabInstanceId,
}: {
open: boolean;
onClose: () => void;
hostId: number;
sessionId: string | null;
protocol: SessionShareProtocol;
tabInstanceId?: string;
}) {
const { t } = useTranslation();
const [mode, setMode] = useState<"link" | "user">("link");
const [permissionLevel, setPermissionLevel] =
useState<SessionSharePermissionLevel>("read-only");
const [expiryPreset, setExpiryPreset] = useState<ExpiryPresetKey>("oneDay");
const [customHours, setCustomHours] = useState("");
const [search, setSearch] = useState("");
const [users, setUsers] = useState<{ id: string; username: string }[]>([]);
const [selectedUserId, setSelectedUserId] = useState<string | null>(null);
const [submitting, setSubmitting] = useState(false);
const [createdLink, setCreatedLink] = useState<string | null>(null);
const [shares, setShares] = useState<SessionShareRecord[]>([]);
const [sharesLoaded, setSharesLoaded] = useState(false);
useEffect(() => {
if (!open) return;
setMode("link");
setPermissionLevel("read-only");
setExpiryPreset("oneDay");
setCustomHours("");
setSearch("");
setSelectedUserId(null);
setCreatedLink(null);
setSharesLoaded(false);
setShares([]);
}, [open, sessionId]);
useEffect(() => {
if (!open || sharesLoaded) return;
setSharesLoaded(true);
Promise.all([
getUserList().catch(() => ({ users: [] })),
getActiveSessionShares(hostId).catch(() => ({ shares: [] })),
]).then(([usersRes, sharesRes]) => {
setUsers(
(usersRes.users ?? []).map((u) => ({
id: String(u.userId),
username: u.username,
})),
);
setShares(sharesRes.shares ?? []);
});
}, [open, hostId, sharesLoaded]);
const filteredUsers = useMemo(() => {
const q = search.trim().toLowerCase();
return q
? users.filter((u) => u.username.toLowerCase().includes(q))
: users;
}, [users, search]);
const expiryHours = (() => {
if (expiryPreset === "custom") {
const hours = Number(customHours);
return Number.isFinite(hours) && hours > 0 ? hours : undefined;
}
return EXPIRY_PRESETS.find((p) => p.key === expiryPreset)?.hours;
})();
async function refreshShares() {
try {
const res = await getActiveSessionShares(hostId);
setShares(res.shares ?? []);
} catch {
// silently ignore
}
}
async function handleCreate() {
if (!sessionId) return;
if (mode === "user" && !selectedUserId) return;
if (expiryPreset === "custom" && !expiryHours) return;
setSubmitting(true);
try {
const result = await createSessionShare({
hostId,
sessionId,
tabInstanceId,
protocol,
shareType: mode,
targetUserId:
mode === "user" ? (selectedUserId ?? undefined) : undefined,
permissionLevel,
expiryHours,
});
if (mode === "link" && result.linkToken) {
const url = `${window.location.origin}${window.location.pathname}?view=shared&token=${result.linkToken}`;
setCreatedLink(url);
toast.success(t("sessionSharing.linkCreated"));
} else {
toast.success(t("sessionSharing.shareCreated"));
setSelectedUserId(null);
}
await refreshShares();
} catch (error) {
const status = (error as { status?: number })?.status;
if (mode === "user" && status === 403) {
toast.error(t("sessionSharing.userLacksHostAccess"));
} else {
toast.error(t("sessionSharing.shareFailed"));
}
} finally {
setSubmitting(false);
}
}
async function handleCopyLink() {
if (!createdLink) return;
try {
await navigator.clipboard.writeText(createdLink);
toast.success(t("sessionSharing.linkCopied"));
} catch {
// clipboard API unavailable, ignore
}
}
async function handleRevoke(shareId: string) {
try {
await revokeSessionShare(shareId);
setShares((prev) => prev.filter((s) => s.id !== shareId));
toast.success(t("sessionSharing.revoked"));
} catch {
toast.error(t("sessionSharing.revokeFailed"));
}
}
return (
<Dialog open={open} onOpenChange={(next) => !next && onClose()}>
<DialogContent className="sm:max-w-md">
<DialogHeader>
<DialogTitle>{t("sessionSharing.modalTitle")}</DialogTitle>
<DialogDescription>
{mode === "link"
? t("sessionSharing.linkModeDescription")
: t("sessionSharing.userModeDescription")}
</DialogDescription>
</DialogHeader>
<div className="flex flex-col gap-3">
<div className="flex gap-1.5">
{(["link", "user"] as const).map((m) => (
<button
key={m}
onClick={() => {
setMode(m);
setCreatedLink(null);
}}
className={`flex-1 flex items-center justify-center gap-1 px-2 py-1.5 text-[10px] font-bold uppercase tracking-widest border transition-colors ${mode === m ? "border-accent-brand/40 bg-accent-brand/10 text-accent-brand" : "border-border text-muted-foreground hover:text-foreground"}`}
>
{m === "link" ? (
<Link2 className="size-3 shrink-0" />
) : (
<User className="size-3 shrink-0" />
)}
{m === "link"
? t("sessionSharing.modeTab.link")
: t("sessionSharing.modeTab.user")}
</button>
))}
</div>
{mode === "user" && (
<>
<div className="relative">
<Search className="absolute left-2.5 top-1/2 -translate-y-1/2 size-3.5 text-muted-foreground/50" />
<Input
placeholder={t("sessionSharing.searchUsersPlaceholder")}
value={search}
onChange={(e) => setSearch(e.target.value)}
className="pl-8"
/>
</div>
<div className="flex flex-col border border-border h-28 overflow-y-auto">
{filteredUsers.length === 0 ? (
<div className="px-3 py-4 text-xs text-muted-foreground/50 text-center">
{t("sessionSharing.noUsersFound")}
</div>
) : (
filteredUsers.map((user) => {
const isSelected = selectedUserId === user.id;
return (
<button
key={user.id}
onClick={() => setSelectedUserId(user.id)}
className={`flex items-center gap-2 px-2.5 py-1.5 text-xs text-left border-b border-border/50 last:border-0 transition-colors shrink-0 ${isSelected ? "bg-accent-brand/10 text-accent-brand" : "hover:bg-muted/40"}`}
>
<div
className={`size-3.5 border flex items-center justify-center shrink-0 transition-colors ${isSelected ? "border-accent-brand bg-accent-brand" : "border-border bg-background"}`}
>
{isSelected && (
<Check className="size-2.5 text-background" />
)}
</div>
<User className="size-3 text-muted-foreground shrink-0" />
<span className="truncate">{user.username}</span>
</button>
);
})
)}
</div>
</>
)}
<div className="flex items-end gap-2">
<div className="flex flex-col gap-1 flex-1 min-w-0">
<span className="text-[10px] font-semibold uppercase tracking-widest text-muted-foreground">
{t("sessionSharing.permissionLevel.label")}
</span>
<select
value={permissionLevel}
onChange={(e) =>
setPermissionLevel(
e.target.value as SessionSharePermissionLevel,
)
}
className="h-8 w-full px-2.5 text-xs border border-border bg-background hover:bg-muted/40 transition-colors"
>
<option value="read-only">
{t("sessionSharing.permissionLevel.readOnly")}
</option>
<option value="read-write">
{t("sessionSharing.permissionLevel.readWrite")}
</option>
</select>
</div>
<DropdownMenu>
<DropdownMenuTrigger asChild>
<button className="flex flex-col gap-1 shrink-0">
<span className="text-[10px] font-semibold uppercase tracking-widest text-muted-foreground text-left">
{t("sessionSharing.expiryLabel")}
</span>
<span className="h-8 flex items-center justify-center px-2.5 text-xs border border-border hover:bg-muted/40 transition-colors whitespace-nowrap">
{t(`hosts.sharing.expiry.${expiryPreset}`)}
</span>
</button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end" className="text-xs">
{EXPIRY_PRESETS.map((preset) => (
<DropdownMenuItem
key={preset.key}
onClick={() => setExpiryPreset(preset.key)}
>
{expiryPreset === preset.key ? (
<Check className="size-3 mr-1.5" />
) : (
<span className="size-3 mr-1.5" />
)}
{t(`hosts.sharing.expiry.${preset.key}`)}
</DropdownMenuItem>
))}
</DropdownMenuContent>
</DropdownMenu>
</div>
{expiryPreset === "custom" && (
<Input
type="number"
autoFocus
placeholder={t("hosts.sharing.customHoursPlaceholder")}
value={customHours}
onChange={(e) => setCustomHours(e.target.value)}
className="[appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none"
/>
)}
<p className="text-[11px] text-muted-foreground leading-snug">
{permissionLevel === "read-only"
? t("sessionSharing.permissionLevel.readOnlyDescription")
: t("sessionSharing.permissionLevel.readWriteDescription")}
</p>
<Button
variant="outline"
className="h-8 shrink-0 border-accent-brand/40 text-accent-brand hover:bg-accent-brand/10 hover:text-accent-brand"
disabled={
!sessionId ||
submitting ||
(mode === "user" && !selectedUserId) ||
(expiryPreset === "custom" && !expiryHours)
}
onClick={handleCreate}
>
{mode === "link"
? t("sessionSharing.createLinkButton")
: t("sessionSharing.createShareButton")}
</Button>
{createdLink && (
<div className="flex items-center gap-1.5">
<Input readOnly value={createdLink} className="text-xs" />
<Button
variant="outline"
size="icon-sm"
onClick={handleCopyLink}
title={t("sessionSharing.copyLink")}
>
<Copy className="size-3.5" />
</Button>
</div>
)}
<div className="flex flex-col gap-0 border-t border-border pt-2">
<div className="flex items-center gap-1.5 pb-2 text-[10px] font-semibold uppercase tracking-widest text-muted-foreground">
<Users className="size-3.5" />
{t("sessionSharing.activeShares")}
{shares.length > 0 && (
<span className="text-muted-foreground/40">
({shares.length})
</span>
)}
</div>
<div className="flex flex-col max-h-40 overflow-y-auto">
{shares.length === 0 && (
<div className="px-1 py-4 text-xs text-muted-foreground/50 text-center">
{t("sessionSharing.noActiveShares")}
</div>
)}
{shares.map((share) => {
const targetUser = users.find(
(u) => u.id === share.targetUserId,
);
return (
<div
key={share.id}
className="flex items-center justify-between gap-2 py-2 border-b border-border/60 last:border-0 text-xs"
>
<div className="flex items-center gap-1.5 min-w-0">
{share.shareType === "link" ? (
<Link2 className="size-3 text-muted-foreground shrink-0" />
) : (
<Shield className="size-3 text-muted-foreground shrink-0" />
)}
<div className="flex flex-col min-w-0">
<span className="truncate font-semibold">
{share.shareType === "link"
? t("sessionSharing.linkShareBadge")
: t("sessionSharing.userShareBadge", {
username:
targetUser?.username ??
share.targetUserId ??
"?",
})}
</span>
<span className="text-[10px] text-muted-foreground/60">
{share.permissionLevel === "read-write"
? t("sessionSharing.permissionLevel.readWrite")
: t("sessionSharing.permissionLevel.readOnly")}
{" · "}
{t("sessionSharing.expiresAt", {
date: new Date(share.expiresAt).toLocaleString(),
})}
</span>
</div>
</div>
<Button
variant="ghost"
size="sm"
className="h-6 text-[10px] px-2 text-destructive hover:bg-destructive/10 shrink-0"
onClick={() => handleRevoke(share.id)}
>
{t("sessionSharing.revoke")}
</Button>
</div>
);
})}
</div>
</div>
</div>
</DialogContent>
</Dialog>
);
}
@@ -1,364 +0,0 @@
import React, { useEffect, useRef, useState } from "react";
import { useTranslation } from "react-i18next";
import { useXTerm } from "react-xtermjs";
import { FitAddon } from "@xterm/addon-fit";
import { AlertCircle, Eye, Users } from "lucide-react";
import {
resolveShareLink,
type ResolvedShareLink,
type ShareLinkErrorKind,
} from "@/api/session-sharing-api";
import { SimpleLoader } from "@/lib/SimpleLoader.tsx";
import { pluginWsUrlForPath } from "@/lib/plugin-transport";
import { RemoteDisplay } from "@/features/remote-display/RemoteDisplay";
const PING_INTERVAL_MS = 30000;
interface TerminalWsMessage {
type: string;
data?: string;
[key: string]: unknown;
}
// Mirrors Terminal.tsx's baseWsUrl construction (dev/electron/embedded/prod).
// Duplicated rather than extracted from that file to avoid touching it here.
// A shared session link is always resolved against the desktop app's
// embedded local backend -- joining a session hosted on someone else's
// remote server isn't supported from the desktop app today.
async function resolveTerminalWsUrl(wsPath: string): Promise<string> {
const target = await pluginWsUrlForPath(wsPath);
if (!target) throw new Error("No terminal endpoint is available");
return target.url;
}
export interface SessionParticipantInfo {
isOwner: boolean;
permissionLevel: "read-write" | "read-only";
label: string | null;
}
function ParticipantsBadge({
participants,
ownerLabel,
}: {
participants: SessionParticipantInfo[];
ownerLabel: string;
}) {
if (participants.length < 2) return null;
const names = participants
.map((participant) =>
participant.isOwner ? ownerLabel : (participant.label ?? "?"),
)
.join(", ");
return (
<div
className="absolute top-3 left-3 z-20 flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs font-medium"
style={{
backgroundColor: "var(--bg-elevated, rgba(0,0,0,0.6))",
color: "var(--foreground)",
border: "1px solid var(--border-base)",
}}
title={names}
>
<Users className="size-3.5" />
{participants.length}
</div>
);
}
function ReadOnlyBadge({ label }: { label: string }) {
return (
<div
className="absolute top-3 right-3 z-20 flex items-center gap-1.5 rounded-md px-2.5 py-1 text-xs font-medium"
style={{
backgroundColor: "var(--bg-elevated, rgba(0,0,0,0.6))",
color: "var(--foreground)",
border: "1px solid var(--border-base)",
}}
>
<Eye className="size-3.5" />
{label}
</div>
);
}
function CenteredMessage({
icon,
message,
}: {
icon: React.ReactNode;
message: string;
}) {
return (
<div
className="flex flex-col items-center justify-center h-full gap-4 w-full"
style={{ backgroundColor: "var(--bg-base)" }}
>
{icon}
<p
className="text-sm font-semibold text-center max-w-xs"
style={{ color: "var(--foreground)" }}
>
{message}
</p>
</div>
);
}
export function GuestTerminalView({
share,
wsPath,
hideBadges = false,
onParticipantsChange,
}: {
share: Pick<ResolvedShareLink, "permissionLevel">;
/** The socket path the backend handed out, query string included. */
wsPath: string;
/** Suppress the built-in overlay badges when the host page renders its own. */
hideBadges?: boolean;
onParticipantsChange?: (participants: SessionParticipantInfo[]) => void;
}) {
const { t } = useTranslation();
const { instance: terminal, ref: xtermRef } = useXTerm();
const [ended, setEnded] = useState<string | null>(null);
const [participants, setParticipants] = useState<SessionParticipantInfo[]>(
[],
);
const wsRef = useRef<WebSocket | null>(null);
const pingIntervalRef = useRef<ReturnType<typeof setInterval> | null>(null);
const onParticipantsChangeRef = useRef(onParticipantsChange);
onParticipantsChangeRef.current = onParticipantsChange;
useEffect(() => {
if (!terminal || !xtermRef.current) return;
terminal.options.theme = { background: "#0c0d0b" };
const fitAddon = new FitAddon();
terminal.loadAddon(fitAddon);
terminal.open(xtermRef.current);
fitAddon.fit();
const resizeObserver = new ResizeObserver(() => fitAddon.fit());
resizeObserver.observe(xtermRef.current);
let cancelled = false;
let ws: WebSocket | null = null;
resolveTerminalWsUrl(wsPath).then((url) => {
if (cancelled) return;
ws = new WebSocket(url);
wsRef.current = ws;
ws.onopen = () => {
pingIntervalRef.current = setInterval(() => {
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: "ping" }));
}
}, PING_INTERVAL_MS);
};
ws.onmessage = (event) => {
let msg: TerminalWsMessage;
try {
msg = JSON.parse(event.data);
} catch {
return;
}
switch (msg.type) {
case "data":
if (typeof msg.data === "string") terminal.write(msg.data);
break;
case "participants":
if (Array.isArray(msg.participants)) {
const next = msg.participants as SessionParticipantInfo[];
setParticipants(next);
onParticipantsChangeRef.current?.(next);
}
break;
case "sessionExpired":
case "sessionTerminatedByOwner":
case "session_ended":
setEnded(t("sessionSharing.guestView.sessionEnded"));
break;
default:
break;
}
};
ws.onclose = () => {
setEnded((prev) => prev ?? t("sessionSharing.guestView.sessionEnded"));
};
if (share.permissionLevel === "read-write") {
terminal.onData((data) => {
if (ws && ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify({ type: "input", data }));
}
});
}
});
return () => {
cancelled = true;
resizeObserver.disconnect();
if (pingIntervalRef.current) clearInterval(pingIntervalRef.current);
ws?.close();
wsRef.current = null;
};
// Deliberately runs once terminal mounts - share/token/permission are stable for the view's lifetime.
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [terminal, wsPath]);
return (
<div className="relative w-full h-full">
{!hideBadges && (
<>
<ParticipantsBadge
participants={participants}
ownerLabel={t("sessionSharing.guestView.ownerLabel")}
/>
{share.permissionLevel === "read-only" && (
<ReadOnlyBadge
label={t("sessionSharing.guestView.readOnlyBadge")}
/>
)}
</>
)}
{ended && (
<div
className="absolute inset-0 z-30 flex items-center justify-center"
style={{ backgroundColor: "var(--bg-base)" }}
>
<CenteredMessage
icon={
<AlertCircle
className="size-10"
style={{ color: "var(--foreground)" }}
/>
}
message={ended}
/>
</div>
)}
<div ref={xtermRef} className="w-full h-full" />
</div>
);
}
function GuestGuacamoleView({ share }: { share: ResolvedShareLink }) {
const { t } = useTranslation();
const [connectionError, setConnectionError] = useState<string | null>(null);
if (!share.connectParams?.token) {
return (
<CenteredMessage
icon={
<AlertCircle
className="size-10"
style={{ color: "var(--foreground)" }}
/>
}
message={t("sessionSharing.guestView.linkInvalid")}
/>
);
}
return (
<div className="relative w-full h-full">
{share.permissionLevel === "read-only" && (
<ReadOnlyBadge label={t("sessionSharing.guestView.readOnlyBadge")} />
)}
{connectionError && (
<div
className="absolute inset-0 z-30 flex items-center justify-center"
style={{ backgroundColor: "var(--bg-base)" }}
>
<CenteredMessage
icon={
<AlertCircle
className="size-10"
style={{ color: "var(--foreground)" }}
/>
}
message={connectionError}
/>
</div>
)}
<RemoteDisplay
token={share.connectParams.token}
protocol={share.protocol}
isVisible={true}
onError={(err) => setConnectionError(err)}
/>
</div>
);
}
export default function SharedSessionView() {
const { t } = useTranslation();
const [share, setShare] = useState<ResolvedShareLink | null>(null);
const [linkToken, setLinkToken] = useState<string | null>(null);
const [error, setError] = useState<string | null>(null);
const [loading, setLoading] = useState(true);
useEffect(() => {
const params = new URLSearchParams(window.location.search);
const token = params.get("token");
if (!token) {
setError(t("sessionSharing.guestView.linkInvalid"));
setLoading(false);
return;
}
setLinkToken(token);
resolveShareLink(token)
.then((resolved) => setShare(resolved))
.catch((err) => {
const kind = (err as { kind?: ShareLinkErrorKind })?.kind;
if (kind === "rate-limited") {
setError(t("sessionSharing.guestView.rateLimited"));
} else {
setError(t("sessionSharing.guestView.linkInvalid"));
}
})
.finally(() => setLoading(false));
}, [t]);
return (
<div
className="fixed inset-0 flex flex-col"
style={{ backgroundColor: "var(--bg-base)" }}
>
<div className="relative flex-1 min-h-0">
{loading && (
<SimpleLoader
visible={true}
message={t("sessionSharing.guestView.loading")}
/>
)}
{!loading && error && (
<CenteredMessage
icon={
<AlertCircle
className="size-10"
style={{ color: "var(--foreground)" }}
/>
}
message={error}
/>
)}
{!loading &&
!error &&
share &&
linkToken &&
(share.protocol === "ssh" ? (
<GuestTerminalView share={share} wsPath={share.wsPath} />
) : (
<GuestGuacamoleView share={share} />
))}
</div>
</div>
);
}
+2 -134
View File
@@ -664,7 +664,6 @@
"done_cli_link": "Open the CLI docs"
},
"nav": {
"collab": "Meetings",
"home": "Home",
"terminal": "Terminal",
"localTerminal": "Local Terminal",
@@ -1032,8 +1031,6 @@
"enableAutoTmuxDesc": "Keep your shell and anything running in it alive across disconnects and browser restarts by running inside tmux (tmux must be installed on the host)",
"enableSessionLogging": "Session Logging",
"enableSessionLoggingDesc": "Record terminal session output for later review",
"allowSessionSharing": "Allow Session Sharing",
"allowSessionSharingDesc": "Let live sessions on this host be shared via link or with other users",
"localEchoLabel": "Local Echo",
"localEchoDesc": "Predict safe printable keystrokes locally on slow connections. Password prompts and control input are never echoed.",
"localEchoDefault": "Use global setting",
@@ -1573,137 +1570,11 @@
"join": "Join",
"sharedSessionLabel": "{{hostName}} (shared)"
},
"collab": {
"createRoom": "New room",
"roomName": "Room name",
"persistentRoom": "Persistent room",
"persistentRoomHint": "Persistent rooms stay listed after the meeting ends and can be reused.",
"noRooms": "No rooms yet. Create one to start a meeting.",
"openRoom": "Open",
"endRoom": "End meeting",
"leaveRoom": "Leave",
"deleteMember": "Remove",
"removeMember": "Remove {{name}}",
"removeMemberTitle": "Remove this member?",
"removeMemberDescription": "{{name}} will lose access to this room immediately. Any active SSH viewer will be disconnected.",
"invite": "Invite",
"inviteTitle": "Invite members",
"members": "Members",
"membersPanel": "Room members and control requests",
"membersWithCount": "Members ({{count}})",
"online": "online",
"offline": "offline",
"you": "(you)",
"hostBadge": "Host",
"presenterBadge": "Presenting",
"present": "Present",
"presentTitle": "Take the stage",
"presentHost": "Host",
"searchHosts": "Search hosts",
"noHostsFound": "No available hosts found.",
"presentProtocol": "Protocol",
"stopPresenting": "Stop presenting",
"takeOver": "Take over",
"takeOverConfirmTitle": "Replace the current presentation?",
"takeOverDescription": "{{name}} is presenting now. Taking over will disconnect everyone from that stage.",
"emptyStage": "Nobody is presenting. Take the stage to share a session.",
"stageLoading": "Connecting to the stage...",
"stageEnded": "The presentation ended",
"roomEnded": "This meeting has ended",
"presenterLabel": "{{name}} is presenting",
"guestLink": "Guest link",
"guestLinkOn": "Guest link is on. Anyone with the link can watch the stage.",
"guestLinkOff": "Guest link is off.",
"copyLink": "Copy link",
"rotateLink": "Rotate link",
"disableLink": "Disable link",
"rotateLinkConfirmTitle": "Rotate the guest link?",
"rotateLinkDescription": "The current link will stop working immediately. Connected SSH guests will be disconnected.",
"disableLinkConfirmTitle": "Disable the guest link?",
"disableLinkDescription": "Anonymous SSH viewers will be disconnected immediately and the current link will stop working.",
"linkCopied": "Link copied",
"roles": "Roles",
"users": "Users",
"searchUsers": "Search users",
"endConfirmTitle": "End this meeting?",
"endDescription": "{{name}} will end for everyone and cannot be reopened.",
"endPersistentDescription": "The active presentation in {{name}} will stop. The room remains available for reuse.",
"deleteRoom": "Delete room",
"deleteConfirmTitle": "Delete this room?",
"deleteDescription": "{{name}} will be permanently deleted for everyone and cannot be undone.",
"invitedTo": "You were invited to \"{{name}}\"",
"guest": {
"title": "Meeting",
"waiting": "Waiting for the presenter...",
"linkInvalid": "This guest link is invalid or the meeting has ended"
},
"reopenFromPanel": "This meeting tab expired. Reopen the room from the Meetings panel.",
"requestControl": "Request control",
"cancelControlRequest": "Cancel request",
"controlQueue": "Control requests",
"noControlRequests": "No pending requests.",
"grantControlTo": "Give control to {{name}}",
"dismissControlRequest": "Dismiss {{name}}'s control request",
"releaseControl": "Release control",
"grantControl": "Give control",
"revokeControl": "Take back control",
"controlRequestedBy": "{{name}} asked for control",
"grant": "Grant",
"controlBadge": "In control",
"youArePresenting": "You are presenting in another tab. Stop presenting to hand the stage over.",
"created": "Room created",
"invited": "Members invited",
"roomTab": "Meeting"
},
"sessionSharing": {
"guestView": {
"loading": "Connecting to shared session...",
"linkInvalid": "This share link is invalid, expired, or has been revoked",
"rateLimited": "Too many attempts, please try again shortly",
"sessionEnded": "This session has ended",
"readOnlyBadge": "View only",
"ownerLabel": "Host owner"
},
"modalTitle": "Share session",
"shareButton": "Share",
"notReadyToShare": "Session is not ready to share yet",
"modeTab": {
"link": "Link",
"user": "User"
},
"linkModeDescription": "Anyone with this link can join, no account required.",
"userModeDescription": "Share with a specific user who already has access to this host. If they do not have access yet, share the host with them first or use a link instead. Once shared, the session appears in their Connections tab.",
"permissionLevel": {
"label": "Permission level",
"readOnly": "Read-only",
"readOnlyDescription": "Can watch the session live but cannot type or interact.",
"readWrite": "Read-write",
"readWriteDescription": "Can type and interact with the session just like the owner."
},
"expiryLabel": "Link expiry",
"createLinkButton": "Create link",
"createShareButton": "Share with user",
"searchUsersPlaceholder": "Search users...",
"noUsersFound": "No users found",
"linkCreated": "Share link created",
"linkCopied": "Link copied to clipboard",
"copyLink": "Copy link",
"shareCreated": "Session shared. It will appear in their Connections tab.",
"shareFailed": "Failed to create share",
"userLacksHostAccess": "That user does not have access to this host yet. Share the host with them first, or use a link instead.",
"activeShares": "Active shares",
"noActiveShares": "No active shares for this session",
"revoke": "Revoke",
"revokeConfirmTitle": "Revoke this share?",
"revokeConfirmDescription": "Anyone using this share will lose access immediately.",
"revoked": "Share revoked",
"revokeFailed": "Failed to revoke share",
"joinCount": "{{count}} join",
"joinCount_other": "{{count}} joins",
"expiresAt": "Expires {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "User: {{username}}",
"loadSharesFailed": "Failed to load active shares"
"readWrite": "Read-write"
}
},
"terminal": {
"connect": "Connect to Host",
@@ -2251,7 +2122,6 @@
"analyticsEnabledDesc": "Sends an anonymous daily count of users, hosts, and feature usage to help improve Termix. No personal data or connection details are ever included.",
"analyticsEnabledLockedDesc": "This setting is locked by the ENABLE_TELEMETRY environment variable and cannot be changed here.",
"updateAnalyticsFailed": "Failed to update analytics setting",
"sessionSharingGloballyEnabled": "Allow Session Sharing",
"auditForwardingTitle": "Forward to SIEM",
"auditForwardingDesc": "Ship a copy of every audit entry to an external collector as NDJSON. Local logs stay the source of truth.",
"auditForwardingEnvNotice": "An environment variable also configures forwarding; the URL saved here takes precedence.",
@@ -2259,8 +2129,6 @@
"auditForwardingTokenStored": "Bearer token (stored)",
"auditForwardingSaved": "Audit forwarding settings saved",
"auditForwardingSaveError": "Failed to save audit forwarding settings",
"sessionSharingGloballyEnabledDesc": "Allow live terminal, RDP, VNC, and Telnet sessions to be shared instance-wide. Overrides every per-host sharing toggle when disabled.",
"updateSessionSharingFailed": "Failed to update session sharing setting",
"sessionTimeout": "Session Timeout",
"hours": "hours",
"sessionTimeoutRange": "Min 1h · Max 720h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Maak die CLI-dokumente oop"
},
"nav": {
"collab": "Vergaderings",
"home": "Tuis",
"terminal": "Terminaal",
"localTerminal": "Plaaslike Terminaal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Hou jou dop en enigiets wat daarin loop lewendig oor ontkoppelings en herbegin van blaaiers deur dit binne tmux te laat loop (tmux moet op die gasheer geïnstalleer wees)",
"enableSessionLogging": "Sessie-logging",
"enableSessionLoggingDesc": "Neem terminaalsessie-uitvoer op vir latere hersiening",
"allowSessionSharing": "Laat Sessiedeling Toe",
"allowSessionSharingDesc": "Laat regstreekse sessies op hierdie gasheer via skakel of met ander gebruikers gedeel word",
"localEchoLabel": "Plaaslike Eggo",
"localEchoDesc": "Voorspel veilige drukbare toetsaanslagen plaaslik op stadige verbindings. Wagwoordaanwysings en beheerinvoer word nooit herhaal nie.",
"localEchoDefault": "Gebruik globale instelling",
@@ -1571,137 +1568,11 @@
"join": "Sluit aan",
"sharedSessionLabel": "{{hostName}} (gedeel)"
},
"collab": {
"createRoom": "Nuwe kamer",
"roomName": "Kamernaam",
"persistentRoom": "Permanente kamer",
"persistentRoomHint": "Permanente kamers bly gelys nadat die vergadering eindig en kan hergebruik word.",
"noRooms": "Geen kamers nog nie. Skep een om 'n vergadering te begin.",
"openRoom": "Oop",
"endRoom": "Beëindig vergadering",
"leaveRoom": "Vertrek",
"deleteMember": "Verwyder",
"removeMember": "Verwyder {{name}}",
"removeMemberTitle": "Verwyder hierdie lid?",
"removeMemberDescription": "{{name}} sal onmiddellik toegang tot hierdie kamer verloor. Enige aktiewe SSH-kyker sal ontkoppel word.",
"invite": "Nooi uit",
"inviteTitle": "Nooi lede uit",
"members": "Lede",
"membersPanel": "Kamerlede en beheerversoeke",
"membersWithCount": "Lede ({{count}})",
"online": "aanlyn",
"offline": "vanlyn",
"you": "(jy)",
"hostBadge": "Gasheer",
"presenterBadge": "Aanbieding",
"present": "Aanwesig",
"presentTitle": "Neem die verhoog",
"presentHost": "Gasheer",
"searchHosts": "Soek gashere",
"noHostsFound": "Geen beskikbare gashere gevind nie.",
"presentProtocol": "Protokol",
"stopPresenting": "Hou op met aanbied",
"takeOver": "Neem oor",
"takeOverConfirmTitle": "Vervang die huidige aanbieding?",
"takeOverDescription": "{{name}} bied nou aan. Oorname sal almal van daardie stadium ontkoppel.",
"emptyStage": "Niemand bied aan nie. Neem die verhoog om 'n sessie te deel.",
"stageLoading": "Verbind met die verhoog...",
"stageEnded": "Die aanbieding het geëindig",
"roomEnded": "Hierdie vergadering het geëindig",
"presenterLabel": "{{name}} bied aan",
"guestLink": "Gas skakel",
"guestLinkOn": "Gasskakel is aan. Enigiemand met die skakel kan die verhoog kyk.",
"guestLinkOff": "Gas skakel is af.",
"copyLink": "Kopieer skakel",
"rotateLink": "Roteer skakel",
"disableLink": "Deaktiveer skakel",
"rotateLinkConfirmTitle": "Draai die gasskakel?",
"rotateLinkDescription": "Die huidige skakel sal onmiddellik ophou werk. Gekoppelde SSH-gaste sal ontkoppel word.",
"disableLinkConfirmTitle": "Deaktiveer die gasskakel?",
"disableLinkDescription": "Anonieme SSH-kykers sal onmiddellik ontkoppel word en die huidige skakel sal ophou werk.",
"linkCopied": "Skakel gekopieer",
"roles": "Rolle",
"users": "Gebruikers",
"searchUsers": "Soek gebruikers",
"endConfirmTitle": "Beëindig hierdie vergadering?",
"endDescription": "{{name}} sal vir almal eindig en kan nie weer heropen word nie.",
"endPersistentDescription": "Die aktiewe aanbieding in {{name}} sal stop. Die kamer bly beskikbaar vir hergebruik.",
"deleteRoom": "Vee kamer uit",
"deleteConfirmTitle": "Vee hierdie kamer uit?",
"deleteDescription": "{{name}} sal permanent vir almal uitgevee word en kan nie ongedaan gemaak word nie.",
"invitedTo": "Jy is genooi na \"{{name}}\"",
"guest": {
"title": "Vergadering",
"waiting": "Wag vir die aanbieder...",
"linkInvalid": "Hierdie gasskakel is ongeldig of die vergadering het geëindig"
},
"reopenFromPanel": "Hierdie vergadering-oortjie het verval. Maak die kamer weer oop vanaf die Vergaderings-paneel.",
"requestControl": "Versoekbeheer",
"cancelControlRequest": "Kanselleer versoek",
"controlQueue": "Beheerversoeke",
"noControlRequests": "Geen hangende versoeke nie.",
"grantControlTo": "Gee beheer aan {{name}}",
"dismissControlRequest": "Maak {{name}}se beheerversoek toe",
"releaseControl": "Vrystellingsbeheer",
"grantControl": "Gee beheer",
"revokeControl": "Neem beheer terug",
"controlRequestedBy": "{{name}} het om beheer gevra",
"grant": "Toekenning",
"controlBadge": "In beheer",
"youArePresenting": "Jy bied aan in 'n ander oortjie. Stop die aanbieding om die verhoog oor te dra.",
"created": "Kamer geskep",
"invited": "Lede genooi",
"roomTab": "Vergadering"
},
"sessionSharing": {
"guestView": {
"loading": "Verbind met gedeelde sessie...",
"linkInvalid": "Hierdie deelskakel is ongeldig, het verval of is herroep",
"rateLimited": "Te veel pogings, probeer asseblief weer binnekort",
"sessionEnded": "Hierdie sessie is verby",
"readOnlyBadge": "Slegs kyk",
"ownerLabel": "Gasheer-eienaar"
},
"modalTitle": "Deel sessie",
"shareButton": "Deel",
"notReadyToShare": "Sessie is nog nie gereed om te deel nie",
"modeTab": {
"link": "Skakel",
"user": "Gebruiker"
},
"linkModeDescription": "Enigiemand met hierdie skakel kan aansluit, geen rekening nodig nie.",
"userModeDescription": "Deel met 'n spesifieke gebruiker wat reeds toegang tot hierdie gasheer het. Indien hulle nog nie toegang het nie, deel die gasheer eers met hulle of gebruik eerder 'n skakel. Sodra dit gedeel is, verskyn die sessie in hul Verbindings-oortjie.",
"permissionLevel": {
"label": "Toestemmingsvlak",
"readOnly": "Leesalleen",
"readOnlyDescription": "Kan die sessie regstreeks kyk, maar kan nie tik of interaksie hê nie.",
"readWrite": "Lees-skryf",
"readWriteDescription": "Kan tik en met die sessie interaksie hê net soos die eienaar."
},
"expiryLabel": "Skakelvervaldatum",
"createLinkButton": "Skep skakel",
"createShareButton": "Deel met gebruiker",
"searchUsersPlaceholder": "Soek gebruikers...",
"noUsersFound": "Geen gebruikers gevind nie",
"linkCreated": "Deel skakel geskep",
"linkCopied": "Skakel gekopieer na knipbord",
"copyLink": "Kopieer skakel",
"shareCreated": "Sessie gedeel. Dit sal in hul Verbindings-oortjie verskyn.",
"shareFailed": "Kon nie deel skep nie",
"userLacksHostAccess": "Daardie gebruiker het nog nie toegang tot hierdie gasheer nie. Deel die gasheer eers met hulle, of gebruik eerder 'n skakel.",
"activeShares": "Aktiewe aandele",
"noActiveShares": "Geen aktiewe delings vir hierdie sessie nie",
"revoke": "Herroep",
"revokeConfirmTitle": "Herroep hierdie deling?",
"revokeConfirmDescription": "Enigiemand wat hierdie deel gebruik, sal onmiddellik toegang verloor.",
"revoked": "Deel herroep",
"revokeFailed": "Kon nie deel herroep nie",
"joinCount": "{{count}} sluit aan",
"joinCount_other": "{{count}} sluit aan",
"expiresAt": "Vervaldatum {{date}}",
"linkShareBadge": "Skakel",
"userShareBadge": "Gebruiker: {{username}}",
"loadSharesFailed": "Kon nie aktiewe delings laai nie"
"readWrite": "Lees-skryf"
}
},
"terminal": {
"connect": "Koppel aan gasheer",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Stuur 'n anonieme daaglikse telling van gebruikers, gashere en funksiegebruik om Termix te help verbeter. Geen persoonlike data of verbindingsbesonderhede word ooit ingesluit nie.",
"analyticsEnabledLockedDesc": "Hierdie instelling word gesluit deur die ENABLE_TELEMETRY omgewingveranderlike en kan nie hier verander word nie.",
"updateAnalyticsFailed": "Kon nie analitiese instelling opdateer nie",
"sessionSharingGloballyEnabled": "Laat Sessiedeling Toe",
"auditForwardingTitle": "Stuur aan na SIEM",
"auditForwardingDesc": "Stuur 'n kopie van elke ouditinskrywing na 'n eksterne versamelaar as NDJSON. Plaaslike logboeke bly die bron van waarheid.",
"auditForwardingEnvNotice": "'n Omgewingsveranderlike konfigureer ook aanstuur; die URL wat hier gestoor word, kry voorrang.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Draerteken (gestoor)",
"auditForwardingSaved": "Oudit-aanstuurinstellings gestoor",
"auditForwardingSaveError": "Kon nie instellings vir oudit-aanstuur stoor nie",
"sessionSharingGloballyEnabledDesc": "Laat lewendige terminaal-, RDP-, VNC- en Telnet-sessies toe om instansiewyd gedeel te word. Oorskryf elke deelskakelaar per gasheer wanneer dit gedeaktiveer is.",
"updateSessionSharingFailed": "Kon nie sessiedelinginstelling opdateer nie",
"sessionTimeout": "Sessie-tydsbeperking",
"hours": "ure",
"sessionTimeoutRange": "Min 1 uur · Maks 720 uur",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "افتح وثائق واجهة سطر الأوامر"
},
"nav": {
"collab": "الاجتماعات",
"home": "الرئيسية",
"terminal": "الطرفية",
"localTerminal": "المحطة المحلية",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "حافظ على تشغيل shell وأي شيء يعمل بداخله أثناء انقطاع الاتصال وإعادة تشغيل المتصفح عن طريق التشغيل داخل tmux (يجب تثبيت tmux على المضيف).",
"enableSessionLogging": "تسجيل الجلسات",
"enableSessionLoggingDesc": "تسجيل مخرجات الجلسة الطرفية للمراجعة لاحقاً",
"allowSessionSharing": "السماح بمشاركة الجلسة",
"allowSessionSharingDesc": "يمكن مشاركة الجلسات المباشرة على هذا المضيف عبر رابط أو مع مستخدمين آخرين",
"localEchoLabel": "صدى محلي",
"localEchoDesc": "توقع ضغطات المفاتيح الآمنة القابلة للطباعة محليًا على الاتصالات البطيئة. لا يتم عرض مطالبات كلمة المرور أو مدخلات التحكم على الشاشة.",
"localEchoDefault": "استخدم الإعدادات العامة",
@@ -1571,137 +1568,11 @@
"join": "ينضم",
"sharedSessionLabel": "{{hostName}} (مشترك)"
},
"collab": {
"createRoom": "غرف جديدة",
"roomName": "اسم الغرفة",
"persistentRoom": "غرفة مستمرة",
"persistentRoomHint": "تبقى الغرف الدائمة مدرجة بعد انتهاء الاجتماع ويمكن إعادة استخدامها.",
"noRooms": "لا توجد غرف اجتماعات بعد. أنشئ غرفة لبدء اجتماع.",
"openRoom": "يفتح",
"endRoom": "انتهاء الاجتماع",
"leaveRoom": "يترك",
"deleteMember": "يزيل",
"removeMember": "إزالة {{name}}",
"removeMemberTitle": "هل تريد حذف هذا العضو؟",
"removeMemberDescription": "سيفقد المستخدم {{name}} إمكانية الوصول إلى هذه الغرفة فورًا. وسيتم فصل أي برنامج عرض SSH نشط.",
"invite": "يدعو",
"inviteTitle": "دعوة الأعضاء",
"members": "أعضاء",
"membersPanel": "أعضاء الغرفة وطلبات التحكم",
"membersWithCount": "الأعضاء ({{count}})",
"online": "متصل",
"offline": "غير متصل بالإنترنت",
"you": "(أنت)",
"hostBadge": "يستضيف",
"presenterBadge": "تقديم",
"present": "حاضر",
"presentTitle": "اصعد إلى المسرح",
"presentHost": "يستضيف",
"searchHosts": "البحث عن المضيفين",
"noHostsFound": "لم يتم العثور على مضيفين متاحين.",
"presentProtocol": "بروتوكول",
"stopPresenting": "توقف عن التقديم",
"takeOver": "تولي زمام الأمور",
"takeOverConfirmTitle": "هل تريد استبدال العرض التقديمي الحالي؟",
"takeOverDescription": "{{name}} يقدم العرض الآن. سيؤدي الاستحواذ على المنصة إلى فصل الجميع عنها.",
"emptyStage": "لا يوجد مقدمون. تفضلوا بالصعود إلى المنصة لمشاركة جلسة.",
"stageLoading": "الاتصال بالمسرح...",
"stageEnded": "انتهى العرض التقديمي",
"roomEnded": "انتهى هذا الاجتماع",
"presenterLabel": "{{name}} يقدم",
"guestLink": "رابط الضيف",
"guestLinkOn": "رابط الضيوف مُفعّل. يمكن لأي شخص لديه الرابط مشاهدة العرض.",
"guestLinkOff": "رابط الضيف معطل.",
"copyLink": "نسخ الوصلة",
"rotateLink": "تدوير الرابط",
"disableLink": "تعطيل الرابط",
"rotateLinkConfirmTitle": "هل تريد تدوير رابط الضيف؟",
"rotateLinkDescription": "سيتوقف الرابط الحالي عن العمل فوراً. سيتم فصل الضيوف المتصلين عبر SSH.",
"disableLinkConfirmTitle": "هل تريد تعطيل رابط الضيف؟",
"disableLinkDescription": "سيتم قطع اتصال عارضي SSH المجهولين على الفور وسيتوقف الرابط الحالي عن العمل.",
"linkCopied": "تم نسخ الرابط",
"roles": "الأدوار",
"users": "المستخدمون",
"searchUsers": "ابحث عن المستخدمين",
"endConfirmTitle": "هل ننهي هذا الاجتماع؟",
"endDescription": "سينتهي {{name}} للجميع ولن يكون من الممكن إعادة فتحه.",
"endPersistentDescription": "سيتوقف العرض التقديمي النشط في {{name}} . وستبقى الغرفة متاحة لإعادة الاستخدام.",
"deleteRoom": "حذف الغرفة",
"deleteConfirmTitle": "هل تريد حذف هذه الغرفة؟",
"deleteDescription": "سيتم حذف {{name}} نهائياً للجميع ولا يمكن التراجع عنه.",
"invitedTo": "لقد تمت دعوتك إلى \"{{name}}\"",
"guest": {
"title": "مقابلة",
"waiting": "في انتظار المذيع...",
"linkInvalid": "رابط الضيف هذا غير صالح أو انتهى الاجتماع"
},
"reopenFromPanel": "انتهت صلاحية علامة تبويب هذا الاجتماع. أعد فتح الغرفة من لوحة الاجتماعات.",
"requestControl": "التحكم في الطلبات",
"cancelControlRequest": "إلغاء الطلب",
"controlQueue": "طلبات التحكم",
"noControlRequests": "لا توجد طلبات معلقة.",
"grantControlTo": "قم بمنح التحكم إلى {{name}}",
"dismissControlRequest": "رفض طلب التحكم {{name}}",
"releaseControl": "التحكم في الإصدار",
"grantControl": "امنح السيطرة",
"revokeControl": "استعد السيطرة",
"controlRequestedBy": "طلب {{name}} التحكم",
"grant": "منحة",
"controlBadge": "مسيطر",
"youArePresenting": "أنت تعرض المحتوى في علامة تبويب أخرى. توقف عن العرض لتسليم المنصة.",
"created": "تم إنشاء الغرفة",
"invited": "الأعضاء المدعوون",
"roomTab": "مقابلة"
},
"sessionSharing": {
"guestView": {
"loading": "جارٍ الاتصال بالجلسة المشتركة...",
"linkInvalid": "رابط المشاركة هذا غير صالح أو منتهي الصلاحية أو تم إلغاؤه",
"rateLimited": "عدد المحاولات كبير جدًا، يرجى المحاولة مرة أخرى قريبًا",
"sessionEnded": "انتهت هذه الجلسة",
"readOnlyBadge": "للعرض فقط",
"ownerLabel": "مالك المضيف"
},
"modalTitle": "جلسة مشاركة",
"shareButton": "يشارك",
"notReadyToShare": "الجلسة غير جاهزة للمشاركة بعد",
"modeTab": {
"link": "وصلة",
"user": "مستخدم"
},
"linkModeDescription": "يمكن لأي شخص لديه هذا الرابط الانضمام، ولا يلزم وجود حساب.",
"userModeDescription": "شارك الملف مع مستخدم محدد لديه صلاحية الوصول إلى هذا المضيف. إذا لم يكن لديه صلاحية الوصول بعد، فشارك معه المضيف أولاً أو استخدم رابطًا. بمجرد المشاركة، ستظهر الجلسة في علامة تبويب \"الاتصالات\" الخاصة به.",
"permissionLevel": {
"label": "مستوى الإذن",
"readOnly": "للقراءة فقط",
"readOnlyDescription": "يمكنني مشاهدة الجلسة مباشرة ولكن لا يمكنني الكتابة أو التفاعل.",
"readWrite": "القراءة والكتابة",
"readWriteDescription": "يمكنه الكتابة والتفاعل مع الجلسة تمامًا مثل المالك."
},
"expiryLabel": "انتهاء صلاحية الرابط",
"createLinkButton": "إنشاء رابط",
"createShareButton": "مشاركة مع المستخدم",
"searchUsersPlaceholder": "ابحث عن المستخدمين...",
"noUsersFound": "لم يتم العثور على مستخدمين",
"linkCreated": "تم إنشاء رابط المشاركة",
"linkCopied": "تم نسخ الرابط إلى الحافظة",
"copyLink": "نسخ الوصلة",
"shareCreated": "تمت مشاركة الجلسة. ستظهر في علامة تبويب \"الاتصالات\" الخاصة بهم.",
"shareFailed": "فشل إنشاء المشاركة",
"userLacksHostAccess": "لا يملك هذا المستخدم صلاحية الوصول إلى هذا المضيف بعد. شارك المضيف معه أولاً، أو استخدم رابطاً بدلاً من ذلك.",
"activeShares": "الأسهم النشطة",
"noActiveShares": "لا توجد أسهم نشطة لهذه الجلسة",
"revoke": "إلغاء",
"revokeConfirmTitle": "إلغاء هذه الحصة؟",
"revokeConfirmDescription": "أي شخص يستخدم هذا الملف المشترك سيفقد الوصول إليه فوراً.",
"revoked": "تم إلغاء الحصة",
"revokeFailed": "فشل في إلغاء المشاركة",
"joinCount": "{{count}} انضم",
"joinCount_other": "{{count}} ينضم",
"expiresAt": "تاريخ الانتهاء {{date}}",
"linkShareBadge": "وصلة",
"userShareBadge": "المستخدم: {{username}}",
"loadSharesFailed": "فشل تحميل المشاركات النشطة"
"readWrite": "القراءة والكتابة"
}
},
"terminal": {
"connect": "الاتصال بالمضيف",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "يرسل النظام إحصاءً يومياً مجهولاً للمستخدمين والمضيفين واستخدام الميزات للمساعدة في تحسين Termix. ولا يتم تضمين أي بيانات شخصية أو تفاصيل اتصال على الإطلاق.",
"analyticsEnabledLockedDesc": "هذا الإعداد مقفل بواسطة متغير البيئة ENABLE_TELEMETRY ولا يمكن تغييره هنا.",
"updateAnalyticsFailed": "فشل تحديث إعدادات التحليلات",
"sessionSharingGloballyEnabled": "السماح بمشاركة الجلسة",
"auditForwardingTitle": "إعادة التوجيه إلى SIEM",
"auditForwardingDesc": "أرسل نسخة من كل إدخال تدقيق إلى جامع بيانات خارجي بصيغة NDJSON. تبقى السجلات المحلية هي المصدر الموثوق.",
"auditForwardingEnvNotice": "يُستخدم متغير البيئة أيضًا لضبط عملية إعادة التوجيه؛ ويأخذ عنوان URL المحفوظ هنا الأولوية.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "رمز حامل (مخزن)",
"auditForwardingSaved": "تم حفظ إعدادات إعادة توجيه التدقيق",
"auditForwardingSaveError": "فشل حفظ إعدادات إعادة توجيه التدقيق",
"sessionSharingGloballyEnabledDesc": "يسمح هذا الخيار بمشاركة جلسات الطرفية المباشرة، وجلسات RDP، وVNC، وTelnet على مستوى الجهاز. ويتجاوز هذا الخيار جميع إعدادات المشاركة الخاصة بكل مضيف عند تعطيله.",
"updateSessionSharingFailed": "فشل تحديث إعدادات مشاركة الجلسة",
"sessionTimeout": "مهلة الجلسة",
"hours": "ساعات",
"sessionTimeoutRange": "الحد الأدنى 1 ساعة · الحد الأقصى 720 ساعة",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Отворете документацията на CLI"
},
"nav": {
"collab": "Срещи",
"home": "Дом",
"terminal": "Терминал",
"localTerminal": "Местен терминал",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Поддържайте вашата обвивка и всичко, което се изпълнява в нея, активно при прекъсвания на връзката и рестартиране на браузъра, като я стартирате вътре в tmux (tmux трябва да е инсталиран на хоста)",
"enableSessionLogging": "Записване на сесии",
"enableSessionLoggingDesc": "Записване на изхода от терминалната сесия за по-късен преглед",
"allowSessionSharing": "Разрешаване на споделяне на сесия",
"allowSessionSharingDesc": "Позволете споделянето на сесиите на живо на този хост чрез линк или с други потребители",
"localEchoLabel": "Локално ехо",
"localEchoDesc": "Предсказвайте безопасни за печат натискания на клавиши локално при бавни връзки. Подканите за парола и контролните въведени команди никога не се повтарят.",
"localEchoDefault": "Използвайте глобална настройка",
@@ -1571,137 +1568,11 @@
"join": "Присъединете се",
"sharedSessionLabel": "{{hostName}} (споделено)"
},
"collab": {
"createRoom": "Нова стая",
"roomName": "Име на стаята",
"persistentRoom": "Постоянна стая",
"persistentRoomHint": "Постоянните стаи остават в списъка след края на срещата и могат да бъдат използвани повторно.",
"noRooms": "Все още няма стаи. Създайте една, за да започнете среща.",
"openRoom": "Отворено",
"endRoom": "Край на срещата",
"leaveRoom": "Оставете",
"deleteMember": "Премахване",
"removeMember": "Премахване на {{name}}",
"removeMemberTitle": "Да се премахне ли този член?",
"removeMemberDescription": "{{name}} ще загуби достъп до тази стая незабавно. Всеки активен SSH зрител ще бъде прекъснат.",
"invite": "Покани",
"inviteTitle": "Поканете членове",
"members": "Членове",
"membersPanel": "Членове на стаята и заявки за контрол",
"membersWithCount": "Членове ({{count}})",
"online": "онлайн",
"offline": "офлайн",
"you": "(ти)",
"hostBadge": "Домакин",
"presenterBadge": "Представяне",
"present": "Настояще",
"presentTitle": "Излезте на сцената",
"presentHost": "Домакин",
"searchHosts": "Търсене на хостове",
"noHostsFound": "Няма намерени налични хостове.",
"presentProtocol": "Протокол",
"stopPresenting": "Спиране на представянето",
"takeOver": "Поемете контрола",
"takeOverConfirmTitle": "Да се замени ли текущата презентация?",
"takeOverDescription": "{{name}} представя сега. Поемането на водещия ще изключи всички от тази сцена.",
"emptyStage": "Никой не представя. Излезте на сцената, за да споделите сесия.",
"stageLoading": "Свързване със сцената...",
"stageEnded": "Презентацията приключи",
"roomEnded": "Тази среща приключи",
"presenterLabel": "{{name}} представя",
"guestLink": "Връзка за гости",
"guestLinkOn": "Връзката за гости е включена. Всеки с връзката може да гледа сцената.",
"guestLinkOff": "Връзката за гости е изключена.",
"copyLink": "Копиране на връзката",
"rotateLink": "Завъртане на връзката",
"disableLink": "Деактивиране на връзката",
"rotateLinkConfirmTitle": "Да се завърти ли линкът за гости?",
"rotateLinkDescription": "Текущата връзка ще спре да работи незабавно. Свързаните SSH гости ще бъдат прекъснати.",
"disableLinkConfirmTitle": "Да се деактивира ли връзката за гости?",
"disableLinkDescription": "Анонимните SSH зрители ще бъдат незабавно прекъснати и текущата връзка ще спре да работи.",
"linkCopied": "Връзката е копирана",
"roles": "Роли",
"users": "Потребители",
"searchUsers": "Търсене на потребители",
"endConfirmTitle": "Да се прекрати ли тази среща?",
"endDescription": "{{name}} ще приключи за всички и не може да бъде отворено отново.",
"endPersistentDescription": "Активната презентация в {{name}} ще спре. Стаята остава достъпна за повторна употреба.",
"deleteRoom": "Изтриване на стая",
"deleteConfirmTitle": "Да се изтрие ли тази стая?",
"deleteDescription": "{{name}} ще бъде изтрито за постоянно за всички и действието не може да бъде отменено.",
"invitedTo": "Поканиха ви в „{{name}}“",
"guest": {
"title": "Среща",
"waiting": "В очакване на водещия...",
"linkInvalid": "Този линк за гости е невалиден или срещата е приключила"
},
"reopenFromPanel": "Този раздел за среща е с изтекъл срок. Отворете отново стаята от панела „Срещи“.",
"requestControl": "Заявка за контрол",
"cancelControlRequest": "Отмяна на заявката",
"controlQueue": "Заявки за контрол",
"noControlRequests": "Няма чакащи заявки.",
"grantControlTo": "Дайте контрол на {{name}}",
"dismissControlRequest": "Отхвърляне на заявката за контрол на {{name}}",
"releaseControl": "Контрол на освобождаването",
"grantControl": "Дайте контрол",
"revokeControl": "Върнете си контрола",
"controlRequestedBy": "{{name}} поиска контрол",
"grant": "Грант",
"controlBadge": "В контрол",
"youArePresenting": "Презентирате в друг раздел. Спрете презентацията, за да предадете сцената.",
"created": "Стаята е създадена",
"invited": "Поканени членове",
"roomTab": "Среща"
},
"sessionSharing": {
"guestView": {
"loading": "Свързване със споделена сесия...",
"linkInvalid": "Този линк за споделяне е невалиден, изтекъл или е отменен",
"rateLimited": "Твърде много опити, моля опитайте отново скоро",
"sessionEnded": "Тази сесия приключи",
"readOnlyBadge": "Само преглед",
"ownerLabel": "Собственик на домакин"
},
"modalTitle": "Споделяне на сесия",
"shareButton": "Споделяне",
"notReadyToShare": "Сесията все още не е готова за споделяне",
"modeTab": {
"link": "Връзка",
"user": "Потребител"
},
"linkModeDescription": "Всеки с този линк може да се присъедини, не е необходим акаунт.",
"userModeDescription": "Споделете с конкретен потребител, който вече има достъп до този хост. Ако все още няма достъп, първо споделете хоста с него или използвайте връзка. След като бъде споделена, сесията се показва в раздела му „Връзки“.",
"permissionLevel": {
"label": "Ниво на разрешение",
"readOnly": "Само за четене",
"readOnlyDescription": "Може да гледа сесията на живо, но не може да пише или да взаимодейства.",
"readWrite": "Четене и запис",
"readWriteDescription": "Може да пише и да взаимодейства със сесията точно като собственика."
},
"expiryLabel": "Изтичане на срока на валидност на връзката",
"createLinkButton": "Създаване на връзка",
"createShareButton": "Споделяне с потребителя",
"searchUsersPlaceholder": "Търсене на потребители...",
"noUsersFound": "Не са намерени потребители",
"linkCreated": "Линкът за споделяне е създаден",
"linkCopied": "Връзката е копирана в буферната памет",
"copyLink": "Копиране на връзката",
"shareCreated": "Сесията е споделена. Тя ще се покаже в раздела им „Връзки“.",
"shareFailed": "Създаването на споделено съдържание не бе успешно",
"userLacksHostAccess": "Тозият потребител все още няма достъп до този хост. Първо споделете хоста с него или използвайте линк.",
"activeShares": "Активни акции",
"noActiveShares": "Няма активни споделяния за тази сесия",
"revoke": "Отмяна",
"revokeConfirmTitle": "Да се отмени ли това споделяне?",
"revokeConfirmDescription": "Всеки, който използва това споделяне, ще загуби достъп незабавно.",
"revoked": "Акцията е отменена",
"revokeFailed": "Неуспешно отменяне на споделянето",
"joinCount": "{{count}} присъединяване",
"joinCount_other": "{{count}} се присъединява",
"expiresAt": "Изтича {{date}}",
"linkShareBadge": "Връзка",
"userShareBadge": "Потребител: {{username}}",
"loadSharesFailed": "Зареждането на активните споделяния не бе успешно"
"readWrite": "Четене и запис"
}
},
"terminal": {
"connect": "Свързване с хоста",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Изпраща анонимен дневен брой потребители, хостове и използване на функции, за да помогне за подобряването на Termix. Никога не се включват лични данни или подробности за връзката.",
"analyticsEnabledLockedDesc": "Тази настройка е заключена от променливата на средата ENABLE_TELEMETRY и не може да бъде променена тук.",
"updateAnalyticsFailed": "Актуализирането на настройката за анализ не бе успешно",
"sessionSharingGloballyEnabled": "Разрешаване на споделяне на сесия",
"auditForwardingTitle": "Напред към SIEM",
"auditForwardingDesc": "Изпращайте копие на всеки запис от одит до външен колектор като NDJSON. Локалните регистрационни файлове остават източник на достоверни данни.",
"auditForwardingEnvNotice": "Променлива на средата също конфигурира пренасочването; URL адресът, записан тук, има приоритет.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Токен на приносителя (съхранен)",
"auditForwardingSaved": "Настройките за пренасочване на одита са запазени",
"auditForwardingSaveError": "Запазването на настройките за пренасочване на одит не бе успешно",
"sessionSharingGloballyEnabledDesc": "Разрешава споделянето на сесии на живо на терминал, RDP, VNC и Telnet в целия екземпляр. Заменя всяко превключвател за споделяне на хост, когато е деактивиран.",
"updateSessionSharingFailed": "Актуализирането на настройката за споделяне на сесията не бе успешно",
"sessionTimeout": "Време за изчакване на сесията",
"hours": "часове",
"sessionTimeoutRange": "Мин. 1 ч. · Макс. 720 ч.",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "CLI ডক্স খুলুন"
},
"nav": {
"collab": "সভা",
"home": "হোম",
"terminal": "টার্মিনাল",
"localTerminal": "স্থানীয় টার্মিনাল",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "সংযোগ বিচ্ছিন্ন হওয়া এবং ব্রাউজার পুনরায় চালু হওয়ার পরেও আপনার শেল এবং এর মধ্যে চলমান সবকিছু সচল রাখতে tmux-এর ভিতরে এটি চালান (tmux অবশ্যই হোস্টে ইনস্টল করা থাকতে হবে)।",
"enableSessionLogging": "সেশন লগিং",
"enableSessionLoggingDesc": "পরবর্তী পর্যালোচনার জন্য টার্মিনাল সেশনের আউটপুট রেকর্ড করুন।",
"allowSessionSharing": "সেশন শেয়ারিং অনুমোদন করুন",
"allowSessionSharingDesc": "এই হোস্টের লাইভ সেশনগুলো লিঙ্কের মাধ্যমে বা অন্যান্য ব্যবহারকারীদের সাথে শেয়ার করা যাবে।",
"localEchoLabel": "স্থানীয় প্রতিধ্বনি",
"localEchoDesc": "ধীরগতির সংযোগে স্থানীয়ভাবে নিরাপদ ও মুদ্রণযোগ্য কীস্ট্রোক অনুমান করুন। পাসওয়ার্ড প্রম্পট এবং কন্ট্রোল ইনপুট কখনও প্রতিধ্বনিত হয় না।",
"localEchoDefault": "গ্লোবাল সেটিং ব্যবহার করুন",
@@ -1571,137 +1568,11 @@
"join": "যোগদান করুন",
"sharedSessionLabel": "{{hostName}} (ভাগ করা)"
},
"collab": {
"createRoom": "নতুন ঘর",
"roomName": "রুমের নাম",
"persistentRoom": "স্থায়ী কক্ষ",
"persistentRoomHint": "মিটিং শেষ হওয়ার পরেও স্থায়ী রুমগুলো তালিকাভুক্ত থাকে এবং পুনরায় ব্যবহার করা যায়।",
"noRooms": "এখনো কোনো রুম নেই। মিটিং শুরু করতে একটি রুম তৈরি করুন।",
"openRoom": "খোলা",
"endRoom": "সভা শেষ করুন",
"leaveRoom": "ছেড়ে দিন",
"deleteMember": "অপসারণ করুন",
"removeMember": "{{name}} মুছে ফেলুন",
"removeMemberTitle": "এই সদস্যকে অপসারণ করবেন?",
"removeMemberDescription": "{{name}} অবিলম্বে এই রুমে প্রবেশাধিকার হারাবে। যেকোনো সক্রিয় SSH ভিউয়ার সংযোগ বিচ্ছিন্ন হয়ে যাবে।",
"invite": "আমন্ত্রণ",
"inviteTitle": "সদস্যদের আমন্ত্রণ জানান",
"members": "সদস্যরা",
"membersPanel": "রুমের সদস্য এবং নিয়ন্ত্রণ অনুরোধ",
"membersWithCount": "সদস্যগণ ({{count}})",
"online": "অনলাইন",
"offline": "অফলাইন",
"you": "(তুমি)",
"hostBadge": "হোস্ট",
"presenterBadge": "উপস্থাপন করা হচ্ছে",
"present": "বর্তমান",
"presentTitle": "মঞ্চে উঠুন",
"presentHost": "হোস্ট",
"searchHosts": "হোস্ট অনুসন্ধান করুন",
"noHostsFound": "কোনো উপলব্ধ হোস্ট খুঁজে পাওয়া যায়নি।",
"presentProtocol": "প্রোটোকল",
"stopPresenting": "উপস্থাপন করা বন্ধ করুন",
"takeOver": "দায়িত্ব গ্রহণ করুন",
"takeOverConfirmTitle": "বর্তমান উপস্থাপনাটি প্রতিস্থাপন করবেন?",
"takeOverDescription": "{{name}} এখন উপস্থাপনা করছে। দায়িত্ব গ্রহণ করলে সবাই সেই মঞ্চ থেকে বিচ্ছিন্ন হয়ে যাবে।",
"emptyStage": "কেউ উপস্থাপনা করছেন না। একটি সেশন পরিচালনা করতে মঞ্চে আসুন।",
"stageLoading": "মঞ্চের সাথে সংযোগ স্থাপন...",
"stageEnded": "উপস্থাপনা শেষ হলো।",
"roomEnded": "এই সভা শেষ হয়েছে।",
"presenterLabel": "{{name}} উপস্থাপন করছে",
"guestLink": "অতিথি লিঙ্ক",
"guestLinkOn": "গেস্ট লিঙ্ক চালু আছে। লিঙ্কটি ব্যবহার করে যে কেউ মঞ্চটি দেখতে পারবেন।",
"guestLinkOff": "গেস্ট লিঙ্ক বন্ধ আছে।",
"copyLink": "লিঙ্ক কপি করুন",
"rotateLink": "লিঙ্ক ঘোরান",
"disableLink": "লিঙ্ক নিষ্ক্রিয় করুন",
"rotateLinkConfirmTitle": "গেস্ট লিঙ্কটি ঘোরান?",
"rotateLinkDescription": "বর্তমান সংযোগটি অবিলম্বে কাজ করা বন্ধ করে দেবে। সংযুক্ত SSH গেস্টদের সংযোগ বিচ্ছিন্ন করা হবে।",
"disableLinkConfirmTitle": "গেস্ট লিঙ্কটি নিষ্ক্রিয় করবেন?",
"disableLinkDescription": "বেনামী SSH দর্শকদের সংযোগ অবিলম্বে বিচ্ছিন্ন করা হবে এবং বর্তমান লিঙ্কটি কাজ করা বন্ধ করে দেবে।",
"linkCopied": "লিঙ্ক কপি করা হয়েছে",
"roles": "ভূমিকা",
"users": "ব্যবহারকারীরা",
"searchUsers": "ব্যবহারকারীদের অনুসন্ধান করুন",
"endConfirmTitle": "এই সভা শেষ করব?",
"endDescription": "{{name}} সকলের জন্য শেষ হয়ে যাবে এবং পুনরায় খোলা যাবে না।",
"endPersistentDescription": "{{name}} -এ চলমান উপস্থাপনাটি বন্ধ হয়ে যাবে। রুমটি পুনরায় ব্যবহারের জন্য উপলব্ধ থাকবে।",
"deleteRoom": "রুম মুছুন",
"deleteConfirmTitle": "এই রুমটা মুছে ফেলবেন?",
"deleteDescription": "{{name}} সকলের জন্য স্থায়ীভাবে মুছে ফেলা হবে এবং এটি আর পূর্বাবস্থায় ফেরানো যাবে না।",
"invitedTo": "তোমাকে \"{{name}} \" এ আমন্ত্রণ জানানো হয়েছিল",
"guest": {
"title": "সভা",
"waiting": "উপস্থাপকের জন্য অপেক্ষা করছি...",
"linkInvalid": "এই অতিথি লিঙ্কটি অবৈধ অথবা মিটিং শেষ হয়ে গেছে।"
},
"reopenFromPanel": "এই মিটিং ট্যাবটির মেয়াদ শেষ হয়ে গেছে। মিটিং প্যানেল থেকে রুমটি পুনরায় খুলুন।",
"requestControl": "অনুরোধ নিয়ন্ত্রণ",
"cancelControlRequest": "অনুরোধ বাতিল করুন",
"controlQueue": "নিয়ন্ত্রণ অনুরোধ",
"noControlRequests": "কোনো অপেক্ষমান অনুরোধ নেই।",
"grantControlTo": "{{name}}-কে নিয়ন্ত্রণ দিন",
"dismissControlRequest": "{{name}}এর নিয়ন্ত্রণ অনুরোধ খারিজ করুন",
"releaseControl": "রিলিজ নিয়ন্ত্রণ",
"grantControl": "নিয়ন্ত্রণ দিন",
"revokeControl": "নিয়ন্ত্রণ ফিরিয়ে নিন",
"controlRequestedBy": "{{name}} নিয়ন্ত্রণের জন্য অনুরোধ করেছে",
"grant": "অনুদান",
"controlBadge": "নিয়ন্ত্রণে",
"youArePresenting": "আপনি অন্য একটি ট্যাবে প্রেজেন্টেশন দিচ্ছেন। মঞ্চ হস্তান্তর করার জন্য প্রেজেন্টেশন বন্ধ করুন।",
"created": "রুম তৈরি করা হয়েছে",
"invited": "সদস্যদের আমন্ত্রণ জানানো হয়েছে",
"roomTab": "সভা"
},
"sessionSharing": {
"guestView": {
"loading": "শেয়ার করা সেশনে সংযোগ স্থাপন করা হচ্ছে...",
"linkInvalid": "এই শেয়ার লিঙ্কটি অবৈধ, মেয়াদোত্তীর্ণ, বা বাতিল করা হয়েছে।",
"rateLimited": "অনেকবার চেষ্টা করা হয়েছে, অনুগ্রহ করে কিছুক্ষণ পরে আবার চেষ্টা করুন।",
"sessionEnded": "এই অধিবেশন শেষ হয়েছে",
"readOnlyBadge": "শুধুমাত্র দেখার জন্য",
"ownerLabel": "হোস্ট মালিক"
},
"modalTitle": "সেশন শেয়ার করুন",
"shareButton": "শেয়ার",
"notReadyToShare": "সেশনটি এখনও শেয়ার করার জন্য প্রস্তুত নয়।",
"modeTab": {
"link": "লিঙ্ক",
"user": "ব্যবহারকারী"
},
"linkModeDescription": "এই লিঙ্কের মাধ্যমে যে কেউ যোগ দিতে পারবেন, কোনো অ্যাকাউন্টের প্রয়োজন নেই।",
"userModeDescription": "এমন একজন নির্দিষ্ট ব্যবহারকারীর সাথে শেয়ার করুন যার এই হোস্টে আগে থেকেই অ্যাক্সেস আছে। যদি তাদের এখনও অ্যাক্সেস না থাকে, তাহলে প্রথমে তাদের সাথে হোস্টটি শেয়ার করুন অথবা এর পরিবর্তে একটি লিঙ্ক ব্যবহার করুন। শেয়ার করা হয়ে গেলে, সেশনটি তাদের 'কানেকশনস' ট্যাবে দেখা যাবে।",
"permissionLevel": {
"label": "অনুমতি স্তর",
"readOnly": "শুধুমাত্র পঠনযোগ্য",
"readOnlyDescription": "সেশনটি সরাসরি দেখা যাবে কিন্তু টাইপ বা অংশগ্রহণ করা যাবে না।",
"readWrite": "পড়া-লেখা",
"readWriteDescription": "মালিকের মতোই সেশনে টাইপ করতে এবং ইন্টারঅ্যাক্ট করতে পারবেন।"
},
"expiryLabel": "লিঙ্কের মেয়াদ শেষ",
"createLinkButton": "লিঙ্ক তৈরি করুন",
"createShareButton": "ব্যবহারকারীর সাথে শেয়ার করুন",
"searchUsersPlaceholder": "ব্যবহারকারীদের অনুসন্ধান করুন...",
"noUsersFound": "কোন ব্যবহারকারী খুঁজে পাওয়া যায়নি",
"linkCreated": "শেয়ার লিঙ্ক তৈরি করা হয়েছে",
"linkCopied": "লিঙ্ক ক্লিপবোর্ডে কপি করা হয়েছে",
"copyLink": "লিঙ্ক কপি করুন",
"shareCreated": "সেশনটি শেয়ার করা হয়েছে। এটি তাদের কানেকশনস ট্যাবে দেখা যাবে।",
"shareFailed": "শেয়ার তৈরি করতে ব্যর্থ হয়েছে",
"userLacksHostAccess": "ওই ব্যবহারকারীর এখনও এই হোস্টে অ্যাক্সেস নেই। প্রথমে তাদের সাথে হোস্টটি শেয়ার করুন, অথবা এর পরিবর্তে একটি লিঙ্ক ব্যবহার করুন।",
"activeShares": "সক্রিয় শেয়ার",
"noActiveShares": "এই সেশনের জন্য কোনো সক্রিয় শেয়ার নেই",
"revoke": "বাতিল করুন",
"revokeConfirmTitle": "এই শেয়ারটি প্রত্যাহার করবেন?",
"revokeConfirmDescription": "যে কেউ এই শেয়ারটি ব্যবহার করলে, তিনি অবিলম্বে অ্যাক্সেস হারাবেন।",
"revoked": "শেয়ার প্রত্যাহার করা হয়েছে",
"revokeFailed": "শেয়ার প্রত্যাহার করতে ব্যর্থ হয়েছে",
"joinCount": "{{count}} যোগদান করুন",
"joinCount_other": "{{count}} যোগদান করে",
"expiresAt": "মেয়াদ শেষ হবে {{date}}",
"linkShareBadge": "লিঙ্ক",
"userShareBadge": "ব্যবহারকারী: {{username}}",
"loadSharesFailed": "সক্রিয় শেয়ারগুলি লোড করতে ব্যর্থ হয়েছে"
"readWrite": "পড়া-লেখা"
}
},
"terminal": {
"connect": "হোস্টের সাথে সংযোগ করুন",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "টারমিক্সকে উন্নত করতে সাহায্য করার জন্য ব্যবহারকারী, হোস্ট এবং ফিচার ব্যবহারের একটি বেনামী দৈনিক গণনা পাঠায়। এতে কোনো ব্যক্তিগত তথ্য বা সংযোগের বিবরণ অন্তর্ভুক্ত করা হয় না।",
"analyticsEnabledLockedDesc": "এই সেটিংটি ENABLE_TELEMETRY এনভায়রনমেন্ট ভেরিয়েবল দ্বারা লক করা আছে এবং এখান থেকে এটি পরিবর্তন করা যাবে না।",
"updateAnalyticsFailed": "অ্যানালিটিক্স সেটিং আপডেট করতে ব্যর্থ হয়েছে",
"sessionSharingGloballyEnabled": "সেশন শেয়ারিং অনুমোদন করুন",
"auditForwardingTitle": "SIEM-এ ফরোয়ার্ড করুন",
"auditForwardingDesc": "প্রতিটি অডিট এন্ট্রির একটি কপি NDJSON ফরম্যাটে একজন বহিরাগত সংগ্রাহকের কাছে পাঠান। স্থানীয় লগই তথ্যের নির্ভরযোগ্য উৎস হিসেবে থাকবে।",
"auditForwardingEnvNotice": "একটি এনভায়রনমেন্ট ভেরিয়েবল ফরওয়ার্ডিংও কনফিগার করে; এখানে সংরক্ষিত URL-টি অগ্রাধিকার পায়।",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "বাহক টোকেন (সংরক্ষিত)",
"auditForwardingSaved": "অডিট ফরওয়ার্ডিং সেটিংস সংরক্ষণ করা হয়েছে",
"auditForwardingSaveError": "অডিট ফরওয়ার্ডিং সেটিংস সংরক্ষণ করতে ব্যর্থ হয়েছে",
"sessionSharingGloballyEnabledDesc": "লাইভ টার্মিনাল, RDP, VNC, এবং টেলনেট সেশনগুলোকে ইনস্ট্যান্স-ব্যাপী শেয়ার করার অনুমতি দিন। এটি নিষ্ক্রিয় করা হলে, প্রতি-হোস্ট শেয়ারিং টগলকে ওভাররাইড করে।",
"updateSessionSharingFailed": "সেশন শেয়ারিং সেটিং আপডেট করতে ব্যর্থ হয়েছে",
"sessionTimeout": "সেশন টাইমআউট",
"hours": "ঘন্টা",
"sessionTimeoutRange": "সর্বনিম্ন ১ ঘণ্টা · সর্বোচ্চ ৭২০ ঘণ্টা",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Obriu la documentació de la CLI"
},
"nav": {
"collab": "Reunions",
"home": "Inici",
"terminal": "Terminal",
"localTerminal": "Terminal local",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Mantingueu actiu el vostre shell i tot el que s'hi executi després de desconnexions i reinicis del navegador executant-lo dins de tmux (tmux ha d'estar instal·lat a l'amfitrió)",
"enableSessionLogging": "Registre de sessions",
"enableSessionLoggingDesc": "Enregistra la sortida de la sessió de terminal per a una revisió posterior",
"allowSessionSharing": "Permetre la compartició de sessions",
"allowSessionSharingDesc": "Permet que les sessions en directe d'aquest amfitrió es comparteixin mitjançant un enllaç o amb altres usuaris",
"localEchoLabel": "Eco local",
"localEchoDesc": "Prediu localment les pulsacions de tecles imprimibles de manera segura en connexions lentes. Les sol·licituds de contrasenya i l'entrada de control no es reprodueixen mai.",
"localEchoDefault": "Utilitza la configuració global",
@@ -1571,137 +1568,11 @@
"join": "Uneix-te",
"sharedSessionLabel": "{{hostName}} (compartit)"
},
"collab": {
"createRoom": "Nova habitació",
"roomName": "Nom de l'habitació",
"persistentRoom": "Sala persistent",
"persistentRoomHint": "Les sales persistents romanen a la llista després que finalitzi la reunió i es poden reutilitzar.",
"noRooms": "Encara no hi ha cap sala. Crea'n una per iniciar una reunió.",
"openRoom": "Obre",
"endRoom": "Finalitza la reunió",
"leaveRoom": "Marxar",
"deleteMember": "Elimina",
"removeMember": "Elimina {{name}}",
"removeMemberTitle": "Voleu eliminar aquest membre?",
"removeMemberDescription": "{{name}} perdrà l'accés a aquesta sala immediatament. Qualsevol visor SSH actiu es desconnectarà.",
"invite": "Convidar",
"inviteTitle": "Convida membres",
"members": "Membres",
"membersPanel": "Membres de la sala i sol·licituds de control",
"membersWithCount": "Membres ({{count}})",
"online": "en línia",
"offline": "fora de línia",
"you": "(tu)",
"hostBadge": "Amfitrió",
"presenterBadge": "Presentant",
"present": "Present",
"presentTitle": "Puja a l'escenari",
"presentHost": "Amfitrió",
"searchHosts": "Cerca amfitrions",
"noHostsFound": "No s'han trobat amfitrions disponibles.",
"presentProtocol": "Protocol",
"stopPresenting": "Atura la presentació",
"takeOver": "Prendre el control",
"takeOverConfirmTitle": "Voleu substituir la presentació actual?",
"takeOverDescription": "{{name}} està presentant ara. Prendre el control desconnectarà tothom d'aquesta etapa.",
"emptyStage": "Ningú fa una presentació. Puja a l'escenari per compartir una sessió.",
"stageLoading": "Connexió amb l'escenari...",
"stageEnded": "La presentació va acabar",
"roomEnded": "Aquesta reunió ha acabat",
"presenterLabel": "{{name}} presenta",
"guestLink": "Enllaç de convidat",
"guestLinkOn": "L'enllaç de convidat està activat. Qualsevol persona que tingui l'enllaç pot veure l'escenari.",
"guestLinkOff": "L'enllaç de convidat està desactivat.",
"copyLink": "Copia l'enllaç",
"rotateLink": "Gira l'enllaç",
"disableLink": "Desactiva l'enllaç",
"rotateLinkConfirmTitle": "Voleu girar l'enllaç de convidat?",
"rotateLinkDescription": "L'enllaç actual deixarà de funcionar immediatament. Els convidats SSH connectats es desconnectaran.",
"disableLinkConfirmTitle": "Voleu desactivar l'enllaç de convidat?",
"disableLinkDescription": "Els visors SSH anònims es desconnectaran immediatament i l'enllaç actual deixarà de funcionar.",
"linkCopied": "Enllaç copiat",
"roles": "Rols",
"users": "Usuaris",
"searchUsers": "Cerca usuaris",
"endConfirmTitle": "Voleu finalitzar aquesta reunió?",
"endDescription": "{{name}} finalitzarà per a tothom i no es podrà tornar a obrir.",
"endPersistentDescription": "La presentació activa a {{name}} s'aturarà. La sala romandrà disponible per a reutilització.",
"deleteRoom": "Suprimeix l'habitació",
"deleteConfirmTitle": "Voleu suprimir aquesta sala?",
"deleteDescription": "{{name}} s'eliminarà permanentment per a tothom i no es podrà desfer.",
"invitedTo": "Has estat convidat a \"{{name}}\"",
"guest": {
"title": "Reunió",
"waiting": "Esperant el presentador...",
"linkInvalid": "Aquest enllaç de convidat no és vàlid o la reunió ha finalitzat."
},
"reopenFromPanel": "Aquesta pestanya de reunió ha caducat. Torna a obrir la sala des del tauler Reunions.",
"requestControl": "Sol·licitud de control",
"cancelControlRequest": "Cancel·la la sol·licitud",
"controlQueue": "Sol·licituds de control",
"noControlRequests": "No hi ha sol·licituds pendents.",
"grantControlTo": "Dóna el control a {{name}}",
"dismissControlRequest": "Ignora la sol·licitud de control de {{name}}",
"releaseControl": "Control de llançament",
"grantControl": "Donar control",
"revokeControl": "Recupera el control",
"controlRequestedBy": "{{name}} va demanar control",
"grant": "Subvenció",
"controlBadge": "En control",
"youArePresenting": "Esteu presentant en una altra pestanya. Deixeu de presentar per cedir l'escenari.",
"created": "Sala creada",
"invited": "Membres convidats",
"roomTab": "Reunió"
},
"sessionSharing": {
"guestView": {
"loading": "Connectant a la sessió compartida...",
"linkInvalid": "Aquest enllaç per compartir no és vàlid, ha caducat o s'ha revocat.",
"rateLimited": "Massa intents, si us plau, torneu-ho a intentar en breu",
"sessionEnded": "Aquesta sessió ha finalitzat",
"readOnlyBadge": "Només visualització",
"ownerLabel": "Propietari de l'amfitrió"
},
"modalTitle": "Comparteix la sessió",
"shareButton": "Comparteix",
"notReadyToShare": "La sessió encara no està a punt per compartir",
"modeTab": {
"link": "Enllaç",
"user": "Usuari"
},
"linkModeDescription": "Qualsevol persona amb aquest enllaç s'hi pot unir, no cal tenir cap compte.",
"userModeDescription": "Comparteix amb un usuari específic que ja tingui accés a aquest amfitrió. Si encara no hi té accés, comparteix primer l'amfitrió amb ell o utilitza un enllaç. Un cop compartida, la sessió apareix a la pestanya Connexions.",
"permissionLevel": {
"label": "Nivell de permís",
"readOnly": "Només lectura",
"readOnlyDescription": "Puc veure la sessió en directe però no puc escriure ni interactuar.",
"readWrite": "Lectura i escriptura",
"readWriteDescription": "Pot escriure i interactuar amb la sessió igual que el propietari."
},
"expiryLabel": "Caducitat de l'enllaç",
"createLinkButton": "Crea un enllaç",
"createShareButton": "Comparteix amb l'usuari",
"searchUsersPlaceholder": "Cerca usuaris...",
"noUsersFound": "No s'han trobat usuaris",
"linkCreated": "Enllaç de compartició creat",
"linkCopied": "Enllaç copiat al porta-retalls",
"copyLink": "Copia l'enllaç",
"shareCreated": "Sessió compartida. Apareixerà a la pestanya Connexions.",
"shareFailed": "No s'ha pogut crear la compartició",
"userLacksHostAccess": "Aquest usuari encara no té accés a aquest amfitrió. Primer comparteix l'amfitrió amb ell o utilitza un enllaç.",
"activeShares": "Accions actives",
"noActiveShares": "No hi ha cap compartició activa per a aquesta sessió",
"revoke": "Revocar",
"revokeConfirmTitle": "Voleu revocar aquesta compartició?",
"revokeConfirmDescription": "Qualsevol persona que utilitzi aquesta opció compartida perdrà l'accés immediatament.",
"revoked": "Compartir revocat",
"revokeFailed": "No s'ha pogut revocar la compartició",
"joinCount": "{{count}} uneix-te",
"joinCount_other": "{{count}} s'uneix",
"expiresAt": "Caduca {{date}}",
"linkShareBadge": "Enllaç",
"userShareBadge": "Usuari: {{username}}",
"loadSharesFailed": "No s'han pogut carregar les comparticions actives"
"readWrite": "Lectura i escriptura"
}
},
"terminal": {
"connect": "Connecta't a l'amfitrió",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Envia un recompte diari anònim d'usuaris, amfitrions i ús de funcions per ajudar a millorar Termix. No s'hi inclouen mai dades personals ni detalls de connexió.",
"analyticsEnabledLockedDesc": "Aquesta configuració està bloquejada per la variable d'entorn ENABLE_TELEMETRY i no es pot canviar aquí.",
"updateAnalyticsFailed": "No s'ha pogut actualitzar la configuració d'analítica",
"sessionSharingGloballyEnabled": "Permetre la compartició de sessions",
"auditForwardingTitle": "Envia a SIEM",
"auditForwardingDesc": "Envieu una còpia de cada entrada d'auditoria a un col·lector extern com a NDJSON. Els registres locals continuen sent la font de veritat.",
"auditForwardingEnvNotice": "Una variable d'entorn també configura el reenviament; l'URL desada aquí té prioritat.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "testimoni del portador (emmagatzemat)",
"auditForwardingSaved": "Configuració de reenviament d'auditoria desada",
"auditForwardingSaveError": "No s'ha pogut desar la configuració de reenviament d'auditoria",
"sessionSharingGloballyEnabledDesc": "Permet que les sessions de terminal, RDP, VNC i Telnet en directe es comparteixin a tota la instància. Anul·la tots els activables i desactivables per compartir per host quan estan desactivats.",
"updateSessionSharingFailed": "No s'ha pogut actualitzar la configuració de compartició de sessions",
"sessionTimeout": "Temps d'espera de la sessió",
"hours": "hores",
"sessionTimeoutRange": "Mín 1 h · Màx 720 h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Otevřete dokumentaci k rozhraní příkazového řádku"
},
"nav": {
"collab": "Schůzky",
"home": "Domov",
"terminal": "Terminál",
"localTerminal": "Místní terminál",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Udržujte svůj shell a vše, co v něm běží, aktivní i po odpojení a restartu prohlížeče spuštěním uvnitř tmuxu (tmux musí být nainstalován na hostiteli).",
"enableSessionLogging": "Protokolování relací",
"enableSessionLoggingDesc": "Zaznamenejte výstup terminálové relace pro pozdější kontrolu",
"allowSessionSharing": "Povolit sdílení relace",
"allowSessionSharingDesc": "Umožnit sdílení živých relací na tomto hostiteli prostřednictvím odkazu nebo s ostatními uživateli",
"localEchoLabel": "Místní ozvěna",
"localEchoDesc": "Předvídat bezpečně tisknutelné stisky kláves lokálně na pomalém připojení. Výzvy k zadání hesla a ovládací prvky se nikdy nezobrazují.",
"localEchoDefault": "Použít globální nastavení",
@@ -1571,137 +1568,11 @@
"join": "Připojit se",
"sharedSessionLabel": "{{hostName}} (sdílené)"
},
"collab": {
"createRoom": "Nový pokoj",
"roomName": "Název místnosti",
"persistentRoom": "Trvalá místnost",
"persistentRoomHint": "Trvalé místnosti zůstanou uvedeny i po skončení schůzky a lze je znovu použít.",
"noRooms": "Zatím žádné místnosti. Vytvořte si novou a začněte schůzku.",
"openRoom": "OTEVŘENO",
"endRoom": "Ukončit schůzku",
"leaveRoom": "Dovolená",
"deleteMember": "Odstranit",
"removeMember": "Odebrat {{name}}",
"removeMemberTitle": "Odebrat tohoto člena?",
"removeMemberDescription": "{{name}} okamžitě ztratí přístup k této místnosti. Jakýkoli aktivní SSH prohlížeč bude odpojen.",
"invite": "Pozvat",
"inviteTitle": "Pozvat členy",
"members": "Členové",
"membersPanel": "Členové místnosti a požadavky na ovládání",
"membersWithCount": "Členové ({{count}})",
"online": "online",
"offline": "offline",
"you": "(Vy)",
"hostBadge": "Hostitel",
"presenterBadge": "Prezentace",
"present": "Současnost",
"presentTitle": "Vyjdi na pódium",
"presentHost": "Hostitel",
"searchHosts": "Vyhledávání hostitelů",
"noHostsFound": "Nebyli nalezeni žádní dostupní hostitelé.",
"presentProtocol": "Protokol",
"stopPresenting": "Zastavit prezentaci",
"takeOver": "Převzít",
"takeOverConfirmTitle": "Nahradit aktuální prezentaci?",
"takeOverDescription": "{{name}} právě vystupuje. Převzetí vystoupení odpojí všechny od dané scény.",
"emptyStage": "Nikdo neprezentuje. Vydejte se na pódium a sdílejte prezentaci.",
"stageLoading": "Připojení k pódiu...",
"stageEnded": "Prezentace skončila",
"roomEnded": "Tato schůzka skončila",
"presenterLabel": "{{name}} prezentuje",
"guestLink": "Odkaz pro hosty",
"guestLinkOn": "Odkaz pro hosty je zapnutý. Kdokoli s odkazem může sledovat pódium.",
"guestLinkOff": "Hostovský odkaz je vypnutý.",
"copyLink": "Kopírovat odkaz",
"rotateLink": "Otočit odkaz",
"disableLink": "Zakázat odkaz",
"rotateLinkConfirmTitle": "Otočit odkaz pro hosty?",
"rotateLinkDescription": "Aktuální odkaz okamžitě přestane fungovat. Připojení hosté přes SSH budou odpojeni.",
"disableLinkConfirmTitle": "Zakázat odkaz pro hosty?",
"disableLinkDescription": "Anonymní uživatelé SSH budou okamžitě odpojeni a aktuální odkaz přestane fungovat.",
"linkCopied": "Odkaz zkopírován",
"roles": "Role",
"users": "Uživatelé",
"searchUsers": "Vyhledat uživatele",
"endConfirmTitle": "Ukončit tuto schůzku?",
"endDescription": "{{name}} bude pro všechny ukončeno a nebude možné jej znovu otevřít.",
"endPersistentDescription": "Aktivní prezentace v {{name}} se zastaví. Místnost zůstane k dispozici pro opětovné použití.",
"deleteRoom": "Smazat místnost",
"deleteConfirmTitle": "Smazat tuto místnost?",
"deleteDescription": "{{name}} bude trvale smazáno pro všechny a nelze to vrátit zpět.",
"invitedTo": "Byli jste pozváni na „{{name}}“",
"guest": {
"title": "Zasedání",
"waiting": "Čekání na moderátora...",
"linkInvalid": "Tento odkaz pro hosty je neplatný nebo schůzka skončila."
},
"reopenFromPanel": "Platnost této karty schůzky vypršela. Znovu otevřete místnost z panelu Schůzky.",
"requestControl": "Požádat o kontrolu",
"cancelControlRequest": "Zrušit požadavek",
"controlQueue": "Žádosti o kontrolu",
"noControlRequests": "Žádné čekající žádosti.",
"grantControlTo": "Předejte kontrolu uživateli {{name}}",
"dismissControlRequest": "Zamítnout požadavek uživatele {{name}}na kontrolu",
"releaseControl": "Ovládání uvolnění",
"grantControl": "Předejte kontrolu",
"revokeControl": "Převezměte zpět kontrolu",
"controlRequestedBy": "{{name}} požádal o kontrolu",
"grant": "Grant",
"controlBadge": "Pod kontrolou",
"youArePresenting": "Prezentujete na jiné kartě. Ukončete prezentaci, abyste mohli předat scénu.",
"created": "Místnost vytvořena",
"invited": "Pozvaní členové",
"roomTab": "Zasedání"
},
"sessionSharing": {
"guestView": {
"loading": "Připojování ke sdílené relaci...",
"linkInvalid": "Tento odkaz pro sdílení je neplatný, jeho platnost vypršela nebo byl zrušen.",
"rateLimited": "Příliš mnoho pokusů, zkuste to prosím znovu brzy",
"sessionEnded": "Tato relace skončila",
"readOnlyBadge": "Pouze zobrazení",
"ownerLabel": "Majitel hostitele"
},
"modalTitle": "Sdílení relace",
"shareButton": "Podíl",
"notReadyToShare": "Relace ještě není připravena ke sdílení",
"modeTab": {
"link": "Odkaz",
"user": "Uživatel"
},
"linkModeDescription": "Připojit se může kdokoli s tímto odkazem, účet není potřeba.",
"userModeDescription": "Sdílejte s konkrétním uživatelem, který již má k tomuto hostiteli přístup. Pokud ještě nemá přístup, nejprve s ním hostitele sdílejte nebo použijte odkaz. Po sdílení se relace zobrazí na jeho kartě Připojení.",
"permissionLevel": {
"label": "Úroveň oprávnění",
"readOnly": "Pouze pro čtení",
"readOnlyDescription": "Může sledovat relaci živě, ale nemůže psát ani interagovat.",
"readWrite": "Čtení a zápis",
"readWriteDescription": "Může psát a interagovat s relací stejně jako její vlastník."
},
"expiryLabel": "Platnost vypršení platnosti odkazu",
"createLinkButton": "Vytvořit odkaz",
"createShareButton": "Sdílet s uživatelem",
"searchUsersPlaceholder": "Hledat uživatele...",
"noUsersFound": "Nenaleženi žádní uživatelé",
"linkCreated": "Odkaz pro sdílení vytvořen",
"linkCopied": "Odkaz zkopírován do schránky",
"copyLink": "Kopírovat odkaz",
"shareCreated": "Relace sdílena. Zobrazí se na jejich kartě Připojení.",
"shareFailed": "Vytvoření sdílené položky se nezdařilo",
"userLacksHostAccess": "Tento uživatel zatím nemá přístup k tomuto hostiteli. Nejprve s ním hostitele sdílejte nebo použijte odkaz.",
"activeShares": "Aktivní akcie",
"noActiveShares": "Pro tuto relaci nejsou žádné aktivní sdílení",
"revoke": "Zrušit",
"revokeConfirmTitle": "Zrušit toto sdílení?",
"revokeConfirmDescription": "Každý, kdo tuto sdílenou složku používá, okamžitě ztratí přístup.",
"revoked": "Podíl zrušen",
"revokeFailed": "Zrušení sdílení se nezdařilo",
"joinCount": "{{count}} připojit se",
"joinCount_other": "{{count}} se připojí",
"expiresAt": "Platnost vyprší {{date}}",
"linkShareBadge": "Odkaz",
"userShareBadge": "Uživatel: {{username}}",
"loadSharesFailed": "Nepodařilo se načíst aktivní sdílení"
"readWrite": "Čtení a zápis"
}
},
"terminal": {
"connect": "Připojení k hostiteli",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Odesílá anonymní denní počet uživatelů, hostitelů a využití funkcí, aby pomohl vylepšit Termix. Nikdy neobsahuje žádné osobní údaje ani podrobnosti o připojení.",
"analyticsEnabledLockedDesc": "Toto nastavení je uzamčeno proměnnou prostředí ENABLE_TELEMETRY a nelze jej zde změnit.",
"updateAnalyticsFailed": "Nepodařilo se aktualizovat nastavení analytických nástrojů",
"sessionSharingGloballyEnabled": "Povolit sdílení relace",
"auditForwardingTitle": "Předejte SIEM",
"auditForwardingDesc": "Odešlete kopii každého záznamu auditu externímu sběrateli jako NDJSON. Zdrojem pravdivých informací zůstávají lokální protokoly.",
"auditForwardingEnvNotice": "Proměnná prostředí také konfiguruje přesměrování; URL uložená zde má přednost.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token nositele (uložený)",
"auditForwardingSaved": "Nastavení přesměrování auditu uloženo",
"auditForwardingSaveError": "Nepodařilo se uložit nastavení přesměrování auditu",
"sessionSharingGloballyEnabledDesc": "Povolit sdílení relací živého terminálu, RDP, VNC a Telnet v rámci celé instance. Pokud je tato možnost zakázána, přepíše všechny přepínače sdílení pro jednotlivé hostitele.",
"updateSessionSharingFailed": "Nepodařilo se aktualizovat nastavení sdílení relace",
"sessionTimeout": "Časový limit relace",
"hours": "hodiny",
"sessionTimeoutRange": "Min. 1h · Max. 720h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Åbn CLI-dokumentationen"
},
"nav": {
"collab": "Møder",
"home": "Hjem",
"terminal": "Terminal",
"localTerminal": "Lokal terminal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Hold din shell og alt, der kører i den, i live på tværs af afbrydelser og genstart af browseren ved at køre den inde i tmux (tmux skal være installeret på værten)",
"enableSessionLogging": "Sessionslogning",
"enableSessionLoggingDesc": "Optag output fra terminalsessionen til senere gennemgang",
"allowSessionSharing": "Tillad deling af sessioner",
"allowSessionSharingDesc": "Tillad live-sessioner på denne vært at blive delt via link eller med andre brugere",
"localEchoLabel": "Lokalt ekko",
"localEchoDesc": "Forudsig sikre, udskrivbare tastetryk lokalt på langsomme forbindelser. Adgangskodeprompter og kontrolinput gentages aldrig.",
"localEchoDefault": "Brug global indstilling",
@@ -1571,137 +1568,11 @@
"join": "Deltag",
"sharedSessionLabel": "{{hostName}} (delt)"
},
"collab": {
"createRoom": "Nyt værelse",
"roomName": "Værelsesnavn",
"persistentRoom": "Permanent rum",
"persistentRoomHint": "Permanente rum forbliver på listen efter mødets afslutning og kan genbruges.",
"noRooms": "Ingen rum endnu. Opret et for at starte et møde.",
"openRoom": "Åben",
"endRoom": "Afslut mødet",
"leaveRoom": "Forlade",
"deleteMember": "Fjerne",
"removeMember": "Fjern {{name}}",
"removeMemberTitle": "Fjern dette medlem?",
"removeMemberDescription": "{{name}} mister adgangen til dette rum med det samme. Enhver aktiv SSH-seer vil blive afbrudt.",
"invite": "Invitere",
"inviteTitle": "Inviter medlemmer",
"members": "Medlemmer",
"membersPanel": "Rummedlemmer og kontrolanmodninger",
"membersWithCount": "Medlemmer ({{count}})",
"online": "online",
"offline": "offline",
"you": "(du)",
"hostBadge": "Vært",
"presenterBadge": "Præsentation",
"present": "Nuværende",
"presentTitle": "Indtag scenen",
"presentHost": "Vært",
"searchHosts": "Søg efter værter",
"noHostsFound": "Ingen tilgængelige værter fundet.",
"presentProtocol": "Protokol",
"stopPresenting": "Stop med at præsentere",
"takeOver": "Overtag",
"takeOverConfirmTitle": "Erstat den nuværende præsentation?",
"takeOverDescription": "{{name}} præsenterer nu. Overtagelse vil afbryde alles forbindelse til den scene.",
"emptyStage": "Ingen præsenterer. Gå på scenen for at dele en session.",
"stageLoading": "Forbinder sig til scenen...",
"stageEnded": "Præsentationen sluttede",
"roomEnded": "Dette møde er afsluttet",
"presenterLabel": "{{name}} præsenterer",
"guestLink": "Gæstelink",
"guestLinkOn": "Gæstelinket er aktiveret. Alle med linket kan se scenen.",
"guestLinkOff": "Gæstelinket er slået fra.",
"copyLink": "Kopiér link",
"rotateLink": "Roter link",
"disableLink": "Deaktiver link",
"rotateLinkConfirmTitle": "Roter gæstelinket?",
"rotateLinkDescription": "Det nuværende link vil stoppe med at virke med det samme. Forbundne SSH-gæster vil blive afbrudt.",
"disableLinkConfirmTitle": "Deaktiver gæstelinket?",
"disableLinkDescription": "Anonyme SSH-seere vil blive afbrudt med det samme, og det nuværende link vil stoppe med at virke.",
"linkCopied": "Linket er kopieret",
"roles": "Roller",
"users": "Brugere",
"searchUsers": "Søg brugere",
"endConfirmTitle": "Afslutte dette møde?",
"endDescription": "{{name}} slutter for alle og kan ikke genåbnes.",
"endPersistentDescription": "Den aktive præsentation i {{name}} stopper. Rummet forbliver tilgængeligt til genbrug.",
"deleteRoom": "Slet rum",
"deleteConfirmTitle": "Slet dette rum?",
"deleteDescription": "{{name}} vil blive slettet permanent for alle og kan ikke fortrydes.",
"invitedTo": "Du blev inviteret til \"{{name}}\"",
"guest": {
"title": "Møde",
"waiting": "Venter på præsentatoren...",
"linkInvalid": "Dette gæstelink er ugyldigt, eller mødet er afsluttet"
},
"reopenFromPanel": "Denne mødefane er udløbet. Genåbn rummet fra panelet Møder.",
"requestControl": "Anmod om kontrol",
"cancelControlRequest": "Annuller anmodning",
"controlQueue": "Kontrolanmodninger",
"noControlRequests": "Ingen ventende anmodninger.",
"grantControlTo": "Giv kontrol til {{name}}",
"dismissControlRequest": "Afvis kontrolanmodningen fra {{name}}",
"releaseControl": "Slipkontrol",
"grantControl": "Giv kontrol",
"revokeControl": "Tag kontrollen tilbage",
"controlRequestedBy": "{{name}} bad om kontrol",
"grant": "Give",
"controlBadge": "I kontrol",
"youArePresenting": "Du præsenterer i en anden fane. Stop præsentationen for at overdrage scenen.",
"created": "Rum oprettet",
"invited": "Medlemmer inviteret",
"roomTab": "Møde"
},
"sessionSharing": {
"guestView": {
"loading": "Forbinder til delt session...",
"linkInvalid": "Dette delingslink er ugyldigt, udløbet eller er blevet tilbagekaldt",
"rateLimited": "For mange forsøg, prøv igen om lidt",
"sessionEnded": "Denne session er afsluttet",
"readOnlyBadge": "Kun visning",
"ownerLabel": "Værtsejer"
},
"modalTitle": "Del session",
"shareButton": "Dele",
"notReadyToShare": "Sessionen er ikke klar til deling endnu",
"modeTab": {
"link": "Forbindelse",
"user": "Bruger"
},
"linkModeDescription": "Alle med dette link kan tilmelde sig, ingen konto kræves.",
"userModeDescription": "Del med en bestemt bruger, der allerede har adgang til denne vært. Hvis de ikke har adgang endnu, skal du først dele værten med dem eller bruge et link i stedet. Når sessionen er delt, vises den under deres fane Forbindelser.",
"permissionLevel": {
"label": "Tilladelsesniveau",
"readOnly": "Skrivebeskyttet",
"readOnlyDescription": "Kan se sessionen live, men kan ikke skrive eller interagere.",
"readWrite": "Læs-skriv",
"readWriteDescription": "Kan skrive og interagere med sessionen ligesom ejeren."
},
"expiryLabel": "Linkudløb",
"createLinkButton": "Opret link",
"createShareButton": "Del med brugeren",
"searchUsersPlaceholder": "Søg efter brugere...",
"noUsersFound": "Ingen brugere fundet",
"linkCreated": "Delingslink oprettet",
"linkCopied": "Link kopieret til udklipsholder",
"copyLink": "Kopiér link",
"shareCreated": "Session delt. Den vises i fanen Forbindelser.",
"shareFailed": "Kunne ikke oprette deling",
"userLacksHostAccess": "Den bruger har endnu ikke adgang til denne vært. Del værten med dem først, eller brug et link i stedet.",
"activeShares": "Aktive aktier",
"noActiveShares": "Ingen aktive delinger for denne session",
"revoke": "Tilbagekald",
"revokeConfirmTitle": "Tilbagekald denne deling?",
"revokeConfirmDescription": "Enhver, der bruger denne deling, mister adgangen med det samme.",
"revoked": "Deling tilbagekaldt",
"revokeFailed": "Delingen kunne ikke tilbagekaldes",
"joinCount": "{{count}} tilmeld dig",
"joinCount_other": "{{count}} deltager",
"expiresAt": "Udløber {{date}}",
"linkShareBadge": "Forbindelse",
"userShareBadge": "Bruger: {{username}}",
"loadSharesFailed": "Kunne ikke indlæse aktive delinger"
"readWrite": "Læs-skriv"
}
},
"terminal": {
"connect": "Opret forbindelse til vært",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Sender en anonym daglig optælling af brugere, værter og funktionsbrug for at forbedre Termix. Ingen personlige data eller forbindelsesoplysninger inkluderes nogensinde.",
"analyticsEnabledLockedDesc": "Denne indstilling er låst af miljøvariablen ENABLE_TELEMETRY og kan ikke ændres her.",
"updateAnalyticsFailed": "Analyseindstillingen kunne ikke opdateres",
"sessionSharingGloballyEnabled": "Tillad deling af sessioner",
"auditForwardingTitle": "Videresend til SIEM",
"auditForwardingDesc": "Send en kopi af hver revisionspost til en ekstern indsamler som NDJSON. Lokale logfiler forbliver kilden til sandheden.",
"auditForwardingEnvNotice": "En miljøvariabel konfigurerer også videresendelse; URL'en, der gemmes her, har forrang.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Bærertoken (gemt)",
"auditForwardingSaved": "Indstillinger for videresendelse af revision gemt",
"auditForwardingSaveError": "Indstillinger for videresendelse af revision mislykkedes",
"sessionSharingGloballyEnabledDesc": "Tillad deling af live terminal-, RDP-, VNC- og Telnet-sessioner på tværs af instanser. Tilsidesætter alle delingsindstillinger pr. vært, når de er deaktiveret.",
"updateSessionSharingFailed": "Indstillingen for deling af session kunne ikke opdateres",
"sessionTimeout": "Sessionstimeout",
"hours": "timer",
"sessionTimeoutRange": "Min. 1 time · Maks. 720 timer",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Öffnen Sie die CLI-Dokumentation."
},
"nav": {
"collab": "Treffen",
"home": "Startseite",
"terminal": "Terminal",
"localTerminal": "Lokales Terminal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Halten Sie Ihre Shell und alle darin laufenden Prozesse auch bei Verbindungsabbrüchen und Browserneustarts am Laufen, indem Sie den Befehl innerhalb von tmux ausführen (tmux muss auf dem Host installiert sein).",
"enableSessionLogging": "Sitzungsprotokollierung",
"enableSessionLoggingDesc": "Terminal-Sitzungsausgabe zur späteren Überprüfung aufzeichnen",
"allowSessionSharing": "Sitzungsfreigabe zulassen",
"allowSessionSharingDesc": "Ermöglichen Sie es, Live-Sitzungen auf diesem Host per Link oder mit anderen Benutzern zu teilen.",
"localEchoLabel": "Lokales Echo",
"localEchoDesc": "Bei langsamen Verbindungen werden sichere, druckbare Tastatureingaben lokal vorhergesagt. Passwortabfragen und Steuereingaben werden niemals wiederholt.",
"localEchoDefault": "Globale Einstellung verwenden",
@@ -1571,137 +1568,11 @@
"join": "Verbinden",
"sharedSessionLabel": "{{hostName}} (gemeinsam genutzt)"
},
"collab": {
"createRoom": "Neues Zimmer",
"roomName": "Zimmername",
"persistentRoom": "Persistenter Raum",
"persistentRoomHint": "Die gespeicherten Räume bleiben auch nach Ende des Meetings gelistet und können wiederverwendet werden.",
"noRooms": "Noch keine Räume vorhanden. Erstellen Sie einen, um ein Meeting zu starten.",
"openRoom": "Offen",
"endRoom": "Ende der Besprechung",
"leaveRoom": "Verlassen",
"deleteMember": "Entfernen",
"removeMember": "Entferne {{name}}",
"removeMemberTitle": "Dieses Mitglied entfernen?",
"removeMemberDescription": "{{name}} verliert sofort den Zugriff auf diesen Raum. Alle aktiven SSH-Viewer werden getrennt.",
"invite": "Einladen",
"inviteTitle": "Mitglieder einladen",
"members": "Mitglieder",
"membersPanel": "Raummitglieder und Kontrollanfragen",
"membersWithCount": "Mitglieder ({{count}})",
"online": "online",
"offline": "offline",
"you": "(Du)",
"hostBadge": "Gastgeber",
"presenterBadge": "Präsentation",
"present": "Gegenwärtig",
"presentTitle": "Betretet die Bühne",
"presentHost": "Gastgeber",
"searchHosts": "Suchmaschinen",
"noHostsFound": "Es wurden keine verfügbaren Hosts gefunden.",
"presentProtocol": "Protokoll",
"stopPresenting": "Hör auf zu präsentieren",
"takeOver": "Übernehmen",
"takeOverConfirmTitle": "Die aktuelle Präsentation ersetzen?",
"takeOverDescription": "{{name}} präsentiert sich jetzt. Die Übernahme trennt alle von dieser Bühne.",
"emptyStage": "Niemand präsentiert. Ergreife die Bühne, um eine Session zu teilen.",
"stageLoading": "Verbindung zur Bühne...",
"stageEnded": "Die Präsentation endete",
"roomEnded": "Diese Sitzung ist beendet.",
"presenterLabel": "{{name}} präsentiert",
"guestLink": "Gastlink",
"guestLinkOn": "Der Gastzugang ist aktiviert. Jeder mit dem Link kann die Bühnenshow verfolgen.",
"guestLinkOff": "Der Gastlink ist deaktiviert.",
"copyLink": "Link kopieren",
"rotateLink": "Drehverbindung",
"disableLink": "Link deaktivieren",
"rotateLinkConfirmTitle": "Den Gastlink drehen?",
"rotateLinkDescription": "Die bestehende Verbindung wird sofort unterbrochen. Verbundene SSH-Gäste werden getrennt.",
"disableLinkConfirmTitle": "Gastlink deaktivieren?",
"disableLinkDescription": "Anonyme SSH-Zugriffe werden sofort getrennt und die aktuelle Verbindung funktioniert nicht mehr.",
"linkCopied": "Link kopiert",
"roles": "Rollen",
"users": "Benutzer",
"searchUsers": "Nutzer suchen",
"endConfirmTitle": "Diese Sitzung beenden?",
"endDescription": "{{name}} wird für alle beendet und kann nicht wieder geöffnet werden.",
"endPersistentDescription": "Die aktive Präsentation in {{name}} wird beendet. Der Raum steht weiterhin zur erneuten Verwendung zur Verfügung.",
"deleteRoom": "Raum löschen",
"deleteConfirmTitle": "Diesen Raum löschen?",
"deleteDescription": "{{name}} wird für alle dauerhaft gelöscht und kann nicht rückgängig gemacht werden.",
"invitedTo": "Sie wurden eingeladen zu \"{{name}}\"",
"guest": {
"title": "Treffen",
"waiting": "Ich warte auf den Moderator...",
"linkInvalid": "Dieser Gastlink ist ungültig oder das Meeting ist beendet."
},
"reopenFromPanel": "Dieser Besprechungsreiter ist abgelaufen. Öffnen Sie den Raum erneut über das Besprechungsmenü.",
"requestControl": "Anforderungskontrolle",
"cancelControlRequest": "Stornierungsanfrage",
"controlQueue": "Kontrollanfragen",
"noControlRequests": "Keine offenen Anfragen.",
"grantControlTo": "Übergib die Kontrolle an {{name}}",
"dismissControlRequest": "Kontrollanfrage von {{name}}ablehnen",
"releaseControl": "Freigabekontrolle",
"grantControl": "Kontrolle abgeben",
"revokeControl": "Übernehmen Sie wieder die Kontrolle",
"controlRequestedBy": "{{name}} hat um Kontrolle gebeten",
"grant": "Gewähren",
"controlBadge": "Unter Kontrolle",
"youArePresenting": "Sie präsentieren in einem anderen Tab. Beenden Sie Ihre Präsentation, um die Bühne zu übergeben.",
"created": "Raum geschaffen",
"invited": "Mitglieder eingeladen",
"roomTab": "Treffen"
},
"sessionSharing": {
"guestView": {
"loading": "Verbindung zur gemeinsamen Sitzung wird hergestellt...",
"linkInvalid": "Dieser Freigabelink ist ungültig, abgelaufen oder wurde widerrufen.",
"rateLimited": "Zu viele Versuche, bitte versuchen Sie es in Kürze erneut.",
"sessionEnded": "Diese Sitzung ist beendet.",
"readOnlyBadge": "Nur Ansicht",
"ownerLabel": "Gastgeber"
},
"modalTitle": "Sitzung teilen",
"shareButton": "Aktie",
"notReadyToShare": "Die Sitzung ist noch nicht zur Freigabe bereit.",
"modeTab": {
"link": "Link",
"user": "Benutzer"
},
"linkModeDescription": "Jeder mit diesem Link kann beitreten, ein Konto ist nicht erforderlich.",
"userModeDescription": "Teilen Sie die Sitzung mit einem bestimmten Benutzer, der bereits Zugriff auf diesen Host hat. Falls er noch keinen Zugriff hat, teilen Sie ihm den Host zuerst mit oder verwenden Sie stattdessen einen Link. Nach der Freigabe erscheint die Sitzung im Tab „Verbindungen“ des Benutzers.",
"permissionLevel": {
"label": "Berechtigungsstufe",
"readOnly": "Nur lesbar",
"readOnlyDescription": "Ich kann die Sitzung live verfolgen, aber nicht tippen oder interagieren.",
"readWrite": "Lesen und Schreiben",
"readWriteDescription": "Kann in der Sitzung genauso tippen und mit ihr interagieren wie der Besitzer."
},
"expiryLabel": "Linkablauf",
"createLinkButton": "Verknüpfung erstellen",
"createShareButton": "Mit dem Nutzer teilen",
"searchUsersPlaceholder": "Benutzer suchen...",
"noUsersFound": "Keine Benutzer gefunden",
"linkCreated": "Link zum Teilen erstellt",
"linkCopied": "Link in die Zwischenablage kopiert",
"copyLink": "Link kopieren",
"shareCreated": "Die Sitzung wurde freigegeben. Sie wird im Tab „Verbindungen“ des Benutzers angezeigt.",
"shareFailed": "Fehler beim Erstellen der Freigabe",
"userLacksHostAccess": "Dieser Benutzer hat noch keinen Zugriff auf diesen Host. Teilen Sie ihm den Host zuerst mit oder verwenden Sie stattdessen einen Link.",
"activeShares": "Aktive Anteile",
"noActiveShares": "Keine aktiven Anteile für diese Sitzung",
"revoke": "Widerrufen",
"revokeConfirmTitle": "Diese Aktie widerrufen?",
"revokeConfirmDescription": "Wer diese Freigabe nutzt, verliert sofort den Zugriff.",
"revoked": "Anteil widerrufen",
"revokeFailed": "Aktienwiderruf fehlgeschlagen",
"joinCount": "{{count}} beitreten",
"joinCount_other": "{{count}} verbindet sich",
"expiresAt": "Läuft ab {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Benutzer: {{username}}",
"loadSharesFailed": "Fehler beim Laden der aktiven Anteile"
"readWrite": "Lesen und Schreiben"
}
},
"terminal": {
"connect": "Mit Host verbinden",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Sendet täglich anonyme Zählungen von Nutzern, Hosts und Funktionsnutzung, um Termix zu verbessern. Es werden niemals personenbezogene Daten oder Verbindungsdaten übermittelt.",
"analyticsEnabledLockedDesc": "Diese Einstellung ist durch die Umgebungsvariable ENABLE_TELEMETRY gesperrt und kann hier nicht geändert werden.",
"updateAnalyticsFailed": "Die Aktualisierung der Analyseeinstellungen ist fehlgeschlagen.",
"sessionSharingGloballyEnabled": "Sitzungsfreigabe zulassen",
"auditForwardingTitle": "Weiterleitung an SIEM",
"auditForwardingDesc": "Senden Sie eine Kopie jedes Prüfeintrags als NDJSON an einen externen Datensammler. Lokale Protokolle bleiben die maßgebliche Datenquelle.",
"auditForwardingEnvNotice": "Eine Umgebungsvariable konfiguriert auch die Weiterleitung; die hier gespeicherte URL hat Vorrang.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Bearer-Token (gespeichert)",
"auditForwardingSaved": "Einstellungen für die Auditweiterleitung gespeichert",
"auditForwardingSaveError": "Die Einstellungen für die Auditweiterleitung konnten nicht gespeichert werden.",
"sessionSharingGloballyEnabledDesc": "Ermöglicht die instanzweite Freigabe von Live-Terminal-, RDP-, VNC- und Telnet-Sitzungen. Überschreibt alle Freigabeeinstellungen pro Host, wenn diese deaktiviert sind.",
"updateSessionSharingFailed": "Fehler beim Aktualisieren der Sitzungsfreigabeeinstellung",
"sessionTimeout": "Sitzungszeitlimit",
"hours": "Stunden",
"sessionTimeoutRange": "Min. 1 Std. · Max. 720 Std.",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Άνοιγμα εγγράφων CLI"
},
"nav": {
"collab": "Συναντήσεις",
"home": "Σπίτι",
"terminal": "Τερματικό",
"localTerminal": "Τοπικό τερματικό",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Διατηρήστε το κέλυφος (shell) και οτιδήποτε εκτελείται σε αυτό ενεργό σε αποσυνδέσεις και επανεκκινήσεις του προγράμματος περιήγησης, εκτελώντας το μέσα στο tmux (το tmux πρέπει να είναι εγκατεστημένο στον κεντρικό υπολογιστή)",
"enableSessionLogging": "Καταγραφή συνεδρίας",
"enableSessionLoggingDesc": "Καταγραφή εξόδου συνεδρίας τερματικού για μελλοντική αναθεώρηση",
"allowSessionSharing": "Επιτρέψτε την κοινή χρήση περιόδου σύνδεσης",
"allowSessionSharingDesc": "Να επιτρέπεται η κοινοποίηση ζωντανών συνεδριών σε αυτόν τον πάροχο μέσω συνδέσμου ή με άλλους χρήστες",
"localEchoLabel": "Τοπική Ηχώ",
"localEchoDesc": "Προβλέψτε ασφαλείς εκτυπώσιμες πληκτρολογήσεις τοπικά σε αργές συνδέσεις. Οι προτροπές κωδικού πρόσβασης και η εισαγωγή ελέγχου δεν επαναλαμβάνονται ποτέ.",
"localEchoDefault": "Χρήση καθολικής ρύθμισης",
@@ -1571,137 +1568,11 @@
"join": "Ενώνω",
"sharedSessionLabel": "{{hostName}} (κοινόχρηστο)"
},
"collab": {
"createRoom": "Νέο δωμάτιο",
"roomName": "Όνομα δωματίου",
"persistentRoom": "Μόνιμο δωμάτιο",
"persistentRoomHint": "Οι μόνιμες αίθουσες παραμένουν καταχωρημένες μετά το τέλος της σύσκεψης και μπορούν να επαναχρησιμοποιηθούν.",
"noRooms": "Δεν υπάρχουν ακόμη αίθουσες. Δημιουργήστε μία για να ξεκινήσετε μια σύσκεψη.",
"openRoom": "Ανοιχτό",
"endRoom": "Λήξη συνάντησης",
"leaveRoom": "Αδεια",
"deleteMember": "Αφαιρώ",
"removeMember": "Αφαίρεση {{name}}",
"removeMemberTitle": "Κατάργηση αυτού του μέλους;",
"removeMemberDescription": "Ο χρήστης {{name}} θα χάσει αμέσως την πρόσβαση σε αυτό το δωμάτιο. Οποιοσδήποτε ενεργός χρήστης προβολής SSH θα αποσυνδεθεί.",
"invite": "Καλώ",
"inviteTitle": "Πρόσκληση μελών",
"members": "Μέλη",
"membersPanel": "Μέλη δωματίου και αιτήματα ελέγχου",
"membersWithCount": "Μέλη ({{count}})",
"online": "διαδικτυακά",
"offline": "εκτός σύνδεσης",
"you": "(εσείς)",
"hostBadge": "Πλήθος",
"presenterBadge": "Παρουσίαση",
"present": "Παρόν",
"presentTitle": "Ανέβα στη σκηνή",
"presentHost": "Πλήθος",
"searchHosts": "Αναζήτηση κεντρικών υπολογιστών",
"noHostsFound": "Δεν βρέθηκαν διαθέσιμοι κεντρικοί υπολογιστές.",
"presentProtocol": "Πρωτόκολλο",
"stopPresenting": "Διακοπή παρουσίασης",
"takeOver": "Αναλαμβάνω",
"takeOverConfirmTitle": "Αντικατάσταση της τρέχουσας παρουσίασης;",
"takeOverDescription": "Το {{name}} παρουσιάζεται τώρα. Η ανάληψη του ελέγχου θα αποσυνδέσει όλους από αυτό το στάδιο.",
"emptyStage": "Κανείς δεν κάνει παρουσίαση. Ανεβείτε στη σκηνή για να μοιραστείτε μια συνεδρία.",
"stageLoading": "Σύνδεση με τη σκηνή...",
"stageEnded": "Η παρουσίαση έληξε",
"roomEnded": "Αυτή η συνάντηση έληξε",
"presenterLabel": "{{name}} παρουσιάζει",
"guestLink": "Σύνδεσμος επισκέπτη",
"guestLinkOn": "Ο σύνδεσμος επισκεπτών είναι ενεργοποιημένος. Όποιος έχει τον σύνδεσμο μπορεί να παρακολουθήσει τη σκηνή.",
"guestLinkOff": "Ο σύνδεσμος επισκέπτη είναι απενεργοποιημένος.",
"copyLink": "Αντιγραφή συνδέσμου",
"rotateLink": "Περιστροφή συνδέσμου",
"disableLink": "Απενεργοποίηση συνδέσμου",
"rotateLinkConfirmTitle": "Εναλλαγή του συνδέσμου επισκέπτη;",
"rotateLinkDescription": "Ο τρέχων σύνδεσμος θα σταματήσει να λειτουργεί αμέσως. Οι συνδεδεμένοι επισκέπτες SSH θα αποσυνδεθούν.",
"disableLinkConfirmTitle": "Απενεργοποίηση του συνδέσμου επισκέπτη;",
"disableLinkDescription": "Οι ανώνυμοι θεατές SSH θα αποσυνδεθούν αμέσως και ο τρέχων σύνδεσμος θα σταματήσει να λειτουργεί.",
"linkCopied": "Ο σύνδεσμος αντιγράφηκε",
"roles": "Ρόλοι",
"users": "Χρήστες",
"searchUsers": "Αναζήτηση χρηστών",
"endConfirmTitle": "Λήξη αυτής της συνάντησης;",
"endDescription": "Το {{name}} θα λήξει για όλους και δεν μπορεί να ανοίξει ξανά.",
"endPersistentDescription": "Η ενεργή παρουσίαση στο {{name}} θα σταματήσει. Η αίθουσα παραμένει διαθέσιμη για επαναχρησιμοποίηση.",
"deleteRoom": "Διαγραφή δωματίου",
"deleteConfirmTitle": "Διαγραφή αυτού του δωματίου;",
"deleteDescription": "Η εντολή {{name}} θα διαγραφεί οριστικά για όλους και δεν θα είναι δυνατή η αναίρεση της.",
"invitedTo": "Σας προσκάλεσαν στο \"{{name}}\"",
"guest": {
"title": "Συνάντηση",
"waiting": "Περιμένοντας τον παρουσιαστή...",
"linkInvalid": "Αυτός ο σύνδεσμος επισκέπτη δεν είναι έγκυρος ή η σύσκεψη έχει λήξει"
},
"reopenFromPanel": "Αυτή η καρτέλα σύσκεψης έληξε. Ανοίξτε ξανά την αίθουσα από τον πίνακα \"Συνέδρια\".",
"requestControl": "Αίτημα ελέγχου",
"cancelControlRequest": "Αίτημα ακύρωσης",
"controlQueue": "Αιτήματα ελέγχου",
"noControlRequests": "Δεν υπάρχουν εκκρεμή αιτήματα.",
"grantControlTo": "Δώστε τον έλεγχο σε {{name}}",
"dismissControlRequest": "Απόρριψη αιτήματος ελέγχου του {{name}}",
"releaseControl": "Έλεγχος απελευθέρωσης",
"grantControl": "Δώστε τον έλεγχο",
"revokeControl": "Πάρε πίσω τον έλεγχο",
"controlRequestedBy": "{{name}} ζήτησε έλεγχο",
"grant": "Χορήγηση",
"controlBadge": "Υπό έλεγχο",
"youArePresenting": "Κάνετε παρουσίαση σε άλλη καρτέλα. Διακόψτε την παρουσίαση για να παραδώσετε τη σκηνή.",
"created": "Δημιουργήθηκε δωμάτιο",
"invited": "Μέλη που έχουν προσκληθεί",
"roomTab": "Συνάντηση"
},
"sessionSharing": {
"guestView": {
"loading": "Σύνδεση σε κοινόχρηστη συνεδρία...",
"linkInvalid": "Αυτός ο σύνδεσμος κοινής χρήσης δεν είναι έγκυρος, έχει λήξει ή έχει ανακληθεί",
"rateLimited": "Πάρα πολλές προσπάθειες, δοκιμάστε ξανά σύντομα.",
"sessionEnded": "Αυτή η συνεδρία έληξε",
"readOnlyBadge": "Μόνο προβολή",
"ownerLabel": "Κάτοχος κεντρικού υπολογιστή"
},
"modalTitle": "Κοινή χρήση περιόδου σύνδεσης",
"shareButton": "Μερίδιο",
"notReadyToShare": "Η συνεδρία δεν είναι ακόμη έτοιμη για κοινή χρήση",
"modeTab": {
"link": "Σύνδεσμος",
"user": "Μεταχειριζόμενος"
},
"linkModeDescription": "Οποιοσδήποτε έχει αυτόν τον σύνδεσμο μπορεί να συμμετάσχει, δεν απαιτείται λογαριασμός.",
"userModeDescription": "Κοινοποίηση με έναν συγκεκριμένο χρήστη που έχει ήδη πρόσβαση σε αυτόν τον κεντρικό υπολογιστή. Εάν δεν έχει ακόμη πρόσβαση, μοιραστείτε πρώτα τον κεντρικό υπολογιστή μαζί του ή χρησιμοποιήστε έναν σύνδεσμο. Μόλις κοινοποιηθεί, η συνεδρία εμφανίζεται στην καρτέλα Συνδέσεις.",
"permissionLevel": {
"label": "Επίπεδο δικαιωμάτων",
"readOnly": "Μόνο για ανάγνωση",
"readOnlyDescription": "Μπορώ να παρακολουθήσω την συνεδρία ζωντανά, αλλά δεν μπορώ να πληκτρολογήσω ή να αλληλεπιδράσω.",
"readWrite": "Ανάγνωση-εγγραφή",
"readWriteDescription": "Μπορεί να πληκτρολογήσει και να αλληλεπιδράσει με την περίοδο λειτουργίας όπως ο κάτοχος."
},
"expiryLabel": "Λήξη σύνδεσης",
"createLinkButton": "Δημιουργία συνδέσμου",
"createShareButton": "Κοινοποίηση με χρήστη",
"searchUsersPlaceholder": "Αναζήτηση χρηστών...",
"noUsersFound": "Δεν βρέθηκαν χρήστες",
"linkCreated": "Ο σύνδεσμος κοινής χρήσης δημιουργήθηκε",
"linkCopied": "Ο σύνδεσμος αντιγράφηκε στο πρόχειρο",
"copyLink": "Αντιγραφή συνδέσμου",
"shareCreated": "Η συνεδρία κοινοποιήθηκε. Θα εμφανιστεί στην καρτέλα \"Συνδέσεις\".",
"shareFailed": "Η δημιουργία κοινής χρήσης απέτυχε",
"userLacksHostAccess": "Αυτός ο χρήστης δεν έχει ακόμη πρόσβαση σε αυτόν τον κεντρικό υπολογιστή. Κοινοποιήστε πρώτα τον κεντρικό υπολογιστή μαζί του ή χρησιμοποιήστε έναν σύνδεσμο.",
"activeShares": "Ενεργές κοινοποιήσεις",
"noActiveShares": "Δεν υπάρχουν ενεργές κοινοποιήσεις για αυτήν την περίοδο σύνδεσης",
"revoke": "Ανακαλώ",
"revokeConfirmTitle": "Ανάκληση αυτής της κοινοποίησης;",
"revokeConfirmDescription": "Όποιος χρησιμοποιεί αυτήν την κοινοποίηση θα χάσει αμέσως την πρόσβαση.",
"revoked": "Η κοινοποίηση ανακλήθηκε",
"revokeFailed": "Η ανάκληση της κοινής χρήσης απέτυχε",
"joinCount": "{{count}} συμμετοχή",
"joinCount_other": "{{count}} ενώσεις",
"expiresAt": "Λήγει {{date}}",
"linkShareBadge": "Σύνδεσμος",
"userShareBadge": "Χρήστης: {{username}}",
"loadSharesFailed": "Αποτυχία φόρτωσης ενεργών κοινόχρηστων στοιχείων"
"readWrite": "Ανάγνωση-εγγραφή"
}
},
"terminal": {
"connect": "Σύνδεση με τον κεντρικό υπολογιστή",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Αποστέλλει έναν ανώνυμο ημερήσιο αριθμό χρηστών, κεντρικών υπολογιστών και χρήσης λειτουργιών για να βοηθήσει στη βελτίωση του Termix. Δεν περιλαμβάνονται ποτέ προσωπικά δεδομένα ή λεπτομέρειες σύνδεσης.",
"analyticsEnabledLockedDesc": "Αυτή η ρύθμιση είναι κλειδωμένη από τη μεταβλητή περιβάλλοντος ENABLE_TELEMETRY και δεν μπορεί να αλλάξει εδώ.",
"updateAnalyticsFailed": "Η ενημέρωση της ρύθμισης αναλυτικών στοιχείων απέτυχε",
"sessionSharingGloballyEnabled": "Επιτρέψτε την κοινή χρήση περιόδου σύνδεσης",
"auditForwardingTitle": "Προώθηση στο SIEM",
"auditForwardingDesc": "Στείλτε ένα αντίγραφο κάθε καταχώρησης ελέγχου σε έναν εξωτερικό συλλέκτη ως NDJSON. Τα τοπικά αρχεία καταγραφής παραμένουν η πηγή της αλήθειας.",
"auditForwardingEnvNotice": "Μια μεταβλητή περιβάλλοντος ρυθμίζει επίσης την προώθηση. Η διεύθυνση URL που αποθηκεύεται εδώ έχει προτεραιότητα.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Διακριτικό κομιστή (αποθηκευμένο)",
"auditForwardingSaved": "Οι ρυθμίσεις προώθησης ελέγχου αποθηκεύτηκαν",
"auditForwardingSaveError": "Αποτυχία αποθήκευσης ρυθμίσεων προώθησης ελέγχου",
"sessionSharingGloballyEnabledDesc": "Επιτρέπεται η κοινή χρήση των ζωντανών συνεδριών τερματικού, RDP, VNC και Telnet σε ολόκληρη την παρουσία. Παρακάμπτει κάθε εναλλαγή κοινής χρήσης ανά κεντρικό υπολογιστή όταν είναι απενεργοποιημένη.",
"updateSessionSharingFailed": "Αποτυχία ενημέρωσης ρύθμισης κοινής χρήσης περιόδου σύνδεσης",
"sessionTimeout": "Χρονικό όριο συνεδρίας",
"hours": "ώρες",
"sessionTimeoutRange": "Ελάχ. 1 ώρα · Μέγ. 720 ώρες",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Abre la documentación de la CLI."
},
"nav": {
"collab": "Reuniones",
"home": "Inicio",
"terminal": "Terminal",
"localTerminal": "Terminal local",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Mantén tu shell y todo lo que se esté ejecutando en él activo durante desconexiones y reinicios del navegador ejecutándolo dentro de tmux (tmux debe estar instalado en el host).",
"enableSessionLogging": "Registro de sesión",
"enableSessionLoggingDesc": "Registrar la salida de la sesión de terminal para su revisión posterior",
"allowSessionSharing": "Permitir compartir la sesión",
"allowSessionSharingDesc": "Permitir que las sesiones en vivo en este servidor se compartan mediante un enlace o con otros usuarios.",
"localEchoLabel": "Eco local",
"localEchoDesc": "Predice localmente las pulsaciones de teclas seguras para imprimir en conexiones lentas. Las solicitudes de contraseña y la entrada de control nunca se repiten.",
"localEchoDefault": "Utilizar la configuración global",
@@ -1571,137 +1568,11 @@
"join": "Unirse",
"sharedSessionLabel": "{{hostName}} (compartido)"
},
"collab": {
"createRoom": "Habitación nueva",
"roomName": "Nombre de la habitación",
"persistentRoom": "Habitación persistente",
"persistentRoomHint": "Las salas reservadas permanecen en la lista una vez finalizada la reunión y pueden volver a utilizarse.",
"noRooms": "Aún no hay salas disponibles. Crea una para iniciar una reunión.",
"openRoom": "Abierto",
"endRoom": "Fin de la reunión",
"leaveRoom": "Dejar",
"deleteMember": "Eliminar",
"removeMember": "Eliminar {{name}}",
"removeMemberTitle": "¿Eliminar a este miembro?",
"removeMemberDescription": "{{name}} perderá el acceso a esta sala inmediatamente. Cualquier visor SSH activo será desconectado.",
"invite": "Invitar",
"inviteTitle": "Invitar a los miembros",
"members": "Miembros",
"membersPanel": "Miembros de la sala y solicitudes de control",
"membersWithCount": "Miembros ({{count}})",
"online": "en línea",
"offline": "desconectado",
"you": "(tú)",
"hostBadge": "Anfitrión",
"presenterBadge": "Presentación",
"present": "Presente",
"presentTitle": "Sube al escenario",
"presentHost": "Anfitrión",
"searchHosts": "Buscar hosts",
"noHostsFound": "No se encontraron hosts disponibles.",
"presentProtocol": "Protocolo",
"stopPresenting": "Deja de presentar",
"takeOver": "Tomar el control",
"takeOverConfirmTitle": "¿Reemplazar la presentación actual?",
"takeOverDescription": "{{name}} se está presentando ahora. Tomar el control desconectará a todos de ese escenario.",
"emptyStage": "Nadie va a presentar. Sube al escenario para compartir una sesión.",
"stageLoading": "Conectando con el escenario...",
"stageEnded": "La presentación terminó",
"roomEnded": "Esta reunión ha terminado.",
"presenterLabel": "{{name}} está presentando",
"guestLink": "Enlace de invitado",
"guestLinkOn": "El enlace para invitados está activado. Cualquiera que tenga el enlace puede ver el espectáculo.",
"guestLinkOff": "El enlace de invitado está desactivado.",
"copyLink": "Copiar enlace",
"rotateLink": "Enlace giratorio",
"disableLink": "Deshabilitar enlace",
"rotateLinkConfirmTitle": "¿Rotar el enlace de invitado?",
"rotateLinkDescription": "El enlace actual dejará de funcionar inmediatamente. Los invitados SSH conectados serán desconectados.",
"disableLinkConfirmTitle": "¿Deshabilitar el enlace de invitado?",
"disableLinkDescription": "Los usuarios que intenten acceder de forma anónima mediante SSH serán desconectados inmediatamente y el enlace actual dejará de funcionar.",
"linkCopied": "Enlace copiado",
"roles": "Roles",
"users": "Usuarios",
"searchUsers": "Buscar usuarios",
"endConfirmTitle": "¿Dar por terminada esta reunión?",
"endDescription": "{{name}} finalizará para todos y no podrá reabrirse.",
"endPersistentDescription": "La presentación activa en {{name}} se detendrá. La sala permanece disponible para su reutilización.",
"deleteRoom": "Eliminar habitación",
"deleteConfirmTitle": "¿Eliminar esta habitación?",
"deleteDescription": "{{name}} se eliminará permanentemente para todos y no se podrá deshacer.",
"invitedTo": "Te invitaron a \"{{name}}\"",
"guest": {
"title": "Reunión",
"waiting": "Esperando al presentador...",
"linkInvalid": "Este enlace de invitado no es válido o la reunión ha finalizado."
},
"reopenFromPanel": "Esta pestaña de reunión ha caducado. Vuelva a abrir la sala desde el panel de Reuniones.",
"requestControl": "Control de solicitudes",
"cancelControlRequest": "Cancelar solicitud",
"controlQueue": "Solicitudes de control",
"noControlRequests": "No hay solicitudes pendientes.",
"grantControlTo": "Cede el control a {{name}}",
"dismissControlRequest": "Rechazar la solicitud de control de {{name}}",
"releaseControl": "Control de liberación",
"grantControl": "Cede el control",
"revokeControl": "Recupera el control",
"controlRequestedBy": "{{name}} pidió control",
"grant": "Conceder",
"controlBadge": "En control",
"youArePresenting": "Estás presentando en otra pestaña. Deja de presentar para ceder la palabra.",
"created": "Habitación creada",
"invited": "Miembros invitados",
"roomTab": "Reunión"
},
"sessionSharing": {
"guestView": {
"loading": "Conectando con la sesión compartida...",
"linkInvalid": "Este enlace para compartir no es válido, ha caducado o ha sido revocado.",
"rateLimited": "Demasiados intentos, por favor inténtelo de nuevo en breve.",
"sessionEnded": "Esta sesión ha finalizado.",
"readOnlyBadge": "Solo lectura",
"ownerLabel": "Propietario del anfitrión"
},
"modalTitle": "Compartir sesión",
"shareButton": "Compartir",
"notReadyToShare": "La sesión aún no está lista para compartirse.",
"modeTab": {
"link": "Enlace",
"user": "Usuario"
},
"linkModeDescription": "Cualquier persona con este enlace puede unirse, no se requiere cuenta.",
"userModeDescription": "Comparte la sesión con un usuario específico que ya tenga acceso a este host. Si aún no tiene acceso, comparte primero el host con él o utiliza un enlace. Una vez compartida, la sesión aparecerá en su pestaña Conexiones.",
"permissionLevel": {
"label": "Nivel de permiso",
"readOnly": "Solo lectura",
"readOnlyDescription": "Se puede ver la sesión en directo, pero no se puede escribir ni interactuar.",
"readWrite": "Leer y escribir",
"readWriteDescription": "Puede escribir e interactuar con la sesión igual que el propietario."
},
"expiryLabel": "Caducidad del enlace",
"createLinkButton": "Crear enlace",
"createShareButton": "Compartir con el usuario",
"searchUsersPlaceholder": "Buscar usuarios...",
"noUsersFound": "No se encontraron usuarios",
"linkCreated": "Enlace para compartir creado",
"linkCopied": "Enlace copiado al portapapeles",
"copyLink": "Copiar enlace",
"shareCreated": "Sesión compartida. Aparecerá en su pestaña Conexiones.",
"shareFailed": "No se pudo crear el recurso compartido",
"userLacksHostAccess": "Ese usuario aún no tiene acceso a este servidor. Primero, comparte el servidor con él o utiliza un enlace.",
"activeShares": "Acciones activas",
"noActiveShares": "No hay acciones activas para esta sesión.",
"revoke": "Revocar",
"revokeConfirmTitle": "¿Revocar esta acción?",
"revokeConfirmDescription": "Cualquier persona que utilice este recurso compartido perderá el acceso inmediatamente.",
"revoked": "Acción revocada",
"revokeFailed": "No se pudo revocar la participación.",
"joinCount": "{{count}} unirse",
"joinCount_other": "{{count}} se une",
"expiresAt": "Caduca {{date}}",
"linkShareBadge": "Enlace",
"userShareBadge": "Usuario: {{username}}",
"loadSharesFailed": "No se pudieron cargar los recursos compartidos activos."
"readWrite": "Leer y escribir"
}
},
"terminal": {
"connect": "Conectar al host",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Envía un recuento diario anónimo de usuarios, hosts y uso de funciones para ayudar a mejorar Termix. No se incluyen datos personales ni detalles de conexión.",
"analyticsEnabledLockedDesc": "Esta configuración está bloqueada por la variable de entorno ENABLE_TELEMETRY y no se puede cambiar aquí.",
"updateAnalyticsFailed": "No se pudo actualizar la configuración de análisis.",
"sessionSharingGloballyEnabled": "Permitir compartir la sesión",
"auditForwardingTitle": "Reenviar a SIEM",
"auditForwardingDesc": "Envíe una copia de cada entrada de auditoría a un recopilador externo en formato NDJSON. Los registros locales siguen siendo la fuente de información fidedigna.",
"auditForwardingEnvNotice": "Una variable de entorno también configura el reenvío; la URL guardada aquí tiene prioridad.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token de portador (almacenado)",
"auditForwardingSaved": "Configuración de reenvío de auditoría guardada",
"auditForwardingSaveError": "No se pudieron guardar los ajustes de reenvío de auditoría.",
"sessionSharingGloballyEnabledDesc": "Permite compartir sesiones de terminal en vivo, RDP, VNC y Telnet en toda la instancia. Cuando está desactivado, anula cualquier configuración de uso compartido por host.",
"updateSessionSharingFailed": "No se pudo actualizar la configuración de uso compartido de la sesión.",
"sessionTimeout": "Tiempo de expiración de sesión",
"hours": "horas",
"sessionTimeoutRange": "Mín 1h · Máx 720h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Avaa CLI-dokumentaatio"
},
"nav": {
"collab": "Kokoukset",
"home": "Kotiin",
"terminal": "Terminaali",
"localTerminal": "Paikallinen terminaali",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Pidä komentotulkkisi ja kaikki siinä käynnissä olevat toiminnot toiminnassa yhteyskatkosten ja selaimen uudelleenkäynnistysten aikana suorittamalla se tmuxin sisällä (tmuxin on oltava asennettuna isäntäkoneelle)",
"enableSessionLogging": "Istuntojen lokitiedot",
"enableSessionLoggingDesc": "Tallenna pääteistunnon tuloste myöhempää tarkastelua varten",
"allowSessionSharing": "Salli istunnon jakaminen",
"allowSessionSharingDesc": "Salli live-istuntojen jakaminen tällä isännällä linkin kautta tai muiden käyttäjien kanssa",
"localEchoLabel": "Paikallinen kaiku",
"localEchoDesc": "Ennusta turvalliset tulostettavat näppäinpainallukset paikallisesti hitailla yhteyksillä. Salasanakehotteita ja ohjaussyötettä ei koskaan toisteta.",
"localEchoDefault": "Käytä yleistä asetusta",
@@ -1571,137 +1568,11 @@
"join": "Liity",
"sharedSessionLabel": "{{hostName}} (jaettu)"
},
"collab": {
"createRoom": "Uusi huone",
"roomName": "Huoneen nimi",
"persistentRoom": "Pysyvä huone",
"persistentRoomHint": "Pysyvät huoneet pysyvät luettelossa kokouksen päättymisen jälkeen ja niitä voidaan käyttää uudelleen.",
"noRooms": "Ei vielä huoneita. Luo huone aloittaaksesi kokouksen.",
"openRoom": "Avata",
"endRoom": "Kokouksen loppu",
"leaveRoom": "Lähtö",
"deleteMember": "Poistaa",
"removeMember": "Poista {{name}}",
"removeMemberTitle": "Poistetaanko tämä jäsen?",
"removeMemberDescription": "{{name}} menettää pääsyn tähän huoneeseen välittömästi. Kaikki aktiiviset SSH-katseluohjelmat katkaistaan.",
"invite": "Kutsu",
"inviteTitle": "Kutsu jäseniä",
"members": "Jäsenet",
"membersPanel": "Huoneen jäsenet ja hallintapyynnöt",
"membersWithCount": "Jäsenet ({{count}})",
"online": "verkossa",
"offline": "offline-tilassa",
"you": "(sinä)",
"hostBadge": "Isäntä",
"presenterBadge": "Esittäminen",
"present": "Esittää",
"presentTitle": "Nouse lavalle",
"presentHost": "Isäntä",
"searchHosts": "Hae isäntiä",
"noHostsFound": "Ei saatavilla olevia isäntiä.",
"presentProtocol": "Protokolla",
"stopPresenting": "Lopeta esittäminen",
"takeOver": "Ota haltuunsa",
"takeOverConfirmTitle": "Korvataanko nykyinen esitys?",
"takeOverDescription": "{{name}} esittää nyt. Hallinnan ottaminen irrottaa kaikki yhteydet kyseiseen vaiheeseen.",
"emptyStage": "Kukaan ei esitä. Nouse lavalle ja jaa sessio.",
"stageLoading": "Yhdistetään lavalle...",
"stageEnded": "Esitys päättyi",
"roomEnded": "Tämä kokous on päättynyt",
"presenterLabel": "{{name}} esittää",
"guestLink": "Vieraslinkki",
"guestLinkOn": "Vieraslinkki on käytössä. Kuka tahansa linkin omaava voi katsoa lavaa.",
"guestLinkOff": "Vierailijalinkki on pois päältä.",
"copyLink": "Kopioi linkki",
"rotateLink": "Kierrä linkkiä",
"disableLink": "Poista linkki käytöstä",
"rotateLinkConfirmTitle": "Kierretäänkö vieraslinkkiä?",
"rotateLinkDescription": "Nykyinen linkki lakkaa toimimasta välittömästi. Yhdistettyjen SSH-vieraiden yhteys katkaistaan.",
"disableLinkConfirmTitle": "Poistetaanko vieraslinkki käytöstä?",
"disableLinkDescription": "Anonyymien SSH-katsojien yhteys katkaistaan välittömästi ja nykyinen linkki lakkaa toimimasta.",
"linkCopied": "Linkki kopioitu",
"roles": "Roolit",
"users": "Käyttäjät",
"searchUsers": "Hae käyttäjiä",
"endConfirmTitle": "Lopetetaanko tämä kokous?",
"endDescription": "{{name}} päättyy kaikilta, eikä sitä voida avata uudelleen.",
"endPersistentDescription": "Aktiivinen esitys kohdassa {{name}} pysähtyy. Huone pysyy käytettävissä uudelleen.",
"deleteRoom": "Poista huone",
"deleteConfirmTitle": "Poistetaanko tämä huone?",
"deleteDescription": "{{name}} poistetaan pysyvästi kaikilta, eikä sitä voi perua.",
"invitedTo": "Sinut kutsuttiin \"{{name}} \" -palveluun",
"guest": {
"title": "Kokous",
"waiting": "Esiintyjää odotellessa...",
"linkInvalid": "Tämä vieraslinkki on virheellinen tai kokous on päättynyt"
},
"reopenFromPanel": "Tämä kokousvälilehti vanheni. Avaa huone uudelleen Kokoukset-paneelista.",
"requestControl": "Pyydä hallintaa",
"cancelControlRequest": "Peruuta pyyntö",
"controlQueue": "Ohjauspyynnöt",
"noControlRequests": "Ei vireillä olevia pyyntöjä.",
"grantControlTo": "Anna hallinta käyttäjälle {{name}}",
"dismissControlRequest": "Hylkää käyttäjän {{name}}hallintapyyntö",
"releaseControl": "Vapautusohjaus",
"grantControl": "Anna hallinta",
"revokeControl": "Ota hallinta takaisin",
"controlRequestedBy": "{{name}} pyysi hallintaoikeutta",
"grant": "Myöntää",
"controlBadge": "Hallinnassa",
"youArePresenting": "Esität toisella välilehdellä. Lopeta esitys luovuttaaksesi esiintymispaikan.",
"created": "Huone luotu",
"invited": "Jäsenet kutsuttuina",
"roomTab": "Kokous"
},
"sessionSharing": {
"guestView": {
"loading": "Yhdistetään jaettuun istuntoon...",
"linkInvalid": "Tämä jakolinkki on virheellinen, vanhentunut tai se on peruutettu.",
"rateLimited": "Liikaa yrityksiä, yritä uudelleen pian",
"sessionEnded": "Tämä istunto on päättynyt",
"readOnlyBadge": "Vain katselu",
"ownerLabel": "Isännän omistaja"
},
"modalTitle": "Jaa istunto",
"shareButton": "Jakaa",
"notReadyToShare": "Istunto ei ole vielä valmis jaettavaksi",
"modeTab": {
"link": "Linkki",
"user": "Käyttäjä"
},
"linkModeDescription": "Kuka tahansa, jolla on tämä linkki, voi liittyä, tiliä ei tarvita.",
"userModeDescription": "Jaa tietyn käyttäjän kanssa, jolla on jo pääsy tähän isäntään. Jos heillä ei vielä ole pääsyä, jaa isäntä ensin heidän kanssaan tai käytä linkkiä. Jakamisen jälkeen istunto näkyy heidän Yhteydet-välilehdellään.",
"permissionLevel": {
"label": "Käyttöoikeustaso",
"readOnly": "Vain lukuoikeus",
"readOnlyDescription": "Voit katsoa istuntoa suorana, mutta et voi kirjoittaa tai olla vuorovaikutuksessa.",
"readWrite": "Lue ja kirjoita",
"readWriteDescription": "Voi kirjoittaa ja olla vuorovaikutuksessa istunnon kanssa aivan kuten omistaja."
},
"expiryLabel": "Linkin vanheneminen",
"createLinkButton": "Luo linkki",
"createShareButton": "Jaa käyttäjän kanssa",
"searchUsersPlaceholder": "Hae käyttäjiä...",
"noUsersFound": "Ei käyttäjiä löytynyt",
"linkCreated": "Jaa linkki luotu",
"linkCopied": "Linkki kopioitu leikepöydälle",
"copyLink": "Kopioi linkki",
"shareCreated": "Istunto jaettu. Se näkyy heidän Yhteydet-välilehdellä.",
"shareFailed": "Jaon luominen epäonnistui",
"userLacksHostAccess": "Käyttäjällä ei ole vielä pääsyä tähän isäntään. Jaa isäntä ensin heidän kanssaan tai käytä linkkiä.",
"activeShares": "Aktiiviset jaot",
"noActiveShares": "Ei aktiivisia jakoja tällä istunnolla",
"revoke": "Peruuttaa",
"revokeConfirmTitle": "Perutaanko tämä jako?",
"revokeConfirmDescription": "Kuka tahansa tätä jakoa käyttävä menettää käyttöoikeuden välittömästi.",
"revoked": "Jako peruttu",
"revokeFailed": "Jakamisen peruuttaminen epäonnistui",
"joinCount": "{{count}} liity",
"joinCount_other": "{{count}} liitokset",
"expiresAt": "Vanhenee {{date}}",
"linkShareBadge": "Linkki",
"userShareBadge": "Käyttäjä: {{username}}",
"loadSharesFailed": "Aktiivisten jakojen lataaminen epäonnistui"
"readWrite": "Lue ja kirjoita"
}
},
"terminal": {
"connect": "Yhdistä isäntään",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Lähettää nimettömän päivittäisen määrän käyttäjistä, isännöistä ja ominaisuuksien käytöstä Termixin parantamiseksi. Henkilötietoja tai yhteystietoja ei koskaan sisällytetä mukaan.",
"analyticsEnabledLockedDesc": "Tämä asetus on lukittu ENABLE_TELEMETRY-ympäristömuuttujalla, eikä sitä voi muuttaa täällä.",
"updateAnalyticsFailed": "Analytiikka-asetuksen päivittäminen epäonnistui",
"sessionSharingGloballyEnabled": "Salli istunnon jakaminen",
"auditForwardingTitle": "Lähetä SIEM:iin",
"auditForwardingDesc": "Lähetä kopio jokaisesta auditointimerkinnästä ulkoiselle kerääjälle NDJSON-tiedostona. Paikalliset lokit pysyvät totuuden lähteenä.",
"auditForwardingEnvNotice": "Ympäristömuuttuja määrittää myös edelleenlähetyksen; tähän tallennettu URL-osoite on etusijalla.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Haltijan tunnus (tallennettu)",
"auditForwardingSaved": "Auditoinnin edelleenlähetysasetukset tallennettu",
"auditForwardingSaveError": "Auditoinnin edelleenlähetysasetusten tallentaminen epäonnistui.",
"sessionSharingGloballyEnabledDesc": "Salli reaaliaikaisten pääte-, RDP-, VNC- ja Telnet-istuntojen jakaminen koko instanssin kesken. Poistamalla tämän asetuksen käytöstä ohitetaan kaikki isäntäkohtaisesti jakamiseen liittyvät asetukset.",
"updateSessionSharingFailed": "Istunnon jakamisasetuksen päivittäminen epäonnistui",
"sessionTimeout": "Istunnon aikakatkaisu",
"hours": "tuntia",
"sessionTimeoutRange": "Vähintään 1 h · Enintään 720 h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Ouvrir la documentation de l'interface de ligne de commande"
},
"nav": {
"collab": "Réunions",
"home": "Accueil",
"terminal": "Terminal",
"localTerminal": "Terminal local",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Pour que votre shell et tout ce qui y est exécuté restent actifs malgré les déconnexions et les redémarrages du navigateur, exécutez la commande dans tmux (tmux doit être installé sur l'hôte).",
"enableSessionLogging": "Journalisation de session",
"enableSessionLoggingDesc": "Enregistrer la sortie de la session terminal pour une consultation ultérieure",
"allowSessionSharing": "Autoriser le partage de session",
"allowSessionSharingDesc": "Autoriser le partage des sessions en direct sur cet hébergeur via un lien ou avec d'autres utilisateurs",
"localEchoLabel": "Écho local",
"localEchoDesc": "Prédiction locale des frappes au clavier imprimables en toute sécurité, même sur les connexions lentes. Les invites de mot de passe et les entrées de contrôle ne sont jamais affichées.",
"localEchoDefault": "Utiliser les paramètres globaux",
@@ -1571,137 +1568,11 @@
"join": "Rejoindre",
"sharedSessionLabel": "{{hostName}} (partagé)"
},
"collab": {
"createRoom": "Nouvelle chambre",
"roomName": "Nom de la chambre",
"persistentRoom": "Chambre persistante",
"persistentRoomHint": "Les salles persistantes restent répertoriées après la fin de la réunion et peuvent être réutilisées.",
"noRooms": "Aucune salle disponible pour le moment. Créez-en une pour démarrer une réunion.",
"openRoom": "Ouvrir",
"endRoom": "Fin de la réunion",
"leaveRoom": "Partir",
"deleteMember": "Retirer",
"removeMember": "Supprimer {{name}}",
"removeMemberTitle": "Supprimer ce membre ?",
"removeMemberDescription": "{{name}} perdra immédiatement l'accès à cette salle. Tout utilisateur SSH actif sera déconnecté.",
"invite": "Inviter",
"inviteTitle": "Inviter des membres",
"members": "Membres",
"membersPanel": "Membres de la salle et demandes de contrôle",
"membersWithCount": "Membres ({{count}})",
"online": "en ligne",
"offline": "hors ligne",
"you": "(toi)",
"hostBadge": "Hôte",
"presenterBadge": "Présentation",
"present": "Présent",
"presentTitle": "Montez sur scène",
"presentHost": "Hôte",
"searchHosts": "Rechercher des hôtes",
"noHostsFound": "Aucun hôte disponible trouvé.",
"presentProtocol": "Protocole",
"stopPresenting": "Arrêtez de présenter",
"takeOver": "Reprendre",
"takeOverConfirmTitle": "Remplacer la présentation actuelle ?",
"takeOverDescription": "{{name}} est en train de présenter. Prendre le relais déconnectera tout le monde de cette scène.",
"emptyStage": "Personne ne présente. Montez sur scène pour animer une session.",
"stageLoading": "Se connecter à la scène...",
"stageEnded": "La présentation s'est terminée.",
"roomEnded": "Cette réunion est terminée.",
"presenterLabel": "{{name}} présente",
"guestLink": "Lien invité",
"guestLinkOn": "Le lien invité est activé. Toute personne disposant du lien peut assister à la représentation.",
"guestLinkOff": "Le lien invité est désactivé.",
"copyLink": "Copier le lien",
"rotateLink": "Lien de rotation",
"disableLink": "Désactiver le lien",
"rotateLinkConfirmTitle": "Faire pivoter le lien invité ?",
"rotateLinkDescription": "La connexion actuelle sera immédiatement interrompue. Les sessions SSH virtuelles seront déconnectées.",
"disableLinkConfirmTitle": "Désactiver le lien invité ?",
"disableLinkDescription": "Les utilisateurs anonymes utilisant SSH seront immédiatement déconnectés et le lien actuel cessera de fonctionner.",
"linkCopied": "Lien copié",
"roles": "Rôles",
"users": "Utilisateurs",
"searchUsers": "Utilisateurs de recherche",
"endConfirmTitle": "Mettre fin à cette réunion ?",
"endDescription": "{{name}} prendra fin pour tout le monde et ne pourra pas être rouvert.",
"endPersistentDescription": "La présentation en cours dans {{name}} va s'arrêter. La salle reste disponible pour une réutilisation.",
"deleteRoom": "Supprimer la salle",
"deleteConfirmTitle": "Supprimer cette pièce ?",
"deleteDescription": "{{name}} sera définitivement supprimé pour tout le monde et ne pourra pas être annulé.",
"invitedTo": "Vous avez été invité à \"{{name}}\"",
"guest": {
"title": "Réunion",
"waiting": "En attente du présentateur...",
"linkInvalid": "Ce lien invité est invalide ou la réunion est terminée."
},
"reopenFromPanel": "Cette réunion a expiré. Veuillez rouvrir la salle depuis le panneau Réunions.",
"requestControl": "Contrôle des demandes",
"cancelControlRequest": "Demande d'annulation",
"controlQueue": "Demandes de contrôle",
"noControlRequests": "Aucune requête en attente.",
"grantControlTo": "Donnez le contrôle à {{name}}",
"dismissControlRequest": "Rejeter la demande de contrôle de {{name}}",
"releaseControl": "Contrôle de la libération",
"grantControl": "Donnez le contrôle",
"revokeControl": "Reprenez le contrôle",
"controlRequestedBy": "{{name}} a demandé le contrôle",
"grant": "Accorder",
"controlBadge": "En contrôle",
"youArePresenting": "Vous présentez dans un autre onglet. Arrêtez votre présentation pour laisser la parole à quelqu'un d'autre.",
"created": "Pièce créée",
"invited": "Les membres invités",
"roomTab": "Réunion"
},
"sessionSharing": {
"guestView": {
"loading": "Connexion à la session partagée...",
"linkInvalid": "Ce lien de partage est invalide, a expiré ou a été révoqué.",
"rateLimited": "Trop de tentatives, veuillez réessayer dans quelques instants.",
"sessionEnded": "Cette session est terminée.",
"readOnlyBadge": "Affichage uniquement",
"ownerLabel": "propriétaire de l'hôte"
},
"modalTitle": "Session de partage",
"shareButton": "Partager",
"notReadyToShare": "La session n'est pas encore prête à être partagée.",
"modeTab": {
"link": "Lien",
"user": "Utilisateur"
},
"linkModeDescription": "Toute personne disposant de ce lien peut s'inscrire, aucun compte n'est requis.",
"userModeDescription": "Partagez cette session avec un utilisateur spécifique qui y a déjà accès. S'il n'y a pas encore accès, partagez-lui d'abord l'hôte ou utilisez un lien. Une fois partagée, la session apparaîtra dans son onglet Connexions.",
"permissionLevel": {
"label": "Niveau d'autorisation",
"readOnly": "Lecture seule",
"readOnlyDescription": "Je peux suivre la session en direct, mais je ne peux ni écrire ni interagir.",
"readWrite": "Lecture-écriture",
"readWriteDescription": "Peut saisir du texte et interagir avec la session comme le propriétaire."
},
"expiryLabel": "Expiration du lien",
"createLinkButton": "Créer un lien",
"createShareButton": "Partager avec l'utilisateur",
"searchUsersPlaceholder": "Rechercher des utilisateurs...",
"noUsersFound": "Aucun utilisateur trouvé",
"linkCreated": "Lien de partage créé",
"linkCopied": "Lien copié dans le presse-papiers",
"copyLink": "Copier le lien",
"shareCreated": "Session partagée. Elle apparaîtra dans leur onglet Connexions.",
"shareFailed": "Échec de la création du partage",
"userLacksHostAccess": "Cet utilisateur n'a pas encore accès à cet hôte. Veuillez d'abord lui partager l'hôte ou utiliser un lien.",
"activeShares": "Actions actives",
"noActiveShares": "Aucune action active pour cette session",
"revoke": "Révoquer",
"revokeConfirmTitle": "Révoquer cette action ?",
"revokeConfirmDescription": "Toute personne utilisant ce partage perdra immédiatement l'accès.",
"revoked": "Action révoquée",
"revokeFailed": "Échec de la révocation de l'action",
"joinCount": "{{count}} rejoindre",
"joinCount_other": "{{count}} rejoint",
"expiresAt": "Expire {{date}}",
"linkShareBadge": "Lien",
"userShareBadge": "Utilisateur : {{username}}",
"loadSharesFailed": "Échec du chargement des actions actives"
"readWrite": "Lecture-écriture"
}
},
"terminal": {
"connect": "Se connecter à l'hôte",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Envoie quotidiennement un décompte anonyme des utilisateurs, des hôtes et de l'utilisation des fonctionnalités afin d'améliorer Termix. Aucune donnée personnelle ni information de connexion n'est jamais incluse.",
"analyticsEnabledLockedDesc": "Ce paramètre est verrouillé par la variable d'environnement ENABLE_TELEMETRY et ne peut pas être modifié ici.",
"updateAnalyticsFailed": "Échec de la mise à jour des paramètres d'analyse",
"sessionSharingGloballyEnabled": "Autoriser le partage de session",
"auditForwardingTitle": "Transmettre au SIEM",
"auditForwardingDesc": "Transmettez une copie de chaque entrée d'audit à un collecteur externe au format NDJSON. Les journaux locaux restent la source de référence.",
"auditForwardingEnvNotice": "Une variable d'environnement configure également la redirection ; l'URL enregistrée ici est prioritaire.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Jeton porteur (stocké)",
"auditForwardingSaved": "Paramètres de transfert d'audit enregistrés",
"auditForwardingSaveError": "Échec de l'enregistrement des paramètres de transfert d'audit",
"sessionSharingGloballyEnabledDesc": "Autorise le partage des sessions de terminal en direct, RDP, VNC et Telnet à l'échelle de l'instance. Remplace toute option de partage par hôte lorsqu'elle est désactivée.",
"updateSessionSharingFailed": "Échec de la mise à jour des paramètres de partage de session",
"sessionTimeout": "Expiration de session",
"hours": "heures",
"sessionTimeoutRange": "Min 1 h · Max 720 h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "פתח את מסמכי ממשק שורת הפקודה (CLI)"
},
"nav": {
"collab": "פגישות",
"home": "בַּיִת",
"terminal": "מָסוֹף",
"localTerminal": "מסוף מקומי",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "שמרו על המעטפת שלכם וכל דבר שפועל בה בחיים גם לאחר ניתוקים והפעלות מחדש של הדפדפן על ידי הפעלתה בתוך tmux (tmux חייב להיות מותקן על המארח)",
"enableSessionLogging": "רישום מושבים",
"enableSessionLoggingDesc": "הקלט את פלט הפעלת הטרמינל לצורך סקירה מאוחרת יותר",
"allowSessionSharing": "אפשר שיתוף סשנים",
"allowSessionSharingDesc": "אפשר שיתוף של מפגשים חיים במארח זה באמצעות קישור או עם משתמשים אחרים",
"localEchoLabel": "הד מקומי",
"localEchoDesc": "חזה הקשות מקלדת להדפסה בטוחות באופן מקומי בחיבורים איטיים. בקשות סיסמה וקלט בקרה לעולם לא יוחזרו.",
"localEchoDefault": "השתמש בהגדרה גלובלית",
@@ -1571,137 +1568,11 @@
"join": "לְהִצְטַרֵף",
"sharedSessionLabel": "{{hostName}} (שותף)"
},
"collab": {
"createRoom": "חדר חדש",
"roomName": "שם החדר",
"persistentRoom": "חדר קבוע",
"persistentRoomHint": "חדרים קבועים נשארים רשומים לאחר סיום הפגישה וניתן לעשות בהם שימוש חוזר.",
"noRooms": "אין עדיין חדרים. צור אחד כדי להתחיל פגישה.",
"openRoom": "לִפְתוֹחַ",
"endRoom": "סיום פגישה",
"leaveRoom": "לַעֲזוֹב",
"deleteMember": "לְהַסִיר",
"removeMember": "הסר {{name}}",
"removeMemberTitle": "להסיר את החבר הזה?",
"removeMemberDescription": "{{name}} יאבד גישה לחדר הזה באופן מיידי. כל צופה פעיל ב-SSH ינותק.",
"invite": "לְהַזמִין",
"inviteTitle": "הזמנת חברים",
"members": "חברים",
"membersPanel": "חברי חדר ובקשות בקרה",
"membersWithCount": "חברים ({{count}})",
"online": "באינטרנט",
"offline": "לא מקוון",
"you": "(אַתָה)",
"hostBadge": "מְאָרֵחַ",
"presenterBadge": "הצגה",
"present": "לְהַצִיג",
"presentTitle": "עלו על הבמה",
"presentHost": "מְאָרֵחַ",
"searchHosts": "חיפוש מארחים",
"noHostsFound": "לא נמצאו מארחים זמינים.",
"presentProtocol": "פּרוֹטוֹקוֹל",
"stopPresenting": "הפסקת ההצגה",
"takeOver": "השתלטות",
"takeOverConfirmTitle": "להחליף את המצגת הנוכחית?",
"takeOverDescription": "{{name}} מציג כעת. השתלטות תנתק את כולם מהבמה הזו.",
"emptyStage": "אף אחד לא מציג. עלו לבמה כדי לשתף סשן.",
"stageLoading": "מתחבר לבמה...",
"stageEnded": "המצגת הסתיימה",
"roomEnded": "פגישה זו הסתיימה",
"presenterLabel": "{{name}} מציג",
"guestLink": "קישור אורח",
"guestLinkOn": "קישור האורח פעיל. כל מי שיש לו קישור יכול לצפות בבמה.",
"guestLinkOff": "קישור האורח כבוי.",
"copyLink": "העתקת קישור",
"rotateLink": "סיבוב קישור",
"disableLink": "השבת קישור",
"rotateLinkConfirmTitle": "לסובב את קישור האורח?",
"rotateLinkDescription": "הקישור הנוכחי יפסיק לפעול באופן מיידי. אורחי SSH המחוברים ינותקו.",
"disableLinkConfirmTitle": "להשבית את קישור האורח?",
"disableLinkDescription": "צופי SSH אנונימיים ינותקו באופן מיידי והקישור הנוכחי יפסיק לפעול.",
"linkCopied": "הקישור הועתק",
"roles": "תפקידים",
"users": "משתמשים",
"searchUsers": "חיפוש משתמשים",
"endConfirmTitle": "לסיים את הפגישה הזו?",
"endDescription": "{{name}} יסתיים עבור כולם ולא ניתן יהיה לפתוח אותו מחדש.",
"endPersistentDescription": "המצגת הפעילה ב- {{name}} תיעצר. החדר יישאר זמין לשימוש חוזר.",
"deleteRoom": "מחיקת חדר",
"deleteConfirmTitle": "למחוק את החדר הזה?",
"deleteDescription": "{{name}} יימחק לצמיתות עבור כולם ולא ניתן יהיה לבטל אותו.",
"invitedTo": "הוזמנת ל-\"{{name}}\"",
"guest": {
"title": "פְּגִישָׁה",
"waiting": "מחכה למנחה...",
"linkInvalid": "קישור האורח הזה אינו תקין או שהפגישה הסתיימה"
},
"reopenFromPanel": "פג תוקף כרטיסיית הפגישה הזו. פתח מחדש את החדר מחלונית הפגישות.",
"requestControl": "בקרת בקשות",
"cancelControlRequest": "ביטול בקשה",
"controlQueue": "בקשות בקרה",
"noControlRequests": "אין בקשות ממתינות.",
"grantControlTo": "תן שליטה ל- {{name}}",
"dismissControlRequest": "סגור את בקשת הבקרה של {{name}}",
"releaseControl": "בקרת שחרור",
"grantControl": "תן שליטה",
"revokeControl": "קח בחזרה את השליטה",
"controlRequestedBy": "{{name}} ביקש שליטה",
"grant": "מַעֲנָק",
"controlBadge": "בשליטה",
"youArePresenting": "אתה מציג בכרטיסייה אחרת. הפסק את ההצגה כדי להעביר את הבמה.",
"created": "החדר נוצר",
"invited": "חברים שהוזמנו",
"roomTab": "פְּגִישָׁה"
},
"sessionSharing": {
"guestView": {
"loading": "מתחבר לסשן משותף...",
"linkInvalid": "קישור השיתוף הזה אינו תקין, פג תוקף או בוטל",
"rateLimited": "יותר מדי ניסיונות, אנא נסה שוב בקרוב",
"sessionEnded": "מושב זה הסתיים",
"readOnlyBadge": "צפייה בלבד",
"ownerLabel": "בעל המארח"
},
"modalTitle": "שיתוף סשן",
"shareButton": "לַחֲלוֹק",
"notReadyToShare": "הסשן עדיין לא מוכן לשיתוף",
"modeTab": {
"link": "לְקַשֵׁר",
"user": "מִשׁתַמֵשׁ"
},
"linkModeDescription": "כל מי שיש לו קישור זה יכול להצטרף, אין צורך בחשבון.",
"userModeDescription": "שתף עם משתמש ספציפי שכבר יש לו גישה למארח זה. אם עדיין אין לו גישה, שתף איתו תחילה את המארח או השתמש בקישור במקום זאת. לאחר השיתוף, הסשן מופיע בכרטיסייה \"חיבורים\" שלו.",
"permissionLevel": {
"label": "רמת הרשאה",
"readOnly": "לקריאה בלבד",
"readOnlyDescription": "יכול לצפות בפגישה בשידור חי אך לא להקליד או לתקשר.",
"readWrite": "קריאה-כתיבה",
"readWriteDescription": "יכול להקליד ולקיים אינטראקציה עם הסשן בדיוק כמו הבעלים."
},
"expiryLabel": "תוקף הקישור",
"createLinkButton": "צור קישור",
"createShareButton": "שתף עם המשתמש",
"searchUsersPlaceholder": "חיפוש משתמשים...",
"noUsersFound": "לא נמצאו משתמשים",
"linkCreated": "קישור השיתוף נוצר",
"linkCopied": "קישור שהועתק ללוח",
"copyLink": "העתקת קישור",
"shareCreated": "הסשן שותף. זה יופיע בלשונית החיבורים שלהם.",
"shareFailed": "יצירת השיתוף נכשלה",
"userLacksHostAccess": "למשתמש הזה עדיין אין גישה למארח הזה. שתף את המארח איתו תחילה, או השתמש בקישור במקום זאת.",
"activeShares": "מניות פעילות",
"noActiveShares": "אין שיתופים פעילים עבור סשן זה",
"revoke": "לְבַטֵל",
"revokeConfirmTitle": "לבטל את השיתוף הזה?",
"revokeConfirmDescription": "כל מי שישתמש בשיתוף הזה יאבד גישה באופן מיידי.",
"revoked": "השיתוף בוטל",
"revokeFailed": "ביטול השיתוף נכשל",
"joinCount": "{{count}} join",
"joinCount_other": "{{count}} מצטרף",
"expiresAt": "פג תוקף {{date}}",
"linkShareBadge": "לְקַשֵׁר",
"userShareBadge": "משתמש: {{username}}",
"loadSharesFailed": "נכשלה טעינת השיתופים הפעילים"
"readWrite": "קריאה-כתיבה"
}
},
"terminal": {
"connect": "התחברות למארח",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "שולח ספירה יומית אנונימית של משתמשים, מארחים ושימוש בתכונות כדי לסייע בשיפור Termix. לא כלולים נתונים אישיים או פרטי חיבור.",
"analyticsEnabledLockedDesc": "הגדרה זו נעולה על ידי משתנה הסביבה ENABLE_TELEMETRY ולא ניתן לשנות אותה כאן.",
"updateAnalyticsFailed": "נכשל עדכון הגדרת הניתוח",
"sessionSharingGloballyEnabled": "אפשר שיתוף סשנים",
"auditForwardingTitle": "העברה ל-SIEM",
"auditForwardingDesc": "שלח עותק של כל ערך ביקורת לאספן חיצוני כ-NDJSON. יומני רישום מקומיים נשארים מקור האמת.",
"auditForwardingEnvNotice": "משתנה סביבה גם מגדיר העברה; כתובת ה-URL שנשמרת כאן מקבלת עדיפות.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "אסימון נושא (מאוחסן)",
"auditForwardingSaved": "הגדרות העברת ביקורת נשמרו",
"auditForwardingSaveError": "נכשלה שמירת הגדרות העברת הביקורת",
"sessionSharingGloballyEnabledDesc": "מאפשר שיתוף של הפעלות מסוף חי, RDP, VNC ו-Telnet בכל המופעים. מבטל כל אפשרות שיתוף לפי מארח כאשר היא מושבתת.",
"updateSessionSharingFailed": "נכשל עדכון הגדרת שיתוף הסשן",
"sessionTimeout": "פסק זמן של סשן",
"hours": "שעות",
"sessionTimeoutRange": "מינימום שעה · מקסימום 720 שעות",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "CLI दस्तावेज़ खोलें"
},
"nav": {
"collab": "बैठक",
"home": "होम",
"terminal": "टर्मिनल",
"localTerminal": "स्थानीय टर्मिनल",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "अपने शेल और उसमें चल रहे किसी भी चीज़ को डिस्कनेक्ट होने और ब्राउज़र के रीस्टार्ट होने पर भी चालू रखने के लिए, tmux के अंदर चलाएँ (होस्ट पर tmux इंस्टॉल होना चाहिए)।",
"enableSessionLogging": "सत्र लॉगिंग",
"enableSessionLoggingDesc": "बाद में समीक्षा के लिए टर्मिनल सत्र का आउटपुट रिकॉर्ड करें",
"allowSessionSharing": "सेशन शेयरिंग की अनुमति दें",
"allowSessionSharingDesc": "इस होस्ट पर होने वाले लाइव सेशन को लिंक के माध्यम से या अन्य उपयोगकर्ताओं के साथ साझा किया जा सकता है।",
"localEchoLabel": "स्थानीय प्रतिध्वनि",
"localEchoDesc": "धीमे कनेक्शन पर स्थानीय रूप से सुरक्षित और प्रिंट करने योग्य कीस्ट्रोक्स का अनुमान लगाएं। पासवर्ड प्रॉम्प्ट और नियंत्रण इनपुट कभी भी प्रदर्शित नहीं होते हैं।",
"localEchoDefault": "वैश्विक सेटिंग का उपयोग करें",
@@ -1571,137 +1568,11 @@
"join": "जोड़ना",
"sharedSessionLabel": "{{hostName}} (साझा)"
},
"collab": {
"createRoom": "नया कमरा",
"roomName": "कमरे का नाम",
"persistentRoom": "लगातार कमरा",
"persistentRoomHint": "स्थायी कमरे मीटिंग समाप्त होने के बाद भी सूची में बने रहते हैं और उनका पुनः उपयोग किया जा सकता है।",
"noRooms": "अभी कोई कमरा उपलब्ध नहीं है। मीटिंग शुरू करने के लिए एक कमरा बनाएं।",
"openRoom": "खुला",
"endRoom": "बैठक समाप्त",
"leaveRoom": "छुट्टी",
"deleteMember": "निकालना",
"removeMember": "{{name}} हटाएँ",
"removeMemberTitle": "क्या इस सदस्य को हटा दें?",
"removeMemberDescription": "{{name}} को इस कमरे तक पहुँच तुरंत खोनी पड़ेगी। कोई भी सक्रिय SSH व्यूअर डिस्कनेक्ट हो जाएगा।",
"invite": "आमंत्रित करना",
"inviteTitle": "सदस्यों को आमंत्रित करो",
"members": "सदस्यों",
"membersPanel": "कमरे के सदस्य और नियंत्रण अनुरोध",
"membersWithCount": "सदस्य ({{count}})",
"online": "ऑनलाइन",
"offline": "ऑफलाइन",
"you": "(आप)",
"hostBadge": "मेज़बान",
"presenterBadge": "प्रस्तुत करते हुए",
"present": "उपस्थित",
"presentTitle": "मंच पर आइए",
"presentHost": "मेज़बान",
"searchHosts": "होस्ट खोजें",
"noHostsFound": "कोई उपलब्ध होस्ट नहीं मिला।",
"presentProtocol": "शिष्टाचार",
"stopPresenting": "प्रस्तुति देना बंद करो",
"takeOver": "कब्जा",
"takeOverConfirmTitle": "क्या वर्तमान प्रस्तुति को बदलना है?",
"takeOverDescription": "{{name}} अभी प्रस्तुति दे रहा है। कार्यभार संभालने से सभी लोग उस मंच से अलग हो जाएंगे।",
"emptyStage": "आज कोई प्रस्तुति नहीं दे रहा है। आप मंच पर आकर अपना सत्र साझा करें।",
"stageLoading": "मंच से जुड़ना...",
"stageEnded": "प्रस्तुति समाप्त हुई",
"roomEnded": "यह बैठक समाप्त हो गई है",
"presenterLabel": "{{name}} प्रस्तुत कर रहा है",
"guestLink": "अतिथि लिंक",
"guestLinkOn": "अतिथि लिंक चालू है। लिंक के माध्यम से कोई भी व्यक्ति मंच देख सकता है।",
"guestLinkOff": "अतिथि लिंक बंद है।",
"copyLink": "लिंक की प्रतिलिपि करें",
"rotateLink": "लिंक घुमाएँ",
"disableLink": "लिंक अक्षम करें",
"rotateLinkConfirmTitle": "अतिथि लिंक को घुमाएँ?",
"rotateLinkDescription": "वर्तमान लिंक तुरंत काम करना बंद कर देगा। कनेक्टेड एसएसएच गेस्ट डिस्कनेक्ट हो जाएंगे।",
"disableLinkConfirmTitle": "अतिथि लिंक को निष्क्रिय करें?",
"disableLinkDescription": "अनाम एसएसएच व्यूअर्स तुरंत डिस्कनेक्ट हो जाएंगे और वर्तमान लिंक काम करना बंद कर देगा।",
"linkCopied": "लिंक कॉपी हो गया",
"roles": "भूमिकाएँ",
"users": "उपयोगकर्ताओं",
"searchUsers": "उपयोगकर्ताओं को खोजें",
"endConfirmTitle": "क्या इस बैठक को यहीं समाप्त करें?",
"endDescription": "{{name}} सभी के लिए समाप्त हो जाएगा और इसे दोबारा नहीं खोला जा सकता है।",
"endPersistentDescription": "{{name}} में चल रही प्रस्तुति बंद हो जाएगी। कमरा पुनः उपयोग के लिए उपलब्ध रहेगा।",
"deleteRoom": "कमरा हटाएं",
"deleteConfirmTitle": "क्या इस कमरे को हटा दें?",
"deleteDescription": "{{name}} को सभी के लिए स्थायी रूप से हटा दिया जाएगा और इसे पूर्ववत नहीं किया जा सकता है।",
"invitedTo": "आपको \"{{name}} \" में आमंत्रित किया गया था",
"guest": {
"title": "बैठक",
"waiting": "प्रस्तुतकर्ता का इंतजार है...",
"linkInvalid": "यह अतिथि लिंक अमान्य है या मीटिंग समाप्त हो चुकी है"
},
"reopenFromPanel": "इस मीटिंग टैब की समय सीमा समाप्त हो गई है। कृपया मीटिंग पैनल से कमरे को पुनः खोलें।",
"requestControl": "अनुरोध नियंत्रण",
"cancelControlRequest": "अनुरोध को रद्द करें",
"controlQueue": "नियंत्रण अनुरोध",
"noControlRequests": "कोई लंबित अनुरोध नहीं।",
"grantControlTo": "{{name}} को नियंत्रण दें",
"dismissControlRequest": "{{name}}के नियंत्रण अनुरोध को खारिज करें",
"releaseControl": "नियंत्रण छोड़ें",
"grantControl": "नियंत्रण सौंप दें",
"revokeControl": "नियंत्रण वापस अपने हाथ में लें।",
"controlRequestedBy": "{{name}} ने नियंत्रण मांगा",
"grant": "अनुदान",
"controlBadge": "नियंत्रण में",
"youArePresenting": "आप किसी दूसरे टैब में प्रेजेंटेशन दे रहे हैं। कृपया प्रेजेंटेशन देना बंद करें और स्टेज किसी और को सौंप दें।",
"created": "कमरा बनाया गया",
"invited": "सदस्यों को आमंत्रित किया गया",
"roomTab": "बैठक"
},
"sessionSharing": {
"guestView": {
"loading": "साझा सत्र से जुड़ रहा है...",
"linkInvalid": "यह शेयर लिंक अमान्य है, इसकी समय सीमा समाप्त हो चुकी है, या इसे रद्द कर दिया गया है।",
"rateLimited": "बहुत अधिक प्रयास किए गए, कृपया कुछ देर बाद पुनः प्रयास करें।",
"sessionEnded": "यह सत्र समाप्त हो गया है।",
"readOnlyBadge": "केवल देखें",
"ownerLabel": "मेज़बान स्वामी"
},
"modalTitle": "सत्र साझा करें",
"shareButton": "शेयर करना",
"notReadyToShare": "सेशन अभी शेयर करने के लिए तैयार नहीं है",
"modeTab": {
"link": "जोड़ना",
"user": "उपयोगकर्ता"
},
"linkModeDescription": "इस लिंक के जरिए कोई भी जुड़ सकता है, इसके लिए किसी खाते की आवश्यकता नहीं है।",
"userModeDescription": "इसे उस विशिष्ट उपयोगकर्ता के साथ साझा करें जिसके पास पहले से ही इस होस्ट का एक्सेस है। यदि उनके पास अभी एक्सेस नहीं है, तो पहले उनके साथ होस्ट साझा करें या इसके बजाय एक लिंक का उपयोग करें। साझा करने के बाद, सेशन उनके कनेक्शन टैब में दिखाई देगा।",
"permissionLevel": {
"label": "अनुमति स्तर",
"readOnly": "केवल पढ़ने के लिए",
"readOnlyDescription": "आप सेशन को लाइव देख सकते हैं लेकिन टाइप या इंटरैक्ट नहीं कर सकते।",
"readWrite": "पढ़ना-लिखना",
"readWriteDescription": "मालिक की तरह ही सेशन में टाइप कर सकता है और इंटरैक्ट कर सकता है।"
},
"expiryLabel": "लिंक की समय सीमा समाप्त",
"createLinkButton": "लिंक बनाएं",
"createShareButton": "उपयोगकर्ता के साथ साझा करें",
"searchUsersPlaceholder": "उपयोगकर्ताओं को खोजें...",
"noUsersFound": "कोई उपयोगकर्ता नहीं मिला",
"linkCreated": "शेयर लिंक बनाया गया",
"linkCopied": "लिंक क्लिपबोर्ड पर कॉपी हो गया है",
"copyLink": "लिंक की प्रतिलिपि करें",
"shareCreated": "सेशन साझा कर दिया गया है। यह उनके कनेक्शन टैब में दिखाई देगा।",
"shareFailed": "शेयर बनाने में विफल",
"userLacksHostAccess": "उस उपयोगकर्ता के पास अभी इस होस्ट तक पहुंच नहीं है। कृपया पहले उनके साथ होस्ट साझा करें, या इसके बजाय एक लिंक का उपयोग करें।",
"activeShares": "सक्रिय शेयर",
"noActiveShares": "इस सत्र के लिए कोई सक्रिय शेयर नहीं हैं",
"revoke": "रद्द करना",
"revokeConfirmTitle": "क्या इस शेयर को रद्द कर दें?",
"revokeConfirmDescription": "इस शेयर का उपयोग करने वाले किसी भी व्यक्ति की पहुंच तुरंत समाप्त हो जाएगी।",
"revoked": "शेयर रद्द कर दिया गया",
"revokeFailed": "शेयर रद्द करने में विफल",
"joinCount": "{{count}} जुड़ें",
"joinCount_other": "{{count}} जुड़ता है",
"expiresAt": "समाप्ति तिथि {{date}}",
"linkShareBadge": "जोड़ना",
"userShareBadge": "उपयोगकर्ता: {{username}}",
"loadSharesFailed": "सक्रिय शेयर लोड करने में विफल"
"readWrite": "पढ़ना-लिखना"
}
},
"terminal": {
"connect": "होस्ट से कनेक्ट करें",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "यह Termix को बेहतर बनाने में मदद करने के लिए उपयोगकर्ताओं, होस्टों और फ़ीचर उपयोग की दैनिक गुमनाम गणना भेजता है। इसमें कभी भी कोई व्यक्तिगत डेटा या कनेक्शन विवरण शामिल नहीं किया जाता है।",
"analyticsEnabledLockedDesc": "यह सेटिंग ENABLE_TELEMETRY पर्यावरण चर द्वारा लॉक की गई है और इसे यहां बदला नहीं जा सकता है।",
"updateAnalyticsFailed": "एनालिटिक्स सेटिंग को अपडेट करने में विफल",
"sessionSharingGloballyEnabled": "सेशन शेयरिंग की अनुमति दें",
"auditForwardingTitle": "SIEM को अग्रेषित करें",
"auditForwardingDesc": "प्रत्येक ऑडिट प्रविष्टि की एक प्रति NDJSON प्रारूप में बाहरी संग्राहक को भेजें। स्थानीय लॉग ही प्रामाणिक स्रोत बने रहेंगे।",
"auditForwardingEnvNotice": "एक पर्यावरण चर फ़ॉरवर्डिंग को भी कॉन्फ़िगर करता है; यहाँ सहेजा गया URL प्राथमिकता लेता है।",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "बियरर टोकन (संग्रहीत)",
"auditForwardingSaved": "ऑडिट अग्रेषण सेटिंग्स सहेजी गईं",
"auditForwardingSaveError": "ऑडिट फ़ॉरवर्डिंग सेटिंग्स को सहेजने में विफलता",
"sessionSharingGloballyEnabledDesc": "लाइव टर्मिनल, RDP, VNC और Telnet सेशन को पूरे इंस्टेंस में साझा करने की अनुमति दें। अक्षम होने पर यह प्रति-होस्ट साझाकरण टॉगल को ओवरराइड कर देता है।",
"updateSessionSharingFailed": "सेशन शेयरिंग सेटिंग को अपडेट करने में विफलता",
"sessionTimeout": "सत्र टाइमआउट",
"hours": "घंटे",
"sessionTimeoutRange": "न्यूनतम 1 घंटा · अधिकतम 720 घंटे",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Nyissa meg a CLI dokumentációját"
},
"nav": {
"collab": "Találkozók",
"home": "Otthon",
"terminal": "Terminál",
"localTerminal": "Helyi terminál",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Tartsd életben a shell-edet és a benne futó dolgokat a lecsatlakozások és a böngésző újraindítása során a tmux-on belüli futtatással (a tmux-nak telepítve kell lennie a gazdagépen)",
"enableSessionLogging": "Munkamenet-naplózás",
"enableSessionLoggingDesc": "Terminál munkamenet kimenetének rögzítése későbbi áttekintés céljából",
"allowSessionSharing": "Munkamenet-megosztás engedélyezése",
"allowSessionSharingDesc": "Engedélyezi az élő munkamenetek megosztását ezen a gazdagépen linken vagy más felhasználókkal",
"localEchoLabel": "Helyi visszhang",
"localEchoDesc": "Lassú kapcsolatok esetén is helyben előrejelzi a biztonságosan nyomtatható billentyűleütéseket. A jelszókérések és a vezérlőbevitel soha nem jelenik meg.",
"localEchoDefault": "Globális beállítás használata",
@@ -1571,137 +1568,11 @@
"join": "Csatlakozik",
"sharedSessionLabel": "{{hostName}} (megosztva)"
},
"collab": {
"createRoom": "Új szoba",
"roomName": "Szoba neve",
"persistentRoom": "Állandó szoba",
"persistentRoomHint": "Az állandó szobák a megbeszélés befejezése után is listázva maradnak, és újra felhasználhatók.",
"noRooms": "Még nincsenek szobák. Hozz létre egyet a megbeszélés megkezdéséhez.",
"openRoom": "Nyitott",
"endRoom": "Megbeszélés vége",
"leaveRoom": "Szabadság",
"deleteMember": "Eltávolítás",
"removeMember": "Eltávolítás {{name}}",
"removeMemberTitle": "Eltávolítja ezt a tagot?",
"removeMemberDescription": "{{name}} azonnal elveszíti a hozzáférést ehhez a szobához. Minden aktív SSH-megjelenítő lekapcsolódik.",
"invite": "Meghív",
"inviteTitle": "Tagok meghívása",
"members": "Tagok",
"membersPanel": "Szoba tagjai és irányítási kérelmek",
"membersWithCount": "Tagok ({{count}})",
"online": "online",
"offline": "offline",
"you": "(te)",
"hostBadge": "Házigazda",
"presenterBadge": "Bemutatja",
"present": "Jelenlegi",
"presentTitle": "Lépj színpadra",
"presentHost": "Házigazda",
"searchHosts": "Keresés hosztok",
"noHostsFound": "Nem található elérhető host.",
"presentProtocol": "Jegyzőkönyv",
"stopPresenting": "Prezentáció leállítása",
"takeOver": "Átvétel",
"takeOverConfirmTitle": "Lecseréli a jelenlegi prezentációt?",
"takeOverDescription": "{{name}} most tart előadást. Az irányítás átvétele mindenkit lekapcsolna arról a színpadról.",
"emptyStage": "Senki sem tart előadást. Lépjen színpadra, és ossza meg velünk az előadást.",
"stageLoading": "Csatlakozás a színpadhoz...",
"stageEnded": "A prezentáció véget ért",
"roomEnded": "Ez a találkozó véget ért",
"presenterLabel": "{{name}} bemutatja",
"guestLink": "Vendéglink",
"guestLinkOn": "Vendéglink be van kapcsolva. Bárki, aki rendelkezik a linkkel, nézheti a színpadot.",
"guestLinkOff": "A vendéglink ki van kapcsolva.",
"copyLink": "Link másolása",
"rotateLink": "Link elforgatása",
"disableLink": "Link letiltása",
"rotateLinkConfirmTitle": "Vendéglink elforgatása?",
"rotateLinkDescription": "A jelenlegi kapcsolat azonnal leáll. A csatlakoztatott SSH-vendégek le lesznek választva.",
"disableLinkConfirmTitle": "Letiltja a vendéglinket?",
"disableLinkDescription": "A névtelen SSH-nézők azonnal le lesznek választva, és a jelenlegi link nem fog működni.",
"linkCopied": "Link másolva",
"roles": "Szerepkörök",
"users": "Felhasználók",
"searchUsers": "Felhasználók keresése",
"endConfirmTitle": "Befejezi ezt a megbeszélést?",
"endDescription": "{{name}} mindenki számára megszűnik, és nem lehet újra megnyitni.",
"endPersistentDescription": "A {{name}} teremben futó aktív prezentáció leáll. A szoba továbbra is elérhető marad újrafelhasználásra.",
"deleteRoom": "Szoba törlése",
"deleteConfirmTitle": "Törli ezt a szobát?",
"deleteDescription": "A {{name}} véglegesen törlésre kerül mindenki számára, és a művelet nem vonható vissza.",
"invitedTo": "Meghívtak a következőre: \"{{name}}\"",
"guest": {
"title": "Találkozó",
"waiting": "Várjuk az előadót...",
"linkInvalid": "Ez a vendéglink érvénytelen, vagy a megbeszélés véget ért."
},
"reopenFromPanel": "Ez a megbeszélésfül lejárt. Nyissa meg újra a szobát a Megbeszélések panelről.",
"requestControl": "Kérelemvezérlés",
"cancelControlRequest": "Kérés visszavonása",
"controlQueue": "Ellenőrzési kérelmek",
"noControlRequests": "Nincsenek függőben lévő kérések.",
"grantControlTo": "Átadni az irányítást {{name}}-nak",
"dismissControlRequest": "Elutasítom {{name}}vezérlési kérelmét",
"releaseControl": "Kioldásvezérlés",
"grantControl": "Átadni az irányítást",
"revokeControl": "Vedd vissza az irányítást",
"controlRequestedBy": "{{name}} kérte az irányítást",
"grant": "Támogatás",
"controlBadge": "Irányítás alatt",
"youArePresenting": "Egy másik lapon tartasz előadást. Állítsa le az előadást, hogy átadhassa a helyet.",
"created": "Szoba létrehozva",
"invited": "Meghívott tagok",
"roomTab": "Találkozó"
},
"sessionSharing": {
"guestView": {
"loading": "Kapcsolódás a megosztott munkamenethez...",
"linkInvalid": "Ez a megosztási link érvénytelen, lejárt vagy visszavonták.",
"rateLimited": "Túl sok próbálkozás, kérjük, próbáld újra később",
"sessionEnded": "Ez a munkamenet véget ért",
"readOnlyBadge": "Csak megtekintés",
"ownerLabel": "Házigazda tulajdonos"
},
"modalTitle": "Megosztási munkamenet",
"shareButton": "Részesedés",
"notReadyToShare": "A munkamenet még nem megosztható",
"modeTab": {
"link": "Link",
"user": "Felhasználó"
},
"linkModeDescription": "Bárki csatlakozhat a link birtokában, nincs szükség regisztrációra.",
"userModeDescription": "Megosztás egy adott felhasználóval, aki már rendelkezik hozzáféréssel ehhez a gazdagéphez. Ha még nincs hozzáférésük, először oszd meg vele a gazdagépet, vagy használj hivatkozást. A megosztás után a munkamenet megjelenik a Kapcsolatok lapon.",
"permissionLevel": {
"label": "Jogosultsági szint",
"readOnly": "Csak olvasható",
"readOnlyDescription": "Élőben nézhetem az előadást, de nem gépelhetek és nem léphetek interakcióba.",
"readWrite": "Olvasható-írható",
"readWriteDescription": "Pont úgy tud gépelni és kommunikálni a munkamenettel, mint a tulajdonos."
},
"expiryLabel": "Link lejárata",
"createLinkButton": "Link létrehozása",
"createShareButton": "Megosztás a felhasználóval",
"searchUsersPlaceholder": "Felhasználók keresése...",
"noUsersFound": "Nem található felhasználó",
"linkCreated": "Megosztási link létrehozva",
"linkCopied": "Link a vágólapra másolva",
"copyLink": "Link másolása",
"shareCreated": "Munkamenet megosztva. Megjelenik a Kapcsolatok fülön.",
"shareFailed": "Nem sikerült létrehozni a megosztást",
"userLacksHostAccess": "A felhasználónak még nincs hozzáférése ehhez a gazdagéphez. Először oszd meg vele a gazdagépet, vagy használj linket.",
"activeShares": "Aktív megosztások",
"noActiveShares": "Nincsenek aktív megosztások ebben a munkamenetben",
"revoke": "Visszavonás",
"revokeConfirmTitle": "Visszavonja ezt a megosztást?",
"revokeConfirmDescription": "Bárki, aki ezt a megosztást használja, azonnal elveszíti a hozzáférését.",
"revoked": "Megosztás visszavonva",
"revokeFailed": "Nem sikerült visszavonni a megosztást",
"joinCount": "{{count}} csatlakozás",
"joinCount_other": "{{count}} csatlakozások",
"expiresAt": "Lejár {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Felhasználó: {{username}}",
"loadSharesFailed": "Nem sikerült betölteni az aktív megosztásokat"
"readWrite": "Olvasható-írható"
}
},
"terminal": {
"connect": "Csatlakozás a gazdagéphez",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Naponta névtelenül küldi a felhasználók, a hosztok és a funkciók használatának számát a Termix fejlesztése érdekében. Személyes adatokat vagy kapcsolati adatokat nem tartalmaz.",
"analyticsEnabledLockedDesc": "Ezt a beállítást az ENABLE_TELEMETRY környezeti változó zárolja, és itt nem módosítható.",
"updateAnalyticsFailed": "Nem sikerült frissíteni az analitikai beállításokat",
"sessionSharingGloballyEnabled": "Munkamenet-megosztás engedélyezése",
"auditForwardingTitle": "Tovább a SIEM-hez",
"auditForwardingDesc": "Minden auditbejegyzés másolatát küldd el egy külső gyűjtőnek NDJSON formátumban. A helyi naplók továbbra is az igazság forrásai.",
"auditForwardingEnvNotice": "Egy környezeti változó is konfigurálja a továbbítás funkciót; az itt mentett URL élvez elsőbbséget.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Tulajdonosi token (tárolt)",
"auditForwardingSaved": "Audittovábbítási beállítások mentve",
"auditForwardingSaveError": "Nem sikerült menteni az audittovábbítási beállításokat",
"sessionSharingGloballyEnabledDesc": "Engedélyezi az élő terminál-, RDP-, VNC- és Telnet-munkamenetek példányonkénti megosztását. Letiltás esetén felülírja az összes gazdagépenkénti megosztási kapcsolót.",
"updateSessionSharingFailed": "Nem sikerült frissíteni a munkamenet-megosztási beállítást",
"sessionTimeout": "Munkamenet időkorlátja",
"hours": "órák",
"sessionTimeoutRange": "Minimum 1 óra · Max. 720 óra",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Buka dokumentasi CLI"
},
"nav": {
"collab": "Pertemuan",
"home": "Rumah",
"terminal": "Terminal",
"localTerminal": "Terminal Lokal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Jaga agar shell Anda dan semua yang berjalan di dalamnya tetap aktif meskipun terjadi pemutusan koneksi dan restart browser dengan menjalankan perintah di dalam tmux (tmux harus diinstal pada host).",
"enableSessionLogging": "Pencatatan Sesi",
"enableSessionLoggingDesc": "Rekam output sesi terminal untuk ditinjau nanti.",
"allowSessionSharing": "Izinkan Berbagi Sesi",
"allowSessionSharingDesc": "Izinkan sesi langsung di host ini dibagikan melalui tautan atau dengan pengguna lain.",
"localEchoLabel": "Gema Lokal",
"localEchoDesc": "Memprediksi penekanan tombol yang aman dan dapat dicetak secara lokal pada koneksi lambat. Permintaan kata sandi dan input kontrol tidak pernah diulang.",
"localEchoDefault": "Gunakan pengaturan global",
@@ -1571,137 +1568,11 @@
"join": "Bergabung",
"sharedSessionLabel": "{{hostName}} (dibagikan)"
},
"collab": {
"createRoom": "Kamar baru",
"roomName": "Nama ruangan",
"persistentRoom": "Ruang permanen",
"persistentRoomHint": "Ruangan yang bersifat permanen akan tetap terdaftar setelah rapat berakhir dan dapat digunakan kembali.",
"noRooms": "Belum ada ruang rapat. Buat ruang rapat untuk memulai pertemuan.",
"openRoom": "Membuka",
"endRoom": "Mengakhiri pertemuan",
"leaveRoom": "Meninggalkan",
"deleteMember": "Menghapus",
"removeMember": "Hapus {{name}}",
"removeMemberTitle": "Hapus anggota ini?",
"removeMemberDescription": "{{name}} akan kehilangan akses ke ruangan ini segera. Setiap penonton SSH yang aktif akan terputus.",
"invite": "Mengundang",
"inviteTitle": "Undang anggota",
"members": "Anggota",
"membersPanel": "Anggota ruangan dan permintaan kontrol",
"membersWithCount": "Anggota ({{count}})",
"online": "on line",
"offline": "offline",
"you": "(Anda)",
"hostBadge": "Tuan rumah",
"presenterBadge": "Mempersembahkan",
"present": "Hadiah",
"presentTitle": "Naik ke panggung",
"presentHost": "Tuan rumah",
"searchHosts": "Cari host",
"noHostsFound": "Tidak ditemukan host yang tersedia.",
"presentProtocol": "Protokol",
"stopPresenting": "Berhenti melakukan presentasi",
"takeOver": "Mengambil alih",
"takeOverConfirmTitle": "Mengganti presentasi yang ada?",
"takeOverDescription": "{{name}} sedang melakukan presentasi sekarang. Mengambil alih akan memutuskan koneksi semua orang dari panggung tersebut.",
"emptyStage": "Tidak ada yang sedang presentasi. Silakan naik ke panggung untuk berbagi sesi.",
"stageLoading": "Terhubung ke panggung...",
"stageEnded": "Presentasi berakhir",
"roomEnded": "Pertemuan ini telah berakhir.",
"presenterLabel": "{{name}} sedang menampilkan",
"guestLink": "Tautan tamu",
"guestLinkOn": "Tautan tamu sudah aktif. Siapa pun yang memiliki tautan tersebut dapat menonton pertunjukan di panggung.",
"guestLinkOff": "Tautan tamu dinonaktifkan.",
"copyLink": "Salin tautan",
"rotateLink": "Putar tautan",
"disableLink": "Nonaktifkan tautan",
"rotateLinkConfirmTitle": "Putar tautan tamu?",
"rotateLinkDescription": "Koneksi saat ini akan segera berhenti berfungsi. Tamu SSH yang terhubung akan terputus.",
"disableLinkConfirmTitle": "Nonaktifkan tautan tamu?",
"disableLinkDescription": "Pengguna anonim yang mengakses melalui SSH akan langsung terputus dan tautan saat ini akan berhenti berfungsi.",
"linkCopied": "Tautan disalin",
"roles": "Peran",
"users": "Pengguna",
"searchUsers": "Cari pengguna",
"endConfirmTitle": "Apakah pertemuan ini bisa diakhiri?",
"endDescription": "{{name}} akan berakhir untuk semua orang dan tidak dapat dibuka kembali.",
"endPersistentDescription": "Presentasi aktif di {{name}} akan berhenti. Ruangan tetap tersedia untuk digunakan kembali.",
"deleteRoom": "Hapus ruangan",
"deleteConfirmTitle": "Hapus ruangan ini?",
"deleteDescription": "{{name}} akan dihapus secara permanen untuk semua orang dan tidak dapat dibatalkan.",
"invitedTo": "Anda diundang ke \"{{name}}\"",
"guest": {
"title": "Pertemuan",
"waiting": "Menunggu pembawa acara...",
"linkInvalid": "Tautan tamu ini tidak valid atau rapat telah berakhir."
},
"reopenFromPanel": "Tab rapat ini telah kedaluwarsa. Buka kembali ruangan dari panel Rapat.",
"requestControl": "Kontrol permintaan",
"cancelControlRequest": "Batalkan permintaan",
"controlQueue": "Permintaan kontrol",
"noControlRequests": "Tidak ada permintaan yang tertunda.",
"grantControlTo": "Berikan kendali ke {{name}}",
"dismissControlRequest": "Abaikan permintaan kontrol {{name}}",
"releaseControl": "Lepaskan kontrol",
"grantControl": "Berikan kendali",
"revokeControl": "Ambil kembali kendali",
"controlRequestedBy": "{{name}} meminta kendali",
"grant": "Menganugerahkan",
"controlBadge": "Dalam kendali",
"youArePresenting": "Anda sedang melakukan presentasi di tab lain. Hentikan presentasi untuk memberikan kesempatan kepada saya.",
"created": "Ruangan dibuat",
"invited": "Anggota diundang",
"roomTab": "Pertemuan"
},
"sessionSharing": {
"guestView": {
"loading": "Menghubungkan ke sesi bersama...",
"linkInvalid": "Tautan berbagi ini tidak valid, telah kedaluwarsa, atau telah dicabut.",
"rateLimited": "Terlalu banyak percobaan, silakan coba lagi sebentar lagi.",
"sessionEnded": "Sesi ini telah berakhir.",
"readOnlyBadge": "Hanya tampilan",
"ownerLabel": "Pemilik host"
},
"modalTitle": "Sesi berbagi",
"shareButton": "Membagikan",
"notReadyToShare": "Sesi belum siap untuk dibagikan.",
"modeTab": {
"link": "Link",
"user": "Pengguna"
},
"linkModeDescription": "Siapa pun yang memiliki tautan ini dapat bergabung, tidak perlu membuat akun.",
"userModeDescription": "Bagikan dengan pengguna tertentu yang sudah memiliki akses ke host ini. Jika mereka belum memiliki akses, bagikan host tersebut kepada mereka terlebih dahulu atau gunakan tautan. Setelah dibagikan, sesi akan muncul di tab Koneksi mereka.",
"permissionLevel": {
"label": "Tingkat izin",
"readOnly": "Hanya baca",
"readOnlyDescription": "Bisa menonton sesi secara langsung tetapi tidak bisa mengetik atau berinteraksi.",
"readWrite": "Baca-tulis",
"readWriteDescription": "Dapat mengetik dan berinteraksi dengan sesi seperti halnya pemilik."
},
"expiryLabel": "Kedaluwarsa tautan",
"createLinkButton": "Buat tautan",
"createShareButton": "Bagikan dengan pengguna",
"searchUsersPlaceholder": "Cari pengguna...",
"noUsersFound": "Tidak ada pengguna yang ditemukan",
"linkCreated": "Tautan berbagi telah dibuat",
"linkCopied": "Tautan disalin ke papan klip",
"copyLink": "Salin tautan",
"shareCreated": "Sesi dibagikan. Sesi tersebut akan muncul di tab Koneksi mereka.",
"shareFailed": "Gagal membuat saham",
"userLacksHostAccess": "Pengguna tersebut belum memiliki akses ke host ini. Bagikan host tersebut kepada mereka terlebih dahulu, atau gunakan tautan sebagai gantinya.",
"activeShares": "Saham aktif",
"noActiveShares": "Tidak ada saham aktif untuk sesi ini.",
"revoke": "Menarik kembali",
"revokeConfirmTitle": "Batalkan pembagian ini?",
"revokeConfirmDescription": "Siapa pun yang menggunakan share ini akan langsung kehilangan akses.",
"revoked": "Saham dicabut",
"revokeFailed": "Gagal mencabut saham",
"joinCount": "{{count}} bergabung",
"joinCount_other": "{{count}} bergabung",
"expiresAt": "Berakhir {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Pengguna: {{username}}",
"loadSharesFailed": "Gagal memuat saham aktif."
"readWrite": "Baca-tulis"
}
},
"terminal": {
"connect": "Terhubung ke Host",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Mengirimkan data harian anonim mengenai jumlah pengguna, host, dan penggunaan fitur untuk membantu meningkatkan Termix. Tidak ada data pribadi atau detail koneksi yang disertakan.",
"analyticsEnabledLockedDesc": "Pengaturan ini dikunci oleh variabel lingkungan ENABLE_TELEMETRY dan tidak dapat diubah di sini.",
"updateAnalyticsFailed": "Gagal memperbarui pengaturan analitik.",
"sessionSharingGloballyEnabled": "Izinkan Berbagi Sesi",
"auditForwardingTitle": "Teruskan ke SIEM",
"auditForwardingDesc": "Kirim salinan setiap entri audit ke pengumpul data eksternal sebagai NDJSON. Log lokal tetap menjadi sumber kebenaran.",
"auditForwardingEnvNotice": "Variabel lingkungan juga mengkonfigurasi penerusan; URL yang disimpan di sini akan diutamakan.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token pembawa (tersimpan)",
"auditForwardingSaved": "Pengaturan penerusan audit tersimpan",
"auditForwardingSaveError": "Gagal menyimpan pengaturan penerusan audit",
"sessionSharingGloballyEnabledDesc": "Izinkan sesi terminal langsung, RDP, VNC, dan Telnet untuk dibagikan di seluruh instance. Menggantikan setiap pengaturan berbagi per host saat dinonaktifkan.",
"updateSessionSharingFailed": "Gagal memperbarui pengaturan berbagi sesi.",
"sessionTimeout": "Waktu sesi habis",
"hours": "jam",
"sessionTimeoutRange": "Minimal 1 jam · Maksimal 720 jam",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Apri la documentazione della CLI"
},
"nav": {
"collab": "Riunioni",
"home": "Home",
"terminal": "Terminale",
"localTerminal": "Terminale locale",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Mantieni la tua shell e tutto ciò che è in esecuzione al suo interno attivi anche in caso di disconnessioni e riavvii del browser, eseguendoli all'interno di tmux (tmux deve essere installato sull'host).",
"enableSessionLogging": "Registrazione sessione",
"enableSessionLoggingDesc": "Registra l'output della sessione del terminale per la revisione successiva",
"allowSessionSharing": "Consenti la condivisione della sessione",
"allowSessionSharingDesc": "Consenti la condivisione delle sessioni live su questo host tramite link o con altri utenti",
"localEchoLabel": "Eco locale",
"localEchoDesc": "Prevedi localmente le sequenze di tasti sicure e stampabili anche con connessioni lente. Le richieste di password e gli input di controllo non vengono mai ripetuti.",
"localEchoDefault": "Utilizza le impostazioni globali",
@@ -1571,137 +1568,11 @@
"join": "Giuntura",
"sharedSessionLabel": "{{hostName}} (condiviso)"
},
"collab": {
"createRoom": "Nuova stanza",
"roomName": "Nome della stanza",
"persistentRoom": "Stanza persistente",
"persistentRoomHint": "Le stanze persistenti rimangono elencate anche dopo la fine della riunione e possono essere riutilizzate.",
"noRooms": "Non ci sono ancora stanze. Creane una per avviare una riunione.",
"openRoom": "Aprire",
"endRoom": "Fine della riunione",
"leaveRoom": "Partire",
"deleteMember": "Rimuovere",
"removeMember": "Rimuovi {{name}}",
"removeMemberTitle": "Rimuovere questo membro?",
"removeMemberDescription": "{{name}} perderà immediatamente l'accesso a questa stanza. Qualsiasi visualizzatore SSH attivo verrà disconnesso.",
"invite": "Invitare",
"inviteTitle": "Invita i membri",
"members": "Membri",
"membersPanel": "Membri della stanza e richieste di controllo",
"membersWithCount": "Membri ({{count}})",
"online": "online",
"offline": "offline",
"you": "(Voi)",
"hostBadge": "Ospite",
"presenterBadge": "Presentazione",
"present": "Presente",
"presentTitle": "Sali sul palco",
"presentHost": "Ospite",
"searchHosts": "Host di ricerca",
"noHostsFound": "Nessun host disponibile trovato.",
"presentProtocol": "Protocollo",
"stopPresenting": "Smetti di presentare",
"takeOver": "Rilevare",
"takeOverConfirmTitle": "Sostituire la presentazione attuale?",
"takeOverDescription": "{{name}} sta presentando ora. Prendere il controllo disconnetterà tutti da quel palco.",
"emptyStage": "Nessuno sta presentando. Salite sul palco per condividere una sessione.",
"stageLoading": "Collegamento al palco...",
"stageEnded": "La presentazione è terminata",
"roomEnded": "La riunione è terminata",
"presenterLabel": "{{name}} sta presentando",
"guestLink": "Link ospite",
"guestLinkOn": "Il link per gli ospiti è attivo. Chiunque abbia il link può assistere alla diretta.",
"guestLinkOff": "Il link per gli ospiti è disattivato.",
"copyLink": "Copia il link",
"rotateLink": "Ruota il collegamento",
"disableLink": "Disabilita il collegamento",
"rotateLinkConfirmTitle": "Ruotare il link per gli ospiti?",
"rotateLinkDescription": "Il collegamento attuale smetterà di funzionare immediatamente. Gli ospiti SSH connessi verranno disconnessi.",
"disableLinkConfirmTitle": "Disabilitare il link per gli ospiti?",
"disableLinkDescription": "Gli utenti che tentano di connettersi tramite SSH in modo anonimo verranno disconnessi immediatamente e il collegamento corrente smetterà di funzionare.",
"linkCopied": "Link copiato",
"roles": "Ruoli",
"users": "Utenti",
"searchUsers": "Utenti di ricerca",
"endConfirmTitle": "Chiudere questa riunione?",
"endDescription": "{{name}} terminerà per tutti e non potrà essere riaperto.",
"endPersistentDescription": "La presentazione attiva in {{name}} verrà interrotta. La sala rimane disponibile per un altro utilizzo.",
"deleteRoom": "Eliminare la stanza",
"deleteConfirmTitle": "Eliminare questa stanza?",
"deleteDescription": "{{name}} verrà eliminato definitivamente per tutti e non sarà possibile annullare l'operazione.",
"invitedTo": "Sei stato invitato a \"{{name}}\"",
"guest": {
"title": "Incontro",
"waiting": "In attesa del presentatore...",
"linkInvalid": "Questo link per gli ospiti non è valido oppure la riunione è terminata."
},
"reopenFromPanel": "La scheda di questa riunione è scaduta. Riapri la sala riunioni dal pannello Riunioni.",
"requestControl": "Controllo della richiesta",
"cancelControlRequest": "Annulla richiesta",
"controlQueue": "Richieste di controllo",
"noControlRequests": "Nessuna richiesta in sospeso.",
"grantControlTo": "Assegna il controllo a {{name}}",
"dismissControlRequest": "Ignora la richiesta di controllo di {{name}}",
"releaseControl": "Controllo del rilascio",
"grantControl": "Dare il controllo",
"revokeControl": "Riprendi il controllo",
"controlRequestedBy": "{{name}} ha chiesto il controllo",
"grant": "Concessione",
"controlBadge": "In controllo",
"youArePresenting": "Stai presentando in un'altra scheda. Interrompi la presentazione per cedere la parola.",
"created": "Stanza creata",
"invited": "Membri invitati",
"roomTab": "Incontro"
},
"sessionSharing": {
"guestView": {
"loading": "Connessione alla sessione condivisa in corso...",
"linkInvalid": "Questo link di condivisione non è valido, è scaduto o è stato revocato.",
"rateLimited": "Troppi tentativi, riprova tra poco.",
"sessionEnded": "Questa sessione è terminata",
"readOnlyBadge": "Solo visualizzazione",
"ownerLabel": "Proprietario dell'host"
},
"modalTitle": "Sessione di condivisione",
"shareButton": "Condividere",
"notReadyToShare": "La sessione non è ancora pronta per la condivisione.",
"modeTab": {
"link": "Collegamento",
"user": "Utente"
},
"linkModeDescription": "Chiunque abbia questo link può partecipare, non è necessario creare un account.",
"userModeDescription": "Condividi la sessione con un utente specifico che ha già accesso a questo host. Se non ha ancora accesso, condividi prima l'host con lui oppure usa un link. Una volta condivisa, la sessione apparirà nella sua scheda Connessioni.",
"permissionLevel": {
"label": "Livello di autorizzazione",
"readOnly": "Sola lettura",
"readOnlyDescription": "È possibile seguire la sessione in diretta, ma non è possibile digitare o interagire.",
"readWrite": "lettura-scrittura",
"readWriteDescription": "Può digitare e interagire con la sessione proprio come il proprietario."
},
"expiryLabel": "Scadenza del collegamento",
"createLinkButton": "Crea collegamento",
"createShareButton": "Condividi con l'utente",
"searchUsersPlaceholder": "Cerca utenti...",
"noUsersFound": "Nessun utente trovato",
"linkCreated": "Link di condivisione creato",
"linkCopied": "Link copiato negli appunti",
"copyLink": "Copia il link",
"shareCreated": "Sessione condivisa. Sarà visibile nella scheda Connessioni.",
"shareFailed": "Impossibile creare la condivisione",
"userLacksHostAccess": "Quell'utente non ha ancora accesso a questo host. Condividi prima l'host con lui, oppure usa un link.",
"activeShares": "Condivisioni attive",
"noActiveShares": "Nessuna azione attiva in questa sessione.",
"revoke": "Revocare",
"revokeConfirmTitle": "Revocare questa condivisione?",
"revokeConfirmDescription": "Chiunque utilizzi questa condivisione perderà immediatamente l'accesso.",
"revoked": "Azione revocata.",
"revokeFailed": "Impossibile revocare la quota",
"joinCount": "{{count}} unisciti",
"joinCount_other": "{{count}} si unisce",
"expiresAt": "Scade il {{date}}",
"linkShareBadge": "Collegamento",
"userShareBadge": "Utente: {{username}}",
"loadSharesFailed": "Impossibile caricare le azioni attive"
"readWrite": "lettura-scrittura"
}
},
"terminal": {
"connect": "Connetti all'host",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Invia un conteggio giornaliero anonimo di utenti, host e utilizzo delle funzionalità per contribuire al miglioramento di Termix. Non vengono mai inclusi dati personali o dettagli di connessione.",
"analyticsEnabledLockedDesc": "Questa impostazione è bloccata dalla variabile d'ambiente ENABLE_TELEMETRY e non può essere modificata qui.",
"updateAnalyticsFailed": "Impossibile aggiornare le impostazioni di analisi",
"sessionSharingGloballyEnabled": "Consenti la condivisione della sessione",
"auditForwardingTitle": "Inoltra a SIEM",
"auditForwardingDesc": "Invia una copia di ogni voce di audit a un raccoglitore esterno in formato NDJSON. I log locali rimangono la fonte di verità.",
"auditForwardingEnvNotice": "Una variabile d'ambiente configura anche l'inoltro delle richieste; l'URL salvato in questa variabile ha la precedenza.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token al portatore (conservato)",
"auditForwardingSaved": "Impostazioni di inoltro del controllo salvate",
"auditForwardingSaveError": "Impossibile salvare le impostazioni di inoltro del controllo.",
"sessionSharingGloballyEnabledDesc": "Consente la condivisione di sessioni live di terminale, RDP, VNC e Telnet a livello di istanza. Quando disabilitata, questa opzione sovrascrive tutte le impostazioni di condivisione per singolo host.",
"updateSessionSharingFailed": "Impossibile aggiornare le impostazioni di condivisione della sessione",
"sessionTimeout": "Timeout sessione",
"hours": "ore",
"sessionTimeoutRange": "Min 1h · Max 720h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "CLIドキュメントを開く"
},
"nav": {
"collab": "会議",
"home": "ホーム",
"terminal": "ターミナル",
"localTerminal": "ローカル端末",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "tmux内で実行することで、接続切断やブラウザの再起動後もシェルとその中で実行されているすべての処理を正常に実行状態に保つことができます(ホストにtmuxがインストールされている必要があります)。",
"enableSessionLogging": "セッションログ",
"enableSessionLoggingDesc": "後で確認できるようにターミナルセッションの出力を記録します",
"allowSessionSharing": "セッション共有を許可する",
"allowSessionSharingDesc": "このホスト上のライブセッションをリンクまたは他のユーザーと共有できるようにします。",
"localEchoLabel": "ローカルエコー",
"localEchoDesc": "低速回線でも、印刷可能な安全なキー入力をローカルで予測します。パスワード入力や制御入力はエコーバックされません。",
"localEchoDefault": "グローバル設定を使用する",
@@ -1571,137 +1568,11 @@
"join": "参加する",
"sharedSessionLabel": "{{hostName}} (共有)"
},
"collab": {
"createRoom": "新しい部屋",
"roomName": "部屋名",
"persistentRoom": "永続的な部屋",
"persistentRoomHint": "永続的な会議室は、会議終了後もリストに表示され、再利用できます。",
"noRooms": "まだ会議室がありません。会議室を作成して会議を開始してください。",
"openRoom": "開ける",
"endRoom": "会議終了",
"leaveRoom": "離れる",
"deleteMember": "取り除く",
"removeMember": "{{name}} を削除",
"removeMemberTitle": "このメンバーを削除しますか?",
"removeMemberDescription": "{{name}} は直ちにこのルームへのアクセス権を失います。アクティブな SSH ビューアはすべて切断されます。",
"invite": "招待する",
"inviteTitle": "メンバーを招待する",
"members": "メンバー",
"membersPanel": "ルームメンバーと制御リクエスト",
"membersWithCount": "メンバー({{count}})",
"online": "オンライン",
"offline": "オフライン",
"you": "(あなた)",
"hostBadge": "ホスト",
"presenterBadge": "発表します",
"present": "現在",
"presentTitle": "ステージに立つ",
"presentHost": "ホスト",
"searchHosts": "ホストを検索",
"noHostsFound": "利用可能なホストが見つかりませんでした。",
"presentProtocol": "プロトコル",
"stopPresenting": "プレゼンテーションをやめる",
"takeOver": "引き継ぐ",
"takeOverConfirmTitle": "現在のプレゼンテーションを置き換えますか?",
"takeOverDescription": "{{name}} が現在プレゼンテーションを行っています。引き継ぐと、そのステージから全員が切断されます。",
"emptyStage": "発表者はいません。ステージに上がってセッションを共有してください。",
"stageLoading": "ステージに接続中…",
"stageEnded": "プレゼンテーションは終了しました",
"roomEnded": "この会議は終了しました。",
"presenterLabel": "{{name}} がプレゼンテーションを行っています",
"guestLink": "ゲストリンク",
"guestLinkOn": "ゲストリンクが有効になっています。リンクを知っている人なら誰でもステージを視聴できます。",
"guestLinkOff": "ゲストリンクが無効になっています。",
"copyLink": "リンクをコピー",
"rotateLink": "リンクを回転させる",
"disableLink": "リンクを無効にする",
"rotateLinkConfirmTitle": "ゲストリンクを回転させますか?",
"rotateLinkDescription": "現在の接続は直ちに停止します。接続中のSSHゲストは切断されます。",
"disableLinkConfirmTitle": "ゲストリンクを無効にしますか?",
"disableLinkDescription": "匿名SSHビューアは直ちに切断され、現在の接続は機能しなくなります。",
"linkCopied": "リンクをコピーしました",
"roles": "役割",
"users": "ユーザー",
"searchUsers": "ユーザーを検索",
"endConfirmTitle": "この会議を終了しますか?",
"endDescription": "{{name}} は全員に対して終了し、再開することはできません。",
"endPersistentDescription": "{{name}} で現在行われているプレゼンテーションは終了します。この部屋は引き続きご利用いただけます。",
"deleteRoom": "ルームを削除",
"deleteConfirmTitle": "この部屋を削除しますか?",
"deleteDescription": "{{name}} は全員に対して完全に削除され、元に戻すことはできません。",
"invitedTo": "あなたは「{{name}}」に招待されました。",
"guest": {
"title": "ミーティング",
"waiting": "プレゼンターをお待ちしています…",
"linkInvalid": "このゲストリンクは無効であるか、ミーティングが終了しています"
},
"reopenFromPanel": "この会議タブの有効期限が切れました。会議パネルから会議室を再度開いてください。",
"requestControl": "リクエスト制御",
"cancelControlRequest": "キャンセルリクエスト",
"controlQueue": "制御要求",
"noControlRequests": "保留中のリクエストはありません。",
"grantControlTo": "{{name}}に制御権を与える",
"dismissControlRequest": "{{name}}の制御要求を却下します",
"releaseControl": "リリース制御",
"grantControl": "コントロールを与える",
"revokeControl": "主導権を取り戻す",
"controlRequestedBy": "{{name}} が制御を要求しました",
"grant": "付与",
"controlBadge": "制御する",
"youArePresenting": "あなたは別のタブでプレゼンテーションを行っています。プレゼンテーションを中断して、ステージを譲ってください。",
"created": "ルームが作成されました",
"invited": "会員の皆様を招待いたします",
"roomTab": "ミーティング"
},
"sessionSharing": {
"guestView": {
"loading": "共有セッションに接続しています...",
"linkInvalid": "この共有リンクは無効、期限切れ、または取り消されています。",
"rateLimited": "試行回数が多すぎます。しばらくしてからもう一度お試しください。",
"sessionEnded": "このセッションは終了しました",
"readOnlyBadge": "閲覧のみ",
"ownerLabel": "ホストオーナー"
},
"modalTitle": "セッションを共有する",
"shareButton": "共有",
"notReadyToShare": "セッションはまだ共有できません",
"modeTab": {
"link": "リンク",
"user": "ユーザー"
},
"linkModeDescription": "このリンクを知っている人なら誰でも参加できます。アカウントは必要ありません。",
"userModeDescription": "このホストへのアクセス権を既に持っている特定のユーザーと共有します。まだアクセス権がない場合は、まずホストを共有するか、代わりにリンクを使用してください。共有が完了すると、セッションはユーザーの「接続」タブに表示されます。",
"permissionLevel": {
"label": "権限レベル",
"readOnly": "読み取り専用",
"readOnlyDescription": "セッションをライブで視聴することはできますが、文字入力やインタラクションはできません。",
"readWrite": "読み書き",
"readWriteDescription": "所有者と同様に、セッション内で文字を入力したり操作したりできます。"
},
"expiryLabel": "リンクの有効期限",
"createLinkButton": "リンクを作成する",
"createShareButton": "ユーザーと共有する",
"searchUsersPlaceholder": "ユーザーを検索...",
"noUsersFound": "ユーザーが見つかりませんでした",
"linkCreated": "共有リンクが作成されました",
"linkCopied": "リンクがクリップボードにコピーされました",
"copyLink": "リンクをコピー",
"shareCreated": "セッションが共有されました。相手の「接続」タブに表示されます。",
"shareFailed": "共有の作成に失敗しました",
"userLacksHostAccess": "そのユーザーはまだこのホストへのアクセス権を持っていません。まずホストを共有するか、代わりにリンクを使用してください。",
"activeShares": "アクティブなシェア",
"noActiveShares": "今セッションで有効な株式はありません",
"revoke": "取り消す",
"revokeConfirmTitle": "この共有を取り消しますか?",
"revokeConfirmDescription": "この共有ファイルを使用している人は、即座にアクセス権を失います。",
"revoked": "シェアが取り消されました",
"revokeFailed": "シェアの取り消しに失敗しました",
"joinCount": "{{count}} 参加する",
"joinCount_other": "{{count}} が参加します",
"expiresAt": "有効期限 {{date}}",
"linkShareBadge": "リンク",
"userShareBadge": "ユーザー: {{username}}",
"loadSharesFailed": "アクティブな共有の読み込みに失敗しました"
"readWrite": "読み書き"
}
},
"terminal": {
"connect": "ホストに接続",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Termixの改善に役立てるため、ユーザー数、ホスト数、機能使用状況に関する匿名データを毎日送信します。個人データや接続情報は一切含まれません。",
"analyticsEnabledLockedDesc": "この設定は環境変数ENABLE_TELEMETRYによってロックされているため、ここで変更することはできません。",
"updateAnalyticsFailed": "分析設定の更新に失敗しました",
"sessionSharingGloballyEnabled": "セッション共有を許可する",
"auditForwardingTitle": "SIEMへ転送",
"auditForwardingDesc": "すべての監査エントリのコピーをNDJSON形式で外部の収集業者に送信します。ローカルログは真の情報源として保持されます。",
"auditForwardingEnvNotice": "環境変数でも転送設定を行うことができます。ここに保存されたURLが優先されます。",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "ベアラートークン(保存済み)",
"auditForwardingSaved": "監査転送設定が保存されました",
"auditForwardingSaveError": "監査転送設定の保存に失敗しました",
"sessionSharingGloballyEnabledDesc": "ライブターミナル、RDP、VNC、およびTelnetセッションをインスタンス全体で共有できるようにします。無効にすると、ホストごとの共有設定がすべて上書きされます。",
"updateSessionSharingFailed": "セッション共有設定の更新に失敗しました",
"sessionTimeout": "セッションタイムアウト",
"hours": "時間",
"sessionTimeoutRange": "最小1時間・最大720時間",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "CLI 문서를 엽니다."
},
"nav": {
"collab": "회의",
"home": "홈",
"terminal": "터미널",
"localTerminal": "로컬 터미널",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "tmux 내부에서 실행하면 연결이 끊기거나 브라우저가 다시 시작되더라도 셸과 그 안에서 실행 중인 모든 작업이 계속 유지됩니다(호스트에 tmux가 설치되어 있어야 함).",
"enableSessionLogging": "세션 로깅",
"enableSessionLoggingDesc": "나중에 검토할 수 있도록 터미널 세션 출력을 기록합니다",
"allowSessionSharing": "세션 공유 허용",
"allowSessionSharingDesc": "이 호스트에서 진행되는 라이브 세션을 링크 또는 다른 사용자와 공유하세요.",
"localEchoLabel": "로컬 에코",
"localEchoDesc": "연결 속도가 느린 환경에서도 안전하게 입력 가능한 키 입력을 로컬에서 예측합니다. 비밀번호 입력 및 제어 입력은 절대 화면에 표시되지 않습니다.",
"localEchoDefault": "전역 설정을 사용하세요",
@@ -1571,137 +1568,11 @@
"join": "가입하다",
"sharedSessionLabel": "{{hostName}} (공유됨)"
},
"collab": {
"createRoom": "새로운 방",
"roomName": "객실 이름",
"persistentRoom": "지속적인 방",
"persistentRoomHint": "회의가 끝난 후에도 지정된 회의실 목록에 남아 재사용할 수 있습니다.",
"noRooms": "아직 회의실이 없습니다. 회의를 시작하려면 회의실을 만드세요.",
"openRoom": "열려 있는",
"endRoom": "회의 종료",
"leaveRoom": "떠나다",
"deleteMember": "제거하다",
"removeMember": "{{name}}를 제거하세요",
"removeMemberTitle": "이 회원을 삭제하시겠습니까?",
"removeMemberDescription": "{{name}} 사용자는 즉시 이 방에 대한 접근 권한을 잃게 됩니다. 활성화된 SSH 뷰어는 모두 연결이 끊어집니다.",
"invite": "초대하다",
"inviteTitle": "회원 초대",
"members": "회원들",
"membersPanel": "회의실 구성원 및 제어 요청",
"membersWithCount": "멤버({{count}})",
"online": "온라인",
"offline": "오프라인",
"you": "(너)",
"hostBadge": "주인",
"presenterBadge": "소개합니다",
"present": "현재의",
"presentTitle": "무대에 오르세요",
"presentHost": "주인",
"searchHosts": "호스트 검색",
"noHostsFound": "사용 가능한 호스트를 찾을 수 없습니다.",
"presentProtocol": "규약",
"stopPresenting": "프레젠테이션을 중단하세요",
"takeOver": "인수하세요",
"takeOverConfirmTitle": "현재 프레젠테이션을 교체하시겠습니까?",
"takeOverDescription": "{{name}} 님이 현재 발표 중입니다. 발표를 이어받으면 해당 무대에서 모든 사용자의 연결이 끊어집니다.",
"emptyStage": "발표자가 없습니다. 무대에 올라 세션을 공유해 보세요.",
"stageLoading": "무대와 연결 중...",
"stageEnded": "프레젠테이션이 끝났습니다.",
"roomEnded": "이 회의는 종료되었습니다.",
"presenterLabel": "{{name}} 가 발표합니다",
"guestLink": "게스트 링크",
"guestLinkOn": "게스트 링크가 활성화되었습니다. 링크만 있으면 누구나 무대를 시청할 수 있습니다.",
"guestLinkOff": "게스트 링크가 꺼져 있습니다.",
"copyLink": "링크 복사",
"rotateLink": "링크를 회전하세요",
"disableLink": "링크 비활성화",
"rotateLinkConfirmTitle": "게스트 링크를 변경하시겠습니까?",
"rotateLinkDescription": "현재 연결은 즉시 작동을 멈춥니다. 연결된 SSH 게스트는 연결이 끊어집니다.",
"disableLinkConfirmTitle": "게스트 링크를 비활성화하시겠습니까?",
"disableLinkDescription": "익명 SSH 뷰어는 즉시 연결이 끊어지고 현재 링크가 작동을 멈춥니다.",
"linkCopied": "링크 복사됨",
"roles": "역할",
"users": "사용자",
"searchUsers": "검색 사용자",
"endConfirmTitle": "이 회의를 종료하시겠습니까?",
"endDescription": "{{name}} 는 모든 사용자에게 종료되며 다시 열 수 없습니다.",
"endPersistentDescription": "{{name}} 에서 진행 중이던 프레젠테이션이 종료됩니다. 해당 공간은 재사용 가능합니다.",
"deleteRoom": "방 삭제",
"deleteConfirmTitle": "이 방을 삭제하시겠습니까?",
"deleteDescription": "{{name}} 는 모든 사용자에게 영구적으로 삭제되며 되돌릴 수 없습니다.",
"invitedTo": "당신은 \"{{name}} \"에 초대되었습니다.",
"guest": {
"title": "회의",
"waiting": "발표자를 기다리는 중...",
"linkInvalid": "게스트 링크가 유효하지 않거나 회의가 종료되었습니다."
},
"reopenFromPanel": "이 회의 탭이 만료되었습니다. 회의 패널에서 회의실을 다시 여세요.",
"requestControl": "요청 제어",
"cancelControlRequest": "취소 요청",
"controlQueue": "제어 요청",
"noControlRequests": "보류 중인 요청이 없습니다.",
"grantControlTo": "{{name}}에 제어권을 넘겨주세요",
"dismissControlRequest": "{{name}}의 제어 요청을 기각합니다.",
"releaseControl": "릴리스 컨트롤",
"grantControl": "제어권을 넘겨주세요",
"revokeControl": "주도권을 되찾으세요",
"controlRequestedBy": "{{name}} 제어권을 요청했습니다.",
"grant": "승인하다",
"controlBadge": "통제하에",
"youArePresenting": "다른 탭에서 프레젠테이션을 진행하고 계십니다. 프레젠테이션을 중지하고 다음 사람에게 넘겨주세요.",
"created": "방이 생성되었습니다",
"invited": "회원 초대",
"roomTab": "회의"
},
"sessionSharing": {
"guestView": {
"loading": "공유 세션에 연결 중...",
"linkInvalid": "이 공유 링크는 유효하지 않거나, 만료되었거나, 취소되었습니다.",
"rateLimited": "시도 횟수가 너무 많습니다. 잠시 후 다시 시도해 주세요.",
"sessionEnded": "이번 세션이 종료되었습니다.",
"readOnlyBadge": "보기 전용",
"ownerLabel": "호스트 소유자"
},
"modalTitle": "공유 세션",
"shareButton": "공유하다",
"notReadyToShare": "세션을 공유할 준비가 아직 되지 않았습니다.",
"modeTab": {
"link": "링크",
"user": "사용자"
},
"linkModeDescription": "이 링크만 있으면 누구나 가입할 수 있으며, 계정은 필요하지 않습니다.",
"userModeDescription": "이미 해당 호스트에 접근 권한이 있는 특정 사용자와 공유하세요. 접근 권한이 없는 경우, 먼저 호스트를 공유하거나 링크를 사용하세요. 공유가 완료되면 해당 세션이 사용자의 '연결' 탭에 나타납니다.",
"permissionLevel": {
"label": "권한 수준",
"readOnly": "읽기 전용",
"readOnlyDescription": "실시간으로 세션을 시청할 수는 있지만, 입력하거나 상호 작용할 수는 없습니다.",
"readWrite": "읽기-쓰기",
"readWriteDescription": "소유자와 마찬가지로 세션에 입력하고 상호 작용할 수 있습니다."
},
"expiryLabel": "링크 만료",
"createLinkButton": "링크 생성",
"createShareButton": "사용자와 공유",
"searchUsersPlaceholder": "사용자 검색...",
"noUsersFound": "사용자를 찾을 수 없습니다.",
"linkCreated": "공유 링크가 생성되었습니다",
"linkCopied": "링크가 클립보드에 복사되었습니다",
"copyLink": "링크 복사",
"shareCreated": "세션이 공유되었습니다. 상대방의 연결 탭에 표시됩니다.",
"shareFailed": "공유 폴더 생성에 실패했습니다.",
"userLacksHostAccess": "해당 사용자는 아직 이 호스트에 대한 접근 권한이 없습니다. 먼저 호스트를 공유하거나 링크를 사용하세요.",
"activeShares": "활성 주식",
"noActiveShares": "이번 세션에는 활성 주식이 없습니다.",
"revoke": "취소",
"revokeConfirmTitle": "이 지분을 취소하시겠습니까?",
"revokeConfirmDescription": "이 공유 폴더를 사용하는 사람은 누구든 즉시 접근 권한을 잃게 됩니다.",
"revoked": "공유 취소됨",
"revokeFailed": "공유 취소에 실패했습니다",
"joinCount": "{{count}} 참여",
"joinCount_other": "{{count}} 참여",
"expiresAt": "만료일 {{date}}",
"linkShareBadge": "링크",
"userShareBadge": "사용자: {{username}}",
"loadSharesFailed": "활성 공유 항목을 로드하는 데 실패했습니다."
"readWrite": "읽기-쓰기"
}
},
"terminal": {
"connect": "호스트에 연결",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Termix 개선을 위해 사용자, 호스트 및 기능 사용량에 대한 익명의 일일 통계를 전송합니다. 개인 정보나 연결 정보는 절대 포함되지 않습니다.",
"analyticsEnabledLockedDesc": "이 설정은 ENABLE_TELEMETRY 환경 변수에 의해 잠겨 있으므로 여기에서 변경할 수 없습니다.",
"updateAnalyticsFailed": "분석 설정 업데이트에 실패했습니다.",
"sessionSharingGloballyEnabled": "세션 공유 허용",
"auditForwardingTitle": "SIEM으로 전달",
"auditForwardingDesc": "모든 감사 항목의 사본을 NDJSON 형식으로 외부 수집기에 전송합니다. 로컬 로그가 원본 데이터의 원천으로 유지됩니다.",
"auditForwardingEnvNotice": "환경 변수를 통해 포워딩을 설정할 수도 있으며, 여기에 저장된 URL이 우선 적용됩니다.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "베어러 토큰(저장됨)",
"auditForwardingSaved": "감사 전달 설정이 저장되었습니다.",
"auditForwardingSaveError": "감사 전달 설정을 저장하는 데 실패했습니다.",
"sessionSharingGloballyEnabledDesc": "라이브 터미널, RDP, VNC 및 Telnet 세션을 인스턴스 전체에서 공유할 수 있도록 허용합니다. 이 기능을 비활성화하면 호스트별 공유 설정이 모두 무시됩니다.",
"updateSessionSharingFailed": "세션 공유 설정 업데이트에 실패했습니다.",
"sessionTimeout": "세션 타임아웃",
"hours": "시간",
"sessionTimeoutRange": "최소 1시간 · 최대 720시간",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Open de CLI-documentatie."
},
"nav": {
"collab": "Vergaderingen",
"home": "Thuis",
"terminal": "Terminal",
"localTerminal": "Lokale terminal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Zorg ervoor dat je shell en alles wat daarin draait, blijft functioneren, ook na een verbindingsoverbreking of een herstart van de browser, door tmux te gebruiken (tmux moet wel op de host geïnstalleerd zijn).",
"enableSessionLogging": "Sessieregistratie",
"enableSessionLoggingDesc": "Sla de uitvoer van de terminalsessie op voor latere beoordeling.",
"allowSessionSharing": "Sessiedeling toestaan",
"allowSessionSharingDesc": "Sta toe dat live sessies op deze host via een link of met andere gebruikers worden gedeeld.",
"localEchoLabel": "Local Echo",
"localEchoDesc": "Voorspel lokaal veilige toetsaanslagen, ook bij trage internetverbindingen. Wachtwoordprompts en besturingsinvoer worden nooit weergegeven.",
"localEchoDefault": "Gebruik de globale instelling",
@@ -1571,137 +1568,11 @@
"join": "Meedoen",
"sharedSessionLabel": "{{hostName}} (gedeeld)"
},
"collab": {
"createRoom": "Nieuwe kamer",
"roomName": "Kamernaam",
"persistentRoom": "Permanente kamer",
"persistentRoomHint": "Kamers die permanent gereserveerd blijven, blijven na afloop van de vergadering beschikbaar en kunnen opnieuw worden gebruikt.",
"noRooms": "Er zijn nog geen vergaderruimtes. Maak er een aan om een vergadering te starten.",
"openRoom": "Open",
"endRoom": "Einde vergadering",
"leaveRoom": "Vertrekken",
"deleteMember": "Verwijderen",
"removeMember": "Verwijder {{name}}",
"removeMemberTitle": "Dit lid verwijderen?",
"removeMemberDescription": "{{name}} verliest onmiddellijk de toegang tot deze ruimte. Elke actieve SSH-viewer wordt losgekoppeld.",
"invite": "Uitnodiging",
"inviteTitle": "Nodig leden uit",
"members": "Leden",
"membersPanel": "Kamerleden en beheerverzoeken",
"membersWithCount": "Leden ({{count}})",
"online": "online",
"offline": "offline",
"you": "(Jij)",
"hostBadge": "Gastheer",
"presenterBadge": "Presentatie",
"present": "Cadeau",
"presentTitle": "Betreed het podium",
"presentHost": "Gastheer",
"searchHosts": "Zoek hosts",
"noHostsFound": "Geen beschikbare hosts gevonden.",
"presentProtocol": "Protocol",
"stopPresenting": "Stop met presenteren",
"takeOver": "Neem het over",
"takeOverConfirmTitle": "De huidige presentatie vervangen?",
"takeOverDescription": "{{name}} presenteert nu. Als je het overneemt, wordt iedereen van dat podium losgekoppeld.",
"emptyStage": "Niemand geeft een presentatie. Betreed het podium om een sessie te delen.",
"stageLoading": "Verbinding maken met het podium...",
"stageEnded": "De presentatie eindigde.",
"roomEnded": "Deze vergadering is afgelopen.",
"presenterLabel": "{{name}} presenteert",
"guestLink": "Gastlink",
"guestLinkOn": "De gastlink is ingeschakeld. Iedereen met de link kan het optreden bekijken.",
"guestLinkOff": "De gastlink is uitgeschakeld.",
"copyLink": "Kopieer link",
"rotateLink": "Draai de link",
"disableLink": "Link uitschakelen",
"rotateLinkConfirmTitle": "De gastlink roteren?",
"rotateLinkDescription": "De huidige verbinding wordt onmiddellijk verbroken. Verbonden SSH-gasten worden losgekoppeld.",
"disableLinkConfirmTitle": "De gastlink uitschakelen?",
"disableLinkDescription": "Anonieme SSH-gebruikers worden onmiddellijk losgekoppeld en de huidige verbinding zal niet meer werken.",
"linkCopied": "Link gekopieerd",
"roles": "Rollen",
"users": "Gebruikers",
"searchUsers": "Zoek gebruikers",
"endConfirmTitle": "Deze vergadering beëindigen?",
"endDescription": "{{name}} zal voor iedereen eindigen en kan niet opnieuw worden geopend.",
"endPersistentDescription": "De actieve presentatie in {{name}} wordt gestopt. De ruimte blijft beschikbaar voor hergebruik.",
"deleteRoom": "Verwijder kamer",
"deleteConfirmTitle": "Deze kamer verwijderen?",
"deleteDescription": "{{name}} wordt permanent verwijderd voor iedereen en kan niet ongedaan worden gemaakt.",
"invitedTo": "Je werd uitgenodigd voor \"{{name}}\"",
"guest": {
"title": "Ontmoeting",
"waiting": "Wachten op de presentator...",
"linkInvalid": "Deze gastlink is ongeldig of de vergadering is afgelopen."
},
"reopenFromPanel": "Dit vergadertabblad is verlopen. Heropen de ruimte via het paneel Vergaderingen.",
"requestControl": "Verzoekbeheer",
"cancelControlRequest": "Verzoek annuleren",
"controlQueue": "Controleverzoeken",
"noControlRequests": "Geen openstaande aanvragen.",
"grantControlTo": "Geef de controle aan {{name}}",
"dismissControlRequest": "Negeer het controleverzoek van {{name}}",
"releaseControl": "Ontgrendeling",
"grantControl": "Geef de controle",
"revokeControl": "Neem de controle terug",
"controlRequestedBy": "{{name}} vroeg om controle",
"grant": "Studiebeurs",
"controlBadge": "Onder controle",
"youArePresenting": "Je presenteert momenteel in een ander tabblad. Stop met presenteren en geef het woord aan iemand anders.",
"created": "Kamer gecreëerd",
"invited": "Leden uitgenodigd",
"roomTab": "Ontmoeting"
},
"sessionSharing": {
"guestView": {
"loading": "Verbinding maken met de gedeelde sessie...",
"linkInvalid": "Deze deelbare link is ongeldig, verlopen of ingetrokken.",
"rateLimited": "Te veel pogingen, probeer het over een tijdje opnieuw.",
"sessionEnded": "Deze sessie is afgelopen.",
"readOnlyBadge": "Alleen bekijken",
"ownerLabel": "Gastheer/gastvrouw"
},
"modalTitle": "Deel sessie",
"shareButton": "Deel",
"notReadyToShare": "De sessie is nog niet klaar om te delen.",
"modeTab": {
"link": "Link",
"user": "Gebruiker"
},
"linkModeDescription": "Iedereen met deze link kan deelnemen, een account is niet nodig.",
"userModeDescription": "Deel de host met een specifieke gebruiker die er al toegang toe heeft. Als die gebruiker nog geen toegang heeft, deel de host dan eerst met hem of haar, of gebruik een link. Zodra de sessie is gedeeld, verschijnt deze in het tabblad 'Verbindingen' van de gebruiker.",
"permissionLevel": {
"label": "Toegangsniveau",
"readOnly": "Alleen-lezen",
"readOnlyDescription": "Je kunt de sessie live volgen, maar je kunt niet typen of interageren.",
"readWrite": "Lezen en schrijven",
"readWriteDescription": "Kan typen en interactie hebben met de sessie, net als de eigenaar."
},
"expiryLabel": "Link verloopt",
"createLinkButton": "Link maken",
"createShareButton": "Delen met gebruiker",
"searchUsersPlaceholder": "Gebruikers doorzoeken...",
"noUsersFound": "Geen gebruikers gevonden",
"linkCreated": "Deellink aangemaakt",
"linkCopied": "Link gekopieerd naar het klembord.",
"copyLink": "Kopieer link",
"shareCreated": "De sessie is gedeeld. Deze verschijnt in hun tabblad 'Verbindingen'.",
"shareFailed": "Aanmaken van de share is mislukt",
"userLacksHostAccess": "Die gebruiker heeft nog geen toegang tot deze host. Deel de host eerst met hem of haar, of gebruik een link.",
"activeShares": "Actieve aandelen",
"noActiveShares": "Geen actieve aandelen voor deze sessie.",
"revoke": "Herroepen",
"revokeConfirmTitle": "Wilt u dit aandeel intrekken?",
"revokeConfirmDescription": "Iedereen die deze gedeelde map gebruikt, verliest onmiddellijk de toegang.",
"revoked": "Aandeel ingetrokken",
"revokeFailed": "Het intrekken van het aandeel is mislukt.",
"joinCount": "{{count}} join",
"joinCount_other": "{{count}} sluit zich aan",
"expiresAt": "Verloopt {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Gebruiker: {{username}}",
"loadSharesFailed": "Het laden van actieve aandelen is mislukt."
"readWrite": "Lezen en schrijven"
}
},
"terminal": {
"connect": "Verbinden met de host",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Verstuurt dagelijks anoniem een telling van gebruikers, hosts en functiegebruik om Termix te verbeteren. Er worden nooit persoonlijke gegevens of verbindingsdetails meegestuurd.",
"analyticsEnabledLockedDesc": "Deze instelling is vergrendeld door de omgevingsvariabele ENABLE_TELEMETRY en kan hier niet worden gewijzigd.",
"updateAnalyticsFailed": "Het bijwerken van de analyse-instellingen is mislukt.",
"sessionSharingGloballyEnabled": "Sessiedeling toestaan",
"auditForwardingTitle": "Doorsturen naar SIEM",
"auditForwardingDesc": "Verzend een kopie van elke auditlogboekvermelding naar een externe verzamelaar als NDJSON-bestand. Lokale logbestanden blijven de bron van waarheid.",
"auditForwardingEnvNotice": "Een omgevingsvariabele configureert ook het doorsturen; de URL die hier is opgeslagen, heeft voorrang.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token met houder (opgeslagen)",
"auditForwardingSaved": "Audit-doorstuurinstellingen opgeslagen",
"auditForwardingSaveError": "Het opslaan van de instellingen voor het doorsturen van auditlogboeken is mislukt.",
"sessionSharingGloballyEnabledDesc": "Sta toe dat live terminal-, RDP-, VNC- en Telnet-sessies instantiebreed worden gedeeld. Deze functie overschrijft elke instelling voor delen per host wanneer deze is uitgeschakeld.",
"updateSessionSharingFailed": "Het bijwerken van de instelling voor het delen van sessies is mislukt.",
"sessionTimeout": "Sessietime-out",
"hours": "uren",
"sessionTimeoutRange": "Minimaal 1 uur · Maximaal 720 uur",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Åpne CLI-dokumentasjonen"
},
"nav": {
"collab": "Møter",
"home": "Hjem",
"terminal": "Terminal",
"localTerminal": "Lokal terminal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Hold skallet ditt og alt som kjører i det i live på tvers av frakoblinger og omstart av nettleseren ved å kjøre det i tmux (tmux må være installert på verten)",
"enableSessionLogging": "Øktlogging",
"enableSessionLoggingDesc": "Ta opp utdata fra terminaløkten for senere gjennomgang",
"allowSessionSharing": "Tillat øktdeling",
"allowSessionSharingDesc": "La direktesendte økter på denne verten deles via lenke eller med andre brukere",
"localEchoLabel": "Lokalt ekko",
"localEchoDesc": "Forutsi trygge utskrivbare tastetrykk lokalt på trege tilkoblinger. Passordforespørsler og kontrollinndata gjentas aldri.",
"localEchoDefault": "Bruk global innstilling",
@@ -1571,137 +1568,11 @@
"join": "Bli med",
"sharedSessionLabel": "{{hostName}} (delt)"
},
"collab": {
"createRoom": "Nytt rom",
"roomName": "Romnavn",
"persistentRoom": "Permanent rom",
"persistentRoomHint": "Permanente rom forblir oppført etter at møtet er avsluttet og kan brukes om igjen.",
"noRooms": "Ingen rom ennå. Opprett et for å starte et møte.",
"openRoom": "Åpne",
"endRoom": "Avslutt møtet",
"leaveRoom": "Forlate",
"deleteMember": "Fjerne",
"removeMember": "Fjern {{name}}",
"removeMemberTitle": "Fjerne dette medlemmet?",
"removeMemberDescription": "{{name}} mister tilgangen til dette rommet umiddelbart. Alle aktive SSH-lesere blir frakoblet.",
"invite": "Invitere",
"inviteTitle": "Inviter medlemmer",
"members": "Medlemmer",
"membersPanel": "Rommedlemmer og kontrollforespørsler",
"membersWithCount": "Medlemmer ({{count}})",
"online": "på nett",
"offline": "frakoblet",
"you": "(du)",
"hostBadge": "Vert",
"presenterBadge": "Presenterer",
"present": "Nåværende",
"presentTitle": "Innta scenen",
"presentHost": "Vert",
"searchHosts": "Søk etter verter",
"noHostsFound": "Ingen tilgjengelige verter funnet.",
"presentProtocol": "Protokoll",
"stopPresenting": "Slutt å presentere",
"takeOver": "Ta over",
"takeOverConfirmTitle": "Erstatte den nåværende presentasjonen?",
"takeOverDescription": "{{name}} presenterer nå. Å ta over vil koble alle fra det stadiet.",
"emptyStage": "Ingen presenterer. Gå på scenen for å dele en økt.",
"stageLoading": "Kobler til scenen...",
"stageEnded": "Presentasjonen ble avsluttet",
"roomEnded": "Dette møtet er avsluttet",
"presenterLabel": "{{name}} presenterer",
"guestLink": "Gjestelenke",
"guestLinkOn": "Gjestelenken er på. Alle med lenken kan se scenen.",
"guestLinkOff": "Gjestelenken er av.",
"copyLink": "Kopier lenke",
"rotateLink": "Roter lenken",
"disableLink": "Deaktiver lenken",
"rotateLinkConfirmTitle": "Roter gjestelenken?",
"rotateLinkDescription": "Den nåværende lenken vil slutte å virke umiddelbart. Tilkoblede SSH-gjester vil bli frakoblet.",
"disableLinkConfirmTitle": "Deaktivere gjestelenken?",
"disableLinkDescription": "Anonyme SSH-lesere vil bli frakoblet umiddelbart, og den nåværende koblingen vil slutte å fungere.",
"linkCopied": "Lenken er kopiert",
"roles": "Roller",
"users": "Brukere",
"searchUsers": "Søk etter brukere",
"endConfirmTitle": "Avslutte dette møtet?",
"endDescription": "{{name}} vil avsluttes for alle og kan ikke åpnes igjen.",
"endPersistentDescription": "Den aktive presentasjonen i {{name}} stopper. Rommet er fortsatt tilgjengelig for gjenbruk.",
"deleteRoom": "Slett rom",
"deleteConfirmTitle": "Slette dette rommet?",
"deleteDescription": "{{name}} vil bli permanent slettet for alle og kan ikke angres.",
"invitedTo": "Du ble invitert til «{{name}}»",
"guest": {
"title": "Møte",
"waiting": "Venter på programlederen...",
"linkInvalid": "Denne gjestelenken er ugyldig, eller møtet er avsluttet"
},
"reopenFromPanel": "Denne møtefanen er utløpt. Åpne rommet på nytt fra Møter-panelet.",
"requestControl": "Be om kontroll",
"cancelControlRequest": "Avbryt forespørsel",
"controlQueue": "Kontrollforespørsler",
"noControlRequests": "Ingen ventende forespørsler.",
"grantControlTo": "Gi kontroll til {{name}}",
"dismissControlRequest": "Avvis kontrollforespørselen til {{name}}",
"releaseControl": "Slipp kontrollen",
"grantControl": "Gi kontroll",
"revokeControl": "Ta tilbake kontrollen",
"controlRequestedBy": "{{name}} ba om kontroll",
"grant": "Stipend",
"controlBadge": "I kontroll",
"youArePresenting": "Du presenterer i en annen fane. Stopp presentasjonen for å gi fra deg scenen.",
"created": "Rommet er opprettet",
"invited": "Medlemmer invitert",
"roomTab": "Møte"
},
"sessionSharing": {
"guestView": {
"loading": "Kobler til delt økt...",
"linkInvalid": "Denne delingslenken er ugyldig, utløpt eller har blitt tilbakekalt",
"rateLimited": "For mange forsøk, prøv igjen snart",
"sessionEnded": "Denne økten er avsluttet",
"readOnlyBadge": "Kun visning",
"ownerLabel": "Vertseier"
},
"modalTitle": "Del økt",
"shareButton": "Dele",
"notReadyToShare": "Økten er ikke klar til deling ennå",
"modeTab": {
"link": "Lenke",
"user": "Bruker"
},
"linkModeDescription": "Alle med denne lenken kan bli med, ingen konto kreves.",
"userModeDescription": "Del med en bestemt bruker som allerede har tilgang til denne verten. Hvis de ikke har tilgang ennå, del verten med dem først eller bruk en lenke i stedet. Når økten er delt, vises den i deres Tilkoblinger-fane.",
"permissionLevel": {
"label": "Tillatelsesnivå",
"readOnly": "Skrivebeskyttet",
"readOnlyDescription": "Kan se økten direkte, men kan ikke skrive eller samhandle.",
"readWrite": "Lese-skrive",
"readWriteDescription": "Kan skrive og samhandle med økten akkurat som eieren."
},
"expiryLabel": "Utløpsdato for lenke",
"createLinkButton": "Opprett lenke",
"createShareButton": "Del med brukeren",
"searchUsersPlaceholder": "Søk etter brukere...",
"noUsersFound": "Ingen brukere funnet",
"linkCreated": "Delingslenke opprettet",
"linkCopied": "Lenke kopiert til utklippstavlen",
"copyLink": "Kopier lenke",
"shareCreated": "Økten er delt. Den vil vises i Tilkoblinger-fanen deres.",
"shareFailed": "Kunne ikke opprette delingen",
"userLacksHostAccess": "Den brukeren har ikke tilgang til denne verten ennå. Del verten med dem først, eller bruk en lenke i stedet.",
"activeShares": "Aktive aksjer",
"noActiveShares": "Ingen aktive delinger for denne økten",
"revoke": "Tilbakekalling",
"revokeConfirmTitle": "Tilbakekalle denne delingen?",
"revokeConfirmDescription": "Alle som bruker denne delingen vil miste tilgangen umiddelbart.",
"revoked": "Deling tilbakekalt",
"revokeFailed": "Kunne ikke tilbakekalle delingen",
"joinCount": "{{count}} bli med",
"joinCount_other": "{{count}} blir med",
"expiresAt": "Utløper {{date}}",
"linkShareBadge": "Lenke",
"userShareBadge": "Bruker: {{username}}",
"loadSharesFailed": "Kunne ikke laste inn aktive delinger"
"readWrite": "Lese-skrive"
}
},
"terminal": {
"connect": "Koble til vert",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Sender en anonym daglig telling av brukere, verter og funksjonsbruk for å forbedre Termix. Ingen personopplysninger eller tilkoblingsdetaljer inkluderes.",
"analyticsEnabledLockedDesc": "Denne innstillingen er låst av miljøvariabelen ENABLE_TELEMETRY og kan ikke endres her.",
"updateAnalyticsFailed": "Kunne ikke oppdatere analyseinnstillingen",
"sessionSharingGloballyEnabled": "Tillat øktdeling",
"auditForwardingTitle": "Videresend til SIEM",
"auditForwardingDesc": "Send en kopi av hver revisjonsoppføring til en ekstern innsamler som NDJSON. Lokale logger forblir kilden til sannheten.",
"auditForwardingEnvNotice": "En miljøvariabel konfigurerer også videresending; URL-en som lagres her har forrang.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Bærertoken (lagret)",
"auditForwardingSaved": "Innstillinger for videresending av revisjon lagret",
"auditForwardingSaveError": "Kunne ikke lagre innstillingene for videresending av revisjon",
"sessionSharingGloballyEnabledDesc": "Tillat deling av Live Terminal-, RDP-, VNC- og Telnet-økter på tvers av hele instansen. Overstyrer alle delingsalternativer per vert når de er deaktivert.",
"updateSessionSharingFailed": "Kunne ikke oppdatere innstillingen for deling av økt",
"sessionTimeout": "Tidsavbrudd for økt",
"hours": "timer",
"sessionTimeoutRange": "Min. 1 t · Maks. 720 t",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Otwórz dokumentację CLI"
},
"nav": {
"collab": "Spotkania",
"home": "Start",
"terminal": "Terminal",
"localTerminal": "Terminal lokalny",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Utrzymuj działanie powłoki i wszystkiego, co w niej działa, nawet po rozłączeniu i ponownym uruchomieniu przeglądarki, uruchamiając ją wewnątrz tmux (tmux musi być zainstalowany na hoście).",
"enableSessionLogging": "Rejestrowanie sesji",
"enableSessionLoggingDesc": "Zapisuj wyjście sesji terminala do późniejszego przejrzenia",
"allowSessionSharing": "Zezwól na udostępnianie sesji",
"allowSessionSharingDesc": "Zezwól na udostępnianie sesji na żywo na tym hoście przez link lub innym użytkownikom",
"localEchoLabel": "Lokalne echo",
"localEchoDesc": "Przewiduj lokalnie bezpieczne, drukowalne znaki na wolnych łączach. Monity o hasło i znaki sterujące nigdy nie są powtarzane.",
"localEchoDefault": "Użyj ustawienia globalnego",
@@ -1571,137 +1568,11 @@
"join": "Dołącz",
"sharedSessionLabel": "{{hostName}} (udostępnione)"
},
"collab": {
"createRoom": "Nowy pokój",
"roomName": "Nazwa pokoju",
"persistentRoom": "Trwały pokój",
"persistentRoomHint": "Trwałe pokoje pozostają na liście po zakończeniu spotkania i można je ponownie wykorzystać.",
"noRooms": "Brak pokoi. Utwórz jeden, aby rozpocząć spotkanie.",
"openRoom": "Otwarte",
"endRoom": "Zakończ spotkanie",
"leaveRoom": "Wyjechać",
"deleteMember": "Usunąć",
"removeMember": "Usuń {{name}}",
"removeMemberTitle": "Usunąć tego członka?",
"removeMemberDescription": "{{name}} natychmiast utraci dostęp do tego pokoju. Każdy aktywny użytkownik SSH zostanie rozłączony.",
"invite": "Zapraszać",
"inviteTitle": "Zaproś członków",
"members": "Członkowie",
"membersPanel": "Członkowie pokoju i prośby o kontrolę",
"membersWithCount": "Członkowie ({{count}})",
"online": "w sieci",
"offline": "nieaktywny",
"you": "(Ty)",
"hostBadge": "Gospodarz",
"presenterBadge": "Przedstawianie",
"present": "Obecny",
"presentTitle": "Wejdź na scenę",
"presentHost": "Gospodarz",
"searchHosts": "Wyszukaj gospodarzy",
"noHostsFound": "Nie znaleziono dostępnych hostów.",
"presentProtocol": "Protokół",
"stopPresenting": "Zatrzymaj prezentację",
"takeOver": "Przejąć",
"takeOverConfirmTitle": "Zastąpić bieżącą prezentację?",
"takeOverDescription": "{{name}} jest teraz prezentowany. Przejęcie kontroli spowoduje odłączenie wszystkich od tej sceny.",
"emptyStage": "Nikt nie prowadzi prezentacji. Wejdź na scenę i podziel się swoją sesją.",
"stageLoading": "Łączę się ze sceną...",
"stageEnded": "Prezentacja dobiegła końca",
"roomEnded": "To spotkanie dobiegło końca",
"presenterLabel": "{{name}} prezentuje",
"guestLink": "Link gościnny",
"guestLinkOn": "Link dla gości jest włączony. Każdy, kto ma link, może obejrzeć scenę.",
"guestLinkOff": "Link dla gości jest wyłączony.",
"copyLink": "Kopiuj link",
"rotateLink": "Obróć link",
"disableLink": "Wyłącz łącze",
"rotateLinkConfirmTitle": "Obrócić link gościa?",
"rotateLinkDescription": "Obecny link natychmiast przestanie działać. Połączeni goście SSH zostaną rozłączeni.",
"disableLinkConfirmTitle": "Wyłączyć link gościa?",
"disableLinkDescription": "Anonimowi użytkownicy SSH zostaną natychmiast rozłączeni, a bieżące łącze przestanie działać.",
"linkCopied": "Link skopiowany",
"roles": "Role",
"users": "Użytkownicy",
"searchUsers": "Wyszukaj użytkowników",
"endConfirmTitle": "Zakończyć to spotkanie?",
"endDescription": "{{name}} zakończy się dla wszystkich i nie będzie można go ponownie otworzyć.",
"endPersistentDescription": "Aktywna prezentacja w {{name}} zostanie zatrzymana. Pokój pozostaje dostępny do ponownego użycia.",
"deleteRoom": "Usuń pokój",
"deleteConfirmTitle": "Usunąć ten pokój?",
"deleteDescription": "{{name}} zostanie trwale usunięty u wszystkich i nie będzie można tego cofnąć.",
"invitedTo": "Zostałeś zaproszony do „{{name}}”",
"guest": {
"title": "Spotkanie",
"waiting": "Czekam na prezentera...",
"linkInvalid": "Ten link dla gościa jest nieprawidłowy lub spotkanie się zakończyło"
},
"reopenFromPanel": "Ta karta spotkania wygasła. Otwórz ponownie pokój z panelu Spotkania.",
"requestControl": "Żądanie kontroli",
"cancelControlRequest": "Anuluj prośbę",
"controlQueue": "Żądania kontrolne",
"noControlRequests": "Brak oczekujących żądań.",
"grantControlTo": "Przekaż kontrolę {{name}}",
"dismissControlRequest": "Odrzuć żądanie kontroli {{name}}",
"releaseControl": "Kontrola wydania",
"grantControl": "Oddaj kontrolę",
"revokeControl": "Odzyskaj kontrolę",
"controlRequestedBy": "{{name}} poprosił o kontrolę",
"grant": "Dotacja",
"controlBadge": "Pod kontrolą",
"youArePresenting": "Prezentujesz na innej karcie. Zatrzymaj prezentację, aby przekazać scenę.",
"created": "Pokój utworzony",
"invited": "Zaproszeni członkowie",
"roomTab": "Spotkanie"
},
"sessionSharing": {
"guestView": {
"loading": "Łączenie z sesją współdzieloną...",
"linkInvalid": "Ten link do udostępniania jest nieprawidłowy, wygasł lub został odwołany",
"rateLimited": "Zbyt wiele prób, spróbuj ponownie za chwilę",
"sessionEnded": "Ta sesja dobiegła końca",
"readOnlyBadge": "Tylko do podglądu",
"ownerLabel": "Właściciel gospodarza"
},
"modalTitle": "Udostępnij sesję",
"shareButton": "Udostępnij",
"notReadyToShare": "Sesja nie jest jeszcze gotowa do udostępnienia",
"modeTab": {
"link": "Link",
"user": "Użytkownik"
},
"linkModeDescription": "Każdy mający ten link może dołączyć, nie jest wymagane założenie konta.",
"userModeDescription": "Udostępnij konkretnemu użytkownikowi, który ma już dostęp do tego hosta. Jeśli jeszcze go nie ma, najpierw udostępnij mu hosta albo skorzystaj z linku. Po udostępnieniu sesja pojawi się na jego karcie Połączenia.",
"permissionLevel": {
"label": "Poziom uprawnień",
"readOnly": "Tylko do odczytu",
"readOnlyDescription": "Może oglądać sesję na żywo, ale nie może pisać ani nic w niej zmieniać.",
"readWrite": "Odczyt-zapis",
"readWriteDescription": "Może pisać i uczestniczyć w sesji tak samo jak właściciel."
},
"expiryLabel": "Wygaśnięcie linku",
"createLinkButton": "Utwórz link",
"createShareButton": "Udostępnij użytkownikowi",
"searchUsersPlaceholder": "Wyszukaj użytkowników...",
"noUsersFound": "Nie znaleziono użytkowników",
"linkCreated": "Utworzono link do udostępniania",
"linkCopied": "Link skopiowany do schowka",
"copyLink": "Kopiuj link",
"shareCreated": "Udostępniono sesję. Pojawi się na jego karcie Połączenia.",
"shareFailed": "Nie udało się utworzyć udostępnienia",
"userLacksHostAccess": "Ten użytkownik nie ma jeszcze dostępu do tego hosta. Udostępnij mu najpierw hosta lub skorzystaj z linku.",
"activeShares": "Aktywne udostępnienia",
"noActiveShares": "Brak aktywnych udostępnień tej sesji",
"revoke": "Unieważnij",
"revokeConfirmTitle": "Cofnąć to udostępnienie?",
"revokeConfirmDescription": "Każdy, kto korzysta z tego udostępnienia, natychmiast utraci dostęp.",
"revoked": "Unieważniono udostępnienie",
"revokeFailed": "Nie udało się unieważnić udostępnienia",
"joinCount": "{{count}} dołączenie",
"joinCount_other": "{{count}} dołączeń",
"expiresAt": "Wygasa {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Użytkownik: {{username}}",
"loadSharesFailed": "Nie udało się załadować aktywnych udostępnień"
"readWrite": "Odczyt-zapis"
}
},
"terminal": {
"connect": "Połącz z hostem",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Wysyła anonimowe, dzienne zestawienie liczby użytkowników, hostów i wykorzystania funkcji, aby pomóc w ulepszaniu Termixa. Nigdy nie zawiera danych osobowych ani szczegółów połączeń.",
"analyticsEnabledLockedDesc": "To ustawienie jest zablokowane przez zmienną środowiskową ENABLE_TELEMETRY i nie można go tutaj zmienić.",
"updateAnalyticsFailed": "Nie udało się zaktualizować ustawień analityki",
"sessionSharingGloballyEnabled": "Zezwól na udostępnianie sesji",
"auditForwardingTitle": "Przekaż do SIEM",
"auditForwardingDesc": "Prześlij kopię każdego wpisu audytu do zewnętrznego kolektora w formacie NDJSON. Lokalne logi pozostają źródłem prawdy.",
"auditForwardingEnvNotice": "Zmienna środowiskowa konfiguruje również przekazywanie; pierwszeństwo ma zapisany tutaj adres URL.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token okaziciela (przechowywany)",
"auditForwardingSaved": "Ustawienia przekazywania audytu zostały zapisane",
"auditForwardingSaveError": "Nie udało się zapisać ustawień przekazywania audytu",
"sessionSharingGloballyEnabledDesc": "Zezwalaj na udostępnianie sesji terminala na żywo, RDP, VNC i Telnet w obrębie instancji. Po wyłączeniu zastępuje wszystkie przełączniki udostępniania dla poszczególnych hostów.",
"updateSessionSharingFailed": "Nie udało się zaktualizować ustawień udostępniania sesji",
"sessionTimeout": "Limit czasu sesji",
"hours": "godziny",
"sessionTimeoutRange": "Min. 1 godz. · Maks. 720 godz.",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Abra a documentação da CLI."
},
"nav": {
"collab": "Reuniões",
"home": "Lar",
"terminal": "terminal",
"localTerminal": "Terminal local",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Mantenha seu shell e tudo o que estiver sendo executado nele em funcionamento mesmo após desconexões e reinicializações do navegador, executando o comando dentro do tmux (o tmux precisa estar instalado no host).",
"enableSessionLogging": "Registro de sessão",
"enableSessionLoggingDesc": "Registre a saída da sessão do terminal para revisão posterior.",
"allowSessionSharing": "Permitir compartilhamento de sessão",
"allowSessionSharingDesc": "Permitir que as sessões ao vivo neste servidor sejam compartilhadas por meio de link ou com outros usuários.",
"localEchoLabel": "Eco Local",
"localEchoDesc": "Preveja sequências de teclas seguras e imprimíveis localmente em conexões lentas. Os prompts de senha e as entradas de controle nunca são repetidos.",
"localEchoDefault": "Usar configuração global",
@@ -1571,137 +1568,11 @@
"join": "Juntar",
"sharedSessionLabel": "{{hostName}} (compartilhado)"
},
"collab": {
"createRoom": "Quarto novo",
"roomName": "Nome do quarto",
"persistentRoom": "Sala persistente",
"persistentRoomHint": "As salas permanentes permanecem listadas após o término da reunião e podem ser reutilizadas.",
"noRooms": "Ainda não há salas. Crie uma para iniciar uma reunião.",
"openRoom": "Abrir",
"endRoom": "Encerramento da reunião",
"leaveRoom": "Deixar",
"deleteMember": "Remover",
"removeMember": "Remover {{name}}",
"removeMemberTitle": "Remover este membro?",
"removeMemberDescription": "{{name}} perderá o acesso a esta sala imediatamente. Qualquer visualizador SSH ativo será desconectado.",
"invite": "Convidar",
"inviteTitle": "Convide membros",
"members": "Membros",
"membersPanel": "Membros da sala e solicitações de controle",
"membersWithCount": "Membros ({{count}})",
"online": "on-line",
"offline": "offline",
"you": "(você)",
"hostBadge": "Hospedar",
"presenterBadge": "Apresentando",
"present": "Presente",
"presentTitle": "Suba ao palco",
"presentHost": "Hospedar",
"searchHosts": "Pesquisar anfitriões",
"noHostsFound": "Nenhum host disponível encontrado.",
"presentProtocol": "Protocolo",
"stopPresenting": "Pare de apresentar",
"takeOver": "Assumir",
"takeOverConfirmTitle": "Substituir a apresentação atual?",
"takeOverDescription": "{{name}} está apresentando agora. Assumir o controle desconectará todos desse palco.",
"emptyStage": "Ninguém está apresentando. Suba ao palco para compartilhar uma sessão.",
"stageLoading": "Conectando-se ao palco...",
"stageEnded": "A apresentação terminou.",
"roomEnded": "Esta reunião terminou.",
"presenterLabel": "{{name}} está apresentando",
"guestLink": "Link para convidado",
"guestLinkOn": "O link para convidados está ativado. Qualquer pessoa com o link pode assistir à apresentação.",
"guestLinkOff": "O link para visitantes está desativado.",
"copyLink": "Copiar link",
"rotateLink": "Rotacionar link",
"disableLink": "Desativar link",
"rotateLinkConfirmTitle": "Girar o link do convidado?",
"rotateLinkDescription": "A conexão atual deixará de funcionar imediatamente. Os dispositivos convidados SSH conectados serão desconectados.",
"disableLinkConfirmTitle": "Desativar o link de convidado?",
"disableLinkDescription": "Os visualizadores SSH anônimos serão desconectados imediatamente e a conexão atual deixará de funcionar.",
"linkCopied": "Link copiado",
"roles": "Funções",
"users": "Usuários",
"searchUsers": "Usuários da pesquisa",
"endConfirmTitle": "Encerrar esta reunião?",
"endDescription": "{{name}} será encerrado para todos e não poderá ser reaberto.",
"endPersistentDescription": "A apresentação ativa em {{name}} será interrompida. A sala permanece disponível para reutilização.",
"deleteRoom": "Excluir sala",
"deleteConfirmTitle": "Apagar esta sala?",
"deleteDescription": "{{name}} será excluído permanentemente para todos e não poderá ser desfeito.",
"invitedTo": "Você foi convidado para \"{{name}}\"",
"guest": {
"title": "Reunião",
"waiting": "Aguardando o apresentador...",
"linkInvalid": "Este link de convidado é inválido ou a reunião já terminou."
},
"reopenFromPanel": "Esta aba da reunião expirou. Reabra a sala no painel Reuniões.",
"requestControl": "Controle de solicitação",
"cancelControlRequest": "Cancelar solicitação",
"controlQueue": "Solicitações de controle",
"noControlRequests": "Não há solicitações pendentes.",
"grantControlTo": "Dê o controle para {{name}}",
"dismissControlRequest": "Rejeitar solicitação de controle de {{name}}",
"releaseControl": "Liberar controle",
"grantControl": "Dê o controle",
"revokeControl": "Retome o controle",
"controlRequestedBy": "{{name}} solicitou o controle",
"grant": "Conceder",
"controlBadge": "No controle",
"youArePresenting": "Você está apresentando em outra aba. Pare de apresentar para passar a palavra.",
"created": "Quarto criado",
"invited": "Membros convidados",
"roomTab": "Reunião"
},
"sessionSharing": {
"guestView": {
"loading": "Conectando à sessão compartilhada...",
"linkInvalid": "Este link de compartilhamento é inválido, expirou ou foi revogado.",
"rateLimited": "Muitas tentativas foram feitas, tente novamente em breve.",
"sessionEnded": "Esta sessão terminou.",
"readOnlyBadge": "Somente visualização",
"ownerLabel": "Proprietário do anfitrião"
},
"modalTitle": "Sessão de compartilhamento",
"shareButton": "Compartilhar",
"notReadyToShare": "A sessão ainda não está pronta para ser compartilhada.",
"modeTab": {
"link": "Link",
"user": "Usuário"
},
"linkModeDescription": "Qualquer pessoa com este link pode participar, sem necessidade de criar uma conta.",
"userModeDescription": "Compartilhe com um usuário específico que já tenha acesso a este host. Caso ele ainda não tenha acesso, compartilhe o host com ele primeiro ou use um link. Após o compartilhamento, a sessão aparecerá na aba Conexões do usuário.",
"permissionLevel": {
"label": "Nível de permissão",
"readOnly": "Somente leitura",
"readOnlyDescription": "É possível assistir à sessão ao vivo, mas não é possível digitar ou interagir.",
"readWrite": "Ler e escrever",
"readWriteDescription": "Pode digitar e interagir com a sessão da mesma forma que o proprietário."
},
"expiryLabel": "Expiração do link",
"createLinkButton": "Criar link",
"createShareButton": "Compartilhar com o usuário",
"searchUsersPlaceholder": "Pesquisar usuários...",
"noUsersFound": "Nenhum usuário encontrado",
"linkCreated": "Compartilhar link criado",
"linkCopied": "Link copiado para a área de transferência",
"copyLink": "Copiar link",
"shareCreated": "Sessão compartilhada. Ela aparecerá na aba Conexões deles.",
"shareFailed": "Falha ao criar compartilhamento",
"userLacksHostAccess": "Esse usuário ainda não tem acesso a este host. Compartilhe o host com ele primeiro ou use um link.",
"activeShares": "Ações ativas",
"noActiveShares": "Nenhuma ação ativa nesta sessão.",
"revoke": "Revogar",
"revokeConfirmTitle": "Revogar essa participação?",
"revokeConfirmDescription": "Qualquer pessoa que usar este compartilhamento perderá o acesso imediatamente.",
"revoked": "Ações revogadas",
"revokeFailed": "Falha ao revogar a participação",
"joinCount": "{{count}} junte-se",
"joinCount_other": "{{count}} entra",
"expiresAt": "Expira em {{date}}",
"linkShareBadge": "Link",
"userShareBadge": "Usuário: {{username}}",
"loadSharesFailed": "Falha ao carregar compartilhamentos ativos"
"readWrite": "Ler e escrever"
}
},
"terminal": {
"connect": "Conectar ao host",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Envia uma contagem diária anônima de usuários, hosts e uso de recursos para ajudar a melhorar o Termix. Nenhum dado pessoal ou detalhe de conexão é incluído.",
"analyticsEnabledLockedDesc": "Essa configuração está bloqueada pela variável de ambiente ENABLE_TELEMETRY e não pode ser alterada aqui.",
"updateAnalyticsFailed": "Falha ao atualizar as configurações de análise",
"sessionSharingGloballyEnabled": "Permitir compartilhamento de sessão",
"auditForwardingTitle": "Encaminhar para SIEM",
"auditForwardingDesc": "Envie uma cópia de cada entrada de auditoria para um coletor externo no formato NDJSON. Os registros locais permanecem como a fonte da verdade.",
"auditForwardingEnvNotice": "Uma variável de ambiente também configura o encaminhamento; a URL salva aqui tem precedência.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token de portador (armazenado)",
"auditForwardingSaved": "Configurações de encaminhamento de auditoria salvas",
"auditForwardingSaveError": "Falha ao salvar as configurações de encaminhamento de auditoria",
"sessionSharingGloballyEnabledDesc": "Permite que sessões de terminal ao vivo, RDP, VNC e Telnet sejam compartilhadas em toda a instância. Substitui todas as configurações de compartilhamento por host quando desativada.",
"updateSessionSharingFailed": "Falha ao atualizar as configurações de compartilhamento de sessão.",
"sessionTimeout": "Tempo limite da sessão",
"hours": "horas",
"sessionTimeoutRange": "Mínimo 1h · Máximo 720h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Abra a documentação da CLI."
},
"nav": {
"collab": "Reuniões",
"home": "Início",
"terminal": "Terminal",
"localTerminal": "Terminal local",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Mantenha o seu shell e tudo o que nele está a ser executado em funcionamento mesmo após desconexões e reinicializações do browser, executando o comando dentro do tmux (o tmux necessita de estar instalado no host).",
"enableSessionLogging": "Registo de sessão",
"enableSessionLoggingDesc": "Gravar a saída da sessão de terminal para revisão posterior",
"allowSessionSharing": "Permitir partilha de sessão",
"allowSessionSharingDesc": "Permitir que as sessões em direto neste servidor sejam partilhadas através de link ou com outros utilizadores.",
"localEchoLabel": "Eco Local",
"localEchoDesc": "Preveja sequências de teclas seguras e imprimíveis localmente em ligações lentas. Os avisos de palavra-passe e as entradas de controlo nunca são repetidos.",
"localEchoDefault": "Usar configuração global",
@@ -1571,137 +1568,11 @@
"join": "Juntar",
"sharedSessionLabel": "{{hostName}} (partilhado)"
},
"collab": {
"createRoom": "Quarto novo",
"roomName": "Nome do quarto",
"persistentRoom": "Sala persistente",
"persistentRoomHint": "As salas permanentes permanecem listadas após o término da reunião e podem ser reutilizadas.",
"noRooms": "Ainda não há salas. Crie uma para iniciar uma reunião.",
"openRoom": "Aberto",
"endRoom": "Encerramento da reunião",
"leaveRoom": "Ausência",
"deleteMember": "Remover",
"removeMember": "Remover {{name}}",
"removeMemberTitle": "Remover este membro?",
"removeMemberDescription": "{{name}} perderá o acesso a esta sala imediatamente. Qualquer visualizador SSH ativo será desligado.",
"invite": "Convidar",
"inviteTitle": "Convide os membros",
"members": "Membros",
"membersPanel": "Membros da sala e pedidos de controlo",
"membersWithCount": "Membros ({{count}})",
"online": "online",
"offline": "offline",
"you": "(tu)",
"hostBadge": "Anfitrião",
"presenterBadge": "Apresentando",
"present": "Presente",
"presentTitle": "Suba ao palco",
"presentHost": "Anfitrião",
"searchHosts": "Pesquisar anfitriões",
"noHostsFound": "Nenhum host disponível encontrado.",
"presentProtocol": "Protocolo",
"stopPresenting": "Pare de apresentar",
"takeOver": "Assumir",
"takeOverConfirmTitle": "Substituir a apresentação atual?",
"takeOverDescription": "{{name}} está a apresentar agora. Assumir o controlo desconectará todos desse palco.",
"emptyStage": "Ninguém está a apresentar. Suba ao palco para partilhar uma sessão.",
"stageLoading": "Ligar-se ao palco...",
"stageEnded": "A apresentação terminou.",
"roomEnded": "Esta reunião terminou.",
"presenterLabel": "{{name}} está a apresentar",
"guestLink": "Link para convidado",
"guestLinkOn": "O link para convidados está ativado. Qualquer pessoa com o link pode assistir à apresentação.",
"guestLinkOff": "O link para os visitantes está desativado.",
"copyLink": "Copiar link",
"rotateLink": "Rotacionar ligação",
"disableLink": "Desativar ligação",
"rotateLinkConfirmTitle": "Rodar o link do convidado?",
"rotateLinkDescription": "A ligação atual deixará de funcionar imediatamente. Os dispositivos convidados SSH ligados serão desligados.",
"disableLinkConfirmTitle": "Desativar o link de convidado?",
"disableLinkDescription": "Os visualizadores SSH anónimos serão imediatamente desligados e a ligação atual deixará de funcionar.",
"linkCopied": "Link copiado",
"roles": "Funções",
"users": "Usuários",
"searchUsers": "Os utilizadores da pesquisa",
"endConfirmTitle": "Encerrar esta reunião?",
"endDescription": "{{name}} será encerrado para todos e não poderá ser reaberto.",
"endPersistentDescription": "A apresentação ativa em {{name}} será interrompida. A sala continua disponível para reutilização.",
"deleteRoom": "Apagar sala",
"deleteConfirmTitle": "Apagar esta sala?",
"deleteDescription": "{{name}} será eliminado permanentemente para todos e não poderá ser anulado.",
"invitedTo": "Foi convidado para \"{{name}}\"",
"guest": {
"title": "Reunião",
"waiting": "À espera do apresentador...",
"linkInvalid": "Este link de convidado é inválido ou a reunião já terminou."
},
"reopenFromPanel": "Esta aba da reunião expirou. Volte a abrir a sala no painel Reuniões.",
"requestControl": "Controle de solicitação",
"cancelControlRequest": "Cancelar pedido",
"controlQueue": "Solicitações de controlo",
"noControlRequests": "Não há pedidos pendentes.",
"grantControlTo": "Dê o controlo a {{name}}",
"dismissControlRequest": "Rejeitar pedido de controlo de {{name}}",
"releaseControl": "Libertar controle",
"grantControl": "Dê o controlo",
"revokeControl": "Retome o comando",
"controlRequestedBy": "{{name}} solicitou o controlo",
"grant": "Subvenção",
"controlBadge": "No controlo",
"youArePresenting": "Está a apresentar em outra aba. Pare de apresentar para passar a palavra.",
"created": "Quarto criado",
"invited": "Membros convidados",
"roomTab": "Reunião"
},
"sessionSharing": {
"guestView": {
"loading": "Ligar à sessão partilhada...",
"linkInvalid": "Este link de partilha é inválido, expirou ou foi revogado.",
"rateLimited": "Muitas tentativas foram feitas, tente novamente em breve.",
"sessionEnded": "Esta sessão terminou.",
"readOnlyBadge": "Somente visualização",
"ownerLabel": "Proprietário do anfitrião"
},
"modalTitle": "Sessão de partilha",
"shareButton": "Partilhar",
"notReadyToShare": "A sessão ainda não está pronta para ser partilhada.",
"modeTab": {
"link": "Ligação",
"user": "Usuário"
},
"linkModeDescription": "Qualquer pessoa com este link pode participar, sem necessidade de criar conta.",
"userModeDescription": "Partilhe com um utilizador específico que já tenha acesso a este host. Caso ainda não tenha acesso, partilhe primeiro o host com ele ou utilize um link. Após a partilha, a sessão aparecerá no separador Conexões do utilizador.",
"permissionLevel": {
"label": "Nível de permissão",
"readOnly": "Somente leitura",
"readOnlyDescription": "É possível assistir à sessão em direto, mas não é possível digitar ou interagir.",
"readWrite": "Ler e escrever",
"readWriteDescription": "Pode digitar e interagir com a sessão da mesma forma que o proprietário."
},
"expiryLabel": "Expiração do link",
"createLinkButton": "Criar link",
"createShareButton": "Partilhar com o usuário",
"searchUsersPlaceholder": "Pesquisar utilizadores...",
"noUsersFound": "Nenhum utilizador encontrado",
"linkCreated": "Partilhar link criado",
"linkCopied": "Ligação copiada para a área de transferência",
"copyLink": "Copiar link",
"shareCreated": "Sessão partilhada. Ela aparecerá no separador Conexões deles.",
"shareFailed": "Falha ao criar partilha",
"userLacksHostAccess": "Esse utilizador ainda não tem acesso a este host. Partilhe o host com ele primeiro ou use um link.",
"activeShares": "Ações ativas",
"noActiveShares": "Sem ação ativa nesta sessão.",
"revoke": "Revogar",
"revokeConfirmTitle": "Revogar essa participação?",
"revokeConfirmDescription": "Qualquer pessoa que utilize esta partilha perderá o acesso imediatamente.",
"revoked": "Ações revogadas",
"revokeFailed": "Falha ao revogar a participação",
"joinCount": "{{count}} junte-se",
"joinCount_other": "{{count}} entra",
"expiresAt": "Expira em {{date}}",
"linkShareBadge": "Ligação",
"userShareBadge": "Utilizador: {{username}}",
"loadSharesFailed": "Falha ao carregar partilhas ativas"
"readWrite": "Ler e escrever"
}
},
"terminal": {
"connect": "Ligar ao Host",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Envia uma contagem diária anónima de utilizadores, hosts e utilização de recursos para ajudar a melhorar o Termix. Nenhum dado pessoal ou detalhe de ligação é incluído.",
"analyticsEnabledLockedDesc": "Esta definição está bloqueada pela variável de ambiente ENABLE_TELEMETRY e não pode ser alterada aqui.",
"updateAnalyticsFailed": "Falha ao atualizar as definições de análise",
"sessionSharingGloballyEnabled": "Permitir partilha de sessão",
"auditForwardingTitle": "Encaminhar para SIEM",
"auditForwardingDesc": "Envie uma cópia de cada entrada de auditoria para um coletor externo no formato NDJSON. Os registos locais permanecem como a fonte da verdade.",
"auditForwardingEnvNotice": "Uma variável de ambiente também configura o encaminhamento; o URL aqui guardado tem precedência.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Token de portador (armazenado)",
"auditForwardingSaved": "Configurações de encaminhamento de auditoria guardadas",
"auditForwardingSaveError": "Falha ao guardar as definições de encaminhamento de auditoria",
"sessionSharingGloballyEnabledDesc": "Permite que as sessões de terminal ao vivo, RDP, VNC e Telnet sejam partilhadas em toda a instância. Substitui todas as definições de partilha por host quando desativada.",
"updateSessionSharingFailed": "Falha ao atualizar as definições de partilha de sessão.",
"sessionTimeout": "Tempo Limite da Sessão",
"hours": "horas",
"sessionTimeoutRange": "Mín. 1h · Máx. 720h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Deschideți documentația CLI"
},
"nav": {
"collab": "Întâlniri",
"home": "Acasă",
"terminal": "Terminal",
"localTerminal": "Terminal local",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Mențineți shell-ul și tot ce rulează în el în funcțiune după deconectări și reporniri ale browserului, rulând în interiorul tmux (tmux trebuie să fie instalat pe gazdă).",
"enableSessionLogging": "Înregistrarea sesiunilor",
"enableSessionLoggingDesc": "Înregistrați ieșirea sesiunii terminale pentru o revizuire ulterioară",
"allowSessionSharing": "Permiteți partajarea sesiunii",
"allowSessionSharingDesc": "Permiteți partajarea sesiunilor live de pe această gazdă prin link sau cu alți utilizatori",
"localEchoLabel": "Ecou local",
"localEchoDesc": "Preziceți local apăsările de taste imprimabile în siguranță pe conexiuni lente. Solicitările de parolă și intrările de control nu sunt niciodată reluate.",
"localEchoDefault": "Folosește setarea globală",
@@ -1571,137 +1568,11 @@
"join": "Alătură-te",
"sharedSessionLabel": "{{hostName}} (partajat)"
},
"collab": {
"createRoom": "Cameră nouă",
"roomName": "Numele camerei",
"persistentRoom": "Cameră persistentă",
"persistentRoomHint": "Sălile persistente rămân listate după încheierea întâlnirii și pot fi reutilizate.",
"noRooms": "Încă nu există săli. Creează una pentru a începe o întâlnire.",
"openRoom": "Deschide",
"endRoom": "Încheiați întâlnirea",
"leaveRoom": "Pleacă",
"deleteMember": "Elimina",
"removeMember": "Eliminați {{name}}",
"removeMemberTitle": "Eliminați acest membru?",
"removeMemberDescription": "{{name}} va pierde imediat accesul la această cameră. Orice vizualizator SSH activ va fi deconectat.",
"invite": "Invita",
"inviteTitle": "Invită membri",
"members": "Membri",
"membersPanel": "Membrii camerei și solicitările de control",
"membersWithCount": "Membri ({{count}})",
"online": "online",
"offline": "offline",
"you": "(tu)",
"hostBadge": "Gazdă",
"presenterBadge": "Prezentare",
"present": "Prezent",
"presentTitle": "Urcă pe scenă",
"presentHost": "Gazdă",
"searchHosts": "Căutați gazde",
"noHostsFound": "Nu au fost găsite gazde disponibile.",
"presentProtocol": "Protocol",
"stopPresenting": "Opriți prezentarea",
"takeOver": "Prelua",
"takeOverConfirmTitle": "Înlocuiți prezentarea curentă?",
"takeOverDescription": "{{name}} prezintă acum. Preluarea controlului îi va deconecta pe toți de la acea etapă.",
"emptyStage": "Nimeni nu prezintă. Urcă pe scenă pentru a împărtăși o sesiune.",
"stageLoading": "Conectarea la scenă...",
"stageEnded": "Prezentarea s-a încheiat",
"roomEnded": "Această întâlnire s-a încheiat",
"presenterLabel": "{{name}} prezintă",
"guestLink": "Link pentru invitați",
"guestLinkOn": "Linkul pentru invitați este activat. Oricine are linkul poate viziona scena.",
"guestLinkOff": "Linkul pentru invitați este dezactivat.",
"copyLink": "Copiază linkul",
"rotateLink": "Rotiți linkul",
"disableLink": "Dezactivați linkul",
"rotateLinkConfirmTitle": "Rotește linkul pentru oaspeți?",
"rotateLinkDescription": "Legătura curentă va înceta să funcționeze imediat. Oaspeții SSH conectați vor fi deconectați.",
"disableLinkConfirmTitle": "Dezactivați linkul pentru invitați?",
"disableLinkDescription": "Vizualizatorii SSH anonimi vor fi deconectați imediat, iar legătura curentă va înceta să funcționeze.",
"linkCopied": "Linkul a fost copiat",
"roles": "Roluri",
"users": "Utilizatori",
"searchUsers": "Căutați utilizatori",
"endConfirmTitle": "Încheiați această întâlnire?",
"endDescription": "{{name}} se va încheia pentru toată lumea și nu va putea fi redeschis.",
"endPersistentDescription": "Prezentarea activă din {{name}} se va opri. Sala rămâne disponibilă pentru reutilizare.",
"deleteRoom": "Ștergeți camera",
"deleteConfirmTitle": "Ștergeți această cameră?",
"deleteDescription": "{{name}} va fi șters definitiv pentru toată lumea și nu poate fi anulat.",
"invitedTo": "Ai fost invitat la „{{name}}”",
"guest": {
"title": "Întâlnire",
"waiting": "În așteptarea prezentatorului...",
"linkInvalid": "Acest link de invitat este invalid sau întâlnirea s-a încheiat."
},
"reopenFromPanel": "Această filă de întâlnire a expirat. Redeschideți sala din panoul Întâlniri.",
"requestControl": "Cerere de control",
"cancelControlRequest": "Anulează cererea",
"controlQueue": "Cereri de control",
"noControlRequests": "Nicio solicitare în așteptare.",
"grantControlTo": "Acordă controlul către {{name}}",
"dismissControlRequest": "Închideți solicitarea de control a utilizatorului {{name}}",
"releaseControl": "Controlul eliberării",
"grantControl": "Oferă controlul",
"revokeControl": "Preia controlul",
"controlRequestedBy": "{{name}} a cerut controlul",
"grant": "Acorda",
"controlBadge": "În control",
"youArePresenting": "Prezentați într-o altă filă. Oprește prezentarea pentru a preda scena.",
"created": "Cameră creată",
"invited": "Membrii invitați",
"roomTab": "Întâlnire"
},
"sessionSharing": {
"guestView": {
"loading": "Conectare la sesiunea partajată...",
"linkInvalid": "Acest link de partajare este invalid, a expirat sau a fost revocat.",
"rateLimited": "Prea multe încercări, vă rugăm să încercați din nou în scurt timp",
"sessionEnded": "Această sesiune s-a încheiat",
"readOnlyBadge": "Doar vizualizare",
"ownerLabel": "Proprietarul gazdei"
},
"modalTitle": "Partajați sesiunea",
"shareButton": "Distribuie",
"notReadyToShare": "Sesiunea nu este încă gata de partajare",
"modeTab": {
"link": "Legătură",
"user": "Utilizator"
},
"linkModeDescription": "Oricine are acest link se poate alătura, nu este necesar un cont.",
"userModeDescription": "Partajați cu un anumit utilizator care are deja acces la această gazdă. Dacă nu are încă acces, partajați mai întâi gazda cu acesta sau utilizați un link în schimb. După partajare, sesiunea apare în fila Conexiuni.",
"permissionLevel": {
"label": "Nivel de permisiune",
"readOnly": "Doar citire",
"readOnlyDescription": "Pot urmări sesiunea în direct, dar nu pot tasta sau interacționa.",
"readWrite": "Citire-scriere",
"readWriteDescription": "Poate tasta și interacționa cu sesiunea la fel ca proprietarul."
},
"expiryLabel": "Expirarea linkului",
"createLinkButton": "Creați un link",
"createShareButton": "Partajează cu utilizatorul",
"searchUsersPlaceholder": "Căutați utilizatori...",
"noUsersFound": "Nu au fost găsiți utilizatori",
"linkCreated": "Link de partajare creat",
"linkCopied": "Linkul a fost copiat în clipboard",
"copyLink": "Copiază linkul",
"shareCreated": "Sesiune partajată. Va apărea în fila Conexiuni.",
"shareFailed": "Nu s-a putut crea partajarea",
"userLacksHostAccess": "Utilizatorul respectiv nu are încă acces la această gazdă. Partajați mai întâi gazda cu acesta sau folosiți un link în schimb.",
"activeShares": "Acțiuni active",
"noActiveShares": "Nicio partajare activă pentru această sesiune",
"revoke": "Revoca",
"revokeConfirmTitle": "Revocați această partajare?",
"revokeConfirmDescription": "Oricine folosește această partajare va pierde accesul imediat.",
"revoked": "Acțiune revocată",
"revokeFailed": "Nu s-a putut revoca partajarea",
"joinCount": "{{count}} alătură-te",
"joinCount_other": "{{count}} se alătură",
"expiresAt": "Expiră la {{date}}",
"linkShareBadge": "Legătură",
"userShareBadge": "Utilizator: {{username}}",
"loadSharesFailed": "Nu s-au putut încărca partajările active"
"readWrite": "Citire-scriere"
}
},
"terminal": {
"connect": "Conectare la gazdă",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Trimite un număr zilnic anonim de utilizatori, gazde și utilizare a funcțiilor pentru a ajuta la îmbunătățirea Termix. Nu sunt incluse niciodată date personale sau detalii de conexiune.",
"analyticsEnabledLockedDesc": "Această setare este blocată de variabila de mediu ENABLE_TELEMETRY și nu poate fi modificată aici.",
"updateAnalyticsFailed": "Setările de analiză nu au putut fi actualizate",
"sessionSharingGloballyEnabled": "Permiteți partajarea sesiunii",
"auditForwardingTitle": "Transmiteți către SIEM",
"auditForwardingDesc": "Trimiteți o copie a fiecărei intrări de audit către un colector extern ca NDJSON. Jurnalele locale rămân sursa de adevăr.",
"auditForwardingEnvNotice": "O variabilă de mediu configurează și redirecționarea; adresa URL salvată aici are prioritate.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Jeton la purtător (stocat)",
"auditForwardingSaved": "Setările de redirecționare a auditului au fost salvate",
"auditForwardingSaveError": "Setările de redirecționare a auditului nu au putut fi salvate.",
"sessionSharingGloballyEnabledDesc": "Permite partajarea sesiunilor live de terminal, RDP, VNC și Telnet la nivel de instanță. Suprascrie fiecare comutare de partajare per gazdă atunci când este dezactivată.",
"updateSessionSharingFailed": "Setările de partajare a sesiunii nu au putut fi actualizate.",
"sessionTimeout": "Expirare sesiune",
"hours": "ore",
"sessionTimeoutRange": "Min 1 oră · Max 720 ore",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Откройте документацию по командной строке."
},
"nav": {
"collab": "Встречи",
"home": "Главная",
"terminal": "Терминал",
"localTerminal": "Локальный терминал",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Поддерживайте работоспособность вашей оболочки и всего, что в ней работает, даже при разрыве соединения и перезапуске браузера, запустив tmux (tmux должен быть установлен на хосте).",
"enableSessionLogging": "Логирование сессии",
"enableSessionLoggingDesc": "Записывать вывод терминальной сессии для последующего просмотра",
"allowSessionSharing": "Разрешить совместное использование сеанса",
"allowSessionSharingDesc": "Разрешите делиться записями онлайн-сессий на этом хостинге по ссылке или с другими пользователями.",
"localEchoLabel": "Локальное эхо",
"localEchoDesc": "Предсказывает безопасные нажатия клавиш для печати локально даже при медленном соединении. Запросы паролей и управляющий ввод никогда не отображаются.",
"localEchoDefault": "Использовать глобальные настройки",
@@ -1571,137 +1568,11 @@
"join": "Присоединиться",
"sharedSessionLabel": "{{hostName}} (совместно)"
},
"collab": {
"createRoom": "Новая комната",
"roomName": "Название комнаты",
"persistentRoom": "Постоянное помещение",
"persistentRoomHint": "Список свободных комнат сохраняется и после окончания встречи, и их можно использовать повторно.",
"noRooms": "Комнат пока нет. Создайте комнату, чтобы начать встречу.",
"openRoom": "Открыть",
"endRoom": "Завершение встречи",
"leaveRoom": "Оставлять",
"deleteMember": "Удалять",
"removeMember": "Удалить {{name}}",
"removeMemberTitle": "Удалить этого участника?",
"removeMemberDescription": "{{name}} немедленно потеряет доступ к этой комнате. Любой активный SSH-просмотрщик будет отключен.",
"invite": "Приглашать",
"inviteTitle": "Пригласить участников",
"members": "Члены",
"membersPanel": "Участники комнаты и запросы на управление",
"membersWithCount": "Участники ({{count}})",
"online": "онлайн",
"offline": "офлайн",
"you": "(ты)",
"hostBadge": "Хозяин",
"presenterBadge": "Презентация",
"present": "Подарок",
"presentTitle": "Выходите на сцену",
"presentHost": "Хозяин",
"searchHosts": "Поиск хостов",
"noHostsFound": "Доступных хостов не найдено.",
"presentProtocol": "Протокол",
"stopPresenting": "Прекратите презентацию",
"takeOver": "Перенимать",
"takeOverConfirmTitle": "Заменить текущую презентацию?",
"takeOverDescription": "{{name}} сейчас выступает. Перехват инициативы отключит всех от этой сцены.",
"emptyStage": "Никто не выступает с презентацией. Выходите на сцену, чтобы поделиться своим опытом.",
"stageLoading": "Подключение к сцене...",
"stageEnded": "Презентация завершилась.",
"roomEnded": "Встреча завершена.",
"presenterLabel": "{{name}} представляет",
"guestLink": "Гостевая ссылка",
"guestLinkOn": "Гостевая ссылка включена. Любой, у кого есть ссылка, может посмотреть выступление.",
"guestLinkOff": "Гостевая ссылка отключена.",
"copyLink": "Скопировать ссылку",
"rotateLink": "Повернуть ссылку",
"disableLink": "Отключить ссылку",
"rotateLinkConfirmTitle": "Повернуть гостевую ссылку?",
"rotateLinkDescription": "Текущее соединение немедленно перестанет работать. Подключенные через SSH гостевые системы будут отключены.",
"disableLinkConfirmTitle": "Отключить гостевую ссылку?",
"disableLinkDescription": "Анонимные пользователи SSH-сервера будут немедленно отключены, и текущая связь перестанет работать.",
"linkCopied": "Ссылка скопирована",
"roles": "Роли",
"users": "Пользователи",
"searchUsers": "Поиск пользователей",
"endConfirmTitle": "Закончить это совещание?",
"endDescription": "{{name}} завершится для всех и не может быть возобновлено.",
"endPersistentDescription": "Активная презентация в {{name}} будет остановлена. Комната остается доступной для повторного использования.",
"deleteRoom": "Удалить комнату",
"deleteConfirmTitle": "Удалить эту комнату?",
"deleteDescription": "{{name}} будет безвозвратно удалено для всех и не может быть отменено.",
"invitedTo": "Вас пригласили на \"{{name}}\"",
"guest": {
"title": "Встреча",
"waiting": "Ожидание выступления докладчика...",
"linkInvalid": "Эта гостевая ссылка недействительна, или встреча завершилась."
},
"reopenFromPanel": "Срок действия этой вкладки «Встречи» истек. Откройте комнату заново на панели «Встречи».",
"requestControl": "Управление запросами",
"cancelControlRequest": "Отменить запрос",
"controlQueue": "Запросы на управление",
"noControlRequests": "Нет ожидающих обработки запросов.",
"grantControlTo": "Передайте управление {{name}}",
"dismissControlRequest": "Отклонить запрос на управление от {{name}}",
"releaseControl": "Управление освобождением",
"grantControl": "Передайте контроль",
"revokeControl": "Верните себе контроль.",
"controlRequestedBy": "{{name}} запросил управление",
"grant": "Грант",
"controlBadge": "Под контролем",
"youArePresenting": "Вы ведёте презентацию в другой вкладке. Прекратите презентацию, чтобы передать слово другому пользователю.",
"created": "Комната создана",
"invited": "Приглашены члены",
"roomTab": "Встреча"
},
"sessionSharing": {
"guestView": {
"loading": "Подключение к общей сессии...",
"linkInvalid": "Данная ссылка для общего доступа недействительна, истек срок ее действия или она была аннулирована.",
"rateLimited": "Слишком много попыток, пожалуйста, попробуйте еще раз чуть позже.",
"sessionEnded": "Данная сессия завершена.",
"readOnlyBadge": "Только для просмотра",
"ownerLabel": "Владелец хостинга"
},
"modalTitle": "Совместное использование сессии",
"shareButton": "Делиться",
"notReadyToShare": "Сессия пока не готова к публикации.",
"modeTab": {
"link": "Связь",
"user": "Пользователь"
},
"linkModeDescription": "Присоединиться может любой, у кого есть эта ссылка, регистрация не требуется.",
"userModeDescription": "Предоставьте доступ конкретному пользователю, у которого уже есть доступ к этому хосту. Если у него еще нет доступа, сначала предоставьте ему доступ к хосту или используйте ссылку. После предоставления доступа сессия отобразится на вкладке «Подключения» этого пользователя.",
"permissionLevel": {
"label": "Уровень доступа",
"readOnly": "Только для чтения",
"readOnlyDescription": "Можно наблюдать за сессией в прямом эфире, но нельзя печатать или взаимодействовать с ней.",
"readWrite": "Чтение-запись",
"readWriteDescription": "Может печатать и взаимодействовать с сессией так же, как и её владелец."
},
"expiryLabel": "Срок действия ссылки истекает",
"createLinkButton": "Создать ссылку",
"createShareButton": "Поделиться с пользователем",
"searchUsersPlaceholder": "Поиск пользователей...",
"noUsersFound": "Пользователи не найдены",
"linkCreated": "Ссылка для обмена создана",
"linkCopied": "Ссылка скопирована в буфер обмена",
"copyLink": "Скопировать ссылку",
"shareCreated": "Сессия была проведена совместно. Она отобразится на вкладке «Подключения».",
"shareFailed": "Не удалось создать общий ресурс.",
"userLacksHostAccess": "У этого пользователя пока нет доступа к данному хосту. Сначала предоставьте ему доступ к хосту или используйте ссылку.",
"activeShares": "Активные акции",
"noActiveShares": "В текущей торговой сессии нет активных акций.",
"revoke": "Отменить",
"revokeConfirmTitle": "Отозвать эту публикацию?",
"revokeConfirmDescription": "Любой, кто воспользуется этой ссылкой, немедленно потеряет к ней доступ.",
"revoked": "Акция аннулирована",
"revokeFailed": "Не удалось отозвать акцию.",
"joinCount": "{{count}} присоединиться",
"joinCount_other": "{{count}} присоединяется",
"expiresAt": "Срок действия истекает {{date}}",
"linkShareBadge": "Связь",
"userShareBadge": "Пользователь: {{username}}",
"loadSharesFailed": "Не удалось загрузить активные акции."
"readWrite": "Чтение-запись"
}
},
"terminal": {
"connect": "Подключиться к хосту",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Ежедневно отправляет анонимный подсчет пользователей, хостов и использования функций, чтобы помочь улучшить Termix. Никакие личные данные или сведения о подключении никогда не включаются.",
"analyticsEnabledLockedDesc": "Этот параметр заблокирован переменной среды ENABLE_TELEMETRY и не может быть изменен здесь.",
"updateAnalyticsFailed": "Не удалось обновить настройки аналитики.",
"sessionSharingGloballyEnabled": "Разрешить совместное использование сеанса",
"auditForwardingTitle": "Переслать в SIEM",
"auditForwardingDesc": "Отправляйте копию каждой записи аудита внешнему сборщику данных в формате NDJSON. Локальные журналы остаются источником достоверной информации.",
"auditForwardingEnvNotice": "Переменная среды также настраивает переадресацию; URL-адрес, сохраненный здесь, имеет приоритет.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Токен носителя (сохраненный)",
"auditForwardingSaved": "Сохранены настройки пересылки аудита.",
"auditForwardingSaveError": "Не удалось сохранить настройки пересылки аудита.",
"sessionSharingGloballyEnabledDesc": "Разрешить общий доступ к сеансам Live Terminal, RDP, VNC и Telnet для всего экземпляра. При отключении этой функции отменяет все настройки общего доступа для отдельных хостов.",
"updateSessionSharingFailed": "Не удалось обновить настройки совместного доступа к сессии.",
"sessionTimeout": "Тайм-аут сессии",
"hours": "часов",
"sessionTimeoutRange": "Мин. 1 ч · Макс. 720 ч",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Отворите CLI документацију"
},
"nav": {
"collab": "Састанци",
"home": "Дом",
"terminal": "Терминал",
"localTerminal": "Локални терминал",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Одржавајте своју шкољку и све што се у њој покреће активним након прекида везе и поновног покретања прегледача покретањем унутар tmux-а (tmux мора бити инсталиран на хосту)",
"enableSessionLogging": "Записивање сесије",
"enableSessionLoggingDesc": "Снимите излаз терминалне сесије за каснији преглед",
"allowSessionSharing": "Дозволи дељење сесије",
"allowSessionSharingDesc": "Дозволите дељење сесија уживо на овом хосту путем линка или са другим корисницима",
"localEchoLabel": "Локални одјек",
"localEchoDesc": "Предвиди безбедне притиске тастера за штампање локално на спорим везама. Упити за лозинку и контролни уноси се никада не понављају.",
"localEchoDefault": "Користите глобална подешавања",
@@ -1571,137 +1568,11 @@
"join": "Придружи се",
"sharedSessionLabel": "{{hostName}} (дељено)"
},
"collab": {
"createRoom": "Нова соба",
"roomName": "Назив собе",
"persistentRoom": "Трајна соба",
"persistentRoomHint": "Трајне собе остају наведене након завршетка састанка и могу се поново користити.",
"noRooms": "Још нема соба. Направите једну да бисте започели састанак.",
"openRoom": "Отворено",
"endRoom": "Заврши састанак",
"leaveRoom": "Одиђи",
"deleteMember": "Уклони",
"removeMember": "Уклони {{name}}",
"removeMemberTitle": "Уклонити овог члана?",
"removeMemberDescription": "{{name}} ће одмах изгубити приступ овој соби. Сваки активни SSH гледалац ће бити искључен.",
"invite": "Позови",
"inviteTitle": "Позовите чланове",
"members": "Чланови",
"membersPanel": "Чланови собе и захтеви за контролу",
"membersWithCount": "Чланови ({{count}})",
"online": "онлајн",
"offline": "офлајн",
"you": "(ти)",
"hostBadge": "Домаћин",
"presenterBadge": "Презентација",
"present": "Присутан",
"presentTitle": "Изађи на сцену",
"presentHost": "Домаћин",
"searchHosts": "Претрага хостова",
"noHostsFound": "Није пронађен ниједан доступан хост.",
"presentProtocol": "Протокол",
"stopPresenting": "Заустави презентацију",
"takeOver": "Преузми",
"takeOverConfirmTitle": "Заменити тренутну презентацију?",
"takeOverDescription": "{{name}} тренутно презентује. Преузимање ће искључити све са те сцене.",
"emptyStage": "Нико не презентује. Изађите на бину да бисте поделили сесију.",
"stageLoading": "Повезивање са сценом...",
"stageEnded": "Презентација је завршена",
"roomEnded": "Овај састанак је завршен",
"presenterLabel": "{{name}} презентује",
"guestLink": "Гостујући линк",
"guestLinkOn": "Линк за госте је укључен. Свако ко има линк може да гледа сцену.",
"guestLinkOff": "Линк за госте је искључен.",
"copyLink": "Копирај линк",
"rotateLink": "Ротирај линк",
"disableLink": "Онемогући везу",
"rotateLinkConfirmTitle": "Ротирати линк за госте?",
"rotateLinkDescription": "Тренутна веза ће одмах престати да ради. Повезани SSH гости ће бити искључени.",
"disableLinkConfirmTitle": "Онемогућити линк за госте?",
"disableLinkDescription": "Анонимни SSH гледаоци ће одмах бити прекинути везу и тренутна веза ће престати да ради.",
"linkCopied": "Линк је копиран",
"roles": "Улоге",
"users": "Корисници",
"searchUsers": "Претрага корисника",
"endConfirmTitle": "Да ли желите да завршите овај састанак?",
"endDescription": "{{name}} ће бити завршен за све и не може се поново отворити.",
"endPersistentDescription": "Активна презентација у {{name}} ће се зауставити. Просторија остаје доступна за поновну употребу.",
"deleteRoom": "Обриши собу",
"deleteConfirmTitle": "Да ли желите да избришете ову собу?",
"deleteDescription": "{{name}} ће бити трајно обрисан за све и не може се поништити.",
"invitedTo": "Позвани сте у „{{name}}“",
"guest": {
"title": "Састанак",
"waiting": "Чекање водитеља...",
"linkInvalid": "Овај линк за госте је неважећи или је састанак завршен"
},
"reopenFromPanel": "Ова картица састанка је истекла. Поново отворите просторију из панела Састанци.",
"requestControl": "Захтевај контролу",
"cancelControlRequest": "Откажи захтев",
"controlQueue": "Захтеви за контролу",
"noControlRequests": "Нема захтева на чекању.",
"grantControlTo": "Дајте контролу кориснику {{name}}",
"dismissControlRequest": "Одбаци захтев за контролу корисника {{name}}",
"releaseControl": "Контрола ослобађања",
"grantControl": "Дајте контролу",
"revokeControl": "Преузмите контролу назад",
"controlRequestedBy": "{{name}} је затражио контролу",
"grant": "Грант",
"controlBadge": "Под контролом",
"youArePresenting": "Презентујете у другој картици. Прекините презентацију да бисте предали сцену.",
"created": "Соба је направљена",
"invited": "Чланови позвани",
"roomTab": "Састанак"
},
"sessionSharing": {
"guestView": {
"loading": "Повезивање са дељеном сесијом...",
"linkInvalid": "Овај линк за дељење је неважећи, истекао је или је опозван",
"rateLimited": "Превише покушаја, покушајте поново ускоро",
"sessionEnded": "Ова сесија је завршена",
"readOnlyBadge": "Само преглед",
"ownerLabel": "Власник домаћина"
},
"modalTitle": "Дели сесију",
"shareButton": "Дели",
"notReadyToShare": "Сесија још није спремна за дељење",
"modeTab": {
"link": "Линк",
"user": "Корисник"
},
"linkModeDescription": "Свако ко има овај линк може да се придружи, није потребан налог.",
"userModeDescription": "Делите са одређеним корисником који већ има приступ овом хосту. Ако још немају приступ, прво поделите хост са њима или користите линк. Након дељења, сесија се појављује на њиховој картици „Везе“.",
"permissionLevel": {
"label": "Ниво дозволе",
"readOnly": "Само за читање",
"readOnlyDescription": "Може да гледа сесију уживо, али не може да куца или да комуницира.",
"readWrite": "Читање и писање",
"readWriteDescription": "Може да куца и интерагује са сесијом баш као и власник."
},
"expiryLabel": "Истек линка",
"createLinkButton": "Направи линк",
"createShareButton": "Подели са корисником",
"searchUsersPlaceholder": "Претражи кориснике...",
"noUsersFound": "Није пронађен ниједан корисник",
"linkCreated": "Линк за дељење је направљен",
"linkCopied": "Линк је копиран у међуспремник",
"copyLink": "Копирај линк",
"shareCreated": "Сесија је дељена. Појавиће се на њиховој картици „Везе“.",
"shareFailed": "Није успело креирање дељења",
"userLacksHostAccess": "Тај корисник још увек нема приступ овом хосту. Прво поделите хост са њим или користите линк.",
"activeShares": "Активне акције",
"noActiveShares": "Нема активних дељења за ову сесију",
"revoke": "Поништи",
"revokeConfirmTitle": "Да ли желите да опозовете ово дељење?",
"revokeConfirmDescription": "Свако ко користи ово дељење ће одмах изгубити приступ.",
"revoked": "Дељење опозвано",
"revokeFailed": "Опозивање дељења није успело",
"joinCount": "{{count}} придружи се",
"joinCount_other": "{{count}} придруживања",
"expiresAt": "Истиче {{date}}",
"linkShareBadge": "Линк",
"userShareBadge": "Корисник: {{username}}",
"loadSharesFailed": "Учитавање активних дељења није успело"
"readWrite": "Читање и писање"
}
},
"terminal": {
"connect": "Повежи се са хостом",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Шаље анонимни дневни број корисника, хостова и коришћења функција како би се побољшао Termix. Никада се не укључују лични подаци или детаљи везе.",
"analyticsEnabledLockedDesc": "Ово подешавање је закључано променљивом окружења ENABLE_TELEMETRY и не може се овде променити.",
"updateAnalyticsFailed": "Ажурирање подешавања аналитике није успело",
"sessionSharingGloballyEnabled": "Дозволи дељење сесије",
"auditForwardingTitle": "Проследи ка SIEM-у",
"auditForwardingDesc": "Пошаљите копију сваког уноса ревизије екстерном колектору као NDJSON. Локални логови остају извор истине.",
"auditForwardingEnvNotice": "Променљива окружења такође конфигурише прослеђивање; URL сачуван овде има предност.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Токен носиоца (сачуван)",
"auditForwardingSaved": "Подешавања прослеђивања ревизије сачувана",
"auditForwardingSaveError": "Чување подешавања прослеђивања ревизије није успело",
"sessionSharingGloballyEnabledDesc": "Дозвољава дељење сесија уживо терминала, RDP, VNC и Telnet сесија на нивоу целе инстанце. Замењује сваки прекидач за дељење по хосту када је онемогућен.",
"updateSessionSharingFailed": "Ажурирање подешавања дељења сесије није успело",
"sessionTimeout": "Временско ограничење сесије",
"hours": "сати",
"sessionTimeoutRange": "Мин. 1 сат · Макс. 720 сати",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Öppna CLI-dokumentationen"
},
"nav": {
"collab": "Möten",
"home": "Hem",
"terminal": "Terminal",
"localTerminal": "Lokal terminal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Håll ditt skal och allt som körs i det vid liv även efter frånkopplingar och omstart av webbläsare genom att köra det inuti tmux (tmux måste vara installerat på värden)",
"enableSessionLogging": "Sessionsloggning",
"enableSessionLoggingDesc": "Spela in utdata från terminalsessionen för senare granskning",
"allowSessionSharing": "Tillåt sessionsdelning",
"allowSessionSharingDesc": "Tillåt att livesessioner på den här värden delas via länk eller med andra användare",
"localEchoLabel": "Lokalt eko",
"localEchoDesc": "Förutsäg säkra utskrivbara tangenttryckningar lokalt på långsamma anslutningar. Lösenordsförfrågningar och kontrollinmatning upprepas aldrig.",
"localEchoDefault": "Använd global inställning",
@@ -1571,137 +1568,11 @@
"join": "Ansluta sig till",
"sharedSessionLabel": "{{hostName}} (delad)"
},
"collab": {
"createRoom": "Nytt rum",
"roomName": "Rumsnamn",
"persistentRoom": "Permanent rum",
"persistentRoomHint": "Beständiga rum finns kvar i listan efter att mötet är slut och kan återanvändas.",
"noRooms": "Inga rum ännu. Skapa ett för att starta ett möte.",
"openRoom": "Öppna",
"endRoom": "Avsluta mötet",
"leaveRoom": "Lämna",
"deleteMember": "Ta bort",
"removeMember": "Ta bort {{name}}",
"removeMemberTitle": "Ta bort den här medlemmen?",
"removeMemberDescription": "{{name}} kommer att förlora åtkomst till det här rummet omedelbart. Alla aktiva SSH-läsare kommer att kopplas bort.",
"invite": "Bjuda",
"inviteTitle": "Bjud in medlemmar",
"members": "Medlemmar",
"membersPanel": "Rumsmedlemmar och kontrollförfrågningar",
"membersWithCount": "Medlemmar ({{count}})",
"online": "online",
"offline": "off-line",
"you": "(du)",
"hostBadge": "Värd",
"presenterBadge": "Presenterar",
"present": "Presentera",
"presentTitle": "Inta scenen",
"presentHost": "Värd",
"searchHosts": "Sök värdar",
"noHostsFound": "Inga tillgängliga värdar hittades.",
"presentProtocol": "Protokoll",
"stopPresenting": "Sluta presentera",
"takeOver": "Ta över",
"takeOverConfirmTitle": "Ersätta den aktuella presentationen?",
"takeOverDescription": "{{name}} presenterar nu. Att ta över kommer att koppla bort alla från den scenen.",
"emptyStage": "Ingen presenterar. Gå ut på scenen för att dela en session.",
"stageLoading": "Ansluter till scenen...",
"stageEnded": "Presentationen avslutades",
"roomEnded": "Det här mötet har avslutats",
"presenterLabel": "{{name}} presenterar",
"guestLink": "Gästlänk",
"guestLinkOn": "Gästlänken är aktiverad. Alla med länken kan titta på scenen.",
"guestLinkOff": "Gästlänken är avstängd.",
"copyLink": "Kopiera länk",
"rotateLink": "Rotera länken",
"disableLink": "Inaktivera länk",
"rotateLinkConfirmTitle": "Rotera gästlänken?",
"rotateLinkDescription": "Den aktuella länken kommer att sluta fungera omedelbart. Anslutna SSH-gäster kommer att kopplas bort.",
"disableLinkConfirmTitle": "Inaktivera gästlänken?",
"disableLinkDescription": "Anonyma SSH-användare kommer att kopplas bort omedelbart och den aktuella länken kommer att sluta fungera.",
"linkCopied": "Länk kopierad",
"roles": "Roller",
"users": "Användare",
"searchUsers": "Sök användare",
"endConfirmTitle": "Avsluta det här mötet?",
"endDescription": "{{name}} kommer att upphöra för alla och kan inte öppnas igen.",
"endPersistentDescription": "Den aktiva presentationen i {{name}} kommer att stoppas. Rummet är fortfarande tillgängligt för återanvändning.",
"deleteRoom": "Ta bort rum",
"deleteConfirmTitle": "Radera det här rummet?",
"deleteDescription": "{{name}} kommer att raderas permanent för alla och kan inte ångras.",
"invitedTo": "Du blev inbjuden till \"{{name}}\"",
"guest": {
"title": "Möte",
"waiting": "Väntar på programledaren...",
"linkInvalid": "Denna gästlänk är ogiltig eller så har mötet avslutats"
},
"reopenFromPanel": "Den här mötesfliken har upphört att gälla. Öppna rummet igen från panelen Möten.",
"requestControl": "Begäran om kontroll",
"cancelControlRequest": "Avbryt begäran",
"controlQueue": "Kontrollförfrågningar",
"noControlRequests": "Inga väntande förfrågningar.",
"grantControlTo": "Ge kontroll till {{name}}",
"dismissControlRequest": "Avvisa kontrollbegäran från {{name}}",
"releaseControl": "Släppkontroll",
"grantControl": "Ge kontroll",
"revokeControl": "Ta tillbaka kontrollen",
"controlRequestedBy": "{{name}} bad om kontroll",
"grant": "Bevilja",
"controlBadge": "I kontroll",
"youArePresenting": "Du presenterar i en annan flik. Avbryt presentationen för att lämna över scenen.",
"created": "Rum skapat",
"invited": "Medlemmar inbjudna",
"roomTab": "Möte"
},
"sessionSharing": {
"guestView": {
"loading": "Ansluter till delad session...",
"linkInvalid": "Den här delningslänken är ogiltig, har löpt ut eller har återkallats",
"rateLimited": "För många försök, försök igen snart",
"sessionEnded": "Den här sessionen är avslutad",
"readOnlyBadge": "Endast visning",
"ownerLabel": "Värdägare"
},
"modalTitle": "Dela session",
"shareButton": "Dela",
"notReadyToShare": "Sessionen är inte redo att delas ännu",
"modeTab": {
"link": "Länk",
"user": "Användare"
},
"linkModeDescription": "Vem som helst med den här länken kan gå med, inget konto krävs.",
"userModeDescription": "Dela med en specifik användare som redan har åtkomst till den här värden. Om de inte har åtkomst ännu, dela värden med dem först eller använd en länk istället. När sessionen har delats visas den på deras flik Anslutningar.",
"permissionLevel": {
"label": "Behörighetsnivå",
"readOnly": "Skrivskyddad",
"readOnlyDescription": "Kan titta på sessionen live men kan inte skriva eller interagera.",
"readWrite": "Läs-skriv",
"readWriteDescription": "Kan skriva och interagera med sessionen precis som ägaren."
},
"expiryLabel": "Länkens utgångsdatum",
"createLinkButton": "Skapa länk",
"createShareButton": "Dela med användaren",
"searchUsersPlaceholder": "Sök användare...",
"noUsersFound": "Inga användare hittades",
"linkCreated": "Delningslänk skapad",
"linkCopied": "Länk kopierad till urklipp",
"copyLink": "Kopiera länk",
"shareCreated": "Sessionen delade. Den kommer att visas på fliken Anslutningar.",
"shareFailed": "Misslyckades med att skapa delningen",
"userLacksHostAccess": "Den användaren har inte åtkomst till den här värden ännu. Dela värden med dem först, eller använd en länk istället.",
"activeShares": "Aktiva aktier",
"noActiveShares": "Inga aktiva delningar för den här sessionen",
"revoke": "Återkalla",
"revokeConfirmTitle": "Återkalla den här delningen?",
"revokeConfirmDescription": "Alla som använder den här delningen kommer att förlora åtkomsten omedelbart.",
"revoked": "Delning återkallad",
"revokeFailed": "Misslyckades med att återkalla delningen",
"joinCount": "{{count}} gå med",
"joinCount_other": "{{count}} ansluter sig",
"expiresAt": "Utgångsdatum {{date}}",
"linkShareBadge": "Länk",
"userShareBadge": "Användare: {{username}}",
"loadSharesFailed": "Misslyckades med att läsa in aktiva delningar"
"readWrite": "Läs-skriv"
}
},
"terminal": {
"connect": "Anslut till värd",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Skickar en anonym daglig räkning av användare, värdar och funktionsanvändning för att förbättra Termix. Inga personuppgifter eller anslutningsdetaljer inkluderas någonsin.",
"analyticsEnabledLockedDesc": "Den här inställningen är låst av miljövariabeln ENABLE_TELEMETRY och kan inte ändras här.",
"updateAnalyticsFailed": "Det gick inte att uppdatera analysinställningen",
"sessionSharingGloballyEnabled": "Tillåt sessionsdelning",
"auditForwardingTitle": "Vidarebefordra till SIEM",
"auditForwardingDesc": "Skicka en kopia av varje granskningspost till en extern insamlare som NDJSON. Lokala loggar förblir källan till sanningen.",
"auditForwardingEnvNotice": "En miljövariabel konfigurerar också vidarebefordran; URL:en som sparas här har företräde.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Bärartoken (lagrad)",
"auditForwardingSaved": "Inställningar för vidarebefordran av granskning har sparats",
"auditForwardingSaveError": "Det gick inte att spara inställningarna för vidarebefordran av granskning",
"sessionSharingGloballyEnabledDesc": "Tillåt att liveterminal-, RDP-, VNC- och Telnet-sessioner delas instansövergripande. Åsidosätter alla delningsknappar per värd när de är inaktiverade.",
"updateSessionSharingFailed": "Det gick inte att uppdatera inställningen för sessionsdelning",
"sessionTimeout": "Sessionstimeout",
"hours": "timmar",
"sessionTimeoutRange": "Min 1 timme · Max 720 timmar",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "เปิดเอกสาร CLI"
},
"nav": {
"collab": "การประชุม",
"home": "บ้าน",
"terminal": "เทอร์มินัล",
"localTerminal": "สถานีปลายทางท้องถิ่น",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "รักษาการทำงานของเชลล์และโปรแกรมใดๆ ที่ทำงานอยู่ภายในเชลล์ให้คงอยู่ต่อไปแม้การตัดการเชื่อมต่อหรือการรีสตาร์ทเบราว์เซอร์ โดยการเรียกใช้คำสั่งภายใน tmux (ต้องติดตั้ง tmux บนเครื่องโฮสต์)",
"enableSessionLogging": "การบันทึกเซสชัน",
"enableSessionLoggingDesc": "บันทึกผลลัพธ์จากเทอร์มินัลเพื่อตรวจสอบในภายหลัง",
"allowSessionSharing": "อนุญาตการแชร์เซสชัน",
"allowSessionSharingDesc": "อนุญาตให้แชร์เซสชันสดบนโฮสต์นี้ผ่านลิงก์หรือกับผู้ใช้รายอื่น",
"localEchoLabel": "เสียงสะท้อนในท้องถิ่น",
"localEchoDesc": "คาดการณ์การกดแป้นพิมพ์ที่ปลอดภัยสำหรับการพิมพ์ในเครื่องบนการเชื่อมต่อที่ช้า ข้อความแจ้งให้ป้อนรหัสผ่านและการป้อนข้อมูลควบคุมจะไม่ถูกแสดงซ้ำ",
"localEchoDefault": "ใช้การตั้งค่าทั่วโลก",
@@ -1571,137 +1568,11 @@
"join": "เข้าร่วม",
"sharedSessionLabel": "{{hostName}} (แชร์)"
},
"collab": {
"createRoom": "ห้องใหม่",
"roomName": "ชื่อห้อง",
"persistentRoom": "ห้องที่คงอยู่",
"persistentRoomHint": "ห้องประชุมที่ตั้งค่าไว้ถาวรจะยังคงอยู่ในรายการหลังจากสิ้นสุดการประชุมและสามารถนำกลับมาใช้ใหม่ได้",
"noRooms": "ยังไม่มีห้องประชุม สร้างห้องประชุมเพื่อเริ่มการประชุม",
"openRoom": "เปิด",
"endRoom": "สิ้นสุดการประชุม",
"leaveRoom": "ออกจาก",
"deleteMember": "ลบ",
"removeMember": "ลบ {{name}}",
"removeMemberTitle": "ลบสมาชิกนี้ออก?",
"removeMemberDescription": "{{name}} จะเสียสิทธิ์ในการเข้าถึงห้องนี้ทันที โปรแกรมดู SSH ที่ใช้งานอยู่จะถูกตัดการเชื่อมต่อ",
"invite": "เชิญ",
"inviteTitle": "เชิญสมาชิก",
"members": "สมาชิก",
"membersPanel": "สมาชิกห้องและคำขอควบคุม",
"membersWithCount": "สมาชิก ({{count}})",
"online": "ออนไลน์",
"offline": "ออฟไลน์",
"you": "(คุณ)",
"hostBadge": "เจ้าภาพ",
"presenterBadge": "นำเสนอ",
"present": "ปัจจุบัน",
"presentTitle": "ขึ้นเวที",
"presentHost": "เจ้าภาพ",
"searchHosts": "ค้นหาโฮสต์",
"noHostsFound": "ไม่พบโฮสต์ที่ใช้งานได้",
"presentProtocol": "โปรโตคอล",
"stopPresenting": "หยุดการนำเสนอ",
"takeOver": "เข้ายึดครอง",
"takeOverConfirmTitle": "ต้องการเปลี่ยนรูปแบบการนำเสนอปัจจุบันหรือไม่?",
"takeOverDescription": "{{name}} กำลังนำเสนออยู่ การเข้าควบคุมจะตัดการเชื่อมต่อทุกคนจากเวทีนั้น",
"emptyStage": "ไม่มีใครกำลังนำเสนออยู่ เชิญขึ้นเวทีเพื่อร่วมแบ่งปันช่วงการนำเสนอได้เลย",
"stageLoading": "เชื่อมต่อกับเวที...",
"stageEnded": "การนำเสนอสิ้นสุดลงแล้ว",
"roomEnded": "การประชุมนี้ได้สิ้นสุดลงแล้ว",
"presenterLabel": "{{name}} กำลังนำเสนอ",
"guestLink": "ลิงก์สำหรับแขก",
"guestLinkOn": "ลิงก์สำหรับแขกรับเชิญเปิดใช้งานแล้ว ใครก็ตามที่มีลิงก์สามารถรับชมการแสดงสดได้",
"guestLinkOff": "ลิงก์สำหรับผู้เยี่ยมชมถูกปิดใช้งาน",
"copyLink": "คัดลิงก์",
"rotateLink": "หมุนลิงก์",
"disableLink": "ปิดใช้งานลิงก์",
"rotateLinkConfirmTitle": "หมุนลิงก์สำหรับแขกรับเชิญหรือไม่?",
"rotateLinkDescription": "ลิงก์ปัจจุบันจะหยุดทำงานทันที ผู้ใช้งาน SSH ที่เชื่อมต่ออยู่จะถูกตัดการเชื่อมต่อ",
"disableLinkConfirmTitle": "ปิดใช้งานลิงก์สำหรับแขกใช่ไหม?",
"disableLinkDescription": "ผู้ใช้งาน SSH ที่ไม่ระบุตัวตนจะถูกตัดการเชื่อมต่อทันที และลิงก์ปัจจุบันจะหยุดทำงาน",
"linkCopied": "คัดลอกลิงก์แล้ว",
"roles": "บทบาท",
"users": "ผู้ใช้",
"searchUsers": "ค้นหาผู้ใช้",
"endConfirmTitle": "จบการประชุมนี้?",
"endDescription": "{{name}} จะสิ้นสุดลงสำหรับทุกคนและไม่สามารถเปิดใช้งานใหม่ได้อีก",
"endPersistentDescription": "การนำเสนอใน {{name}} จะหยุดลง ห้องยังคงพร้อมใช้งานได้ตามปกติ",
"deleteRoom": "ลบห้อง",
"deleteConfirmTitle": "ลบห้องนี้?",
"deleteDescription": "{{name}} จะถูกลบอย่างถาวรสำหรับทุกคนและไม่สามารถกู้คืนได้",
"invitedTo": "คุณได้รับเชิญไปที่ \"{{name}}\"",
"guest": {
"title": "การประชุม",
"waiting": "กำลังรอผู้ประกาศ...",
"linkInvalid": "ลิงก์สำหรับผู้เข้าร่วมนี้ไม่ถูกต้อง หรือการประชุมได้สิ้นสุดลงแล้ว"
},
"reopenFromPanel": "แท็บการประชุมนี้หมดอายุแล้ว โปรดเปิดห้องประชุมอีกครั้งจากแผงการประชุม",
"requestControl": "การควบคุมคำขอ",
"cancelControlRequest": "คำขอการยกเลิก",
"controlQueue": "คำขอควบคุม",
"noControlRequests": "ไม่มีคำขอที่รอการดำเนินการ",
"grantControlTo": "มอบการควบคุมให้กับ {{name}}",
"dismissControlRequest": "ยกเลิกคำขอควบคุมของ {{name}}",
"releaseControl": "ปล่อยการควบคุม",
"grantControl": "มอบการควบคุม",
"revokeControl": "ทวงคืนการควบคุม",
"controlRequestedBy": "{{name}} ขอควบคุม",
"grant": "ยินยอม",
"controlBadge": "ควบคุมได้",
"youArePresenting": "คุณกำลังนำเสนออยู่ในแท็บอื่น โปรดหยุดการนำเสนอเพื่อส่งต่อให้ผู้อื่น",
"created": "สร้างห้อง",
"invited": "สมาชิกที่ได้รับเชิญ",
"roomTab": "การประชุม"
},
"sessionSharing": {
"guestView": {
"loading": "กำลังเชื่อมต่อกับเซสชันที่ใช้ร่วมกัน...",
"linkInvalid": "ลิงก์แชร์นี้ไม่ถูกต้อง หมดอายุ หรือถูกยกเลิกแล้ว",
"rateLimited": "พยายามหลายครั้งเกินไป โปรดลองใหม่อีกครั้งในภายหลัง",
"sessionEnded": "การประชุมครั้งนี้สิ้นสุดลงแล้ว",
"readOnlyBadge": "ดูได้อย่างเดียว",
"ownerLabel": "เจ้าของที่พัก"
},
"modalTitle": "เซสชั่นการแบ่งปัน",
"shareButton": "แบ่งปัน",
"notReadyToShare": "เซสชั่นยังไม่พร้อมให้แชร์",
"modeTab": {
"link": "ลิงก์",
"user": "ผู้ใช้"
},
"linkModeDescription": "ใครก็ตามที่มีลิงก์นี้สามารถเข้าร่วมได้ ไม่จำเป็นต้องมีบัญชีผู้ใช้",
"userModeDescription": "แชร์กับผู้ใช้เฉพาะรายที่มีสิทธิ์เข้าถึงโฮสต์นี้อยู่แล้ว หากพวกเขายังไม่มีสิทธิ์เข้าถึง ให้แชร์โฮสต์กับพวกเขาก่อน หรือใช้ลิงก์แทน เมื่อแชร์แล้ว เซสชันจะปรากฏในแท็บการเชื่อมต่อของพวกเขา",
"permissionLevel": {
"label": "ระดับการอนุญาต",
"readOnly": "อ่านอย่างเดียว",
"readOnlyDescription": "สามารถรับชมการประชุมสดได้ แต่ไม่สามารถพิมพ์หรือโต้ตอบได้",
"readWrite": "อ่าน-เขียน",
"readWriteDescription": "สามารถพิมพ์และโต้ตอบกับเซสชันได้เหมือนกับเจ้าของเซสชัน"
},
"expiryLabel": "ลิงก์หมดอายุ",
"createLinkButton": "สร้างลิงก์",
"createShareButton": "แชร์กับผู้ใช้",
"searchUsersPlaceholder": "ค้นหาผู้ใช้...",
"noUsersFound": "ไม่พบผู้ใช้งาน",
"linkCreated": "สร้างลิงก์สำหรับแชร์แล้ว",
"linkCopied": "คัดลอกลิงก์ไปยังคลิปบอร์ดแล้ว",
"copyLink": "คัดลิงก์",
"shareCreated": "แชร์เซสชันแล้ว เซสชันนั้นจะปรากฏในแท็บการเชื่อมต่อของพวกเขา",
"shareFailed": "ไม่สามารถสร้างการแชร์ได้",
"userLacksHostAccess": "ผู้ใช้รายนั้นยังไม่มีสิทธิ์เข้าถึงโฮสต์นี้ โปรดแชร์โฮสต์ให้พวกเขาก่อน หรือใช้ลิงก์แทน",
"activeShares": "หุ้นที่ใช้งานอยู่",
"noActiveShares": "ไม่มีหุ้นที่เปิดซื้อขายในรอบนี้",
"revoke": "ถอน",
"revokeConfirmTitle": "ต้องการยกเลิกการแชร์นี้หรือไม่?",
"revokeConfirmDescription": "ใครก็ตามที่ใช้ลิงก์นี้จะเสียสิทธิ์การเข้าถึงทันที",
"revoked": "หุ้นถูกเพิกถอน",
"revokeFailed": "ไม่สามารถเพิกถอนหุ้นได้",
"joinCount": "{{count}} เข้าร่วม",
"joinCount_other": "{{count}} เข้าร่วม",
"expiresAt": "หมดอายุ {{date}}",
"linkShareBadge": "ลิงก์",
"userShareBadge": "ผู้ใช้: {{username}}",
"loadSharesFailed": "ไม่สามารถโหลดหุ้นที่ใช้งานอยู่ได้"
"readWrite": "อ่าน-เขียน"
}
},
"terminal": {
"connect": "เชื่อมต่อกับโฮสต์",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "ส่งรายงานจำนวนผู้ใช้ โฮสต์ และการใช้งานฟีเจอร์รายวันแบบไม่ระบุตัวตน เพื่อช่วยปรับปรุง Termix ไม่มีข้อมูลส่วนบุคคลหรือรายละเอียดการเชื่อมต่อใดๆ รวมอยู่ด้วย",
"analyticsEnabledLockedDesc": "การตั้งค่านี้ถูกล็อกโดยตัวแปรสภาพแวดล้อม ENABLE_TELEMETRY และไม่สามารถเปลี่ยนแปลงได้ที่นี่",
"updateAnalyticsFailed": "ไม่สามารถอัปเดตการตั้งค่าการวิเคราะห์ได้",
"sessionSharingGloballyEnabled": "อนุญาตการแชร์เซสชัน",
"auditForwardingTitle": "ส่งต่อไปยัง SIEM",
"auditForwardingDesc": "ส่งสำเนาของรายการตรวจสอบทุกรายการไปยังตัวเก็บรวบรวมภายนอกในรูปแบบ NDJSON บันทึกในเครื่องยังคงเป็นแหล่งข้อมูลที่ถูกต้องที่สุด",
"auditForwardingEnvNotice": "ตัวแปรสภาพแวดล้อมยังใช้กำหนดค่าการส่งต่อด้วย โดย URL ที่บันทึกไว้ในที่นี้จะมีลำดับความสำคัญเหนือกว่า",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "โทเค็นผู้ถือ (ที่จัดเก็บไว้)",
"auditForwardingSaved": "บันทึกการตั้งค่าการส่งต่อการตรวจสอบแล้ว",
"auditForwardingSaveError": "ไม่สามารถบันทึกการตั้งค่าการส่งต่อการตรวจสอบได้",
"sessionSharingGloballyEnabledDesc": "อนุญาตให้แชร์เซสชันเทอร์มินัลสด, RDP, VNC และ Telnet ทั่วทั้งอินสแตนซ์ การตั้งค่านี้จะแทนที่การตั้งค่าการแชร์ต่อโฮสต์ทั้งหมดเมื่อปิดใช้งานอยู่",
"updateSessionSharingFailed": "ไม่สามารถอัปเดตการตั้งค่าการแชร์เซสชันได้",
"sessionTimeout": "หมดเวลาเซสชัน",
"hours": "ชั่วโมง",
"sessionTimeoutRange": "ขั้นต่ำ 1 ชั่วโมง · ขั้นสูงสุด 720 ชั่วโมง",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "CLI belgelerini açın"
},
"nav": {
"collab": "Toplantılar",
"home": "Ana Sayfa",
"terminal": "Terminal",
"localTerminal": "Yerel Terminal",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Kabuk uygulamanızı ve içinde çalışan her şeyi bağlantı kesintileri ve tarayıcı yeniden başlatmaları sırasında çalışır durumda tutmak için tmux içinde çalıştırın (tmux ana bilgisayarda kurulu olmalıdır).",
"enableSessionLogging": "Oturum Kaydı",
"enableSessionLoggingDesc": "Daha sonra gözden geçirmek için terminal oturumu çıktısını kaydet",
"allowSessionSharing": "Oturum Paylaşımına İzin Ver",
"allowSessionSharingDesc": "Bu sunucudaki canlı oturumların bağlantı yoluyla veya diğer kullanıcılarla paylaşılmasına izin verin.",
"localEchoLabel": "Yerel Yankı",
"localEchoDesc": "Yavaş bağlantılarda bile yerel olarak güvenli yazdırılabilir tuş vuruşlarını tahmin edin. Parola istemleri ve kontrol girişleri asla tekrarlanmaz.",
"localEchoDefault": "Genel ayarı kullanın",
@@ -1571,137 +1568,11 @@
"join": "Katılmak",
"sharedSessionLabel": "{{hostName}} (paylaşılan)"
},
"collab": {
"createRoom": "Yeni oda",
"roomName": "Oda adı",
"persistentRoom": "Kalıcı oda",
"persistentRoomHint": "Kalıcı olarak tahsis edilen odalar, toplantı bittikten sonra da listede kalır ve tekrar kullanılabilir.",
"noRooms": "Henüz oda yok. Toplantı başlatmak için bir oda oluşturun.",
"openRoom": "Açık",
"endRoom": "Toplantıyı sonlandırın",
"leaveRoom": "Ayrılmak",
"deleteMember": "Kaldırmak",
"removeMember": "{{name}}'ı kaldır",
"removeMemberTitle": "Bu üyeyi kaldırmak mı istiyorsunuz?",
"removeMemberDescription": "{{name}} bu odaya erişimini derhal kaybedecektir. Aktif olan tüm SSH izleyicilerinin bağlantısı kesilecektir.",
"invite": "Davet etmek",
"inviteTitle": "Üyeleri davet edin",
"members": "Üyeler",
"membersPanel": "Oda üyeleri ve kontrol talepleri",
"membersWithCount": "Üyeler ({{count}})",
"online": "çevrimiçi",
"offline": "çevrimdışı",
"you": "(Sen)",
"hostBadge": "Ev sahibi",
"presenterBadge": "Sunar",
"present": "Sunmak",
"presentTitle": "Sahneye çıkın",
"presentHost": "Ev sahibi",
"searchHosts": "Ev sahiplerini ara",
"noHostsFound": "Kullanılabilir sunucu bulunamadı.",
"presentProtocol": "Protokol",
"stopPresenting": "Sunum yapmayı bırakın",
"takeOver": "Devralmak",
"takeOverConfirmTitle": "Mevcut sunumu değiştirmek mi istiyorsunuz?",
"takeOverDescription": "{{name}} şu anda sunum yapıyor. Devralmak, herkesi o sahneden ayıracaktır.",
"emptyStage": "Kimse sunum yapmıyor. Sahneye çıkın ve bir sunum paylaşın.",
"stageLoading": "Sahneye bağlanmak...",
"stageEnded": "Sunum sona erdi.",
"roomEnded": "Bu toplantı sona erdi.",
"presenterLabel": "{{name}} sunuyor",
"guestLink": "Konuk bağlantısı",
"guestLinkOn": "Misafir bağlantısı aktif. Bağlantıya sahip herkes sahneyi izleyebilir.",
"guestLinkOff": "Misafir bağlantısı kapalı.",
"copyLink": "Bağlantıyı kopyala",
"rotateLink": "Bağlantıyı döndür",
"disableLink": "Bağlantıyı devre dışı bırak",
"rotateLinkConfirmTitle": "Konuk bağlantısını döndürelim mi?",
"rotateLinkDescription": "Mevcut bağlantı derhal çalışmayı durduracaktır. Bağlı SSH misafirlerinin bağlantısı kesilecektir.",
"disableLinkConfirmTitle": "Misafir bağlantısını devre dışı bırak?",
"disableLinkDescription": "Anonim SSH izleyicilerinin bağlantısı derhal kesilecek ve mevcut bağlantı çalışmayı durduracaktır.",
"linkCopied": "Bağlantı kopyalandı",
"roles": "Roller",
"users": "Kullanıcılar",
"searchUsers": "Kullanıcıları ara",
"endConfirmTitle": "Bu toplantıyı sonlandıralım mı?",
"endDescription": "{{name}} herkes için sona erecek ve yeniden açılamayacak.",
"endPersistentDescription": "{{name}} 'daki aktif sunum durdurulacaktır. Oda yeniden kullanıma açıktır.",
"deleteRoom": "Odayı sil",
"deleteConfirmTitle": "Bu odayı silmek mi?",
"deleteDescription": "{{name}} herkes için kalıcı olarak silinecek ve geri alınamaz.",
"invitedTo": "\"{{name}} \" etkinliğine davet edildiniz.",
"guest": {
"title": "Toplantı",
"waiting": "Sunucuyu bekliyoruz...",
"linkInvalid": "Bu konuk bağlantısı geçersiz veya toplantı sona erdi."
},
"reopenFromPanel": "Bu toplantı sekmesinin süresi doldu. Toplantılar panelinden odayı yeniden açın.",
"requestControl": "Talep kontrolü",
"cancelControlRequest": "İptal talebi",
"controlQueue": "Kontrol talepleri",
"noControlRequests": "Bekleyen talep yok.",
"grantControlTo": "Kontrolü {{name}}'a verin.",
"dismissControlRequest": "{{name}}'ın kontrol isteğini reddet",
"releaseControl": "Kontrolü serbest bırak",
"grantControl": "Kontrolü ona verin.",
"revokeControl": "Kontrolü geri alın",
"controlRequestedBy": "{{name}} kontrolü istedi",
"grant": "Hibe etmek",
"controlBadge": "Kontrol altında",
"youArePresenting": "Başka bir sekmede sunum yapıyorsunuz. Sunumu durdurun ve sahneyi karşı tarafa devredin.",
"created": "Oda oluşturuldu",
"invited": "Üyeler davet edildi",
"roomTab": "Toplantı"
},
"sessionSharing": {
"guestView": {
"loading": "Paylaşılan oturuma bağlanılıyor...",
"linkInvalid": "Bu paylaşım bağlantısı geçersiz, süresi dolmuş veya iptal edilmiş.",
"rateLimited": "Çok fazla deneme yapıldı, lütfen kısa süre sonra tekrar deneyin.",
"sessionEnded": "Bu oturum sona erdi.",
"readOnlyBadge": "Yalnızca görüntüle",
"ownerLabel": "Ev sahibi"
},
"modalTitle": "Oturumu paylaş",
"shareButton": "Paylaşmak",
"notReadyToShare": "Oturum henüz paylaşılmaya hazır değil.",
"modeTab": {
"link": "Bağlantı",
"user": "Kullanıcı"
},
"linkModeDescription": "Bu bağlantıya sahip herkes katılabilir, hesap gerekmez.",
"userModeDescription": "Bu sunucuya zaten erişimi olan belirli bir kullanıcıyla paylaşın. Henüz erişimleri yoksa, önce sunucuyu onlarla paylaşın veya bunun yerine bir bağlantı kullanın. Paylaşıldıktan sonra, oturum Bağlantılar sekmesinde görünür.",
"permissionLevel": {
"label": "İzin seviyesi",
"readOnly": "salt okunur",
"readOnlyDescription": "Oturumu canlı olarak izleyebilirsiniz ancak yazı yazamaz veya etkileşimde bulunamazsınız.",
"readWrite": "Okuma-yazma",
"readWriteDescription": "Oturum sahibi gibi yazabilir ve oturumla etkileşim kurabilirsiniz."
},
"expiryLabel": "Bağlantı süresinin dolması",
"createLinkButton": "Bağlantı oluştur",
"createShareButton": "Kullanıcıyla paylaş",
"searchUsersPlaceholder": "Kullanıcıları ara...",
"noUsersFound": "Hiç kullanıcı bulunamadı.",
"linkCreated": "Paylaşım bağlantısı oluşturuldu.",
"linkCopied": "Bağlantı panoya kopyalandı",
"copyLink": "Bağlantıyı kopyala",
"shareCreated": "Oturum paylaşıldı. Bu, onların Bağlantılar sekmesinde görünecektir.",
"shareFailed": "Paylaşım oluşturulamadı.",
"userLacksHostAccess": "Bu kullanıcının henüz bu sunucuya erişimi yok. Öncelikle sunucuyu onlarla paylaşın veya bunun yerine bir bağlantı kullanın.",
"activeShares": "Aktif hisseler",
"noActiveShares": "Bu oturum için aktif hisse senedi bulunmamaktadır.",
"revoke": "Geri çekmek",
"revokeConfirmTitle": "Bu hisseyi iptal etmek ister misiniz?",
"revokeConfirmDescription": "Bu paylaşımı kullanan herkes erişimini anında kaybedecektir.",
"revoked": "Hisseler geri alındı",
"revokeFailed": "Hisseleri geri alma işlemi başarısız oldu.",
"joinCount": "{{count}} katıl",
"joinCount_other": "{{count}} birleşiyor",
"expiresAt": "Süresi doluyor {{date}}",
"linkShareBadge": "Bağlantı",
"userShareBadge": "Kullanıcı: {{username}}",
"loadSharesFailed": "Aktif paylaşımlar yüklenemedi."
"readWrite": "Okuma-yazma"
}
},
"terminal": {
"connect": "Sunucuya Bağlan",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Termix'i geliştirmeye yardımcı olmak için kullanıcı, sunucu ve özellik kullanımına ilişkin anonim günlük sayım gönderir. Hiçbir kişisel veri veya bağlantı bilgisi asla dahil edilmez.",
"analyticsEnabledLockedDesc": "Bu ayar, ENABLE_TELEMETRY ortam değişkeni tarafından kilitlenmiştir ve burada değiştirilemez.",
"updateAnalyticsFailed": "Analiz ayarlarını güncelleme başarısız oldu.",
"sessionSharingGloballyEnabled": "Oturum Paylaşımına İzin Ver",
"auditForwardingTitle": "SIEM'e ilet",
"auditForwardingDesc": "Her denetim kaydının bir kopyasını NDJSON formatında harici bir toplayıcıya gönderin. Yerel günlükler, doğruluk kaynağı olmaya devam eder.",
"auditForwardingEnvNotice": "Ortam değişkeni de yönlendirmeyi yapılandırır; burada kaydedilen URL önceliklidir.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Taşıyıcı belirteç (saklanmış)",
"auditForwardingSaved": "Denetim yönlendirme ayarları kaydedildi.",
"auditForwardingSaveError": "Denetim yönlendirme ayarları kaydedilemedi.",
"sessionSharingGloballyEnabledDesc": "Canlı terminal, RDP, VNC ve Telnet oturumlarının tüm örnek genelinde paylaşılmasına izin verin. Devre dışı bırakıldığında, sunucu başına paylaşım ayarlarının tümünü geçersiz kılar.",
"updateSessionSharingFailed": "Oturum paylaşım ayarı güncellenemedi.",
"sessionTimeout": "Oturum Zaman Aşımı",
"hours": "saat",
"sessionTimeoutRange": "En az 1 saat · En fazla 720 saat",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Відкрийте документацію CLI"
},
"nav": {
"collab": "Зустрічі",
"home": "Дім",
"terminal": "Термінал",
"localTerminal": "Місцевий термінал",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Зберігайте вашу оболонку та все, що в ній працює, активними після відключень та перезапусків браузера, запускаючи її всередині tmux (tmux має бути встановлений на хості)",
"enableSessionLogging": "Ведення журналу сеансу",
"enableSessionLoggingDesc": "Запис виводу сеансу терміналу для подальшого перегляду",
"allowSessionSharing": "Дозволити спільний доступ до сеансу",
"allowSessionSharingDesc": "Дозволити ділитися прямими трансляціями на цьому хості через посилання або з іншими користувачами",
"localEchoLabel": "Локальне відлуння",
"localEchoDesc": "Передбачати безпечні для друку натискання клавіш локально на повільних з'єднаннях. Запити на введення пароля та введені елементи керування ніколи не відображаються.",
"localEchoDefault": "Використовувати глобальні налаштування",
@@ -1571,137 +1568,11 @@
"join": "Приєднатися",
"sharedSessionLabel": "{{hostName}} (спільний доступ)"
},
"collab": {
"createRoom": "Нова кімната",
"roomName": "Назва кімнати",
"persistentRoom": "Постійна кімната",
"persistentRoomHint": "Постійні кімнати залишаються у списку після завершення зустрічі та можуть бути використані повторно.",
"noRooms": "Поки що немає кімнат. Створіть одну, щоб розпочати зустріч.",
"openRoom": "ВІДЧИНЕНО",
"endRoom": "Закінчити зустріч",
"leaveRoom": "Залишити",
"deleteMember": "Видалити",
"removeMember": "Видалити {{name}}",
"removeMemberTitle": "Видалити цього учасника?",
"removeMemberDescription": "{{name}} негайно втратить доступ до цієї кімнати. Будь-який активний переглядач SSH буде відключено.",
"invite": "Запросити",
"inviteTitle": "Запросити учасників",
"members": "Члени",
"membersPanel": "Учасники кімнати та запити на керування",
"membersWithCount": "Учасники ({{count}})",
"online": "онлайн",
"offline": "офлайн",
"you": "(ти)",
"hostBadge": "Хост",
"presenterBadge": "Презентація",
"present": "Подарунок",
"presentTitle": "Вийди на сцену",
"presentHost": "Хост",
"searchHosts": "Пошук хостів",
"noHostsFound": "Не знайдено доступних хостів.",
"presentProtocol": "Протокол",
"stopPresenting": "Зупинити презентацію",
"takeOver": "Захопити",
"takeOverConfirmTitle": "Замінити поточну презентацію?",
"takeOverDescription": "{{name}} зараз презентує. Перехоплення сцени відключить усіх учасників.",
"emptyStage": "Ніхто не виступає. Вийдіть на сцену, щоб поділитися сесією.",
"stageLoading": "Підключення до сцени...",
"stageEnded": "Презентація закінчилася",
"roomEnded": "Ця зустріч завершилася",
"presenterLabel": "{{name}} презентує",
"guestLink": "Гостьове посилання",
"guestLinkOn": "Гостьове посилання ввімкнено. Будь-хто, хто має посилання, може дивитися сцену.",
"guestLinkOff": "Гостьове посилання вимкнено.",
"copyLink": "Копіювати посилання",
"rotateLink": "Повернути посилання",
"disableLink": "Вимкнути посилання",
"rotateLinkConfirmTitle": "Повернути гостьове посилання?",
"rotateLinkDescription": "Поточне посилання негайно перестане працювати. Підключені гості SSH будуть відключені.",
"disableLinkConfirmTitle": "Вимкнути гостьове посилання?",
"disableLinkDescription": "Анонімні користувачі SSH будуть негайно відключені, а поточне посилання перестане працювати.",
"linkCopied": "Посилання скопійовано",
"roles": "Ролі",
"users": "Користувачі",
"searchUsers": "Пошук користувачів",
"endConfirmTitle": "Завершити цю зустріч?",
"endDescription": "{{name}} завершиться для всіх і не може бути відкрито повторно.",
"endPersistentDescription": "Активна презентація в {{name}} буде зупинена. Кімната залишається доступною для повторного використання.",
"deleteRoom": "Видалити кімнату",
"deleteConfirmTitle": "Видалити цю кімнату?",
"deleteDescription": "{{name}} буде видалено назавжди для всіх і цю дію не можна буде скасувати.",
"invitedTo": "Вас запросили до «{{name}}»",
"guest": {
"title": "Зустріч",
"waiting": "Чекаємо на ведучого...",
"linkInvalid": "Це гостьове посилання недійсне або зустріч завершилася"
},
"reopenFromPanel": "Термін дії цієї вкладки зустрічі закінчився. Відкрийте кімнату знову на панелі Зустрічі.",
"requestControl": "Запит на керування",
"cancelControlRequest": "Скасувати запит",
"controlQueue": "Запити на керування",
"noControlRequests": "Немає запитів, що очікують на розгляд.",
"grantControlTo": "Надайте керування {{name}}",
"dismissControlRequest": "Відхилити запит керування від {{name}}",
"releaseControl": "Контроль випуску",
"grantControl": "Надайте контроль",
"revokeControl": "Поверніть собі контроль",
"controlRequestedBy": "{{name}} запросив керування",
"grant": "Грант",
"controlBadge": "Контроль",
"youArePresenting": "Ви презентуєте в іншій вкладці. Зупиніть презентацію, щоб передати сцену.",
"created": "Кімнату створено",
"invited": "Запрошені учасники",
"roomTab": "Зустріч"
},
"sessionSharing": {
"guestView": {
"loading": "Підключення до спільного сеансу...",
"linkInvalid": "Це посилання для спільного доступу недійсне, термін його дії минув або його було відкликано",
"rateLimited": "Забагато спроб, спробуйте ще раз пізніше",
"sessionEnded": "Цей сеанс завершився",
"readOnlyBadge": "Тільки перегляд",
"ownerLabel": "Власник хоста"
},
"modalTitle": "Поділитися сеансом",
"shareButton": "Поділитися",
"notReadyToShare": "Сеанс ще не готовий до поширення",
"modeTab": {
"link": "Посилання",
"user": "Користувач"
},
"linkModeDescription": "Приєднатися може кожен, хто має це посилання, обліковий запис не потрібен.",
"userModeDescription": "Надайте доступ певному користувачеві, який уже має доступ до цього хоста. Якщо у нього ще немає доступу, спочатку надайте йому доступ до хоста або скористайтеся посиланням. Після надання доступу сеанс відображається на його вкладці «Підключення».",
"permissionLevel": {
"label": "Рівень дозволів",
"readOnly": "Тільки для читання",
"readOnlyDescription": "Можна дивитися сеанс у прямому ефірі, але не можна друкувати чи взаємодіяти.",
"readWrite": "Читання-запис",
"readWriteDescription": "Можна друкувати та взаємодіяти з сеансом так само, як і його власник."
},
"expiryLabel": "Термін дії посилання",
"createLinkButton": "Створити посилання",
"createShareButton": "Поділитися з користувачем",
"searchUsersPlaceholder": "Пошук користувачів...",
"noUsersFound": "Користувачів не знайдено",
"linkCreated": "Посилання для спільного доступу створено",
"linkCopied": "Посилання скопійовано в буфер обміну",
"copyLink": "Копіювати посилання",
"shareCreated": "Сеанс спільний. Він відображатиметься на вкладці «Зв’язки».",
"shareFailed": "Не вдалося створити спільний доступ",
"userLacksHostAccess": "Цей користувач ще не має доступу до цього хоста. Спочатку надайте йому доступ до хоста або скористайтеся посиланням.",
"activeShares": "Активні акції",
"noActiveShares": "Немає активних поширень для цього сеансу",
"revoke": "Скасувати",
"revokeConfirmTitle": "Скасувати цей спільний доступ?",
"revokeConfirmDescription": "Будь-хто, хто користується цим ресурсом спільного доступу, негайно втратить доступ.",
"revoked": "Акції анульовано",
"revokeFailed": "Не вдалося скасувати спільний доступ",
"joinCount": "{{count}} приєднатися",
"joinCount_other": "{{count}} приєднується",
"expiresAt": "Термін дії закінчується {{date}}",
"linkShareBadge": "Посилання",
"userShareBadge": "Користувач: {{username}}",
"loadSharesFailed": "Не вдалося завантажити активні спільні ресурси"
"readWrite": "Читання-запис"
}
},
"terminal": {
"connect": "Підключення до хоста",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Надсилає анонімний щоденний підрахунок користувачів, хостів та використання функцій, щоб допомогти покращити Termix. Жодні особисті дані чи деталі з’єднання ніколи не включаються.",
"analyticsEnabledLockedDesc": "Цей параметр заблоковано змінною середовища ENABLE_TELEMETRY і його не можна змінити тут.",
"updateAnalyticsFailed": "Не вдалося оновити налаштування аналітики",
"sessionSharingGloballyEnabled": "Дозволити спільний доступ до сеансу",
"auditForwardingTitle": "Вперед до SIEM",
"auditForwardingDesc": "Надсилайте копію кожного запису аудиту зовнішньому колектору як NDJSON. Локальні журнали залишаються джерелом достовірної інформації.",
"auditForwardingEnvNotice": "Змінна середовища також налаштовує переадресацію; URL-адреса, збережена тут, має пріоритет.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Токен пред'явника (зберігається)",
"auditForwardingSaved": "Налаштування переадресації аудиту збережено",
"auditForwardingSaveError": "Не вдалося зберегти налаштування переадресації аудиту",
"sessionSharingGloballyEnabledDesc": "Дозволити спільний доступ до сеансів терміналу, RDP, VNC та Telnet для всього екземпляра. Перевизначає кожен перемикач спільного доступу для кожного хоста, якщо його вимкнено.",
"updateSessionSharingFailed": "Не вдалося оновити налаштування спільного доступу до сеансу",
"sessionTimeout": "Час очікування сеансу",
"hours": "години",
"sessionTimeoutRange": "Мін. 1 год · Макс. 720 год",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "Mở tài liệu CLI"
},
"nav": {
"collab": "Các cuộc họp",
"home": "Trang chủ",
"terminal": "Terminal",
"localTerminal": "Ga địa phương",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "Giữ cho shell và mọi thứ đang chạy trong đó hoạt động bình thường ngay cả khi bị ngắt kết nối hoặc khởi động lại trình duyệt bằng cách chạy bên trong tmux (tmux phải được cài đặt trên máy chủ).",
"enableSessionLogging": "Ghi nhật ký phiên",
"enableSessionLoggingDesc": "Ghi lại đầu ra phiên terminal để xem lại sau",
"allowSessionSharing": "Cho phép chia sẻ phiên",
"allowSessionSharingDesc": "Cho phép chia sẻ các phiên trực tiếp trên máy chủ này qua liên kết hoặc với những người dùng khác.",
"localEchoLabel": "Tiếng vọng địa phương",
"localEchoDesc": "Dự đoán các thao tác gõ phím an toàn có thể in được cục bộ trên các kết nối chậm. Lời nhắc nhập mật khẩu và đầu vào điều khiển không bao giờ được hiển thị lại.",
"localEchoDefault": "Sử dụng cài đặt toàn cầu",
@@ -1571,137 +1568,11 @@
"join": "Tham gia",
"sharedSessionLabel": "{{hostName}} (được chia sẻ)"
},
"collab": {
"createRoom": "Phòng mới",
"roomName": "Tên phòng",
"persistentRoom": "Phòng bền vững",
"persistentRoomHint": "Các phòng họp được lưu lại sẽ vẫn hiển thị sau khi cuộc họp kết thúc và có thể được sử dụng lại.",
"noRooms": "Chưa có phòng nào. Hãy tạo một phòng để bắt đầu cuộc họp.",
"openRoom": "Mở",
"endRoom": "Kết thúc cuộc họp",
"leaveRoom": "Rời khỏi",
"deleteMember": "Di dời",
"removeMember": "Xóa {{name}}",
"removeMemberTitle": "Xóa thành viên này?",
"removeMemberDescription": "{{name}} sẽ mất quyền truy cập vào phòng này ngay lập tức. Bất kỳ trình xem SSH nào đang hoạt động sẽ bị ngắt kết nối.",
"invite": "Mời",
"inviteTitle": "Mời thành viên",
"members": "Thành viên",
"membersPanel": "Thành viên phòng và yêu cầu kiểm soát",
"membersWithCount": "Thành viên ({{count}})",
"online": "trực tuyến",
"offline": "ngoại tuyến",
"you": "(Bạn)",
"hostBadge": "Chủ nhà",
"presenterBadge": "Giới thiệu",
"present": "Hiện tại",
"presentTitle": "Hãy lên sân khấu",
"presentHost": "Chủ nhà",
"searchHosts": "Tìm kiếm máy chủ",
"noHostsFound": "Không tìm thấy máy chủ nào khả dụng.",
"presentProtocol": "Giao thức",
"stopPresenting": "Dừng thuyết trình",
"takeOver": "Tiếp quản",
"takeOverConfirmTitle": "Bạn muốn thay thế bài thuyết trình hiện tại?",
"takeOverDescription": "{{name}} đang trình bày. Việc tiếp quản sẽ ngắt kết nối mọi người khỏi sân khấu đó.",
"emptyStage": "Hiện chưa có ai thuyết trình. Hãy lên sân khấu để chia sẻ một phiên thảo luận.",
"stageLoading": "Kết nối với sân khấu...",
"stageEnded": "Buổi thuyết trình kết thúc.",
"roomEnded": "Cuộc họp này đã kết thúc.",
"presenterLabel": "{{name}} đang trình bày",
"guestLink": "Liên kết khách",
"guestLinkOn": "Link dành cho khách đã được bật. Bất cứ ai có link đều có thể xem chương trình.",
"guestLinkOff": "Liên kết khách đã bị tắt.",
"copyLink": "Sao chép liên kết",
"rotateLink": "Xoay liên kết",
"disableLink": "Vô hiệu hóa liên kết",
"rotateLinkConfirmTitle": "Xoay liên kết khách?",
"rotateLinkDescription": "Kết nối hiện tại sẽ ngừng hoạt động ngay lập tức. Các máy khách SSH đang kết nối sẽ bị ngắt kết nối.",
"disableLinkConfirmTitle": "Vô hiệu hóa liên kết khách?",
"disableLinkDescription": "Những người xem SSH ẩn danh sẽ bị ngắt kết nối ngay lập tức và liên kết hiện tại sẽ ngừng hoạt động.",
"linkCopied": "Liên kết đã được sao chép",
"roles": "Vai trò",
"users": "Người dùng",
"searchUsers": "Tìm kiếm người dùng",
"endConfirmTitle": "Kết thúc cuộc họp này?",
"endDescription": "{{name}} sẽ kết thúc đối với tất cả mọi người và không thể mở lại.",
"endPersistentDescription": "Buổi thuyết trình đang diễn ra tại {{name}} sẽ dừng lại. Phòng vẫn có thể được sử dụng lại.",
"deleteRoom": "Xóa phòng",
"deleteConfirmTitle": "Xóa phòng này?",
"deleteDescription": "{{name}} sẽ bị xóa vĩnh viễn đối với tất cả mọi người và không thể hoàn tác.",
"invitedTo": "Bạn được mời đến \"{{name}}\"",
"guest": {
"title": "Cuộc họp",
"waiting": "Đang chờ người dẫn chương trình...",
"linkInvalid": "Liên kết dành cho khách này không hợp lệ hoặc cuộc họp đã kết thúc."
},
"reopenFromPanel": "Tab cuộc họp này đã hết hạn. Vui lòng mở lại phòng từ mục Cuộc họp.",
"requestControl": "Yêu cầu kiểm soát",
"cancelControlRequest": "Yêu cầu hủy bỏ",
"controlQueue": "Yêu cầu kiểm soát",
"noControlRequests": "Không có yêu cầu nào đang chờ xử lý.",
"grantControlTo": "Trao quyền điều khiển cho {{name}}",
"dismissControlRequest": "Bỏ qua yêu cầu điều khiển của {{name}}",
"releaseControl": "Kiểm soát giải phóng",
"grantControl": "Trao quyền kiểm soát",
"revokeControl": "Giành lại quyền kiểm soát",
"controlRequestedBy": "{{name}} yêu cầu quyền điều khiển",
"grant": "Khoản trợ cấp",
"controlBadge": "Trong tầm kiểm soát",
"youArePresenting": "Bạn đang thuyết trình ở một tab khác. Hãy dừng thuyết trình để nhường sân khấu.",
"created": "Phòng được tạo",
"invited": "Các thành viên được mời",
"roomTab": "Cuộc họp"
},
"sessionSharing": {
"guestView": {
"loading": "Đang kết nối đến phiên chia sẻ...",
"linkInvalid": "Liên kết chia sẻ này không hợp lệ, đã hết hạn hoặc đã bị thu hồi.",
"rateLimited": "Đã thử quá nhiều lần, vui lòng thử lại sau.",
"sessionEnded": "Phiên này đã kết thúc",
"readOnlyBadge": "Chỉ xem",
"ownerLabel": "Chủ nhà"
},
"modalTitle": "Chia sẻ phiên họp",
"shareButton": "Chia sẻ",
"notReadyToShare": "Buổi học chưa sẵn sàng để chia sẻ.",
"modeTab": {
"link": "Liên kết",
"user": "Người dùng"
},
"linkModeDescription": "Bất kỳ ai có liên kết này đều có thể tham gia, không cần tài khoản.",
"userModeDescription": "Chia sẻ với một người dùng cụ thể đã có quyền truy cập vào máy chủ này. Nếu họ chưa có quyền truy cập, hãy chia sẻ máy chủ với họ trước hoặc sử dụng liên kết thay thế. Sau khi chia sẻ, phiên làm việc sẽ xuất hiện trong tab Kết nối của họ.",
"permissionLevel": {
"label": "Cấp độ quyền hạn",
"readOnly": "Chỉ đọc",
"readOnlyDescription": "Có thể xem phiên trực tiếp nhưng không thể gõ chữ hoặc tương tác.",
"readWrite": "Đọc-viết",
"readWriteDescription": "Có thể nhập liệu và tương tác với phiên làm việc giống như chủ sở hữu."
},
"expiryLabel": "Liên kết hết hạn",
"createLinkButton": "Tạo liên kết",
"createShareButton": "Chia sẻ với người dùng",
"searchUsersPlaceholder": "Tìm kiếm người dùng...",
"noUsersFound": "Không tìm thấy người dùng nào",
"linkCreated": "Đã tạo liên kết chia sẻ",
"linkCopied": "Liên kết đã được sao chép vào clipboard",
"copyLink": "Sao chép liên kết",
"shareCreated": "Phiên họp đã được chia sẻ. Nó sẽ xuất hiện trong tab Kết nối của họ.",
"shareFailed": "Không thể tạo chia sẻ",
"userLacksHostAccess": "Người dùng đó chưa có quyền truy cập vào máy chủ này. Hãy chia sẻ thông tin máy chủ với họ trước, hoặc sử dụng liên kết thay thế.",
"activeShares": "Cổ phiếu tích cực",
"noActiveShares": "Hiện không có cổ phiếu nào đang được giao dịch trong phiên này.",
"revoke": "Thu hồi",
"revokeConfirmTitle": "Thu hồi cổ phần này?",
"revokeConfirmDescription": "Bất kỳ ai sử dụng thư mục chia sẻ này sẽ mất quyền truy cập ngay lập tức.",
"revoked": "Cổ phần đã bị thu hồi",
"revokeFailed": "Không thể thu hồi cổ phần",
"joinCount": "{{count}} tham gia",
"joinCount_other": "{{count}} tham gia",
"expiresAt": "Hết hạn {{date}}",
"linkShareBadge": "Liên kết",
"userShareBadge": "Người dùng: {{username}}",
"loadSharesFailed": "Không thể tải các chia sẻ đang hoạt động"
"readWrite": "Đọc-viết"
}
},
"terminal": {
"connect": "Kết nối đến máy chủ",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "Gửi báo cáo hàng ngày ẩn danh về số lượng người dùng, máy chủ và mức sử dụng tính năng để giúp cải thiện Termix. Không có dữ liệu cá nhân hoặc chi tiết kết nối nào được tiết lộ.",
"analyticsEnabledLockedDesc": "Cài đặt này bị khóa bởi biến môi trường ENABLE_TELEMETRY và không thể thay đổi ở đây.",
"updateAnalyticsFailed": "Không thể cập nhật cài đặt phân tích.",
"sessionSharingGloballyEnabled": "Cho phép chia sẻ phiên",
"auditForwardingTitle": "Chuyển tiếp đến SIEM",
"auditForwardingDesc": "Gửi một bản sao của mỗi mục kiểm toán đến một đơn vị thu thập dữ liệu bên ngoài dưới dạng NDJSON. Nhật ký cục bộ vẫn là nguồn thông tin chính xác.",
"auditForwardingEnvNotice": "Một biến môi trường cũng cấu hình việc chuyển tiếp; URL được lưu ở đây sẽ được ưu tiên.",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "Mã thông báo người mang (đã lưu trữ)",
"auditForwardingSaved": "Cài đặt chuyển tiếp kiểm toán đã được lưu",
"auditForwardingSaveError": "Không thể lưu cài đặt chuyển tiếp kiểm toán.",
"sessionSharingGloballyEnabledDesc": "Cho phép chia sẻ các phiên terminal trực tiếp, RDP, VNC và Telnet trên toàn bộ máy chủ. Khi bị vô hiệu hóa, tùy chọn này sẽ ghi đè lên mọi tùy chọn chia sẻ trên từng máy chủ riêng lẻ.",
"updateSessionSharingFailed": "Không thể cập nhật cài đặt chia sẻ phiên.",
"sessionTimeout": "Thời gian chờ phiên",
"hours": "giờ",
"sessionTimeoutRange": "Tối thiểu 1h · Tối đa 720h",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "打开 CLI 文档"
},
"nav": {
"collab": "会议",
"home": "首页",
"terminal": "终端",
"localTerminal": "本地终端",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "通过在 tmux 中运行(tmux 必须安装在主机上),可以在断开连接和浏览器重启后保持 shell 及其中运行的所有内容处于活动状态。",
"enableSessionLogging": "会话日志记录",
"enableSessionLoggingDesc": "记录终端会话输出以供日后查看",
"allowSessionSharing": "允许会话共享",
"allowSessionSharingDesc": "允许通过链接或其他方式共享此主机上的实时会话。",
"localEchoLabel": "本地回声",
"localEchoDesc": "在连接速度较慢的情况下,本地预测可安全打印的按键操作。密码提示和控制输入永远不会被回显。",
"localEchoDefault": "使用全局设置",
@@ -1571,137 +1568,11 @@
"join": "加入",
"sharedSessionLabel": "{{hostName}}(共享)"
},
"collab": {
"createRoom": "新房间",
"roomName": "房间名称",
"persistentRoom": "持久房间",
"persistentRoomHint": "会议结束后,持久会议室仍会保留在列表中,可以重复使用。",
"noRooms": "暂无会议室。创建会议室即可开始会议。",
"openRoom": "打开",
"endRoom": "会议结束",
"leaveRoom": "离开",
"deleteMember": "消除",
"removeMember": "移除 {{name}}",
"removeMemberTitle": "移除此成员?",
"removeMemberDescription": "{{name}} 将立即失去对该房间的访问权限。所有正在使用的 SSH 查看器都将被断开连接。",
"invite": "邀请",
"inviteTitle": "邀请成员",
"members": "成员",
"membersPanel": "房间成员和控制请求",
"membersWithCount": "成员({{count}})",
"online": "在线的",
"offline": "离线",
"you": "(你)",
"hostBadge": "主持人",
"presenterBadge": "呈现",
"present": "展示",
"presentTitle": "登上舞台",
"presentHost": "主持人",
"searchHosts": "搜索主机",
"noHostsFound": "未找到可用主机。",
"presentProtocol": "协议",
"stopPresenting": "停止演示",
"takeOver": "接管",
"takeOverConfirmTitle": "替换当前演示文稿?",
"takeOverDescription": "{{name}} 正在直播。接管直播将会断开所有人与该直播间的连接。",
"emptyStage": "目前无人发言。请上台分享您的演讲内容。",
"stageLoading": "连接到舞台……",
"stageEnded": "演讲结束了",
"roomEnded": "会议结束",
"presenterLabel": "{{name}} 正在呈现",
"guestLink": "访客链接",
"guestLinkOn": "访客链接已开启。任何拥有该链接的人都可以观看舞台表演。",
"guestLinkOff": "访客链接已关闭。",
"copyLink": "复制链接",
"rotateLink": "旋转链接",
"disableLink": "禁用链接",
"rotateLinkConfirmTitle": "旋转访客链接?",
"rotateLinkDescription": "当前连接将立即停止工作。已连接的SSH访客将被断开连接。",
"disableLinkConfirmTitle": "禁用访客链接?",
"disableLinkDescription": "匿名 SSH 查看者将被立即断开连接,当前链接将停止工作。",
"linkCopied": "链接已复制",
"roles": "角色",
"users": "用户",
"searchUsers": "搜索用户",
"endConfirmTitle": "结束会议吗?",
"endDescription": "{{name}} 将对所有人关闭,且无法重新开启。",
"endPersistentDescription": "{{name}} 中的当前演示将停止。该房间仍可供再次使用。",
"deleteRoom": "删除房间",
"deleteConfirmTitle": "删除这个房间?",
"deleteDescription": "{{name}} 将被永久删除,且无法撤销。",
"invitedTo": "您受邀参加“{{name}}”",
"guest": {
"title": "会议",
"waiting": "等待主持人……",
"linkInvalid": "此访客链接无效或会议已结束"
},
"reopenFromPanel": "此会议标签页已过期。请从“会议”面板重新打开会议室。",
"requestControl": "请求控制",
"cancelControlRequest": "取消请求",
"controlQueue": "控制请求",
"noControlRequests": "没有待处理的请求。",
"grantControlTo": "将控制权交给 {{name}}",
"dismissControlRequest": "驳回 {{name}}的控制请求",
"releaseControl": "发布控制",
"grantControl": "赋予控制权",
"revokeControl": "夺回控制权",
"controlRequestedBy": "{{name}} 请求控制权",
"grant": "授予",
"controlBadge": "掌控之中",
"youArePresenting": "您正在另一个标签页中进行演示。请停止演示,将演示权交给对方。",
"created": "创建房间",
"invited": "受邀成员",
"roomTab": "会议"
},
"sessionSharing": {
"guestView": {
"loading": "正在连接到共享会话...",
"linkInvalid": "此共享链接无效、已过期或已被撤销。",
"rateLimited": "尝试次数过多,请稍后再试。",
"sessionEnded": "此会话已结束",
"readOnlyBadge": "仅查看",
"ownerLabel": "房东"
},
"modalTitle": "共享会话",
"shareButton": "共享",
"notReadyToShare": "会话尚未准备好共享",
"modeTab": {
"link": "链接",
"user": "用户"
},
"linkModeDescription": "任何人只要拥有此链接即可加入,无需注册账号。",
"userModeDescription": "将主机共享给已拥有此主机访问权限的特定用户。如果他们还没有访问权限,请先将主机共享给他们,或者使用链接代替。共享后,会话将显示在他们的“连接”标签页中。",
"permissionLevel": {
"label": "权限级别",
"readOnly": "只读",
"readOnlyDescription": "可以观看直播,但无法打字或互动。",
"readWrite": "读写",
"readWriteDescription": "可以像会话所有者一样进行输入和互动。"
},
"expiryLabel": "链接过期",
"createLinkButton": "创建链接",
"createShareButton": "与用户共享",
"searchUsersPlaceholder": "搜索用户...",
"noUsersFound": "未找到用户",
"linkCreated": "已创建共享链接",
"linkCopied": "链接已复制到剪贴板",
"copyLink": "复制链接",
"shareCreated": "会话已共享。它将出现在对方的“连接”标签页中。",
"shareFailed": "创建共享失败",
"userLacksHostAccess": "该用户目前没有访问此主机的权限。请先与其共享主机,或使用链接进行共享。",
"activeShares": "有效共享",
"noActiveShares": "此会话暂无活跃共享",
"revoke": "撤销",
"revokeConfirmTitle": "撤销此共享?",
"revokeConfirmDescription": "任何使用此共享的用户都将立即失去访问权限。",
"revoked": "共享已撤销",
"revokeFailed": "撤销共享失败",
"joinCount": "{{count}} 人加入",
"joinCount_other": "{{count}} 人加入",
"expiresAt": "过期时间 {{date}}",
"linkShareBadge": "链接",
"userShareBadge": "用户:{{username}}",
"loadSharesFailed": "无法加载共享"
"readWrite": "读写"
}
},
"terminal": {
"connect": "连接到主机",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "每日匿名发送用户、主机和功能使用情况统计数据,以帮助改进 Termix。绝不包含任何个人数据或连接详情。",
"analyticsEnabledLockedDesc": "此设置受 ENABLE_TELEMETRY 环境变量锁定,无法在此处更改。",
"updateAnalyticsFailed": "分析设置更新失败",
"sessionSharingGloballyEnabled": "允许会话共享",
"auditForwardingTitle": "转发至 SIEM",
"auditForwardingDesc": "将每条审计记录的副本以 NDJSON 格式发送给外部收集器。本地日志仍然是最终的权威来源。",
"auditForwardingEnvNotice": "环境变量还可以配置转发;此处保存的 URL 优先。",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "持有者代币(已存储)",
"auditForwardingSaved": "已保存的审核转发设置",
"auditForwardingSaveError": "保存审计转发设置失败",
"sessionSharingGloballyEnabledDesc": "允许在整个实例范围内共享实时终端、RDP、VNC 和 Telnet 会话。禁用此功能将覆盖所有主机级别的共享设置。",
"updateSessionSharingFailed": "会话共享设置更新失败",
"sessionTimeout": "会话超时",
"hours": "小时",
"sessionTimeoutRange": "最短 1 小时 · 最长 720 小时",
+2 -134
View File
@@ -667,7 +667,6 @@
"done_cli_link": "開啟 CLI 文檔"
},
"nav": {
"collab": "會議",
"home": "首頁",
"terminal": "終端機",
"localTerminal": "本地端",
@@ -1036,8 +1035,6 @@
"enableAutoTmuxDesc": "透過在 tmux 中執行(tmux 必須安裝在主機上),可以在斷開連線和瀏覽器重新啟動後保持 shell 及其中執行的所有內容處於活動狀態。",
"enableSessionLogging": "工作階段記錄",
"enableSessionLoggingDesc": "記錄終端機工作階段輸出以供日後檢視",
"allowSessionSharing": "允許會話共享",
"allowSessionSharingDesc": "允許透過連結或其他方式分享此主機上的即時會話。",
"localEchoLabel": "本地迴聲",
"localEchoDesc": "在連線速度較慢的情況下,本地預測可安全列印的按鍵操作。密碼提示和控制輸入永遠不會被回顯。",
"localEchoDefault": "使用全域設定",
@@ -1571,137 +1568,11 @@
"join": "加入",
"sharedSessionLabel": "{{hostName}} (共享)"
},
"collab": {
"createRoom": "新房間",
"roomName": "房間名稱",
"persistentRoom": "持久房間",
"persistentRoomHint": "會議結束後,持久會議室仍會保留在清單中,可重複使用。",
"noRooms": "暫無會議室。創建會議室即可開始會議。",
"openRoom": "打開",
"endRoom": "會議結束",
"leaveRoom": "離開",
"deleteMember": "消除",
"removeMember": "移除 {{name}}",
"removeMemberTitle": "移除此成員?",
"removeMemberDescription": "{{name}} 將立即失去該房間的存取權限。所有正在使用的 SSH 檢視器都將被斷開。",
"invite": "邀請",
"inviteTitle": "邀請成員",
"members": "成員",
"membersPanel": "房間成員和控制請求",
"membersWithCount": "成員({{count}})",
"online": "在線的",
"offline": "離線",
"you": "(你)",
"hostBadge": "主持人",
"presenterBadge": "呈現",
"present": "展示",
"presentTitle": "登上舞台",
"presentHost": "主持人",
"searchHosts": "搜尋主機",
"noHostsFound": "未找到可用主機。",
"presentProtocol": "協定",
"stopPresenting": "停止演示",
"takeOver": "接管",
"takeOverConfirmTitle": "替換當前簡報?",
"takeOverDescription": "{{name}} 正在直播中。接管直播將會中斷所有人與該直播間的連結。",
"emptyStage": "目前無人發言。請上台分享您的演講內容。",
"stageLoading": "連接到舞台…",
"stageEnded": "演講結束了",
"roomEnded": "會議結束",
"presenterLabel": "{{name}} 正在呈現",
"guestLink": "訪客連結",
"guestLinkOn": "訪客連結已開啟。任何擁有該連結的人都可以觀看舞台表演。",
"guestLinkOff": "訪客連結已關閉。",
"copyLink": "複製連結",
"rotateLink": "旋轉連結",
"disableLink": "停用連結",
"rotateLinkConfirmTitle": "旋轉訪客連結?",
"rotateLinkDescription": "當前連線將立即停止工作。已連線的SSH訪客將會被斷開連線。",
"disableLinkConfirmTitle": "禁用訪客連結?",
"disableLinkDescription": "匿名 SSH 檢視者將立即被斷開連接,目前連結將停止運作。",
"linkCopied": "連結已複製",
"roles": "角色",
"users": "使用者",
"searchUsers": "搜尋用戶",
"endConfirmTitle": "結束會議嗎?",
"endDescription": "{{name}} 將對所有人關閉,且無法重新開啟。",
"endPersistentDescription": "{{name}} 中的目前示範將停止。該房間仍可供再次使用。",
"deleteRoom": "刪除房間",
"deleteConfirmTitle": "刪除這個房間?",
"deleteDescription": "{{name}} 將會永久刪除,且無法撤銷。",
"invitedTo": "您受邀參加“{{name}}”",
"guest": {
"title": "會議",
"waiting": "等待主持人…",
"linkInvalid": "此訪客連結無效或會議已結束"
},
"reopenFromPanel": "此會議標籤頁已過期。請從「會議」面板重新開啟會議室。",
"requestControl": "請求控制",
"cancelControlRequest": "取消請求",
"controlQueue": "控制請求",
"noControlRequests": "沒有待處理的請求。",
"grantControlTo": "將控制權交給 {{name}}",
"dismissControlRequest": "駁回 {{name}}的控制請求",
"releaseControl": "發布控制",
"grantControl": "賦予控制權",
"revokeControl": "奪回控制權",
"controlRequestedBy": "{{name}} 請求控制權",
"grant": "授予",
"controlBadge": "掌控之中",
"youArePresenting": "您正在另一個標籤頁中進行示範。請停止演示,將演示權交給對方。",
"created": "創建房間",
"invited": "受邀成員",
"roomTab": "會議"
},
"sessionSharing": {
"guestView": {
"loading": "正在連接到共享會話...",
"linkInvalid": "此分享連結無效、已過期或已撤銷。",
"rateLimited": "嘗試次數過多,請稍後再試。",
"sessionEnded": "本次會議已結束",
"readOnlyBadge": "僅查看",
"ownerLabel": "房東"
},
"modalTitle": "分享會話",
"shareButton": "分享",
"notReadyToShare": "會話尚未準備好分享",
"modeTab": {
"link": "關聯",
"user": "使用者"
},
"linkModeDescription": "任何人只要擁有此連結即可加入,無需註冊帳號。",
"userModeDescription": "將主機共用給已擁有此主機存取權限的特定使用者。如果他們還沒有存取權限,請先將主機分享給他們,或使用連結代替。共享後,會話將顯示在他們的“連接”選項卡中。",
"permissionLevel": {
"label": "權限等級",
"readOnly": "只讀",
"readOnlyDescription": "可以觀看直播,但無法打字或互動。",
"readWrite": "讀寫",
"readWriteDescription": "可以像會話擁有者一樣進行輸入和互動。"
},
"expiryLabel": "連結過期",
"createLinkButton": "建立連結",
"createShareButton": "與用戶分享",
"searchUsersPlaceholder": "搜尋用戶...",
"noUsersFound": "未找到用戶",
"linkCreated": "已建立分享連結",
"linkCopied": "連結已複製到剪貼簿",
"copyLink": "複製連結",
"shareCreated": "會話已共用。它將出現在對方的「連線」標籤中。",
"shareFailed": "建立共享失敗",
"userLacksHostAccess": "該使用者目前沒有存取此主機的權限。請先與其共享主機,或使用連結進行共享。",
"activeShares": "活躍股",
"noActiveShares": "本會話無活躍份額",
"revoke": "撤銷",
"revokeConfirmTitle": "撤銷此份額?",
"revokeConfirmDescription": "任何使用此共用資料夾的使用者都將立即失去存取權限。",
"revoked": "股份撤銷",
"revokeFailed": "撤銷股份失敗",
"joinCount": "{{count}} 加入",
"joinCount_other": "{{count}} 加入",
"expiresAt": "過期時間 {{date}}",
"linkShareBadge": "關聯",
"userShareBadge": "使用者: {{username}}",
"loadSharesFailed": "無法加載活動份額"
"readWrite": "讀寫"
}
},
"terminal": {
"connect": "連線至主機",
@@ -2239,7 +2110,6 @@
"analyticsEnabledDesc": "每日匿名傳送使用者、主機和功能使用統計數據,以協助改善 Termix。絕不包含任何個人資料或連結詳情。",
"analyticsEnabledLockedDesc": "此設定受 ENABLE_TELEMETRY 環境變數鎖定,無法在此變更。",
"updateAnalyticsFailed": "分析設定更新失敗",
"sessionSharingGloballyEnabled": "允許會話共享",
"auditForwardingTitle": "轉寄至 SIEM",
"auditForwardingDesc": "將每個審計記錄的副本以 NDJSON 格式傳送給外部收集器。本地日誌仍然是最終的權威來源。",
"auditForwardingEnvNotice": "環境變數也可以配置轉送;此處儲存的 URL 優先。",
@@ -2247,8 +2117,6 @@
"auditForwardingTokenStored": "持有者代幣(已儲存)",
"auditForwardingSaved": "已儲存的審核轉送設定",
"auditForwardingSaveError": "審核轉送設定保存失敗",
"sessionSharingGloballyEnabledDesc": "允許在整個執行個體範圍內共用即時終端、RDP、VNC 和 Telnet 會話。停用此功能將覆蓋所有主機層級的共用設定。",
"updateSessionSharingFailed": "會話共享設定更新失敗",
"sessionTimeout": "工作階段逾時",
"hours": "小時",
"sessionTimeoutRange": "最短 1 小時,最長 720 小時",
+20
View File
@@ -350,6 +350,26 @@ async function fetchGuestPlugins(): Promise<PluginSummary[]> {
return Array.isArray(body) ? (body as PluginSummary[]) : [];
}
let guestViewsRequest: Promise<string[]> | null = null;
/**
* The `?view=` names enabled guest plugins serve to anonymous pages, so the
* entry point can tell a guest link from a signed-in full-screen view
* without knowing any plugin.
*/
export function fetchGuestViews(): Promise<string[]> {
guestViewsRequest ??= fetchGuestPlugins()
.then((plugins) =>
plugins.flatMap(
(plugin) =>
(plugin.contributes as { guestViews?: string[] } | undefined)
?.guestViews ?? [],
),
)
.catch(() => []);
return guestViewsRequest;
}
async function fetchPreLoginPlugins(): Promise<PluginSummary[]> {
const response = await fetch(getBackendUrl("/plugins/public-manifest"));
if (!response.ok) return [];
+1
View File
@@ -99,6 +99,7 @@ export const tabsApi = {
openTab: shell.openTab,
openSingletonTab: shell.openSingletonTab,
closeTab: shell.closeTab,
openRailView: shell.openRailView,
getLayout: () => layoutProvider?.getLayout() ?? null,
applyLayout: (layout: Layout, options?: { name?: string }) =>
layoutProvider
+1 -22
View File
@@ -27,10 +27,9 @@ import {
Minimize2,
FolderOpen,
PanelRight,
Share2,
} from "lucide-react";
import { tabIcon } from "@/shell/tabUtils";
import { isSessionTabType, isShareableTabType } from "@/shell/tab-registry";
import { isSessionTabType } from "@/shell/tab-registry";
import { isElectron } from "@/lib/electron";
import type { Tab, TabType, SplitMode } from "@/types/ui-types";
import { SPLIT_MODES, PANE_COUNTS } from "@/lib/theme";
@@ -43,11 +42,6 @@ function isConnectionTab(type: TabType): boolean {
return isSessionTabType(type);
}
/** Connection tabs that also offer "Share session". */
function isShareableConnectionTab(type: TabType): boolean {
return isConnectionTab(type) && isShareableTabType(type);
}
export function TabBar({
tabs,
activeTabId,
@@ -63,7 +57,6 @@ export function TabBar({
onRemoveFromSplit,
onRenameTab,
onOpenFileManager,
onOpenShare,
isAppFullscreen,
onToggleAppFullscreen,
rightDockOpen,
@@ -84,7 +77,6 @@ export function TabBar({
onRemoveFromSplit: (tabId: string) => void;
onRenameTab?: (tabId: string, newLabel: string) => void;
onOpenFileManager?: (tabId: string) => void;
onOpenShare?: (tabId: string) => void;
isAppFullscreen: boolean;
onToggleAppFullscreen: () => void;
rightDockOpen?: boolean;
@@ -472,19 +464,6 @@ export function TabBar({
<RefreshCw className="size-3" />
</button>
)}
{isShareableConnectionTab(tab.type) && onOpenShare && (
<button
onPointerDown={(e) => e.stopPropagation()}
onClick={(e) => {
e.stopPropagation();
onOpenShare(tab.id);
}}
title={t("sessionSharing.shareButton")}
className="flex items-center justify-center size-5 md:size-4 rounded-sm transition-colors text-muted-foreground hover:text-foreground hover:bg-muted"
>
<Share2 className="size-3" />
</button>
)}
<button
onPointerDown={(e) => e.stopPropagation()}
onClick={(e) => {
-7
View File
@@ -61,8 +61,6 @@ export interface TabTypeDef {
persistent?: boolean;
singleton?: boolean;
session?: boolean;
/** Whether a session tab offers "Share session". Default true. */
shareable?: boolean;
hostless?: boolean;
restore?: (host: Host) => boolean;
activityTypes?: string[];
@@ -117,11 +115,6 @@ export function isSessionTabType(type: string): boolean {
return CORE_SESSION.has(type) || !!registry.get(type)?.session;
}
/** Whether a session tab of this type offers "Share session". Default true. */
export function isShareableTabType(type: string): boolean {
return registry.get(type)?.shareable !== false;
}
export function isHostlessTabType(type: string): boolean {
return CORE_HOSTLESS.has(type) || !!registry.get(type)?.hostless;
}
-14
View File
@@ -10,7 +10,6 @@ import {
Fingerprint,
Hammer,
ScrollText,
Presentation,
} from "lucide-react";
import { lazy, Suspense } from "react";
import { useTranslation } from "react-i18next";
@@ -28,12 +27,6 @@ import {
} from "@/lib/adaptive-resource-budget";
// Heavy tab surfaces — keep out of the AppShell critical path.
const CollabRoomTab = lazy(() =>
import("@/features/collab/CollabRoomTab").then((m) => ({
default: m.CollabRoomTab,
})),
);
const DashboardTab = lazy(() =>
import("@/dashboard/DashboardTab").then((m) => ({
default: m.DashboardTab,
@@ -129,8 +122,6 @@ export function tabIcon(type: TabType) {
return <Settings className="size-3.5" />;
case "homepage":
return <LayoutGrid className="size-3.5" />;
case "collab":
return <Presentation className="size-3.5" />;
case "termix-id":
return <Fingerprint className="size-3.5" />;
case "session-logs":
@@ -231,11 +222,6 @@ export function renderTabContent(tab: Tab, context: TabRenderContext) {
case "homepage":
return withTabSuspense(<HomepageCanvas />);
case "collab":
return withTabSuspense(
<CollabRoomTab roomId={tab.collabRoomId} isVisible={isVisible} />,
);
case "termix-id":
return withTabSuspense(
<PanelTabFrame>
-26
View File
@@ -54,10 +54,6 @@ import {
type HostDefaults,
type BrandingSettings,
} from "@/api/settings-api";
import {
getSessionSharingGloballyEnabled,
updateSessionSharingGloballyEnabled,
} from "@/api/session-sharing-api";
import {
getAcmeSslSettings,
updateAcmeSslSettings,
@@ -148,8 +144,6 @@ export function AdminSettingsPanel({
const [analyticsLocked, setAnalyticsLocked] = useState(false);
const [oidcSilentLoginDefaultLocked, setOidcSilentLoginDefaultLocked] =
useState(false);
const [sessionSharingGloballyEnabled, setSessionSharingGloballyEnabled] =
useState(true);
const [stepCaPrivateEndpoints, setStepCaPrivateEndpoints] = useState<
string[]
>([]);
@@ -361,7 +355,6 @@ export function AdminSettingsPanel({
secondFactorExternal,
oidcSilent,
analytics,
sessionSharingEnabled,
notificationEndpoints,
stepCaEndpoints,
secretSourceEndpoints,
@@ -378,7 +371,6 @@ export function AdminSettingsPanel({
getSecondFactorAfterExternalLogin(),
getOidcSilentLoginDefault(),
getAnalyticsEnabled(),
getSessionSharingGloballyEnabled(),
getNotificationPrivateEndpoints(),
getStepCaPrivateEndpoints(),
getSecretSourcePrivateEndpoints(),
@@ -418,9 +410,6 @@ export function AdminSettingsPanel({
setAnalyticsEnabled(analytics.value.enabled);
setAnalyticsLocked(analytics.value.locked ?? false);
}
if (sessionSharingEnabled.status === "fulfilled") {
setSessionSharingGloballyEnabled(sessionSharingEnabled.value.enabled);
}
if (stepCaEndpoints.status === "fulfilled") {
setStepCaPrivateEndpoints(stepCaEndpoints.value);
}
@@ -553,17 +542,6 @@ export function AdminSettingsPanel({
}
}
async function handleToggleSessionSharingGloballyEnabled() {
const newVal = !sessionSharingGloballyEnabled;
setSessionSharingGloballyEnabled(newVal);
try {
await updateSessionSharingGloballyEnabled(newVal);
} catch {
setSessionSharingGloballyEnabled(!newVal);
toast.error(t("admin.updateSessionSharingFailed"));
}
}
async function handleSaveStepCaSettings() {
try {
await updateStepCaSettings(stepCaSettings);
@@ -1088,7 +1066,6 @@ export function AdminSettingsPanel({
analyticsEnabled={analyticsEnabled}
analyticsLocked={analyticsLocked}
handleToggleAnalytics={handleToggleAnalytics}
sessionSharingGloballyEnabled={sessionSharingGloballyEnabled}
notificationPrivateEndpoints={notificationPrivateEndpoints}
stepCaPrivateEndpoints={stepCaPrivateEndpoints}
onSaveStepCaPrivateEndpoints={handleSaveStepCaPrivateEndpoints}
@@ -1102,9 +1079,6 @@ export function AdminSettingsPanel({
onSaveNotificationPrivateEndpoints={
handleSaveNotificationPrivateEndpoints
}
handleToggleSessionSharingGloballyEnabled={
handleToggleSessionSharingGloballyEnabled
}
allowRegistration={allowRegistration}
handleToggleRegistration={handleToggleRegistration}
allowPasswordLogin={allowPasswordLogin}
-13
View File
@@ -27,7 +27,6 @@ type GeneralSettingsSectionProps = {
analyticsEnabled: boolean;
analyticsLocked: boolean;
handleToggleAnalytics: () => void;
sessionSharingGloballyEnabled: boolean;
notificationPrivateEndpoints: string[];
onSaveNotificationPrivateEndpoints: (hosts: string[]) => void;
stepCaPrivateEndpoints: string[];
@@ -39,7 +38,6 @@ type GeneralSettingsSectionProps = {
SetStateAction<{ caUrl: string; fingerprint: string; provisioner: string }>
>;
handleSaveStepCaSettings: () => void;
handleToggleSessionSharingGloballyEnabled: () => void;
allowRegistration: boolean;
handleToggleRegistration: () => void;
allowPasswordLogin: boolean;
@@ -77,7 +75,6 @@ export function AdminGeneralSettingsSection({
analyticsEnabled,
analyticsLocked,
handleToggleAnalytics,
sessionSharingGloballyEnabled,
notificationPrivateEndpoints,
onSaveNotificationPrivateEndpoints,
stepCaPrivateEndpoints,
@@ -87,7 +84,6 @@ export function AdminGeneralSettingsSection({
stepCaSettings,
setStepCaSettings,
handleSaveStepCaSettings,
handleToggleSessionSharingGloballyEnabled,
allowRegistration,
handleToggleRegistration,
allowPasswordLogin,
@@ -142,15 +138,6 @@ export function AdminGeneralSettingsSection({
disabled={analyticsLocked}
/>
</SettingRow>
<SettingRow
label={t("admin.sessionSharingGloballyEnabled")}
description={t("admin.sessionSharingGloballyEnabledDesc")}
>
<AdminToggle
on={sessionSharingGloballyEnabled}
onToggle={handleToggleSessionSharingGloballyEnabled}
/>
</SettingRow>
<div className="flex flex-col gap-1.5 py-2">
<span className="text-xs font-medium">
{t("admin.notificationPrivateEndpoints")}
+1 -2
View File
@@ -25,8 +25,7 @@ export type CoreRailView =
| "connections"
| "session-logs"
| "user-profile"
| "admin-settings"
| "collab";
| "admin-settings";
export type RailView = CoreRailView | (string & {});
-186
View File
@@ -1,186 +0,0 @@
import { useCallback, useEffect, useState } from "react";
import { useTranslation } from "react-i18next";
import { toast } from "sonner";
import { Loader2, Plus, Presentation, RefreshCw } from "lucide-react";
import { Button } from "@/components/button";
import { Input } from "@/components/input";
import { Badge } from "@/components/badge";
import {
Dialog,
DialogContent,
DialogFooter,
DialogHeader,
DialogTitle,
} from "@/components/dialog";
import {
createCollabRoom,
listCollabRooms,
type CollabRoom,
} from "@/api/collab-api";
import { getErrorMessage } from "@/lib/error-message";
export function CollabPanel({
onOpenRoom,
}: {
onOpenRoom: (room: CollabRoom) => void;
}) {
const { t } = useTranslation();
const [rooms, setRooms] = useState<CollabRoom[]>([]);
const [loading, setLoading] = useState(true);
const [createOpen, setCreateOpen] = useState(false);
const [name, setName] = useState("");
const [persistent, setPersistent] = useState(false);
const [creating, setCreating] = useState(false);
const refresh = useCallback(async () => {
try {
const result = await listCollabRooms();
setRooms(result.rooms ?? []);
} catch {
/* the list stays as-is */
} finally {
setLoading(false);
}
}, []);
useEffect(() => {
void refresh();
const timer = window.setInterval(() => void refresh(), 30000);
return () => window.clearInterval(timer);
}, [refresh]);
async function handleCreate() {
if (!name.trim()) return;
setCreating(true);
try {
const { room } = await createCollabRoom(name.trim(), persistent);
toast.success(t("collab.created"));
setCreateOpen(false);
setName("");
setPersistent(false);
await refresh();
onOpenRoom(room);
} catch (error) {
toast.error(getErrorMessage(error));
} finally {
setCreating(false);
}
}
return (
<div className="flex flex-col gap-2 p-2">
<div className="flex items-center gap-1.5">
<Button
size="sm"
className="h-8 text-xs flex-1 border border-accent-brand/40 bg-accent-brand/10 text-accent-brand font-semibold hover:bg-accent-brand/20"
onClick={() => setCreateOpen(true)}
>
<Plus className="size-3.5 mr-1" />
{t("collab.createRoom")}
</Button>
<Button
size="sm"
variant="outline"
className="h-8 px-2"
onClick={() => void refresh()}
aria-label={t("common.refresh")}
title={t("common.refresh")}
>
<RefreshCw className="size-3.5" />
</Button>
</div>
{loading ? (
<div className="flex justify-center py-6">
<Loader2 className="size-4 animate-spin text-muted-foreground" />
</div>
) : rooms.length === 0 ? (
<p className="text-xs text-muted-foreground px-1 py-4 text-center">
{t("collab.noRooms")}
</p>
) : (
<div className="flex flex-col gap-1">
{rooms.map((room) => (
<button
key={room.id}
type="button"
onClick={() => onOpenRoom(room)}
className="flex items-center gap-2 px-2 py-1.5 text-left border border-border hover:bg-muted/50"
>
<Presentation className="size-3.5 shrink-0 text-muted-foreground" />
<span className="flex-1 text-xs truncate">{room.name}</span>
{room.presenterUserId && (
<span
className="size-1.5 rounded-full bg-red-500 shrink-0"
role="img"
aria-label={t("collab.presenterBadge")}
title={t("collab.presenterBadge")}
/>
)}
{room.persistent && (
<Badge variant="outline" className="text-[9px] px-1 py-0">
{t("collab.persistentRoom")}
</Badge>
)}
</button>
))}
</div>
)}
<Dialog open={createOpen} onOpenChange={setCreateOpen}>
<DialogContent>
<DialogHeader>
<DialogTitle>{t("collab.createRoom")}</DialogTitle>
</DialogHeader>
<div className="flex flex-col gap-3">
<label htmlFor="collab-room-name" className="text-xs font-medium">
{t("collab.roomName")}
</label>
<Input
id="collab-room-name"
placeholder={t("collab.roomName")}
value={name}
onChange={(e) => setName(e.target.value)}
onKeyDown={(e) => {
if (e.key === "Enter") void handleCreate();
}}
/>
<label className="flex items-start gap-2 text-xs cursor-pointer">
<input
type="checkbox"
className="mt-0.5"
checked={persistent}
onChange={(e) => setPersistent(e.target.checked)}
/>
<span>
<span className="font-medium">
{t("collab.persistentRoom")}
</span>
<br />
<span className="text-muted-foreground">
{t("collab.persistentRoomHint")}
</span>
</span>
</label>
</div>
<DialogFooter>
<Button
variant="outline"
onClick={() => setCreateOpen(false)}
disabled={creating}
>
{t("common.cancel")}
</Button>
<Button
onClick={() => void handleCreate()}
disabled={creating || !name.trim()}
>
{creating && <Loader2 className="size-3.5 mr-1 animate-spin" />}
{t("common.create")}
</Button>
</DialogFooter>
</DialogContent>
</Dialog>
</div>
);
}
-9
View File
@@ -1810,15 +1810,6 @@ export function HostEditor({
onChange={(v) => setField("enableSessionLogging", v)}
/>
</SettingRow>
<SettingRow
label={t("hosts.allowSessionSharing")}
description={t("hosts.allowSessionSharingDesc")}
>
<FakeSwitch
checked={form.allowSessionSharing}
onChange={(v) => setField("allowSessionSharing", v)}
/>
</SettingRow>
<div className="flex flex-col gap-1.5">
<label className="text-[10px] font-bold uppercase tracking-widest text-muted-foreground">
{t("hosts.localEchoLabel")}
-2
View File
@@ -199,7 +199,6 @@ export function createHostEditorForm(
enableTmuxMonitor: host?.enableTmuxMonitor ?? false,
enableTerminalToolbar: host?.enableTerminalToolbar ?? true,
enableAiAssistant: host?.enableAiAssistant ?? false,
allowSessionSharing: host?.allowSessionSharing ?? true,
enableProxmox: (proxmoxSettings.enableProxmox as boolean) ?? false,
proxmoxConfig:
((proxmoxSettings.proxmoxConfig as Host["proxmoxConfig"]) ?? {
@@ -509,7 +508,6 @@ export function buildHostEditorPayload(
enableTmuxMonitor: form.enableTmuxMonitor,
enableTerminalToolbar: form.enableTerminalToolbar,
enableAiAssistant: form.enableAiAssistant,
allowSessionSharing: form.allowSessionSharing,
enableProxmox: form.enableProxmox,
proxmoxConfig:
form.enableProxmox || form.proxmoxConfig?.source
-7
View File
@@ -10,7 +10,6 @@ import {
Settings,
User,
Zap,
Presentation,
type LucideIcon,
} from "lucide-react";
import { useMemo, useSyncExternalStore } from "react";
@@ -90,12 +89,6 @@ export const RAIL_ITEMS: RailItemDef[] = [
separatorAfter: true,
rightDockable: true,
},
{
id: "collab",
icon: Presentation,
labelKey: "nav.collab",
separatorAfter: true,
},
{
id: "quick-connect",
icon: Zap,
@@ -1,94 +0,0 @@
import { describe, expect, it, vi, beforeEach } from "vitest";
const axiosGetMock = vi.hoisted(() => vi.fn());
vi.mock("axios", () => ({
default: {
get: axiosGetMock,
isAxiosError: (err: unknown): err is { response?: { status?: number } } =>
typeof err === "object" && err !== null && "response" in err,
},
}));
vi.mock("@/lib/base-path", () => ({
getBasePath: () => "",
}));
vi.mock("@/lib/electron", () => ({
isElectron: () => false,
}));
vi.mock("@/main-axios", () => ({
getServerConfig: vi.fn(async () => null),
}));
import {
resolveShareLink,
ShareLinkError,
} from "../../api/session-sharing-api";
beforeEach(() => {
axiosGetMock.mockReset();
});
describe("resolveShareLink", () => {
it("returns the resolved share data on success", async () => {
axiosGetMock.mockResolvedValueOnce({
data: {
protocol: "ssh",
permissionLevel: "read-write",
wsPath: "/terminal/ws?shareToken=abc123",
},
});
const result = await resolveShareLink("abc123");
expect(result).toEqual({
protocol: "ssh",
permissionLevel: "read-write",
wsPath: "/terminal/ws?shareToken=abc123",
});
expect(axiosGetMock).toHaveBeenCalledWith(
expect.stringContaining("/session-sharing/resolve/abc123"),
);
});
it("throws a not-found ShareLinkError on 404", async () => {
axiosGetMock.mockRejectedValueOnce({ response: { status: 404 } });
await expect(resolveShareLink("bad-token")).rejects.toMatchObject({
kind: "not-found",
});
await expect(resolveShareLink("bad-token")).rejects.toBeInstanceOf(
ShareLinkError,
);
});
it("throws a rate-limited ShareLinkError on 429", async () => {
axiosGetMock.mockRejectedValueOnce({ response: { status: 429 } });
await expect(resolveShareLink("token")).rejects.toMatchObject({
kind: "rate-limited",
});
});
it("throws a generic ShareLinkError on unexpected failures", async () => {
axiosGetMock.mockRejectedValueOnce(new Error("network down"));
await expect(resolveShareLink("token")).rejects.toMatchObject({
kind: "unknown",
});
});
it("URL-encodes the link token", async () => {
axiosGetMock.mockResolvedValueOnce({
data: { protocol: "ssh", permissionLevel: "read-only", wsPath: "" },
});
await resolveShareLink("a/b c");
expect(axiosGetMock).toHaveBeenCalledWith(
expect.stringContaining(encodeURIComponent("a/b c")),
);
});
});
@@ -1,211 +0,0 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import {
render,
screen,
waitFor,
cleanup,
fireEvent,
} from "@testing-library/react";
const api = vi.hoisted(() => ({
createSessionShare: vi.fn(),
getActiveSessionShares: vi.fn(async () => ({ shares: [] })),
revokeSessionShare: vi.fn(async () => ({ success: true as const })),
}));
vi.mock("@/api/session-sharing-api", () => api);
const mainAxios = vi.hoisted(() => ({
getUserList: vi.fn(async () => ({
users: [
{ userId: "u1", username: "alice" },
{ userId: "u2", username: "bob" },
],
})),
}));
vi.mock("@/main-axios", () => mainAxios);
vi.mock("react-i18next", () => ({
useTranslation: () => ({
t: (key: string, opts?: Record<string, unknown>) =>
opts ? `${key}:${JSON.stringify(opts)}` : key,
}),
}));
vi.mock("sonner", () => ({
toast: { success: vi.fn(), error: vi.fn() },
}));
Object.assign(navigator, {
clipboard: { writeText: vi.fn(async () => {}) },
});
import { ShareSessionModal } from "../../../features/session-sharing/ShareSessionModal";
beforeEach(() => {
api.createSessionShare.mockReset();
api.getActiveSessionShares.mockReset();
api.getActiveSessionShares.mockResolvedValue({ shares: [] });
api.revokeSessionShare.mockReset();
mainAxios.getUserList.mockClear();
});
afterEach(() => {
cleanup();
});
describe("ShareSessionModal", () => {
it("creates a link share with the default read-only permission and 24h expiry", async () => {
api.createSessionShare.mockResolvedValue({
shareId: "share-1",
linkToken: "tok-123",
expiresAt: "2026-07-21T00:00:00.000Z",
});
render(
<ShareSessionModal
open={true}
onClose={() => {}}
hostId={42}
sessionId="sess-1"
protocol="ssh"
tabInstanceId="tab-1"
/>,
);
const createButton = await screen.findByText(
"sessionSharing.createLinkButton",
);
fireEvent.click(createButton);
await waitFor(() => {
expect(api.createSessionShare).toHaveBeenCalledWith({
hostId: 42,
sessionId: "sess-1",
tabInstanceId: "tab-1",
protocol: "ssh",
shareType: "link",
targetUserId: undefined,
permissionLevel: "read-only",
expiryHours: 24,
});
});
});
it("does not submit a user share until a target user is selected", async () => {
render(
<ShareSessionModal
open={true}
onClose={() => {}}
hostId={7}
sessionId="sess-2"
protocol="rdp"
/>,
);
fireEvent.click(await screen.findByText("sessionSharing.modeTab.user"));
const shareButton = await screen.findByText(
"sessionSharing.createShareButton",
);
expect((shareButton as HTMLButtonElement).disabled).toBe(true);
expect(api.createSessionShare).not.toHaveBeenCalled();
});
it("submits a user share with the selected target and read-write permission", async () => {
api.createSessionShare.mockResolvedValue({
shareId: "share-2",
linkToken: null,
expiresAt: "2026-07-21T00:00:00.000Z",
});
render(
<ShareSessionModal
open={true}
onClose={() => {}}
hostId={7}
sessionId="sess-2"
protocol="vnc"
/>,
);
fireEvent.click(await screen.findByText("sessionSharing.modeTab.user"));
fireEvent.click(await screen.findByText("alice"));
const select = await screen.findByDisplayValue(
"sessionSharing.permissionLevel.readOnly",
);
fireEvent.change(select, { target: { value: "read-write" } });
fireEvent.click(screen.getByText("sessionSharing.createShareButton"));
await waitFor(() => {
expect(api.createSessionShare).toHaveBeenCalledWith({
hostId: 7,
sessionId: "sess-2",
tabInstanceId: undefined,
protocol: "vnc",
shareType: "user",
targetUserId: "u1",
permissionLevel: "read-write",
expiryHours: 24,
});
});
});
it("does not call create when there is no live session id", async () => {
render(
<ShareSessionModal
open={true}
onClose={() => {}}
hostId={1}
sessionId={null}
protocol="ssh"
/>,
);
const createButton = await screen.findByText(
"sessionSharing.createLinkButton",
);
expect((createButton as HTMLButtonElement).disabled).toBe(true);
});
it("loads and renders active shares for the host", async () => {
api.getActiveSessionShares.mockResolvedValue({
shares: [
{
id: "share-x",
hostId: 42,
ownerUserId: "owner-1",
protocol: "ssh",
sessionId: "sess-1",
tabInstanceId: null,
shareType: "link",
targetUserId: null,
linkToken: "tok-abc",
permissionLevel: "read-only",
createdAt: "2026-07-20T00:00:00.000Z",
expiresAt: "2026-07-21T00:00:00.000Z",
revokedAt: null,
lastJoinedAt: null,
joinCount: 0,
},
],
});
render(
<ShareSessionModal
open={true}
onClose={() => {}}
hostId={42}
sessionId="sess-1"
protocol="ssh"
/>,
);
await waitFor(() => {
expect(screen.getByText("sessionSharing.linkShareBadge")).toBeTruthy();
});
});
});
@@ -1,137 +0,0 @@
import { describe, it, expect, vi, beforeEach, afterEach } from "vitest";
import { render, screen, waitFor, cleanup } from "@testing-library/react";
const api = vi.hoisted(() => ({
resolveShareLink: vi.fn(async (): Promise<unknown> => {
throw new Error("resolveShareLink not mocked for this test");
}),
ShareLinkError: class ShareLinkError extends Error {
kind: string;
constructor(message: string, kind: string) {
super(message);
this.kind = kind;
}
},
}));
vi.mock("@/api/session-sharing-api", () => api);
vi.mock("react-i18next", () => ({
useTranslation: () => ({ t: (key: string) => key }),
}));
vi.mock("react-xtermjs", () => ({
useXTerm: () => ({
instance: {
loadAddon: vi.fn(),
open: vi.fn(),
write: vi.fn(),
onData: vi.fn(),
},
ref: { current: document.createElement("div") },
}),
}));
vi.mock("@xterm/addon-fit", () => ({
FitAddon: class FitAddon {
fit() {}
},
}));
import SharedSessionView from "../../../features/session-sharing/SharedSessionView";
import {
registerSlotContribution,
resetActionRegistry,
} from "@/shell/action-registry";
import { REMOTE_DISPLAY_SLOT } from "@/features/remote-display/RemoteDisplay";
import { setPermissionsForTesting } from "@/hooks/use-permissions";
function setSearch(search: string) {
window.history.pushState({}, "", `/?${search}`);
}
beforeEach(() => {
setPermissionsForTesting([]);
registerSlotContribution(REMOTE_DISPLAY_SLOT, {
actionId: "fixture.display",
titleKey: "x",
kind: "component",
component: () => <div data-testid="remote-display" />,
});
api.resolveShareLink.mockReset();
api.resolveShareLink.mockImplementation(async () => {
throw new Error("resolveShareLink not mocked for this test");
});
});
afterEach(() => {
cleanup();
resetActionRegistry();
});
describe("SharedSessionView", () => {
it("shows a friendly error when no token is present in the URL", async () => {
setSearch("view=shared");
render(<SharedSessionView />);
await waitFor(() => {
expect(
screen.getByText("sessionSharing.guestView.linkInvalid"),
).toBeTruthy();
});
expect(api.resolveShareLink).not.toHaveBeenCalled();
});
it("shows a generic error when the link is invalid or expired", async () => {
setSearch("view=shared&token=bad");
api.resolveShareLink.mockRejectedValue(
new api.ShareLinkError("not found", "not-found"),
);
render(<SharedSessionView />);
await waitFor(() => {
expect(
screen.getByText("sessionSharing.guestView.linkInvalid"),
).toBeTruthy();
});
});
it("shows a rate-limit specific message on 429", async () => {
setSearch("view=shared&token=abc");
api.resolveShareLink.mockRejectedValue(
new api.ShareLinkError("slow down", "rate-limited"),
);
render(<SharedSessionView />);
await waitFor(() => {
expect(api.resolveShareLink).toHaveBeenCalledWith("abc");
});
await waitFor(() => {
expect(
screen.getByText("sessionSharing.guestView.rateLimited"),
).toBeTruthy();
});
});
it("renders the plugin remote display for a resolved rdp share", async () => {
setSearch("view=shared&token=abc");
api.resolveShareLink.mockResolvedValue({
protocol: "rdp",
permissionLevel: "read-only",
wsPath: "/plugin-ws/remote-desktop/display",
connectParams: { token: "guac-join-token" },
});
render(<SharedSessionView />);
await waitFor(() => {
expect(screen.getByTestId("remote-display")).toBeTruthy();
});
expect(
screen.getByText("sessionSharing.guestView.readOnlyBadge"),
).toBeTruthy();
});
});
+2 -3
View File
@@ -49,14 +49,13 @@ describe("RAIL_ITEMS", () => {
// the settings toggles, the sidebar titles and the mobile bar all read
// from this one list.
// "sftp" moved to the file-manager plugin's own registerRailItem,
// "port-forwarding" to the tunnels plugin's, and "serial" to the serial
// plugin's.
// "port-forwarding" to the tunnels plugin's, "serial" to the serial
// plugin's, and "collab" to the session-sharing plugin's.
expect(RAIL_ITEMS.map((item) => item.id)).toEqual([
"hosts",
"credentials",
"termix-id",
"connections",
"collab",
"quick-connect",
"ssh-tools",
"macros",