mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-28 06:05:24 +00:00
Compare commits
17
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a4d8a52928 | ||
|
|
3d92725ce6 | ||
|
|
73c15f7c58 | ||
|
|
96b8520fb4 | ||
|
|
7b7b17e31f | ||
|
|
53c4e5fe9c | ||
|
|
28cb1bc554 | ||
|
|
b691d4f7cb | ||
|
|
a65b4a5d48 | ||
|
|
abaf89b732 | ||
|
|
72d868afc7 | ||
|
|
d35304e107 | ||
|
|
f4d87ddd8d | ||
|
|
4d7385f51d | ||
|
|
d3fc32928b | ||
|
|
1533c6837a | ||
|
|
a89ccc6b07 |
No files matched your search
@@ -41,9 +41,15 @@ on:
|
||||
default: ""
|
||||
|
||||
jobs:
|
||||
# One image per plugin profile (docker/bundled-plugins.json). standard keeps
|
||||
# the plain tags; minimal and full add a suffix.
|
||||
build:
|
||||
runs-on: blacksmith-8vcpu-ubuntu-2404
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
profile: [standard, minimal, full]
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v7
|
||||
@@ -80,12 +86,17 @@ jobs:
|
||||
TAGS=()
|
||||
ALL_TAGS=()
|
||||
|
||||
SUFFIX=""
|
||||
if [ "${{ matrix.profile }}" != "standard" ]; then
|
||||
SUFFIX="-${{ matrix.profile }}"
|
||||
fi
|
||||
|
||||
if [ "$BUILD_TYPE" = "Production" ]; then
|
||||
TAGS+=("$VERSION" "latest")
|
||||
TAGS+=("$VERSION$SUFFIX" "latest$SUFFIX")
|
||||
elif [ "$BUILD_TYPE" = "Beta" ]; then
|
||||
TAGS+=("beta" "$VERSION")
|
||||
TAGS+=("beta$SUFFIX" "$VERSION$SUFFIX")
|
||||
else
|
||||
TAGS+=("dev-$VERSION")
|
||||
TAGS+=("dev-$VERSION$SUFFIX")
|
||||
fi
|
||||
|
||||
for tag in "${TAGS[@]}"; do
|
||||
@@ -124,6 +135,7 @@ jobs:
|
||||
tags: ${{ env.ALL_TAGS }}
|
||||
build-args: |
|
||||
BUILDKIT_CONTEXT_KEEP_GIT_DIR=1
|
||||
PLUGIN_PROFILE=${{ matrix.profile }}
|
||||
labels: |
|
||||
org.opencontainers.image.source=https://github.com/${{ github.repository }}
|
||||
org.opencontainers.image.revision=${{ env.SOURCE_SHA }}
|
||||
|
||||
@@ -161,9 +161,10 @@ jobs:
|
||||
echo "sha=$SHA" >> "$GITHUB_OUTPUT"
|
||||
echo "prev_ref=$PREV" >> "$GITHUB_OUTPUT"
|
||||
|
||||
# Translates new or changed strings with the Termix LLM server and commits
|
||||
# them to the dev branch, so the beta or stable build includes them. If the
|
||||
# server is down it warns and the release goes on with what is there.
|
||||
# Translates new or changed strings with the Termix LLM server and pins the
|
||||
# bundled plugins to their newest registry releases, then commits both to the
|
||||
# dev branch so the beta or stable build includes them. If the server is down
|
||||
# it warns and the release goes on with what is there.
|
||||
translate:
|
||||
needs: [prep]
|
||||
if: ${{ needs.prep.outputs.skip != 'true' && needs.prep.outputs.mode != 'Overwrite release' }}
|
||||
@@ -191,19 +192,26 @@ jobs:
|
||||
languages: src/ui/locales/languages.json
|
||||
api-key: ${{ secrets.TERMIX_LLM_API_KEY }}
|
||||
|
||||
- name: Commit translations
|
||||
- name: Install dependencies
|
||||
run: npm ci --ignore-scripts
|
||||
|
||||
# Newest stable plugin release whose engine.termix allows this version.
|
||||
- name: Pin bundled plugins
|
||||
run: node scripts/pin-bundled-plugins.cjs --all --core-version "${{ needs.prep.outputs.version }}"
|
||||
|
||||
- name: Commit translations and plugin pins
|
||||
id: commit
|
||||
run: |
|
||||
git add src/ui/locales
|
||||
git add src/ui/locales docker/bundled-plugins.json
|
||||
if git diff --cached --quiet; then
|
||||
echo "No translation changes."
|
||||
elif [ "${{ needs.prep.outputs.mode }}" = "Dry run" ]; then
|
||||
echo "DRY RUN: would commit these translation changes:"
|
||||
echo "DRY RUN: would commit these translation and pin changes:"
|
||||
git --no-pager diff --cached --stat
|
||||
else
|
||||
git config user.name "LukeGus"
|
||||
git config user.email "bugattiguy527@gmail.com"
|
||||
git commit -m "chore: update translations"
|
||||
git commit -m "chore: update translations and plugin pins"
|
||||
git push origin HEAD:"${{ needs.prep.outputs.dev_branch }}"
|
||||
fi
|
||||
echo "sha=$(git rev-parse HEAD)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
@@ -1,5 +1,36 @@
|
||||
# Changelog
|
||||
|
||||
## 26.10.6
|
||||
|
||||
### Added
|
||||
|
||||
- The mobile app can sign in through your browser with any login method, including passkeys and security keys
|
||||
|
||||
## 26.10.5
|
||||
|
||||
### Added
|
||||
|
||||
- Safe mode: start the server with TERMIX_SAFE_MODE=1 to run only layout and theme plugins, so a broken plugin can be turned off
|
||||
- TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS lets plugin registries live on a private address, like a registry in your LAN
|
||||
- Plugin registry browsing and downloads use HTTP_PROXY and HTTPS_PROXY when they are set
|
||||
- Docker image sizes: the default image now ships the most used plugins, the minimal tag ships only the look plugins and the full tag ships every official plugin
|
||||
- Plugins an older image shipped and you had on are downloaded from the registry on the first start of a smaller image, so nothing goes missing
|
||||
|
||||
### Changed
|
||||
|
||||
- Card grids in the Plugins tab and in plugins can show Auto (as many as fit) or a set number of cards per row
|
||||
|
||||
### Fixed
|
||||
|
||||
- The macOS app asks for Local Network access, so it can reach servers on your LAN
|
||||
- The desktop app can change the connection origin of a host shared with you, instead of failing to save
|
||||
|
||||
## 26.10.4
|
||||
|
||||
### Fixed
|
||||
|
||||
- Pin classic layout plugin (fixes proxmox install)
|
||||
|
||||
## 26.10.3
|
||||
|
||||
### Added
|
||||
@@ -30,6 +61,7 @@
|
||||
- Plugins can add a panel that sits beside a host tab, like a terminal. You can open, resize and move it
|
||||
- The desktop app can link to a server that requires a client certificate (mutual TLS). It uses a PFX or P12 file for sync and the certificate in your system store for the app window
|
||||
- Plugins can show a web page in a native view in the desktop app, for sites that do not load in an iframe
|
||||
- The desktop app draws its own title bar in the colors of your theme instead of the native white one
|
||||
|
||||
### Changed
|
||||
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
cask "termix" do
|
||||
version "26.10.2"
|
||||
sha256 "9df1850b5f75a3c0a1b3876847d46b7b4ff993aa1e50da55f4c88819308ba223"
|
||||
version "26.10.5"
|
||||
sha256 "808c467c5c34402193c7950ce61df0fa0445782f276348cf31ef235a6427d21c"
|
||||
|
||||
url "https://github.com/Termix-SSH/Termix/releases/download/v#{version}/termix_macos_universal_dmg.dmg"
|
||||
name "Termix"
|
||||
|
||||
@@ -66,7 +66,9 @@ Plugins add everything else. The official ones ship with Termix, and admins can
|
||||
| [Automations](https://github.com/Termix-SSH/Plugin-Automations) | Run steps on your hosts on a schedule or when something happens. |
|
||||
| [Classic Layout](https://github.com/Termix-SSH/Plugin-Classic-Layout) | The classic Termix layout with an icon rail, sidebar, tab bar and dock. |
|
||||
| [Classic Themes](https://github.com/Termix-SSH/Plugin-Classic-Themes) | Light, dark and seven more color themes for Termix. |
|
||||
| [Cloud Providers](https://github.com/Termix-SSH/Plugin-Cloud-Providers) | Add hosts from AWS, Azure, Google Cloud, DigitalOcean, Hetzner and other clouds, and keep them in sync. |
|
||||
| [Credential Tools](https://github.com/Termix-SSH/Plugin-Credential-Tools) | Generate SSH keys, check them and copy a public key to a host. |
|
||||
| [Databases](https://github.com/Termix-SSH/Plugin-Databases) | Browse and edit MySQL, MariaDB, PostgreSQL and SQLite databases on your hosts from one tab. |
|
||||
| [Docker](https://github.com/Termix-SSH/Plugin-Docker) | Manage Docker and Podman containers on your hosts over SSH, with logs, stats and a console. |
|
||||
| [File Manager](https://github.com/Termix-SSH/Plugin-File-Manager) | Browse, edit and move files over SFTP, including straight from one server to another. |
|
||||
| [Fleets](https://github.com/Termix-SSH/Plugin-Fleets) | Group hosts into fleets and run commands, package actions and file transfers on all of them at once. |
|
||||
@@ -76,6 +78,7 @@ Plugins add everything else. The official ones ship with Termix, and admins can
|
||||
| [Host Status](https://github.com/Termix-SSH/Plugin-Host-Status) | Shows if each host is online with a dot in the host list, checked by connecting to its port. |
|
||||
| [Hosts Config](https://github.com/Termix-SSH/Plugin-Hosts-Config) | Keep hosts, folders and sharing in a YAML or JSON file. Termix loads them as read only hosts and reloads when the file changes. |
|
||||
| [Import and Export](https://github.com/Termix-SSH/Plugin-Import-Export) | Import hosts from a JSON file or an SSH config file and export them to share or back up. |
|
||||
| [Kubernetes](https://github.com/Termix-SSH/Plugin-Kubernetes) | Manage Kubernetes clusters from your hosts over SSH, with logs, metrics, YAML and a shell. |
|
||||
| [LDAP](https://github.com/Termix-SSH/Plugin-LDAP) | Sign in with your LDAP or Active Directory username and password. |
|
||||
| [Login Security](https://github.com/Termix-SSH/Plugin-Login-Security) | Sign people out when idle, limit session length, turn off remember me and require a second factor at login. |
|
||||
| [Network Topology](https://github.com/Termix-SSH/Plugin-Network-Topology) | Draws your hosts and the links between them as a live, interactive graph. |
|
||||
@@ -83,10 +86,14 @@ Plugins add everything else. The official ones ship with Termix, and admins can
|
||||
| [Passkeys](https://github.com/Termix-SSH/Plugin-WebAuthn) | Sign in with a passkey or security key instead of a password. |
|
||||
| [Proxmox](https://github.com/Termix-SSH/Plugin-Proxmox) | Import Proxmox VE guests as hosts, keep them in sync and watch node stats. |
|
||||
| [Remote Desktop](https://github.com/Termix-SSH/Plugin-Remote-Desktop) | RDP, VNC and Telnet sessions in your browser, with clipboard, file transfer, sharing and recording. |
|
||||
| [Reverse Proxy](https://github.com/Termix-SSH/Plugin-Reverse-Proxy) | Reverse proxy for TCP, UDP, HTTP and HTTPS with free certificates and Termix login, managed per host. |
|
||||
| [Samba Shares](https://github.com/Termix-SSH/Plugin-Samba) | Create and manage Samba (SMB) file shares, users and permissions on your hosts from one tab. |
|
||||
| [Secret Sources](https://github.com/Termix-SSH/Plugin-Secret-Sources) | Pull host passwords and keys from 1Password when you connect instead of storing them in Termix. |
|
||||
| [Serial](https://github.com/Termix-SSH/Plugin-Serial) | Open a serial console to a router, switch or other device plugged into your computer. |
|
||||
| [Services](https://github.com/Termix-SSH/Plugin-Service-Manager) | Manage services, timers and logs on your hosts over SSH. |
|
||||
| [Session Recording](https://github.com/Termix-SSH/Plugin-Session-Recording) | Record terminal and remote desktop sessions and play them back or download them later. |
|
||||
| [Session Sharing](https://github.com/Termix-SSH/Plugin-Session-Sharing) | Share live sessions by link or with another user, and present sessions to a group in meeting rooms. |
|
||||
| [Simple Layout](https://github.com/Termix-SSH/Plugin-Simple-Layout) | A simple Termix layout for small setups with a top bar, a Home screen and only the basics. |
|
||||
| [Single sign-on](https://github.com/Termix-SSH/Plugin-SSO) | Sign in with any OpenID Connect provider, GitHub or Google. |
|
||||
| [Snippets](https://github.com/Termix-SSH/Plugin-Snippets) | Save the commands you run often and run them in a terminal or on many hosts in one click. |
|
||||
| [SSH Terminal](https://github.com/Termix-SSH/Plugin-SSH-Terminal) | SSH terminal sessions with tabs, split screen, history, macros and a local terminal in the desktop app. |
|
||||
|
||||
+15
-4
@@ -34,9 +34,20 @@ WORKDIR /app
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN npm run build:backend:core
|
||||
|
||||
# Stage 3b: Stage the bundled plugins for one profile (minimal, standard or
|
||||
# full, see docker/bundled-plugins.json). Only this stage and the final one
|
||||
# differ between profiles, so the other stages are built once.
|
||||
FROM deps AS plugins
|
||||
WORKDIR /app
|
||||
ARG PLUGIN_PROFILE=standard
|
||||
COPY scripts/build-plugins.cjs ./scripts/build-plugins.cjs
|
||||
COPY scripts/lib/bundled-plugins.cjs ./scripts/lib/bundled-plugins.cjs
|
||||
COPY docker/bundled-plugins.json ./docker/bundled-plugins.json
|
||||
# Bundled plugin downloads show in the plugin store, so keep them between builds.
|
||||
RUN --mount=type=cache,target=/app/node_modules/.cache/termix-bundled-plugins \
|
||||
npm run build:backend
|
||||
node scripts/build-plugins.cjs --profile "$PLUGIN_PROFILE"
|
||||
|
||||
# Stage 4: Download OPKSSH binary for the target platform so the image works offline
|
||||
FROM node:24-slim AS opkssh-downloader
|
||||
@@ -117,9 +128,9 @@ COPY --chown=node:node --from=frontend-builder /app/dist /app/html
|
||||
|
||||
COPY --chown=node:node --from=production-deps /app/node_modules /app/node_modules
|
||||
COPY --chown=node:node --from=backend-builder /app/dist/backend ./dist/backend
|
||||
# Plugins pinned in docker/bundled-plugins.json, resolved as dist/plugins by
|
||||
# getBundledPluginsDir().
|
||||
COPY --chown=node:node --from=backend-builder /app/dist/plugins ./dist/plugins
|
||||
# Plugins of the chosen profile pinned in docker/bundled-plugins.json, resolved
|
||||
# as dist/plugins by getBundledPluginsDir().
|
||||
COPY --chown=node:node --from=plugins /app/dist/plugins ./dist/plugins
|
||||
# Target of node_modules/@termix-ssh/plugin-sdk, which core and the plugins import.
|
||||
COPY --chown=node:node --from=backend-builder /app/packages/plugin-sdk/package.json ./packages/plugin-sdk/package.json
|
||||
COPY --chown=node:node --from=backend-builder /app/packages/plugin-sdk/dist ./packages/plugin-sdk/dist
|
||||
|
||||
+190
-56
@@ -3,50 +3,85 @@
|
||||
{
|
||||
"id": "acme-ssl",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-ACME-SSL/releases/download/v1.0.2/acme-ssl-1.0.2.tmxplug",
|
||||
"sha256": "157d0f96dc42136ff64e618b6904db7862079cd31c1f1cf5f19846b1d127b00f"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-ACME-SSL/releases/download/v1.1.0/acme-ssl-1.1.0.tmxplug",
|
||||
"sha256": "fb75541fae110007b45ed69d58aa4b9b6f6a79b6b1b762c6e54b635aa7cb6e4a",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "ai",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-AI/releases/download/v1.1.0/ai-1.1.0.tmxplug",
|
||||
"sha256": "71dda6940d62c9eede7821bbac21e99443fbc08728a47759f215e2416f1d162f"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-AI/releases/download/v1.3.0/ai-1.3.0.tmxplug",
|
||||
"sha256": "87ad17324cec6036dc224135fee342250c37413dccb2963f5f6b554d4ab8f5a6",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "alerts",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Alerts/releases/download/v1.0.2/alerts-1.0.2.tmxplug",
|
||||
"sha256": "50768e77019276343a5d162c85d081659fb89d1cc3733ac45cd0db4436918faa",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Alerts/releases/download/v1.1.0/alerts-1.1.0.tmxplug",
|
||||
"sha256": "a7ce9e20ce3c15f77c15479b4901563adf3c793e24a3aacd7226950491f0434c",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "audit-tools",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Audit-Tools/releases/download/v1.0.0/audit-tools-1.0.0.tmxplug",
|
||||
"sha256": "131479c294d692b1c0ed4d6cec273730a3a67a28ecd44825ffd36bade9aa863b",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "automations",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Automations/releases/download/v1.0.2/automations-1.0.2.tmxplug",
|
||||
"sha256": "674eb04276b4a0c77c794b30647f8680218a78de8d52b73e99ec900cc1b3fdb3"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Automations/releases/download/v1.2.0/automations-1.2.0.tmxplug",
|
||||
"sha256": "2ec9c718d73a094be3b59121aea049f0237e5783f53d193c4ea24a524584aeea",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "classic-layout",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Classic-Layout/releases/download/v1.0.0/classic-layout-1.0.0.tmxplug",
|
||||
"sha256": "3a51cc9a4c966478f2ebfd58dbbe025ff0ebe8bbdcd3ba73156151e555f62dec",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Classic-Layout/releases/download/v1.0.2/classic-layout-1.0.2.tmxplug",
|
||||
"sha256": "cf54f9b2e81c33b7e58cd3a21e203805f08ba37b3bc78412a08eb21b9fef8f14",
|
||||
"tier": "minimal",
|
||||
"defaultLook": true
|
||||
},
|
||||
{
|
||||
"id": "classic-themes",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Classic-Themes/releases/download/v1.0.0/classic-themes-1.0.0.tmxplug",
|
||||
"sha256": "17561e569811476ea4e1f7cdf8d9afbe33edf061bd09f6b05699b44968da41ad",
|
||||
"sha256": "919283f95701d41727c826637a7d349bd6a646abd61f9ac9017149bd0bee782c",
|
||||
"tier": "minimal",
|
||||
"defaultLook": true
|
||||
},
|
||||
{
|
||||
"id": "cloud-providers",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Cloud-Providers/releases/download/v1.1.0/cloud-providers-1.1.0.tmxplug",
|
||||
"sha256": "7f61eafc3b99bdf1328fffa95791db1d27f8e1b683e5a5925603b5840057a9c7",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "credential-tools",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Credential-Tools/releases/download/v1.0.0/credential-tools-1.0.0.tmxplug",
|
||||
"sha256": "413eff710b5c832a2575a890bbab1c90d28ea55f10cd7a7b94b851d51dd77dce",
|
||||
"tier": "standard"
|
||||
},
|
||||
{
|
||||
"id": "databases",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Databases/releases/download/v1.1.0/databases-1.1.0.tmxplug",
|
||||
"sha256": "4d9504cde705688a6f1f7706139d4e4c49b2276eccc67538fdee8251f29920b8",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "docker",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Docker/releases/download/v1.0.2/docker-1.0.2.tmxplug",
|
||||
"sha256": "0e1c722682faac6a027fd9b01e6910eb53ce5acb13332c6c8d8868554f3701ab",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Docker/releases/download/v1.2.1/docker-1.2.1.tmxplug",
|
||||
"sha256": "b2ca797465d88cfb549a04c3f0161708669def22a5ca73cb107879847c2db8ff",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
@@ -55,8 +90,9 @@
|
||||
{
|
||||
"id": "file-manager",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-File-Manager/releases/download/v1.0.3/file-manager-1.0.3.tmxplug",
|
||||
"sha256": "250e9779a6b1caf11721f1ee2baf76655ae6e52d963e894d8db84eb9677cf0b3",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-File-Manager/releases/download/v1.1.1/file-manager-1.1.1.tmxplug",
|
||||
"sha256": "ebba0b7d14facb3354f22a00e059e9f5a69e233458cb24985bf4ed5e5f8d2abd",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
@@ -66,91 +102,167 @@
|
||||
"id": "fleets",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Fleets/releases/download/v1.0.2/fleets-1.0.2.tmxplug",
|
||||
"sha256": "50dab38e1c6c95fdb4d0544ce50cdf84dae84789e64aa34ea9d04fdac3a38c59"
|
||||
"sha256": "50dab38e1c6c95fdb4d0544ce50cdf84dae84789e64aa34ea9d04fdac3a38c59",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "homepage",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Homepage/releases/download/v1.0.2/homepage-1.0.2.tmxplug",
|
||||
"sha256": "88cdea8ba8f458fcf124e7ab97e3d419896d8d22ffa9a372af34f1818872975b"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Homepage/releases/download/v1.1.0/homepage-1.1.0.tmxplug",
|
||||
"sha256": "5a9d5d2cc337fcee5590ea957e35ddeea5a71596aeb59410bf1420065b9b5b00",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "host-metrics",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Host-Metrics/releases/download/v1.0.3/host-metrics-1.0.3.tmxplug",
|
||||
"sha256": "8f6022568349fc4318d509781bdb9d5b40973c010a9e27f720eed6baf68b881e",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Host-Metrics/releases/download/v1.2.0/host-metrics-1.2.0.tmxplug",
|
||||
"sha256": "8522cd23b558c3209821cee6d177daeb80f439b8ff652c577c5e4955315cc7a3",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "host-status",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Host-Status/releases/download/v1.0.0/host-status-1.0.0.tmxplug",
|
||||
"sha256": "1ba62577dc7373a2a2787bab7efdb89b544a30a8003b1de91ce51f372fc4f170",
|
||||
"tier": "standard"
|
||||
},
|
||||
{
|
||||
"id": "hosts-config",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Hosts-Config/releases/download/v1.0.0/hosts-config-1.0.0.tmxplug",
|
||||
"sha256": "60a2b2a6d9ba13bad12a511c93af70a30a10fbc560066b6419acf533d806a3ad",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "import-export",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Import-Export/releases/download/v1.0.0/import-export-1.0.0.tmxplug",
|
||||
"sha256": "6670b6c147e81eed0ddfd249f9a7c9564f1ab50e45f2771161d2e30c47f6fd58",
|
||||
"tier": "standard"
|
||||
},
|
||||
{
|
||||
"id": "kubernetes",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Kubernetes/releases/download/v1.0.1/kubernetes-1.0.1.tmxplug",
|
||||
"sha256": "31d6b200579d326d07244712713ae291ff473270d44b478a884d07c863a394f0",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "ldap",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-LDAP/releases/download/v1.0.2/ldap-1.0.2.tmxplug",
|
||||
"sha256": "9ef269ad281f1c68cea53e0d43ccb7a5d4f949f11b30b22eac3d01047b20eb03"
|
||||
"sha256": "9ef269ad281f1c68cea53e0d43ccb7a5d4f949f11b30b22eac3d01047b20eb03",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "login-security",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Login-Security/releases/download/v1.0.0/login-security-1.0.0.tmxplug",
|
||||
"sha256": "b21dff5722e72a02022d563ef27130e8b56a53e273f1668fade4ec7d030374aa",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "network-topology",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Network-Topology/releases/download/v1.0.2/network-topology-1.0.2.tmxplug",
|
||||
"sha256": "8d32340a0d0f9674b872da5d3d53e90f529b80dfe0d73ab294eed00e565fbb56"
|
||||
"sha256": "8d32340a0d0f9674b872da5d3d53e90f529b80dfe0d73ab294eed00e565fbb56",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "opkssh",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-OPKSSH/releases/download/v1.0.2/opkssh-1.0.2.tmxplug",
|
||||
"sha256": "4bb8f1ac5d39bd18ac3d0fe82ddbf2f26ab4c01bd75e6f7a073d65c2e9aef219"
|
||||
"sha256": "4bb8f1ac5d39bd18ac3d0fe82ddbf2f26ab4c01bd75e6f7a073d65c2e9aef219",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "proxmox",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Proxmox/releases/download/v1.0.2/proxmox-1.0.2.tmxplug",
|
||||
"sha256": "b92be2644b0c8121732103b922069a6cb3cf00caad4e6549f7a8cb471bda5e4e"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Proxmox/releases/download/v1.1.0/proxmox-1.1.0.tmxplug",
|
||||
"sha256": "8937d239ad40033d69fba59085fe8896ee25c61951c21f66ff98531fd4c63cbf",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "remote-desktop",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Remote-Desktop/releases/download/v1.1.0/remote-desktop-1.1.0.tmxplug",
|
||||
"sha256": "6f74f1d26f91a43b2d2203417d744211f366c335d5fff7bed34bfce33874dd01",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Remote-Desktop/releases/download/v1.2.1/remote-desktop-1.2.1.tmxplug",
|
||||
"sha256": "ad244f31016f0ea5df5c303bf6f48af35c6c8e52b12098d381c8296626b73de7",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "reverse-proxy",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Reverse-Proxy/releases/download/v1.1.0/reverse-proxy-1.1.0.tmxplug",
|
||||
"sha256": "c8a9851da7ca6291c1f47cf6ab235da5057455a86b4ed0dc1c1a3026afb30aa7",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "samba",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Samba/releases/download/v1.0.0/samba-1.0.0.tmxplug",
|
||||
"sha256": "6e131ccdca998a9d0802becdd439a88305b64fcd7f07335bec9c7ed6791c0f53",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "secret-sources",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Secret-Sources/releases/download/v1.0.2/secret-sources-1.0.2.tmxplug",
|
||||
"sha256": "82e2b1e95b0837dd3e5fee277be4eea2d1ce68567b0e204941c48150f415d134"
|
||||
"sha256": "82e2b1e95b0837dd3e5fee277be4eea2d1ce68567b0e204941c48150f415d134",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "serial",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Serial/releases/download/v1.0.2/serial-1.0.2.tmxplug",
|
||||
"sha256": "6ede7e8726a7312429473f34a46f93ba6657c5b7ebc12bed18f80ec62c211715",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": "desktop",
|
||||
"consent": false
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "service-manager",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Service-Manager/releases/download/v1.1.0/service-manager-1.1.0.tmxplug",
|
||||
"sha256": "82b1c70abd97ed535f217535c667fe6c48e5e01e2bf8037a89b58b80d35206bf",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "session-recording",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Session-Recording/releases/download/v1.0.2/session-recording-1.0.2.tmxplug",
|
||||
"sha256": "55ace6897710ce9a63f24e3d736a9e533cac557be0f3d98974956c94cf417d1c"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Session-Recording/releases/download/v1.1.0/session-recording-1.1.0.tmxplug",
|
||||
"sha256": "31cd78d67e061242f8776849a2fae5f84ab48c7c765d487b32c5e1693c54b46a",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "session-sharing",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Session-Sharing/releases/download/v1.0.2/session-sharing-1.0.2.tmxplug",
|
||||
"sha256": "6408e7949a9549ac5ec94b35205729099138e730df1598d50f4bb618d8d90804"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Session-Sharing/releases/download/v1.1.0/session-sharing-1.1.0.tmxplug",
|
||||
"sha256": "2988b39221d93b3dbc5e2a81e104e5dc01ce264afb1e66df3407492658ab9fdc",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "simple-layout",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Simple-Layout/releases/download/v1.0.1/simple-layout-1.0.1.tmxplug",
|
||||
"sha256": "838f08050335b44b62295b87006b50d1db1029699bfe6a35fa75808d4aea2cde",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "snippets",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Snippets/releases/download/v1.0.2/snippets-1.0.2.tmxplug",
|
||||
"sha256": "cc1f5d74cf97f9a9c8f800fccf481c8a000e6fa516bc260ce24a7249d4f4c8e5",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Snippets/releases/download/v1.1.0/snippets-1.1.0.tmxplug",
|
||||
"sha256": "e2d7d1ebe5bdf2986ffb4961ac6f6d32b392b02c30a64a333a7eeb2ce6a46bb3",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
@@ -159,8 +271,9 @@
|
||||
{
|
||||
"id": "ssh-terminal",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-SSH-Terminal/releases/download/v1.0.3/ssh-terminal-1.0.3.tmxplug",
|
||||
"sha256": "bc288bd843e37b64bcda7462d175039147b75dc6de8866769e4a938036a9d023",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-SSH-Terminal/releases/download/v1.1.1/ssh-terminal-1.1.1.tmxplug",
|
||||
"sha256": "5cfb381a2de10b7a6fab108d79645bb1e6e7316fb5e4150c4529a3e76a2193d8",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
@@ -169,8 +282,9 @@
|
||||
{
|
||||
"id": "sso",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-SSO/releases/download/v1.0.3/sso-1.0.3.tmxplug",
|
||||
"sha256": "87b03c0789d981dbc806162d73dfcc2c624150375277efd2ae40ab9d7657d48e",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-SSO/releases/download/v1.0.4/sso-1.0.4.tmxplug",
|
||||
"sha256": "2aad33177085fbc92fe06cd007facffbfc8f42f9c9fa688ad5f37d68f62093d9",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": false,
|
||||
"consent": false,
|
||||
@@ -181,19 +295,29 @@
|
||||
"id": "step-ca",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Step-CA/releases/download/v1.0.2/step-ca-1.0.2.tmxplug",
|
||||
"sha256": "685b644fe44c2d3fa007baee16e8ea8a7d5204f039ebc8aa65e8093ad93adf8a"
|
||||
"sha256": "685b644fe44c2d3fa007baee16e8ea8a7d5204f039ebc8aa65e8093ad93adf8a",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "sync",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Sync/releases/download/v1.0.1/sync-1.0.1.tmxplug",
|
||||
"sha256": "66a301fd04fb8d2a3ece18dfb230069cf78e1138ee78941dc511dfbd8ee4f91e",
|
||||
"tier": "standard"
|
||||
},
|
||||
{
|
||||
"id": "tailscale",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Tailscale/releases/download/v1.0.2/tailscale-1.0.2.tmxplug",
|
||||
"sha256": "5c7b00d6b6b0186d833302e39a9d31b92ea92d4542e9e2dab550b95837a59d97"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Tailscale/releases/download/v1.1.0/tailscale-1.1.0.tmxplug",
|
||||
"sha256": "8784a77a1fc1b0011d8243d9520574300df31bc40c31f86339868f4c9b76d1bf",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "telemetry",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Telemetry/releases/download/v1.0.2/telemetry-1.0.2.tmxplug",
|
||||
"sha256": "5ffdc58b05cd8b37fd0a207f99d2d3a256164130c950032501c499f869edb9ec",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": true
|
||||
@@ -203,19 +327,22 @@
|
||||
"id": "termix-identity",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Termix-Identity/releases/download/v1.0.2/termix-identity-1.0.2.tmxplug",
|
||||
"sha256": "ac6c90a48b4f1e9cff6773a5fd267b2bf7319d2fc7e2aa2cd4004cec82f0f927"
|
||||
"sha256": "ac6c90a48b4f1e9cff6773a5fd267b2bf7319d2fc7e2aa2cd4004cec82f0f927",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "tmux-monitor",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Tmux-Monitor/releases/download/v1.0.3/tmux-monitor-1.0.3.tmxplug",
|
||||
"sha256": "f152d64f433d3f1de7c3fdf172e752ea7e333909f0fdda77336a6b8dddb9f242"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Tmux-Monitor/releases/download/v1.1.0/tmux-monitor-1.1.0.tmxplug",
|
||||
"sha256": "3cdc54a34e1ca30c4e3c217bbc612e40ef3cd3e4d5de704ea92d914b32d98006",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "totp",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-TOTP/releases/download/v1.0.2/totp-1.0.2.tmxplug",
|
||||
"sha256": "94a0772660fa8e4dfd9afc15b68d5bc9fe02fe28a1acfd35e65a57c304d460c0",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
@@ -224,8 +351,9 @@
|
||||
{
|
||||
"id": "tunnels",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Tunnels/releases/download/v1.0.3/tunnels-1.0.3.tmxplug",
|
||||
"sha256": "d0de9e59ccc9e1a0f2817dd1ec9951021f2d7e89304894bb1e8cefd65aebff0b",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Tunnels/releases/download/v1.2.1/tunnels-1.2.1.tmxplug",
|
||||
"sha256": "2871a8d31854e1a31416c4afe5839099a4c489e34d9d31573659f73b2515f159",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
@@ -235,31 +363,36 @@
|
||||
"id": "vault",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Vault/releases/download/v1.0.2/vault-1.0.2.tmxplug",
|
||||
"sha256": "48ef402d030912a836489edf0fdfcaf7929cbd67c21f16a2079cb4925134cc28"
|
||||
"sha256": "48ef402d030912a836489edf0fdfcaf7929cbd67c21f16a2079cb4925134cc28",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "wake-on-lan",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Wake-On-LAN/releases/download/v1.0.2/wake-on-lan-1.0.2.tmxplug",
|
||||
"sha256": "3e9cf9a133b4dd96ec5f2b9fbf2d6a3ff7e08f8dfbf1e86b8d45de0c2f024f42"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Wake-On-LAN/releases/download/v1.1.0/wake-on-lan-1.1.0.tmxplug",
|
||||
"sha256": "1afb708c12631ededec40938aed3ab587bc9a519215fa5e93350b1f0a843d2a8",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "warpgate",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Warpgate/releases/download/v1.0.2/warpgate-1.0.2.tmxplug",
|
||||
"sha256": "5c2c1c9aef40dbbf98424d02303f2ee77e6e869334247881e8aa0fcd8c415b47"
|
||||
"sha256": "5c2c1c9aef40dbbf98424d02303f2ee77e6e869334247881e8aa0fcd8c415b47",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "web-endpoint",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Web-Endpoint/releases/download/v1.0.2/web-endpoint-1.0.2.tmxplug",
|
||||
"sha256": "0326edb1052d1debd083004c2dd1711d21a902cfacb55ce74d1a8856a5122477"
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Web-Endpoint/releases/download/v1.1.0/web-endpoint-1.1.0.tmxplug",
|
||||
"sha256": "79e691abc456b17c8ce651017b47097a7ff71e94267e668341548a05b911a92c",
|
||||
"tier": "full"
|
||||
},
|
||||
{
|
||||
"id": "webauthn",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-WebAuthn/releases/download/v1.0.2/webauthn-1.0.2.tmxplug",
|
||||
"sha256": "8269f6e407897332648c8526b65383c4db071ea782bf1e58aa7c7c00627f3f4b",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-WebAuthn/releases/download/v1.1.0/webauthn-1.1.0.tmxplug",
|
||||
"sha256": "83a61a530db0273f9fef2080d6aa027a82ef8374fb4e0f158a8559a2770299de",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
@@ -268,8 +401,9 @@
|
||||
{
|
||||
"id": "workspaces",
|
||||
"source": "tmxplug",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Workspaces/releases/download/v1.0.2/workspaces-1.0.2.tmxplug",
|
||||
"sha256": "97519a01fbb2eb2eecf21d7b9ab9028c740457bcff9fc6b075fb6facbc5ccb6b",
|
||||
"url": "https://github.com/Termix-SSH/Plugin-Workspaces/releases/download/v1.1.0/workspaces-1.1.0.tmxplug",
|
||||
"sha256": "7189d767c3f7cddfb59366f6cceeca27a0b29e41da1dcc89d57a25317a0fe4bf",
|
||||
"tier": "standard",
|
||||
"onboarding": {
|
||||
"recommended": true,
|
||||
"consent": false
|
||||
|
||||
@@ -128,6 +128,10 @@
|
||||
"category": "public.app-category.developer-tools",
|
||||
"hardenedRuntime": true,
|
||||
"gatekeeperAssess": false,
|
||||
"extendInfo": {
|
||||
"NSLocalNetworkUsageDescription": "Termix connects to servers and hosts on your local network.",
|
||||
"NSBonjourServices": ["_http._tcp", "_https._tcp", "_ssh._tcp"]
|
||||
},
|
||||
"entitlements": "packaging/build/entitlements.mac.plist",
|
||||
"entitlementsInherit": "packaging/build/entitlements.mac.inherit.plist",
|
||||
"type": "distribution",
|
||||
@@ -153,6 +157,8 @@
|
||||
"artifactName": "termix_macos_${arch}_mas.${ext}",
|
||||
"extendInfo": {
|
||||
"ITSAppUsesNonExemptEncryption": false,
|
||||
"NSLocalNetworkUsageDescription": "Termix connects to servers and hosts on your local network.",
|
||||
"NSBonjourServices": ["_http._tcp", "_https._tcp", "_ssh._tcp"],
|
||||
"NSAppleEventsUsageDescription": "Termix needs access to control other applications for terminal operations."
|
||||
}
|
||||
},
|
||||
|
||||
@@ -31,6 +31,10 @@ const { quitApp } = require("./app-quit.cjs");
|
||||
const { selectLinuxPasswordStore } = require("./linux-password-store.cjs");
|
||||
// Saved by the file manager after the user picks an editor in a file dialog.
|
||||
const EXTERNAL_EDITOR_SETTING = "fileManager.externalEditorPath";
|
||||
|
||||
// The height of the title bar the app draws itself. The renderer uses the
|
||||
// same number, so the bar and the window controls always line up.
|
||||
const TITLE_BAR_HEIGHT = 40;
|
||||
const { isExternalLoginUrl, isCallbackPort } = require("./external-login.cjs");
|
||||
|
||||
// The main process's Node.js networking (the global `fetch`) only
|
||||
@@ -1327,12 +1331,27 @@ function createWindow() {
|
||||
? "macOS"
|
||||
: "Linux";
|
||||
|
||||
const isMac = process.platform === "darwin";
|
||||
|
||||
mainWindow = new BrowserWindow({
|
||||
width: 1200,
|
||||
height: 800,
|
||||
minWidth: 800,
|
||||
minHeight: 600,
|
||||
title: "Termix",
|
||||
// The app draws its own title bar so it follows the active theme. macOS
|
||||
// keeps the traffic lights on top of it, Windows and Linux get the
|
||||
// native controls as an overlay whose colors the renderer keeps in sync.
|
||||
titleBarStyle: isMac ? "hiddenInset" : "hidden",
|
||||
...(isMac
|
||||
? { trafficLightPosition: { x: 14, y: 16 } }
|
||||
: {
|
||||
titleBarOverlay: {
|
||||
color: "#0f0f14",
|
||||
symbolColor: "#e6e6ea",
|
||||
height: TITLE_BAR_HEIGHT,
|
||||
},
|
||||
}),
|
||||
icon: path.join(
|
||||
appRoot,
|
||||
"public",
|
||||
@@ -1545,6 +1564,16 @@ function createWindow() {
|
||||
}
|
||||
});
|
||||
|
||||
const sendTitleBarVisible = () => {
|
||||
if (!mainWindow || mainWindow.isDestroyed()) return;
|
||||
mainWindow.webContents.send(
|
||||
"title-bar-visible-changed",
|
||||
titleBarVisible(mainWindow),
|
||||
);
|
||||
};
|
||||
mainWindow.on("enter-full-screen", sendTitleBarVisible);
|
||||
mainWindow.on("leave-full-screen", sendTitleBarVisible);
|
||||
|
||||
mainWindow.on("closed", () => {
|
||||
embeddedViews.destroyAll();
|
||||
mainWindow = null;
|
||||
@@ -1574,10 +1603,50 @@ ipcMain.handle("get-app-version", () => {
|
||||
return app.getVersion();
|
||||
});
|
||||
|
||||
/** The window an IPC call came from, so the main window and the extra
|
||||
* windows (isolated views, sign-in) can each answer for themselves. */
|
||||
function windowFor(event) {
|
||||
const win = BrowserWindow.fromWebContents(event.sender);
|
||||
if (win && !win.isDestroyed()) return win;
|
||||
if (mainWindow && !mainWindow.isDestroyed()) return mainWindow;
|
||||
return null;
|
||||
}
|
||||
|
||||
ipcMain.handle("get-platform", () => {
|
||||
return process.platform;
|
||||
});
|
||||
|
||||
// Whether the app-drawn title bar shows in the window that asks. Only the
|
||||
// main window hides the native bar, and in full screen macOS hides the
|
||||
// traffic lights, so the bar goes away there too.
|
||||
function titleBarVisible(win) {
|
||||
return !!win && win === mainWindow && !win.isFullScreen();
|
||||
}
|
||||
|
||||
ipcMain.handle("get-title-bar-visible", (event) => {
|
||||
return titleBarVisible(windowFor(event));
|
||||
});
|
||||
|
||||
// The renderer sends the colors of the active theme so the window controls
|
||||
// the system draws (Windows and Linux) match the app.
|
||||
ipcMain.handle("set-title-bar-overlay", (event, colors) => {
|
||||
const win = windowFor(event);
|
||||
if (!win || process.platform === "darwin") return;
|
||||
const options = {};
|
||||
if (typeof colors?.color === "string" && colors.color) {
|
||||
options.color = colors.color;
|
||||
}
|
||||
if (typeof colors?.symbolColor === "string" && colors.symbolColor) {
|
||||
options.symbolColor = colors.symbolColor;
|
||||
}
|
||||
if (Object.keys(options).length === 0) return;
|
||||
try {
|
||||
win.setTitleBarOverlay(options);
|
||||
} catch (error) {
|
||||
logToFile("setTitleBarOverlay failed:", error);
|
||||
}
|
||||
});
|
||||
|
||||
ipcMain.handle("get-embedded-server-status", () => {
|
||||
return {
|
||||
running:
|
||||
|
||||
@@ -32,6 +32,19 @@ contextBridge.exposeInMainWorld("electronAPI", {
|
||||
webFrame.setZoomFactor(Math.min(2, Math.max(0.5, value)));
|
||||
},
|
||||
getPlatform: () => ipcRenderer.invoke("get-platform"),
|
||||
|
||||
// Whether the app-drawn title bar shows in this window, and when it changes
|
||||
// (full screen hides it).
|
||||
getTitleBarVisible: () => ipcRenderer.invoke("get-title-bar-visible"),
|
||||
onTitleBarVisibleChange: (callback) => {
|
||||
const listener = (_event, visible) => callback(visible);
|
||||
ipcRenderer.on("title-bar-visible-changed", listener);
|
||||
return () =>
|
||||
ipcRenderer.removeListener("title-bar-visible-changed", listener);
|
||||
},
|
||||
// Keeps the window controls the system draws in the colors of the theme.
|
||||
setTitleBarOverlay: (colors) =>
|
||||
ipcRenderer.invoke("set-title-bar-overlay", colors),
|
||||
getEmbeddedServerStatus: () =>
|
||||
ipcRenderer.invoke("get-embedded-server-status"),
|
||||
|
||||
|
||||
+12
-1
@@ -298,7 +298,7 @@
|
||||
{
|
||||
"name": "HTTP_PROXY",
|
||||
"group": "proxy",
|
||||
"description": "Proxy for outbound HTTP requests, like registry downloads and webhooks."
|
||||
"description": "Proxy for outbound HTTP requests, like plugin registry downloads and webhooks."
|
||||
},
|
||||
{
|
||||
"name": "HTTPS_PROXY",
|
||||
@@ -353,6 +353,11 @@
|
||||
"group": "plugins",
|
||||
"description": "Where plugin download counts are read from. Defaults to stats.json next to the registry index."
|
||||
},
|
||||
{
|
||||
"name": "TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS",
|
||||
"group": "plugins",
|
||||
"description": "Comma-separated host names or IP addresses that plugin registry downloads may reach on a private address, like a registry in your LAN. List bare hosts: entries with a scheme, port or path are ignored. Matched by name only, on any port, so only list names your own DNS answers for. With HTTPS_PROXY set, add them to NO_PROXY too."
|
||||
},
|
||||
{
|
||||
"name": "TERMIX_REQUIRE_SIGNED_PLUGINS",
|
||||
"group": "plugins",
|
||||
@@ -365,6 +370,12 @@
|
||||
"default": "false",
|
||||
"description": "Start everyone in the layout repair view instead of the chosen layout. Use it when a layout plugin breaks the app."
|
||||
},
|
||||
{
|
||||
"name": "TERMIX_SAFE_MODE",
|
||||
"group": "plugins",
|
||||
"default": "false",
|
||||
"description": "Start only layout and theme plugins. Every other plugin stays off until a restart without it, so you can turn off a plugin that breaks the server or the app."
|
||||
},
|
||||
{
|
||||
"name": "TERMIX_BUNDLED_PLUGINS_DIR",
|
||||
"group": "plugins",
|
||||
|
||||
Generated
+2
-2
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "termix",
|
||||
"version": "26.10.3",
|
||||
"version": "26.10.6",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "termix",
|
||||
"version": "26.10.3",
|
||||
"version": "26.10.6",
|
||||
"hasInstallScript": true,
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
|
||||
+4
-3
@@ -4,7 +4,7 @@
|
||||
"workspaces": [
|
||||
"packages/*"
|
||||
],
|
||||
"version": "26.10.3",
|
||||
"version": "26.10.6",
|
||||
"description": "Self-hosted, plugin-based server management.",
|
||||
"author": "Karmaa",
|
||||
"main": "electron/main.cjs",
|
||||
@@ -18,7 +18,7 @@
|
||||
"postinstall": "node scripts/patch-app-builder-lib.cjs && node scripts/patch-better-sqlite3.cjs && node scripts/patch-nan.cjs && node scripts/patch-node-pty.cjs && node scripts/patch-ssh2-agent.cjs && node scripts/patch-ssh2-sk.cjs",
|
||||
"prepare": "husky || true",
|
||||
"prebuild": "node scripts/write-electron-build-info.cjs",
|
||||
"lint": "node scripts/generate-dialect-schema.cjs --check && eslint . && node scripts/check-importmap-csp.cjs && node scripts/check-core-plugin-ids.cjs && node scripts/check-sdk-ui-exports.cjs && node scripts/check-sdk-guide.cjs && node scripts/check-test-locations.cjs && node scripts/check-changelog.cjs && node scripts/check-env-catalog.cjs",
|
||||
"lint": "node scripts/generate-dialect-schema.cjs --check && eslint . && node scripts/check-importmap-csp.cjs && node scripts/check-core-plugin-ids.cjs && node scripts/check-sdk-ui-exports.cjs && node scripts/check-button-colors.cjs && node scripts/check-sdk-guide.cjs && node scripts/check-test-locations.cjs && node scripts/check-changelog.cjs && node scripts/check-env-catalog.cjs",
|
||||
"lint:fix": "eslint --fix .",
|
||||
"type-check": "npm run build:sdk && tsc -b --force",
|
||||
"test": "vitest run",
|
||||
@@ -31,7 +31,8 @@
|
||||
"dev:docker": "node scripts/dev.mjs docker",
|
||||
"dev:frontend": "vite",
|
||||
"build": "npm run build:sdk && vite build && node scripts/stamp-sw-build-info.cjs && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins",
|
||||
"build:backend": "npm run build:sdk && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\" && npm run build:plugins",
|
||||
"build:backend:core": "npm run build:sdk && tsc -p tsconfig.node.json && node -e \"require('fs').copyFileSync('src/backend/package.json','dist/backend/package.json')\"",
|
||||
"build:backend": "npm run build:backend:core && npm run build:plugins",
|
||||
"generate:openapi": "npm run build:sdk && node scripts/generate-openapi.mjs",
|
||||
"electron:rebuild": "electron-rebuild -f -o better-sqlite3,@serialport/bindings-cpp,node-pty",
|
||||
"build:win-portable": "npm run build && npm run electron:rebuild && electron-builder --win --dir",
|
||||
|
||||
@@ -1,5 +1,39 @@
|
||||
# Changelog
|
||||
|
||||
## 1.0.21
|
||||
|
||||
Plugin API 1.12.0.
|
||||
|
||||
### Added
|
||||
|
||||
- `@termix-ssh/plugin-sdk/host-scripts`: Docker, Linux metrics, systemd, journal and OpenRC command builders and parsers, plus `scriptShell()` and `passwordSudoScript()` to send scripts to `bash -s` on stdin. It has no Node or ssh2 imports, so the Termix mobile app runs the same code
|
||||
|
||||
## 1.0.20
|
||||
|
||||
Plugin API 1.12.0.
|
||||
|
||||
### Added
|
||||
|
||||
- `columns` and `onColumns` on `ViewToggle` show a cards per row picker: Auto fits as many as the pane has room for, or pick 1 to 6
|
||||
- `size` and `minCardWidth` on `DataView`, so a card grid follows that pick, and the `GridSize` type
|
||||
- `usePluginPanelView` also keeps `columns`, the cards per row pick, with `setColumns`
|
||||
|
||||
## 1.0.19
|
||||
|
||||
Plugin API 1.11.0.
|
||||
|
||||
### Added
|
||||
|
||||
- `app.registerCompanionLayout` and `useCompanions`, so a plugin can let each host turn the panel bar on or off, move it and choose which panels show and in what order
|
||||
|
||||
## 1.0.18
|
||||
|
||||
Plugin API 1.10.0.
|
||||
|
||||
### Added
|
||||
|
||||
- `clientCert` on the sync link, link patch and remote target, and the `client_cert` remote error kind, so a sync plugin can link to a server that needs mutual TLS
|
||||
|
||||
## 1.0.17
|
||||
|
||||
Plugin API 1.9.0.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# Termix plugin guide
|
||||
|
||||
SDK 1.0.17 | Plugin API 1.9.0
|
||||
SDK 1.0.21 | Plugin API 1.12.0
|
||||
|
||||
This guide is for anyone, person or AI coding tool, building a Termix plugin. It ships inside
|
||||
`@termix-ssh/plugin-sdk`, so the copy in your `node_modules` always matches the SDK you have installed.
|
||||
@@ -335,7 +335,9 @@ try {
|
||||
|
||||
`ctx.ssh.withConnection(hostId, { pool, purpose }, fn)` borrows a pooled connection for frequent short
|
||||
commands. `@termix-ssh/plugin-sdk/host-commands` has helpers to detect the OS and run package manager and
|
||||
sudo commands. Hosts from `ctx.hosts` never carry secrets. Pass the host or its id to `ctx.ssh`.
|
||||
sudo commands. `@termix-ssh/plugin-sdk/host-scripts` builds Docker, metrics, systemd and journal
|
||||
commands and parses their output; send a script on stdin to the command `scriptShell()` returns. Hosts from
|
||||
`ctx.hosts` never carry secrets. Pass the host or its id to `ctx.ssh`.
|
||||
|
||||
### The desktop app
|
||||
|
||||
@@ -496,6 +498,7 @@ your plugin's error boundary and Suspense.
|
||||
| `registerRailItem` | A sidebar rail button |
|
||||
| `registerTab`, `registerPanel` | A tab type or sidebar panel (id in `contributes.tabs` / `panels`) |
|
||||
| `registerCompanion`, `toggleCompanion` | A panel beside any host tab, bound to its host and handle |
|
||||
| `registerCompanionLayout` | Per host on/off, side, order and hidden panels for a tab type |
|
||||
| `registerDashboardCard` | A dashboard card (`contributes.dashboardCards`) |
|
||||
| `registerHostAction` | A host button, palette entry or default connect |
|
||||
| `registerHostEditorSection` | Your own host editor section (host settings get one for free) |
|
||||
@@ -642,6 +645,9 @@ exports with props is `ui.api.txt` in the Termix repo
|
||||
`PanePrompt` for small prompts.
|
||||
- Every tab or panel sits in `PanelShell`. Lists use `PanelList` and `ListRow`, add with `AddButton`,
|
||||
forms end with `FormFooter`, empty lists show `EmptyState`.
|
||||
- Card grids use `DataView` with `ViewToggle`. Pass `columns` and `onColumns` to `ViewToggle` and the same
|
||||
value as `size` to `DataView`, so users can pick Auto (as many as fit) or a fixed number of cards per
|
||||
row. `usePluginPanelView` keeps the choice as `columns`. Older Termix versions ignore both props.
|
||||
- Forms: `TextField`, `NumberField`, `SelectField`, `SwitchRow`, `SecretField`, `SettingRow` and friends.
|
||||
- Host sessions use `ConnectionGate` for the whole connect flow (host keys, TOTP, passphrases, errors).
|
||||
- Mobile: check `useIsMobile()` and give small screens a layout that works. The desktop app always uses the
|
||||
@@ -901,6 +907,7 @@ To run your own registry instead, see https://docs.termix.site/develop/registrie
|
||||
| `@termix-ssh/plugin-sdk/testing` | `createMockCtx`, `createTestDb`, `renderWithApp`, `createFakeContext` |
|
||||
| `@termix-ssh/plugin-sdk/vitest-preset` | `pluginVitestConfig` |
|
||||
| `@termix-ssh/plugin-sdk/host-commands` | OS detection, package manager and sudo helpers over ssh2 |
|
||||
| `@termix-ssh/plugin-sdk/host-scripts` | Docker, metrics, systemd and journal command builders and parsers, scripts sent to `bash -s` |
|
||||
| `@termix-ssh/plugin-sdk/ssh-certs` | `applyCertificateAuth()` for certificate based SSH auth |
|
||||
| `@termix-ssh/plugin-sdk/ssh-keys` | `generateSshKeyPair()`, `detectSshKeyType()`, `publicKeyFromPrivate()`, `validateSshKeyPair()` |
|
||||
| `@termix-ssh/plugin-sdk/desktop` | The desktop app bridge, typed. Check it exists before use |
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@termix-ssh/plugin-sdk",
|
||||
"version": "1.0.17",
|
||||
"version": "1.0.21",
|
||||
"description": "The contract between Termix core and a plugin: types, the capability catalog and the manifest schema.",
|
||||
"license": "Apache-2.0",
|
||||
"repository": {
|
||||
@@ -81,6 +81,10 @@
|
||||
"types": "./dist/host-commands.d.ts",
|
||||
"default": "./dist/host-commands.js"
|
||||
},
|
||||
"./host-scripts": {
|
||||
"types": "./dist/host-scripts/index.d.ts",
|
||||
"default": "./dist/host-scripts/index.js"
|
||||
},
|
||||
"./ssh-certs": {
|
||||
"types": "./dist/ssh-certs.d.ts",
|
||||
"default": "./dist/ssh-certs.js"
|
||||
|
||||
@@ -308,6 +308,15 @@ export interface SyncBasicAuth {
|
||||
password: string;
|
||||
}
|
||||
|
||||
/** A client certificate for a server that asks for mutual TLS. */
|
||||
export interface SyncClientCert {
|
||||
/** Base64 of the PFX/P12 file. */
|
||||
pfx: string;
|
||||
passphrase: string;
|
||||
/** The file name, to show which certificate is saved. */
|
||||
name: string | null;
|
||||
}
|
||||
|
||||
/** Extra per server connection options. Kept open so new ones need no migration. */
|
||||
export type SyncLinkOptions = Record<string, unknown>;
|
||||
|
||||
@@ -323,6 +332,7 @@ export interface SyncLinkInfo {
|
||||
customHeaders: SyncProxyHeader[];
|
||||
basicAuth: SyncBasicAuth | null;
|
||||
allowInvalidCertificate: boolean;
|
||||
clientCert: SyncClientCert | null;
|
||||
remoteUserId: string | null;
|
||||
remoteUsername: string | null;
|
||||
account: {
|
||||
@@ -352,6 +362,7 @@ export interface SyncLinkCreate {
|
||||
customHeaders?: SyncProxyHeader[];
|
||||
basicAuth?: SyncBasicAuth | null;
|
||||
allowInvalidCertificate?: boolean;
|
||||
clientCert?: SyncClientCert | null;
|
||||
remoteUserId?: string | null;
|
||||
remoteUsername?: string | null;
|
||||
}
|
||||
@@ -365,6 +376,7 @@ export type SyncLinkPatch = Partial<
|
||||
| "customHeaders"
|
||||
| "basicAuth"
|
||||
| "allowInvalidCertificate"
|
||||
| "clientCert"
|
||||
| "remoteUserId"
|
||||
| "remoteUsername"
|
||||
| "account"
|
||||
@@ -379,7 +391,13 @@ export type SyncLinkPatch = Partial<
|
||||
>;
|
||||
|
||||
export type SyncRemoteErrorKind =
|
||||
"offline" | "tls" | "proxy" | "basic_auth" | "signed_out" | "server";
|
||||
| "offline"
|
||||
| "tls"
|
||||
| "client_cert"
|
||||
| "proxy"
|
||||
| "basic_auth"
|
||||
| "signed_out"
|
||||
| "server";
|
||||
|
||||
export interface SyncRemoteError extends Error {
|
||||
readonly kind: SyncRemoteErrorKind;
|
||||
@@ -392,6 +410,7 @@ export interface SyncRemoteTarget {
|
||||
customHeaders?: SyncProxyHeader[];
|
||||
basicAuth?: SyncBasicAuth | null;
|
||||
allowInvalidCertificate?: boolean;
|
||||
clientCert?: SyncClientCert | null;
|
||||
}
|
||||
|
||||
export interface SyncRemoteRequest {
|
||||
|
||||
@@ -35,6 +35,17 @@ export interface ElectronAPI {
|
||||
getAppVersion: () => Promise<string>;
|
||||
setZoomFactor?: (factor: number) => void;
|
||||
getPlatform: () => Promise<string>;
|
||||
/** Whether the app-drawn title bar shows in this window. */
|
||||
getTitleBarVisible?: () => Promise<boolean>;
|
||||
/** Calls back when the title bar shows or hides; returns an unsubscribe. */
|
||||
onTitleBarVisibleChange?: (
|
||||
callback: (visible: boolean) => void,
|
||||
) => () => void;
|
||||
/** Keeps the window controls the system draws in the colors of the theme. */
|
||||
setTitleBarOverlay?: (colors: {
|
||||
color?: string;
|
||||
symbolColor?: string;
|
||||
}) => Promise<void>;
|
||||
getSetting?: (key: string) => Promise<string | null | undefined>;
|
||||
setSetting?: (key: string, value: string) => Promise<void>;
|
||||
|
||||
|
||||
@@ -825,6 +825,26 @@ export interface CompanionDefaults {
|
||||
edgeButton?: boolean;
|
||||
}
|
||||
|
||||
/** A panel a tab type can show beside it, for a picker. */
|
||||
export interface CompanionInfo {
|
||||
/** The id registerCompanionLayout's hidden and order lists use. */
|
||||
id: string;
|
||||
titleKey: string;
|
||||
icon?: IconComponent;
|
||||
}
|
||||
|
||||
/** How a host wants the panel bar beside a tab. */
|
||||
export interface CompanionLayout {
|
||||
/** False removes the bar and its panels. */
|
||||
enabled?: boolean;
|
||||
/** Where a panel opens until the user moves it. */
|
||||
side?: "left" | "right" | "bottom";
|
||||
/** Companion ids in bar order. */
|
||||
order?: string[];
|
||||
/** Companion ids left out. */
|
||||
hidden?: string[];
|
||||
}
|
||||
|
||||
export interface CompanionProps {
|
||||
/** The tab it sits beside. */
|
||||
tab: PluginTabRecord;
|
||||
@@ -1118,6 +1138,14 @@ export interface TermixApp extends TermixAppInfo {
|
||||
component: ComponentType<CompanionProps>,
|
||||
options?: CompanionOptions,
|
||||
) => Disposer;
|
||||
/**
|
||||
* Lets a plugin decide, per host, how the panel bar looks on one tab type.
|
||||
* Read from the host payload, so it must not call hooks.
|
||||
*/
|
||||
registerCompanionLayout: (
|
||||
tabType: string,
|
||||
resolve: (host: PluginHostRecord | undefined) => CompanionLayout,
|
||||
) => Disposer;
|
||||
/** Opens a companion on a tab, or closes it when it is showing. */
|
||||
toggleCompanion: (tab: PluginTabRecord, id?: string) => void;
|
||||
registerHostEditorSection: (
|
||||
@@ -1347,6 +1375,7 @@ export interface PluginHostBridge {
|
||||
hostProtocols: (host: PluginHostRecord) => string[];
|
||||
useHostStatus: (hostId: number | undefined) => HostStatusInfo | null;
|
||||
useHostActions: () => HostActionContribution[];
|
||||
useCompanions: (tabType: string) => CompanionInfo[];
|
||||
useActivityTypes: () => string[];
|
||||
activityTarget: (type: string) => ActivityTargetInfo | undefined;
|
||||
useExtensions: (pointId: string) => ExtensionContribution[];
|
||||
@@ -1682,28 +1711,49 @@ export function usePluginUiPreferences<
|
||||
return bridge.usePluginUiPreferences(bridge.usePluginId()) as never;
|
||||
}
|
||||
|
||||
type PanelGridSize = "auto" | "1" | "2" | "3" | "4" | "5" | "6";
|
||||
const PANEL_GRID_SIZES: readonly string[] = [
|
||||
"auto",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
];
|
||||
|
||||
/**
|
||||
* Grid or list and row density for one of this plugin's views, kept in its
|
||||
* Appearance area as `<prefix>viewMode` and `<prefix>density`. Declare those
|
||||
* keys in contributes.uiPresets so each preset level can pick a default.
|
||||
* Grid or list, row density and cards per row for one of this plugin's
|
||||
* views, kept in its Appearance area as `<prefix>viewMode`, `<prefix>density`
|
||||
* and `<prefix>columns`. Declare those keys in contributes.uiPresets so each
|
||||
* preset level can pick a default. Hand columns to ViewToggle and DataView.
|
||||
*/
|
||||
export function usePluginPanelView(prefix = ""): {
|
||||
view: "grid" | "list";
|
||||
density: "comfortable" | "compact";
|
||||
compact: boolean;
|
||||
columns: PanelGridSize;
|
||||
setView: (view: "grid" | "list") => void;
|
||||
setDensity: (density: "comfortable" | "compact") => void;
|
||||
setColumns: (columns: PanelGridSize) => void;
|
||||
} {
|
||||
const { values, set } = usePluginUiPreferences();
|
||||
const view = values[`${prefix}viewMode`] === "list" ? "list" : "grid";
|
||||
const density =
|
||||
values[`${prefix}density`] === "compact" ? "compact" : "comfortable";
|
||||
const saved = values[`${prefix}columns`];
|
||||
const columns =
|
||||
typeof saved === "string" && PANEL_GRID_SIZES.includes(saved)
|
||||
? (saved as PanelGridSize)
|
||||
: "auto";
|
||||
return {
|
||||
view,
|
||||
density,
|
||||
compact: density === "compact",
|
||||
columns,
|
||||
setView: (next) => set(`${prefix}viewMode`, next),
|
||||
setDensity: (next) => set(`${prefix}density`, next),
|
||||
setColumns: (next) => set(`${prefix}columns`, next),
|
||||
};
|
||||
}
|
||||
|
||||
@@ -1756,6 +1806,14 @@ export function useHostActions(): HostActionContribution[] {
|
||||
return requireHost().useHostActions();
|
||||
}
|
||||
|
||||
/**
|
||||
* Every panel that can open beside a tab of this type, for a settings screen
|
||||
* that lets the user hide or reorder them. Reactive.
|
||||
*/
|
||||
export function useCompanions(tabType: string): CompanionInfo[] {
|
||||
return requireHost().useCompanions(tabType);
|
||||
}
|
||||
|
||||
/**
|
||||
* Recent-activity types every registered tab claims (registerTab's
|
||||
* activityTypes), core's and plugins'. For a filter that lists what a user
|
||||
|
||||
@@ -11,6 +11,9 @@
|
||||
|
||||
export type { Client, ClientChannel } from "ssh2";
|
||||
import type { Client, ClientChannel } from "ssh2";
|
||||
// Homebrew and OrbStack paths a non-interactive shell misses.
|
||||
import { EXTRA_PATH_DIRS } from "./host-scripts/docker.js";
|
||||
export { EXTRA_PATH_DIRS };
|
||||
|
||||
export interface ExecResult {
|
||||
stdout: string;
|
||||
@@ -114,14 +117,6 @@ export interface PlatformInfo {
|
||||
osPrettyName: string | null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Non-interactive SSH shells don't source ~/.zprofile or ~/.bash_profile,
|
||||
* so PATH additions from installers like Homebrew or OrbStack are missing.
|
||||
* Extend PATH with their common install locations before probing.
|
||||
*/
|
||||
export const EXTRA_PATH_DIRS =
|
||||
'/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:"$HOME/.orbstack/bin"';
|
||||
|
||||
const DOCKER_PROBE =
|
||||
`command -v docker >/dev/null 2>&1` +
|
||||
` || [ -S /var/run/docker.sock ]` +
|
||||
|
||||
@@ -0,0 +1,468 @@
|
||||
/**
|
||||
* Docker and Podman command builders and output parsers.
|
||||
*
|
||||
* Container ids and names are checked with CONTAINER_ID_RE before they go on
|
||||
* a command line, so they need no quoting. Anything free form is quoted.
|
||||
*/
|
||||
import { HostScriptError } from "./text.js";
|
||||
|
||||
export type ContainerRuntime = "docker" | "podman";
|
||||
|
||||
export function normalizeContainerRuntime(value: unknown): ContainerRuntime {
|
||||
return value === "podman" ? "podman" : "docker";
|
||||
}
|
||||
|
||||
export function getRuntimeLabel(runtime: ContainerRuntime): string {
|
||||
return runtime === "podman" ? "Podman" : "Docker";
|
||||
}
|
||||
|
||||
/**
|
||||
* Non-interactive SSH shells don't source ~/.zprofile or ~/.bash_profile,
|
||||
* so PATH additions from installers like Homebrew or OrbStack are missing.
|
||||
*/
|
||||
export const EXTRA_PATH_DIRS =
|
||||
'/opt/homebrew/bin:/opt/homebrew/sbin:/usr/local/bin:"$HOME/.orbstack/bin"';
|
||||
|
||||
export function containerCommand(
|
||||
runtime: ContainerRuntime | undefined,
|
||||
args: string,
|
||||
isWindows = false,
|
||||
): string {
|
||||
const cli = `${normalizeContainerRuntime(runtime)} ${args}`;
|
||||
// cmd and PowerShell don't understand the POSIX env prefix.
|
||||
return isWindows ? cli : `PATH="${EXTRA_PATH_DIRS}:$PATH" ${cli}`;
|
||||
}
|
||||
|
||||
export const CONTAINER_ID_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]*$/;
|
||||
export const DOCKER_TIMESTAMP_RE = /^[0-9T:.Z+-]+$/;
|
||||
|
||||
export function isContainerId(value: unknown): value is string {
|
||||
return (
|
||||
typeof value === "string" &&
|
||||
value.length <= 256 &&
|
||||
CONTAINER_ID_RE.test(value)
|
||||
);
|
||||
}
|
||||
|
||||
function requireContainer(id: string): string {
|
||||
if (!isContainerId(id))
|
||||
throw new HostScriptError("That is not a valid container id");
|
||||
return id;
|
||||
}
|
||||
|
||||
export const CONTAINER_ACTIONS = [
|
||||
"start",
|
||||
"stop",
|
||||
"restart",
|
||||
"pause",
|
||||
"unpause",
|
||||
] as const;
|
||||
export type ContainerAction = (typeof CONTAINER_ACTIONS)[number];
|
||||
|
||||
const LIST_FORMAT_UNIX = `'{"id":"{{.ID}}","name":"{{.Names}}","image":"{{.Image}}","status":"{{.Status}}","state":"{{.State}}","ports":"{{.Ports}}","created":"{{.CreatedAt}}"}' `;
|
||||
const LIST_FORMAT_WINDOWS = `"{\\"id\\":\\"{{.ID}}\\",\\"name\\":\\"{{.Names}}\\",\\"image\\":\\"{{.Image}}\\",\\"status\\":\\"{{.Status}}\\",\\"state\\":\\"{{.State}}\\",\\"ports\\":\\"{{.Ports}}\\",\\"created\\":\\"{{.CreatedAt}}\\"}"`;
|
||||
const STATS_FORMAT_UNIX = `'{"cpu":"{{.CPUPerc}}","memory":"{{.MemUsage}}","memoryPercent":"{{.MemPerc}}","netIO":"{{.NetIO}}","blockIO":"{{.BlockIO}}","pids":"{{.PIDs}}"}' `;
|
||||
const STATS_FORMAT_WINDOWS = `"{\\"cpu\\":\\"{{.CPUPerc}}\\",\\"memory\\":\\"{{.MemUsage}}\\",\\"memoryPercent\\":\\"{{.MemPerc}}\\",\\"netIO\\":\\"{{.NetIO}}\\",\\"blockIO\\":\\"{{.BlockIO}}\\",\\"pids\\":\\"{{.PIDs}}\\"}"`;
|
||||
|
||||
export function listFormat(isWindows: boolean): string {
|
||||
return isWindows ? LIST_FORMAT_WINDOWS : LIST_FORMAT_UNIX;
|
||||
}
|
||||
|
||||
export function statsFormat(isWindows: boolean): string {
|
||||
return isWindows ? STATS_FORMAT_WINDOWS : STATS_FORMAT_UNIX;
|
||||
}
|
||||
|
||||
/** One row of `ps --format listFormat()`. */
|
||||
export interface ContainerRow {
|
||||
id: string;
|
||||
name: string;
|
||||
image: string;
|
||||
status: string;
|
||||
state: string;
|
||||
ports: string;
|
||||
created: string;
|
||||
}
|
||||
|
||||
/** CLI arguments, without the runtime, for each container command. */
|
||||
export const dockerArgs = {
|
||||
version: () => "--version",
|
||||
ping: () => "ps",
|
||||
list: (all: boolean, isWindows = false) =>
|
||||
`ps ${all ? "-a " : ""}--format ${listFormat(isWindows)}`,
|
||||
inspect: (id: string) => `inspect ${requireContainer(id)}`,
|
||||
stats: (id: string, isWindows = false) =>
|
||||
`stats ${requireContainer(id)} --no-stream --format ${statsFormat(isWindows)}`,
|
||||
action: (action: ContainerAction, id: string) => {
|
||||
if (!CONTAINER_ACTIONS.includes(action))
|
||||
throw new HostScriptError("Unknown action");
|
||||
return `${action} ${requireContainer(id)}`;
|
||||
},
|
||||
remove: (id: string, force: boolean) =>
|
||||
`rm ${force ? "-f " : ""}${requireContainer(id)}`,
|
||||
logs: (
|
||||
id: string,
|
||||
options: {
|
||||
tail?: number;
|
||||
timestamps?: boolean;
|
||||
since?: string;
|
||||
until?: string;
|
||||
} = {},
|
||||
) => {
|
||||
let args = `logs ${requireContainer(id)}`;
|
||||
if (options.tail && options.tail > 0)
|
||||
args += ` --tail ${Math.floor(options.tail)}`;
|
||||
if (options.timestamps) args += " --timestamps";
|
||||
if (options.since && DOCKER_TIMESTAMP_RE.test(options.since)) {
|
||||
args += ` --since ${options.since}`;
|
||||
}
|
||||
if (options.until && DOCKER_TIMESTAMP_RE.test(options.until)) {
|
||||
args += ` --until ${options.until}`;
|
||||
}
|
||||
return `${args} 2>&1`;
|
||||
},
|
||||
states: () => `ps -a --format ${PS_STATE_FORMAT}`,
|
||||
composeProjects: () => "compose ls -a --format json",
|
||||
};
|
||||
|
||||
/** The version from `docker --version` or `podman --version`. */
|
||||
export function parseRuntimeVersion(output: string): string {
|
||||
return output.match(/(?:Docker|podman) version ([^\s,]+)/i)?.[1] ?? "unknown";
|
||||
}
|
||||
|
||||
export type RuntimeProblem =
|
||||
"NOT_INSTALLED" | "DAEMON_NOT_RUNNING" | "PERMISSION_DENIED" | "DOCKER_ERROR";
|
||||
|
||||
/** Sorts a failed `docker ps` into a reason the UI can explain. */
|
||||
export function classifyRuntimeError(message: string): RuntimeProblem {
|
||||
if (
|
||||
/command not found|not found: (docker|podman)|No such file or directory/i.test(
|
||||
message,
|
||||
)
|
||||
) {
|
||||
return "NOT_INSTALLED";
|
||||
}
|
||||
if (message.includes("Cannot connect to the Docker daemon"))
|
||||
return "DAEMON_NOT_RUNNING";
|
||||
if (/permission denied/i.test(message)) return "PERMISSION_DENIED";
|
||||
return "DOCKER_ERROR";
|
||||
}
|
||||
|
||||
/** Parses `ps --format listFormat()` output, skipping lines that are not JSON. */
|
||||
export function parseContainerList(output: string): Record<string, unknown>[] {
|
||||
return output
|
||||
.split("\n")
|
||||
.filter((line) => line.trim())
|
||||
.flatMap((line) => {
|
||||
try {
|
||||
return [JSON.parse(line) as Record<string, unknown>];
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
export interface ContainerStats {
|
||||
cpu: string;
|
||||
memoryUsed: string;
|
||||
memoryLimit: string;
|
||||
memoryPercent: string;
|
||||
netInput: string;
|
||||
netOutput: string;
|
||||
blockRead: string;
|
||||
blockWrite: string;
|
||||
pids: string;
|
||||
}
|
||||
|
||||
/** Parses one `stats --no-stream --format statsFormat()` line. Throws on bad JSON. */
|
||||
export function parseContainerStats(output: string): ContainerStats {
|
||||
const raw = JSON.parse(output.trim()) as Record<string, string>;
|
||||
const split = (value: string | undefined) => {
|
||||
const [first, second] = (value ?? "").split(" / ");
|
||||
return [first?.trim() || "0B", second?.trim() || "0B"];
|
||||
};
|
||||
const [memoryUsed, memoryLimit] = split(raw.memory);
|
||||
const [netInput, netOutput] = split(raw.netIO);
|
||||
const [blockRead, blockWrite] = split(raw.blockIO);
|
||||
return {
|
||||
cpu: raw.cpu,
|
||||
memoryUsed,
|
||||
memoryLimit,
|
||||
memoryPercent: raw.memoryPercent,
|
||||
netInput,
|
||||
netOutput,
|
||||
blockRead,
|
||||
blockWrite,
|
||||
pids: raw.pids,
|
||||
};
|
||||
}
|
||||
|
||||
export interface ContainerState {
|
||||
/** Docker's own state word: running, exited, restarting, ... */
|
||||
state: string;
|
||||
/** Health from the status text, when the image declares a healthcheck. */
|
||||
unhealthy: boolean;
|
||||
}
|
||||
|
||||
export type DockerEventName = "exited" | "started" | "unhealthy" | "restarting";
|
||||
|
||||
export const PS_STATE_FORMAT = `'{"name":"{{.Names}}","state":"{{.State}}","status":"{{.Status}}"}'`;
|
||||
|
||||
/** Parses `ps -a --format PS_STATE_FORMAT` output, one JSON object per line. */
|
||||
export function parseContainerStates(
|
||||
output: string,
|
||||
): Map<string, ContainerState> {
|
||||
const states = new Map<string, ContainerState>();
|
||||
for (const line of output.split("\n")) {
|
||||
const trimmed = line.trim();
|
||||
if (!trimmed) continue;
|
||||
try {
|
||||
const parsed = JSON.parse(trimmed) as {
|
||||
name?: string;
|
||||
state?: string;
|
||||
status?: string;
|
||||
};
|
||||
if (!parsed.name) continue;
|
||||
states.set(parsed.name, {
|
||||
state: (parsed.state ?? "").toLowerCase(),
|
||||
unhealthy: /\(unhealthy\)/i.test(parsed.status ?? ""),
|
||||
});
|
||||
} catch {
|
||||
// A partial line is not worth failing the whole poll over.
|
||||
}
|
||||
}
|
||||
return states;
|
||||
}
|
||||
|
||||
/**
|
||||
* The events a pair of snapshots implies. A container missing from the
|
||||
* previous snapshot counts as newly seen rather than started, so the first
|
||||
* poll after a restart does not replay every running container.
|
||||
*/
|
||||
export function diffContainerStates(
|
||||
previous: Map<string, ContainerState>,
|
||||
current: Map<string, ContainerState>,
|
||||
): Array<{ container: string; event: DockerEventName }> {
|
||||
const events: Array<{ container: string; event: DockerEventName }> = [];
|
||||
for (const [name, now] of current) {
|
||||
const before = previous.get(name);
|
||||
if (!before) continue;
|
||||
if (before.state !== now.state) {
|
||||
if (now.state === "exited")
|
||||
events.push({ container: name, event: "exited" });
|
||||
else if (now.state === "running")
|
||||
events.push({ container: name, event: "started" });
|
||||
else if (now.state === "restarting") {
|
||||
events.push({ container: name, event: "restarting" });
|
||||
}
|
||||
}
|
||||
// A container can go unhealthy while it stays up.
|
||||
if (!before.unhealthy && now.unhealthy) {
|
||||
events.push({ container: name, event: "unhealthy" });
|
||||
}
|
||||
}
|
||||
return events;
|
||||
}
|
||||
|
||||
export interface ContainerCounts {
|
||||
running: number;
|
||||
stopped: number;
|
||||
unhealthy: number;
|
||||
total: number;
|
||||
}
|
||||
|
||||
/** Counts from `ps -a --format PS_STATE_FORMAT` output. */
|
||||
export function countContainers(output: string): ContainerCounts {
|
||||
const states = [...parseContainerStates(output).values()];
|
||||
const running = states.filter((s) => s.state === "running").length;
|
||||
return {
|
||||
running,
|
||||
stopped: states.length - running,
|
||||
unhealthy: states.filter((s) => s.unhealthy).length,
|
||||
total: states.length,
|
||||
};
|
||||
}
|
||||
|
||||
// Compose stacks
|
||||
|
||||
export const STACK_NAME_RE = /^[a-z0-9][a-z0-9_-]{0,62}$/;
|
||||
export const STACK_SERVICE_RE = /^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,126}$/;
|
||||
export const COMPOSE_FILES = [
|
||||
"compose.yaml",
|
||||
"compose.yml",
|
||||
"docker-compose.yaml",
|
||||
"docker-compose.yml",
|
||||
];
|
||||
|
||||
export const STACK_ACTIONS = [
|
||||
"deploy",
|
||||
"redeploy",
|
||||
"pull",
|
||||
"start",
|
||||
"stop",
|
||||
"restart",
|
||||
"pause",
|
||||
"unpause",
|
||||
"down",
|
||||
"destroy",
|
||||
] as const;
|
||||
export type StackAction = (typeof STACK_ACTIONS)[number];
|
||||
|
||||
/** Actions that can target one service of a stack. */
|
||||
export const STACK_SERVICE_ACTIONS: StackAction[] = [
|
||||
"deploy",
|
||||
"pull",
|
||||
"start",
|
||||
"stop",
|
||||
"restart",
|
||||
"pause",
|
||||
"unpause",
|
||||
];
|
||||
|
||||
export type StackState =
|
||||
"running" | "partial" | "stopped" | "paused" | "not-deployed";
|
||||
|
||||
export interface StackSummary {
|
||||
name: string;
|
||||
managed: boolean;
|
||||
state: StackState;
|
||||
running: number;
|
||||
total: number;
|
||||
composeFile: string | null;
|
||||
}
|
||||
|
||||
export interface StackService {
|
||||
service: string;
|
||||
name: string;
|
||||
id: string;
|
||||
image: string;
|
||||
state: string;
|
||||
status: string;
|
||||
health: string;
|
||||
ports: string;
|
||||
}
|
||||
|
||||
/** `compose ls` and `compose ps --format json` print one object per line or one array. */
|
||||
export function parseJsonLines(output: string): Record<string, unknown>[] {
|
||||
const text = output.trim();
|
||||
if (!text) return [];
|
||||
if (text.startsWith("[")) {
|
||||
try {
|
||||
return JSON.parse(text) as Record<string, unknown>[];
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
return text.split("\n").flatMap((line) => {
|
||||
try {
|
||||
return [JSON.parse(line) as Record<string, unknown>];
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
const str = (value: unknown): string =>
|
||||
typeof value === "string" ? value : "";
|
||||
|
||||
export function parseServices(output: string): StackService[] {
|
||||
return parseJsonLines(output).map((row) => {
|
||||
const publishers = Array.isArray(row.Publishers)
|
||||
? (row.Publishers as Record<string, unknown>[])
|
||||
: [];
|
||||
const ports = publishers
|
||||
.filter((p) => Number(p.PublishedPort) > 0)
|
||||
.map((p) => `${p.PublishedPort}:${p.TargetPort}`)
|
||||
.filter((value, index, all) => all.indexOf(value) === index)
|
||||
.join(", ");
|
||||
return {
|
||||
service: str(row.Service),
|
||||
name: str(row.Name),
|
||||
id: str(row.ID),
|
||||
image: str(row.Image),
|
||||
state: str(row.State),
|
||||
status: str(row.Status),
|
||||
health: str(row.Health),
|
||||
ports,
|
||||
};
|
||||
});
|
||||
}
|
||||
|
||||
function stateOf(running: number, paused: number, total: number): StackState {
|
||||
if (total === 0) return "not-deployed";
|
||||
if (paused === total) return "paused";
|
||||
if (running === total) return "running";
|
||||
if (running > 0) return "partial";
|
||||
return "stopped";
|
||||
}
|
||||
|
||||
/** Turns the `compose ls` status text ("running(2), exited(1)") into a state. */
|
||||
export function parseStackStatus(status: string): {
|
||||
state: StackState;
|
||||
running: number;
|
||||
total: number;
|
||||
} {
|
||||
let running = 0;
|
||||
let paused = 0;
|
||||
let total = 0;
|
||||
for (const part of status.split(",")) {
|
||||
const match = part.trim().match(/^([a-z]+)\((\d+)\)$/i);
|
||||
if (!match) continue;
|
||||
const count = Number(match[2]);
|
||||
total += count;
|
||||
if (match[1] === "running") running += count;
|
||||
if (match[1] === "paused") paused += count;
|
||||
}
|
||||
return { state: stateOf(running, paused, total), running, total };
|
||||
}
|
||||
|
||||
export function stackStateFromServices(services: StackService[]) {
|
||||
const total = services.length;
|
||||
const running = services.filter((s) => s.state === "running").length;
|
||||
const paused = services.filter((s) => s.state === "paused").length;
|
||||
return { state: stateOf(running, paused, total), running, total };
|
||||
}
|
||||
|
||||
/** Stacks from `compose ls -a --format json`, for hosts with no stacks folder. */
|
||||
export function parseComposeProjects(output: string): StackSummary[] {
|
||||
return parseJsonLines(output)
|
||||
.flatMap((project) => {
|
||||
const name = str(project.Name);
|
||||
if (!STACK_NAME_RE.test(name)) return [];
|
||||
return [
|
||||
{
|
||||
name,
|
||||
managed: false,
|
||||
...parseStackStatus(str(project.Status)),
|
||||
composeFile: str(project.ConfigFiles).split(",")[0] || null,
|
||||
},
|
||||
];
|
||||
})
|
||||
.sort((a, b) => a.name.localeCompare(b.name));
|
||||
}
|
||||
|
||||
/** The compose commands one action runs, in order. */
|
||||
export function composeArgsFor(
|
||||
action: StackAction,
|
||||
service: string | undefined,
|
||||
options: { removeVolumes?: boolean },
|
||||
): string[] {
|
||||
const target = service ? ` ${service}` : "";
|
||||
switch (action) {
|
||||
case "deploy":
|
||||
return [`up -d --remove-orphans${target}`];
|
||||
case "redeploy":
|
||||
return [`pull${target}`, `up -d --remove-orphans${target}`];
|
||||
case "pull":
|
||||
return [`pull${target}`];
|
||||
case "start":
|
||||
case "stop":
|
||||
case "restart":
|
||||
case "pause":
|
||||
case "unpause":
|
||||
return [`${action}${target}`];
|
||||
case "down":
|
||||
return ["down --remove-orphans"];
|
||||
case "destroy":
|
||||
return [`down --remove-orphans${options.removeVolumes ? " -v" : ""}`];
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
/**
|
||||
* Host scripts: command builders and output parsers for Docker, Linux
|
||||
* metrics, systemd, the journal and OpenRC.
|
||||
*
|
||||
* Pure TypeScript with no Node or ssh2 imports, so the same code runs in a
|
||||
* plugin backend and in the mobile app. Run a script by sending it on stdin
|
||||
* to the command from `scriptShell()`.
|
||||
*/
|
||||
export * from "./text.js";
|
||||
export * from "./shell.js";
|
||||
export * from "./docker.js";
|
||||
export * from "./metrics.js";
|
||||
export * from "./systemd.js";
|
||||
export * from "./journal.js";
|
||||
export * from "./openrc.js";
|
||||
@@ -0,0 +1,242 @@
|
||||
/** journalctl scripts and parsers. */
|
||||
import { isUnit } from "./systemd.js";
|
||||
import { HostScriptError, shellQuote as q, utf8Decode } from "./text.js";
|
||||
|
||||
export const MAX_JOURNAL_LINES = 5000;
|
||||
const FIELDS = "MESSAGE,PRIORITY,_SYSTEMD_UNIT,SYSLOG_IDENTIFIER,_PID,_COMM";
|
||||
|
||||
export interface JournalQuery {
|
||||
units: string[];
|
||||
priority?: number;
|
||||
since?: string;
|
||||
until?: string;
|
||||
boot?: string;
|
||||
grep?: string;
|
||||
lines: number;
|
||||
kernel: boolean;
|
||||
}
|
||||
|
||||
export interface JournalEntry {
|
||||
/** Unix ms. */
|
||||
time: number;
|
||||
priority: number;
|
||||
unit: string;
|
||||
ident: string;
|
||||
pid: string;
|
||||
message: string;
|
||||
}
|
||||
|
||||
export interface BootView {
|
||||
offset: number;
|
||||
id: string;
|
||||
first: string;
|
||||
last: string;
|
||||
}
|
||||
|
||||
const RELATIVE_RE = /^-\d{1,5}(s|m|min|h|d|w)$/;
|
||||
const DATE_RE = /^\d{4}-\d{2}-\d{2}( \d{2}:\d{2}(:\d{2})?)?$/;
|
||||
const WORDS = ["today", "yesterday", "now"];
|
||||
|
||||
export function isJournalTime(value: string): boolean {
|
||||
return (
|
||||
RELATIVE_RE.test(value) || DATE_RE.test(value) || WORDS.includes(value)
|
||||
);
|
||||
}
|
||||
|
||||
function str(value: unknown): string {
|
||||
return typeof value === "string" ? value.trim() : "";
|
||||
}
|
||||
|
||||
/** Reads journal filters from a query string. Anything odd throws a HostScriptError. */
|
||||
export function parseJournalQuery(
|
||||
input: Record<string, unknown>,
|
||||
): JournalQuery {
|
||||
const rawUnits = Array.isArray(input.unit) ? input.unit : [input.unit];
|
||||
const units = rawUnits.map(str).filter(Boolean);
|
||||
for (const unit of units) {
|
||||
if (!isUnit(unit))
|
||||
throw new HostScriptError("That is not a valid unit name");
|
||||
}
|
||||
if (units.length > 20) throw new HostScriptError("Too many units");
|
||||
|
||||
const query: JournalQuery = {
|
||||
units,
|
||||
lines: 300,
|
||||
kernel: input.kernel === "true" || input.kernel === true,
|
||||
};
|
||||
const priority = str(input.priority);
|
||||
if (priority) {
|
||||
const value = Number(priority);
|
||||
if (!Number.isInteger(value) || value < 0 || value > 7) {
|
||||
throw new HostScriptError("priority must be 0 to 7");
|
||||
}
|
||||
query.priority = value;
|
||||
}
|
||||
for (const key of ["since", "until"] as const) {
|
||||
const value = str(input[key]);
|
||||
if (!value) continue;
|
||||
if (!isJournalTime(value))
|
||||
throw new HostScriptError(`${key} is not a valid time`);
|
||||
query[key] = value;
|
||||
}
|
||||
const boot = str(input.boot);
|
||||
if (boot) {
|
||||
if (!/^(-?\d{1,4}|[0-9a-f]{32})$/.test(boot))
|
||||
throw new HostScriptError("boot is not valid");
|
||||
query.boot = boot;
|
||||
}
|
||||
const grep = typeof input.grep === "string" ? input.grep : "";
|
||||
if (grep) {
|
||||
if (grep.length > 200 || /[\r\n\0]/.test(grep)) {
|
||||
throw new HostScriptError("The search is too long");
|
||||
}
|
||||
query.grep = grep;
|
||||
}
|
||||
const lines = Number(str(input.lines) || 300);
|
||||
if (Number.isFinite(lines) && lines > 0) {
|
||||
query.lines = Math.min(MAX_JOURNAL_LINES, Math.round(lines));
|
||||
}
|
||||
return query;
|
||||
}
|
||||
|
||||
/** journalctl arguments for a query, each one quoted. */
|
||||
export function journalArgs(
|
||||
query: Omit<JournalQuery, "lines"> & { lines?: number },
|
||||
options: { follow?: boolean; useGrep?: boolean } = {},
|
||||
): string {
|
||||
const args = ["journalctl", "--no-pager", "-q", "-o", "json"];
|
||||
args.push(`--output-fields=${FIELDS}`);
|
||||
if (options.follow) args.push("-f");
|
||||
if (query.lines) args.push("-n", String(Math.floor(query.lines)));
|
||||
for (const unit of query.units) {
|
||||
if (!isUnit(unit))
|
||||
throw new HostScriptError("That is not a valid unit name");
|
||||
args.push("-u", q(unit));
|
||||
}
|
||||
if (query.kernel) args.push("-k");
|
||||
if (query.priority !== undefined)
|
||||
args.push("-p", String(Math.floor(query.priority)));
|
||||
if (query.since) args.push("--since", q(query.since));
|
||||
if (query.until) args.push("--until", q(query.until));
|
||||
if (query.boot) args.push("-b", q(query.boot));
|
||||
if (query.grep && options.useGrep !== false) {
|
||||
args.push("--case-sensitive=false", "-g", q(query.grep));
|
||||
}
|
||||
return args.join(" ");
|
||||
}
|
||||
|
||||
export function journalScript(query: JournalQuery): string {
|
||||
// Older journalctl builds have no -g. Then the search runs on our side instead.
|
||||
const noGrep = journalArgs(
|
||||
{ ...query, lines: query.grep ? MAX_JOURNAL_LINES : query.lines },
|
||||
{ useGrep: false },
|
||||
);
|
||||
return `
|
||||
command -v journalctl >/dev/null 2>&1 || { echo "SCRIPT_ERR:This host has no journal"; exit 1; }
|
||||
${journalArgs(query)} 2>/tmp/termix-journal.$$
|
||||
RC=$?
|
||||
if [ $RC -ne 0 ] && grep -qi "pattern" /tmp/termix-journal.$$; then
|
||||
rm -f /tmp/termix-journal.$$
|
||||
echo "@@TERMIX_NOGREP@@"
|
||||
${noGrep}
|
||||
exit 0
|
||||
fi
|
||||
cat /tmp/termix-journal.$$ >&2; rm -f /tmp/termix-journal.$$
|
||||
exit $RC
|
||||
`;
|
||||
}
|
||||
|
||||
function messageOf(value: unknown): string {
|
||||
if (typeof value === "string") return value;
|
||||
if (Array.isArray(value)) {
|
||||
return utf8Decode(value.filter((n): n is number => typeof n === "number"));
|
||||
}
|
||||
return value == null ? "" : String(value);
|
||||
}
|
||||
|
||||
/** One `journalctl -o json` line, or null when it is not an entry. */
|
||||
export function parseEntry(line: string): JournalEntry | null {
|
||||
const text = line.trim();
|
||||
if (!text.startsWith("{")) return null;
|
||||
let raw: Record<string, unknown>;
|
||||
try {
|
||||
raw = JSON.parse(text) as Record<string, unknown>;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
const micros = Number(raw.__REALTIME_TIMESTAMP);
|
||||
const priority = Number(raw.PRIORITY);
|
||||
return {
|
||||
time: Number.isFinite(micros) ? Math.floor(micros / 1000) : 0,
|
||||
priority: Number.isInteger(priority) ? priority : 6,
|
||||
unit: messageOf(raw._SYSTEMD_UNIT),
|
||||
ident: messageOf(raw.SYSLOG_IDENTIFIER ?? raw._COMM),
|
||||
pid: messageOf(raw._PID),
|
||||
message: messageOf(raw.MESSAGE),
|
||||
};
|
||||
}
|
||||
|
||||
export function parseJournal(
|
||||
output: string,
|
||||
query: JournalQuery,
|
||||
): JournalEntry[] {
|
||||
const fallback = output.includes("@@TERMIX_NOGREP@@");
|
||||
const body = fallback ? output.split("@@TERMIX_NOGREP@@")[1] : output;
|
||||
let entries = body
|
||||
.split("\n")
|
||||
.map(parseEntry)
|
||||
.filter((entry): entry is JournalEntry => entry !== null);
|
||||
if (fallback && query.grep) {
|
||||
const needle = query.grep.toLowerCase();
|
||||
entries = entries
|
||||
.filter((entry) => entry.message.toLowerCase().includes(needle))
|
||||
.slice(-query.lines);
|
||||
}
|
||||
return entries;
|
||||
}
|
||||
|
||||
export const BOOTS_SCRIPT = `journalctl --list-boots --no-pager 2>/dev/null | tail -n 50; exit 0\n`;
|
||||
|
||||
export function parseBoots(output: string): BootView[] {
|
||||
const boots: BootView[] = [];
|
||||
for (const line of output.split("\n")) {
|
||||
const match =
|
||||
/^\s*(-?\d+)\s+([0-9a-f]{32})\s+(\w{3} \S+ \S+ \S+)\s*.?\s*(\w{3} \S+ \S+ \S+)?/.exec(
|
||||
line,
|
||||
);
|
||||
if (!match) continue;
|
||||
boots.push({
|
||||
offset: Number(match[1]),
|
||||
id: match[2],
|
||||
first: match[3],
|
||||
last: match[4] ?? "",
|
||||
});
|
||||
}
|
||||
return boots.reverse();
|
||||
}
|
||||
|
||||
export const USAGE_SCRIPT = `journalctl --disk-usage 2>&1; exit 0\n`;
|
||||
|
||||
export function parseUsage(output: string): string {
|
||||
return /take up (\S+)/.exec(output)?.[1] ?? "";
|
||||
}
|
||||
|
||||
const SIZE_RE = /^\d{1,6}(K|M|G)$/;
|
||||
const AGE_RE = /^\d{1,4}(d|w|month|months|year|years)$/;
|
||||
|
||||
export function vacuumScript(body: Record<string, unknown>): string {
|
||||
const size = str(body.size);
|
||||
const time = str(body.time);
|
||||
if (!size && !time) throw new HostScriptError("Give a size or an age");
|
||||
if (size && !SIZE_RE.test(size))
|
||||
throw new HostScriptError("Size looks like 500M or 2G");
|
||||
if (time && !AGE_RE.test(time))
|
||||
throw new HostScriptError("Age looks like 7d or 4w");
|
||||
const flags = [
|
||||
size ? `--vacuum-size=${size}` : "",
|
||||
time ? `--vacuum-time=${time}` : "",
|
||||
]
|
||||
.filter(Boolean)
|
||||
.join(" ");
|
||||
return `journalctl ${flags} 2>&1 || { echo "SCRIPT_ERR:journalctl vacuum failed"; exit 1; }\n`;
|
||||
}
|
||||
@@ -0,0 +1,433 @@
|
||||
/**
|
||||
* Linux metrics: one awk sample of /proc for CPU, memory, load, network and
|
||||
* processes, plus df parsing for disks.
|
||||
*/
|
||||
|
||||
// One awk reads every /proc file itself, so a sample is one exec of awk instead
|
||||
// of a shell plus six tools. Output sections are split by @@; each process line
|
||||
// is pid, utime+stime ticks, rss pages, starttime, state, ppid, comm.
|
||||
const AWK = String.raw`BEGIN{f="/proc/stat";while((getline l<f)>0)if(l~/^cpu/)print l;close(f);print "@@";f="/proc/meminfo";while((getline l<f)>0)if(l~/^(MemTotal|MemFree|MemAvailable|Buffers|Cached|SwapTotal|SwapFree):/)print l;close(f);print "@@";f="/proc/loadavg";getline l<f;print l;close(f);f="/proc/uptime";getline l<f;print l;close(f);print "@@";f="/proc/net/dev";while((getline l<f)>0)print l;close(f);print "@@";print pg;print "@@";for(i=1;i<ARGC;i++){f=ARGV[i];if((getline s<f)>0){a=index(s,"(");if(a&&match(s,/\)[^)]*$/)){split(substr(s,RSTART+2),x," ");print substr(s,1,a-2)" "(x[12]+x[13])" "x[22]"\t"x[20]"\t"x[1]" "x[2]" "substr(s,a+1,RSTART-a-1)}}close(f)}}`;
|
||||
|
||||
/** The live sample command. The page size never changes on a host, so pass it back once known. */
|
||||
export const liveCmd = (pageBytes?: number) =>
|
||||
"awk -v pg=" +
|
||||
(pageBytes ?? '"$(getconf PAGESIZE)"') +
|
||||
" '" +
|
||||
AWK +
|
||||
"' /proc/[0-9]*/stat";
|
||||
|
||||
export interface LiveSample {
|
||||
/** The admin minimum between samples; the client never polls faster. */
|
||||
minIntervalS?: number;
|
||||
cpu: number | null;
|
||||
cpuMix?: { user: number; system: number; iowait: number; steal: number };
|
||||
cores: Array<number | null>;
|
||||
coreIds: string[];
|
||||
memTotalKb: number;
|
||||
memCachedKb: number;
|
||||
memFreeKb: number;
|
||||
memUsedKb: number;
|
||||
swapTotalKb: number;
|
||||
swapUsedKb: number;
|
||||
load: [number, number, number];
|
||||
net: Array<{ name: string; rxBps: number | null; txBps: number | null }>;
|
||||
count: number;
|
||||
running: number;
|
||||
procs: Array<{
|
||||
pid: number;
|
||||
name: string;
|
||||
cpu: number;
|
||||
memKb: number;
|
||||
state: string;
|
||||
ppid: number;
|
||||
}>;
|
||||
/** Seconds since boot. */
|
||||
uptime?: number;
|
||||
/** Total bytes received and sent on every interface but lo, since boot. */
|
||||
netTotals?: { rx: number; tx: number };
|
||||
}
|
||||
|
||||
/** What the next call needs from this one. */
|
||||
export interface LivePrev {
|
||||
at: number;
|
||||
uptime: number;
|
||||
pageBytes: number;
|
||||
cpu: Map<string, { total: number; idle: number }>;
|
||||
/** Aggregate user nice system idle iowait irq softirq steal ticks, for the breakdown. */
|
||||
cpuRaw?: number[];
|
||||
/** Keyed by pid:starttime so a reused pid never inherits another process's ticks. */
|
||||
ticks: Map<string, number>;
|
||||
net: Map<string, { rx: number; tx: number }>;
|
||||
}
|
||||
|
||||
/** Total and idle ticks from a /proc/stat `cpu` line. */
|
||||
export function parseCpuLine(
|
||||
cpuLine: string,
|
||||
): { total: number; idle: number } | undefined {
|
||||
const parts = cpuLine.trim().split(/\s+/);
|
||||
if (parts[0] !== "cpu") return undefined;
|
||||
const nums = parts
|
||||
.slice(1)
|
||||
.map((n) => Number(n))
|
||||
.filter((n) => Number.isFinite(n));
|
||||
if (nums.length < 4) return undefined;
|
||||
const idle = (nums[3] ?? 0) + (nums[4] ?? 0);
|
||||
const total = nums.reduce((a, b) => a + b, 0);
|
||||
return { total, idle };
|
||||
}
|
||||
|
||||
const TOP_N = 60;
|
||||
|
||||
/** Parses `liveCmd()` output. Rates need the `next` of the previous call. */
|
||||
export function parseLive(
|
||||
output: string,
|
||||
prev: LivePrev | undefined,
|
||||
at = Date.now(),
|
||||
): { sample: LiveSample; next: LivePrev } {
|
||||
const [cpuS = "", memS = "", loadS = "", netS = "", pageS = "", procS = ""] =
|
||||
output.split("@@\n");
|
||||
|
||||
// Only the first 8 fields: guest and guest_nice are already inside user and nice.
|
||||
const cpu = new Map<string, { total: number; idle: number }>();
|
||||
let cpuRaw: number[] | undefined;
|
||||
for (const l of cpuS.split("\n")) {
|
||||
const name = l.split(/\s+/)[0];
|
||||
if (!name.startsWith("cpu")) continue;
|
||||
if (name === "cpu") cpuRaw = l.split(/\s+/).slice(1, 9).map(Number);
|
||||
const c = parseCpuLine(
|
||||
l
|
||||
.replace(/^cpu\d*/, "cpu")
|
||||
.split(/\s+/)
|
||||
.slice(0, 9)
|
||||
.join(" "),
|
||||
);
|
||||
if (c) cpu.set(name, c);
|
||||
}
|
||||
// Matched by name, so an offline core does not shift the ones after it.
|
||||
const pct = (name: string) => {
|
||||
const p = prev?.cpu.get(name);
|
||||
const c = cpu.get(name);
|
||||
if (!p || !c || c.total <= p.total) return null;
|
||||
const used = c.total - p.total - (c.idle - p.idle);
|
||||
return Math.max(0, Math.min(100, (used / (c.total - p.total)) * 100));
|
||||
};
|
||||
|
||||
// Where the busy time went since the last sample, as percent of all ticks.
|
||||
let cpuMix: LiveSample["cpuMix"];
|
||||
if (prev?.cpuRaw && cpuRaw && cpuRaw.length === 8) {
|
||||
const d = cpuRaw.map((v, i) => v - (prev.cpuRaw?.[i] ?? 0));
|
||||
const total = d.reduce((a, b) => a + b, 0);
|
||||
if (total > 0 && d.every((v) => v >= 0)) {
|
||||
const p = (n: number) => (n / total) * 100;
|
||||
cpuMix = {
|
||||
user: p(d[0] + d[1]),
|
||||
system: p(d[2] + d[5] + d[6]),
|
||||
iowait: p(d[4]),
|
||||
steal: p(d[7]),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
const mem: Record<string, number> = {};
|
||||
for (const l of memS.split("\n")) {
|
||||
const m = l.match(/^(\w+):\s+(\d+)/);
|
||||
if (m) mem[m[1]] = Number(m[2]);
|
||||
}
|
||||
|
||||
const [la = "", up = ""] = loadS.trim().split("\n");
|
||||
const laParts = la.split(/\s+/).map(Number);
|
||||
const uptime = Number(up.split(/\s+/)[0]) || 0;
|
||||
|
||||
const nets = new Map<string, { rx: number; tx: number }>();
|
||||
for (const l of netS.split("\n")) {
|
||||
const [name, rest] = l.split(":");
|
||||
if (!rest || name.trim() === "lo") continue;
|
||||
const f = rest.trim().split(/\s+/);
|
||||
nets.set(name.trim(), { rx: Number(f[0]) || 0, tx: Number(f[8]) || 0 });
|
||||
}
|
||||
// A reboot makes uptime go backwards, so rates start again.
|
||||
const dt = prev && uptime > prev.uptime ? uptime - prev.uptime : 0;
|
||||
const rate = (now: number, before: number | undefined) =>
|
||||
dt > 0 && before !== undefined && now >= before
|
||||
? (now - before) / dt
|
||||
: null;
|
||||
|
||||
const pageBytes = Number(pageS.trim()) || prev?.pageBytes || 4096;
|
||||
const pageKb = pageBytes / 1024;
|
||||
const aggDelta =
|
||||
prev && cpu.has("cpu") && prev.cpu.has("cpu")
|
||||
? cpu.get("cpu")!.total - prev.cpu.get("cpu")!.total
|
||||
: 0;
|
||||
const cores = [...cpu.keys()].filter((k) => k !== "cpu");
|
||||
const ncpu = Math.max(1, cores.length);
|
||||
const ticks = new Map<string, number>();
|
||||
const procs: LiveSample["procs"] = [];
|
||||
for (const l of procS.split("\n")) {
|
||||
const [pid, t, rss, start, state, ppid, ...rest] = l.split("\t");
|
||||
const name = rest.join("\t");
|
||||
if (!name) continue;
|
||||
const key = pid + ":" + start;
|
||||
const tk = Number(t) || 0;
|
||||
ticks.set(key, tk);
|
||||
const before = prev?.ticks.get(key);
|
||||
procs.push({
|
||||
pid: Number(pid),
|
||||
name,
|
||||
cpu:
|
||||
before !== undefined && aggDelta > 0 && tk >= before
|
||||
? ((tk - before) / aggDelta) * ncpu * 100
|
||||
: 0,
|
||||
memKb: (Number(rss) || 0) * pageKb,
|
||||
state: state || "?",
|
||||
ppid: Number(ppid) || 0,
|
||||
});
|
||||
}
|
||||
procs.sort((a, b) => b.cpu - a.cpu || b.memKb - a.memKb);
|
||||
|
||||
// Awk exits 0 when /proc is missing (macOS, restricted containers); that is not a sample.
|
||||
if (!cpu.has("cpu") || !mem.MemTotal || !uptime) {
|
||||
throw new Error("live sample unavailable: /proc data missing");
|
||||
}
|
||||
const memTotalKb = mem.MemTotal;
|
||||
const swapTotalKb = mem.SwapTotal ?? 0;
|
||||
let rxTotal = 0;
|
||||
let txTotal = 0;
|
||||
for (const c of nets.values()) {
|
||||
rxTotal += c.rx;
|
||||
txTotal += c.tx;
|
||||
}
|
||||
return {
|
||||
sample: {
|
||||
cpu: pct("cpu"),
|
||||
cores: cores.map(pct),
|
||||
coreIds: cores.map((k) => k.slice(3)),
|
||||
cpuMix,
|
||||
memTotalKb,
|
||||
memCachedKb: (mem.Buffers ?? 0) + (mem.Cached ?? 0),
|
||||
memFreeKb: mem.MemFree ?? 0,
|
||||
memUsedKb: memTotalKb - (mem.MemAvailable ?? 0),
|
||||
swapTotalKb,
|
||||
swapUsedKb: swapTotalKb - (mem.SwapFree ?? 0),
|
||||
load: [laParts[0] || 0, laParts[1] || 0, laParts[2] || 0],
|
||||
net: [...nets].map(([name, c]) => ({
|
||||
name,
|
||||
rxBps: rate(c.rx, prev?.net.get(name)?.rx),
|
||||
txBps: rate(c.tx, prev?.net.get(name)?.tx),
|
||||
})),
|
||||
count: procs.length,
|
||||
running: procs.filter((p) => p.state === "R").length,
|
||||
procs: procs.slice(0, TOP_N),
|
||||
uptime,
|
||||
netTotals: { rx: rxTotal, tx: txTotal },
|
||||
},
|
||||
next: { at, uptime, pageBytes, cpu, cpuRaw, ticks, net: nets },
|
||||
};
|
||||
}
|
||||
|
||||
// Disks
|
||||
|
||||
const DARWIN_DATA_MOUNT = "/System/Volumes/Data";
|
||||
const PSEUDO_FS_RE =
|
||||
/^(tmpfs|devtmpfs|overlay|udev|none|shm|squashfs|efivarfs)$/;
|
||||
|
||||
/** GNU df sizes in KiB, without the header. */
|
||||
export const DF_BYTES_COMMAND = "df -TkP | tail -n +2";
|
||||
/** GNU df sizes as short human text, without the header. */
|
||||
export const DF_HUMAN_COMMAND = "df -hT -P | tail -n +2";
|
||||
|
||||
export interface DfRow {
|
||||
filesystem: string;
|
||||
type: string;
|
||||
mount: string;
|
||||
parts: string[];
|
||||
}
|
||||
|
||||
export interface DiskFilesystem {
|
||||
filesystem: string;
|
||||
type: string;
|
||||
mount: string;
|
||||
percent: number | null;
|
||||
usedHuman: string | null;
|
||||
totalHuman: string | null;
|
||||
availableHuman: string | null;
|
||||
usedBytes: number | null;
|
||||
totalBytes: number | null;
|
||||
availableBytes: number | null;
|
||||
label?: string;
|
||||
}
|
||||
|
||||
export interface MonitoredMount {
|
||||
path: string;
|
||||
label?: string;
|
||||
}
|
||||
|
||||
function toFixedNum(n: number | null | undefined, digits = 2): number | null {
|
||||
if (typeof n !== "number" || !Number.isFinite(n)) return null;
|
||||
return Number(n.toFixed(digits));
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses `df -T -P` style output: Filesystem, Type, then the size columns,
|
||||
* with Mounted-on last. Pseudo filesystems are left out.
|
||||
*/
|
||||
export function parseDfLines(output: string): DfRow[] {
|
||||
return output
|
||||
.split("\n")
|
||||
.map((l) => l.trim())
|
||||
.filter(Boolean)
|
||||
.map((line) => {
|
||||
const parts = line.split(/\s+/);
|
||||
return {
|
||||
filesystem: parts[0] || "",
|
||||
type: parts[1] || "",
|
||||
mount: parts[6] || "",
|
||||
parts,
|
||||
};
|
||||
})
|
||||
.filter((row) => row.parts.length >= 7 && !PSEUDO_FS_RE.test(row.type));
|
||||
}
|
||||
|
||||
/** The most used real filesystem in a `df -TkP` row set. */
|
||||
export function findWorstMountIndex(bytesRows: DfRow[]): {
|
||||
index: number;
|
||||
usedBytes: number;
|
||||
totalBytes: number;
|
||||
} {
|
||||
let worstIndex = -1;
|
||||
let worstUsedBytes = -1;
|
||||
let worstTotalBytes = 0;
|
||||
bytesRows.forEach((row, index) => {
|
||||
const totalBytes = Number(row.parts[2]);
|
||||
const usedBytes = Number(row.parts[3]);
|
||||
if (
|
||||
!Number.isFinite(totalBytes) ||
|
||||
!Number.isFinite(usedBytes) ||
|
||||
totalBytes <= 0
|
||||
) {
|
||||
return;
|
||||
}
|
||||
const usedRatio = usedBytes / totalBytes;
|
||||
const worstRatio =
|
||||
worstTotalBytes > 0 ? worstUsedBytes / worstTotalBytes : -1;
|
||||
if (usedRatio > worstRatio) {
|
||||
worstIndex = index;
|
||||
worstUsedBytes = usedBytes;
|
||||
worstTotalBytes = totalBytes;
|
||||
}
|
||||
});
|
||||
return {
|
||||
index: worstIndex,
|
||||
usedBytes: worstUsedBytes,
|
||||
totalBytes: worstTotalBytes,
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Merges `df -TkP` size rows (parts[2..4] in `blockSizeBytes` units) and
|
||||
* `df -hT -P` human rows into one list. Human rows only supply the display
|
||||
* text, matched by mount point so a mismatched row count can't shift them.
|
||||
*/
|
||||
export function buildFilesystemList(
|
||||
bytesRows: DfRow[],
|
||||
humanRows: DfRow[],
|
||||
blockSizeBytes = 1,
|
||||
): DiskFilesystem[] {
|
||||
const aligned = humanRows.length === bytesRows.length;
|
||||
return bytesRows
|
||||
.map((row, index) => {
|
||||
const totalBytes = Number(row.parts[2]) * blockSizeBytes;
|
||||
const usedBytes = Number(row.parts[3]) * blockSizeBytes;
|
||||
const availableBytes = Number(row.parts[4]) * blockSizeBytes;
|
||||
if (!Number.isFinite(totalBytes) || totalBytes <= 0) return null;
|
||||
const humanRow = aligned
|
||||
? humanRows[index]
|
||||
: humanRows.find((h) => h.mount === row.mount);
|
||||
const percent = Number.isFinite(usedBytes)
|
||||
? Math.max(0, Math.min(100, (usedBytes / totalBytes) * 100))
|
||||
: null;
|
||||
return {
|
||||
filesystem: row.filesystem,
|
||||
type: row.type,
|
||||
mount: row.mount,
|
||||
percent: toFixedNum(percent, 0),
|
||||
usedHuman: humanRow?.parts[3] || null,
|
||||
totalHuman: humanRow?.parts[2] || null,
|
||||
availableHuman: humanRow?.parts[4] || null,
|
||||
usedBytes: Number.isFinite(usedBytes) ? usedBytes : null,
|
||||
totalBytes,
|
||||
availableBytes: Number.isFinite(availableBytes) ? availableBytes : null,
|
||||
};
|
||||
})
|
||||
.filter((fs): fs is DiskFilesystem => fs !== null);
|
||||
}
|
||||
|
||||
/**
|
||||
* The headline disk is the root filesystem. On macOS "/" is the small sealed
|
||||
* system volume, so the data volume wins there. With no root mount the most
|
||||
* used one is shown.
|
||||
*/
|
||||
export function selectPrimaryFilesystem(
|
||||
filesystems: DiskFilesystem[],
|
||||
): DiskFilesystem | null {
|
||||
if (filesystems.length === 0) return null;
|
||||
const root =
|
||||
filesystems.find((fs) => fs.mount === DARWIN_DATA_MOUNT) ??
|
||||
filesystems.find((fs) => fs.mount === "/");
|
||||
if (root) return root;
|
||||
let best = filesystems[0];
|
||||
for (const fs of filesystems) {
|
||||
const ratio = (fs.usedBytes ?? 0) / (fs.totalBytes || 1);
|
||||
const bestRatio = (best.usedBytes ?? 0) / (best.totalBytes || 1);
|
||||
if (ratio > bestRatio) best = fs;
|
||||
}
|
||||
return best;
|
||||
}
|
||||
|
||||
/**
|
||||
* Drops mounts by exact path ("/mnt/nas") or by filesystem type substring
|
||||
* ("nfs" matches nfs and nfs4), so network shares can be hidden.
|
||||
*/
|
||||
export function filterExcludedFilesystems(
|
||||
filesystems: DiskFilesystem[],
|
||||
excludedMounts?: string[] | null,
|
||||
): DiskFilesystem[] {
|
||||
if (!excludedMounts || excludedMounts.length === 0) return filesystems;
|
||||
const normalized = excludedMounts
|
||||
.map((entry) => entry.trim().toLowerCase())
|
||||
.filter(Boolean);
|
||||
if (normalized.length === 0) return filesystems;
|
||||
return filesystems.filter((fs) => {
|
||||
const mount = fs.mount.toLowerCase();
|
||||
const type = fs.type.toLowerCase();
|
||||
return !normalized.some(
|
||||
(entry) => mount === entry || (type && type.includes(entry)),
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
export function mergeMonitoredFilesystems(
|
||||
filesystems: DiskFilesystem[],
|
||||
monitored: MonitoredMount[],
|
||||
customFilesystems: Array<DiskFilesystem | null>,
|
||||
): DiskFilesystem[] {
|
||||
const result = [...filesystems];
|
||||
monitored.forEach((entry, index) => {
|
||||
const path = entry.path.trim();
|
||||
const custom = customFilesystems[index];
|
||||
if (!path || !custom) return;
|
||||
const existing = result.find((fs) => fs.mount === path);
|
||||
if (existing) {
|
||||
existing.label = entry.label?.trim() || undefined;
|
||||
return;
|
||||
}
|
||||
result.push({
|
||||
...custom,
|
||||
mount: path,
|
||||
label: entry.label?.trim() || undefined,
|
||||
});
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
/** Host name, OS, kernel and arch in one exec, as key=value lines. */
|
||||
export const SYSTEM_INFO_COMMAND = `echo "hostname=$(hostname 2>/dev/null || cat /etc/hostname 2>/dev/null)"; echo "os=$( . /etc/os-release 2>/dev/null; echo "$PRETTY_NAME")"; echo "kernel=$(uname -r 2>/dev/null)"; echo "arch=$(uname -m 2>/dev/null)"`;
|
||||
@@ -0,0 +1,94 @@
|
||||
/** OpenRC scripts, with states mapped onto the words systemd uses. */
|
||||
import { isOpenRcName, type UnitAction, type UnitSummary } from "./systemd.js";
|
||||
import { HostScriptError, shellQuote as q } from "./text.js";
|
||||
|
||||
export const OPENRC_LIST_SCRIPT = `
|
||||
rc-status --servicelist 2>/dev/null
|
||||
echo "@@TERMIX_RUNLEVELS@@"
|
||||
rc-update show -v 2>/dev/null
|
||||
exit 0
|
||||
`;
|
||||
|
||||
function activeOf(state: string): { active: string; sub: string } {
|
||||
switch (state) {
|
||||
case "started":
|
||||
return { active: "active", sub: "running" };
|
||||
case "crashed":
|
||||
return { active: "failed", sub: "crashed" };
|
||||
case "starting":
|
||||
return { active: "activating", sub: "starting" };
|
||||
case "stopping":
|
||||
return { active: "deactivating", sub: "stopping" };
|
||||
case "inactive":
|
||||
case "hotplugged":
|
||||
return { active: "inactive", sub: state };
|
||||
default:
|
||||
return { active: "inactive", sub: state || "stopped" };
|
||||
}
|
||||
}
|
||||
|
||||
export function parseOpenRcList(output: string): UnitSummary[] {
|
||||
const [list = "", levels = ""] = output.split("@@TERMIX_RUNLEVELS@@");
|
||||
const units = new Map<string, UnitSummary>();
|
||||
for (const line of list.split("\n")) {
|
||||
const match = /^\s*(\S+)\s+\[\s*([a-z ]+?)\s*\]/.exec(line);
|
||||
if (!match) continue;
|
||||
const { active, sub } = activeOf(match[2]);
|
||||
units.set(match[1], {
|
||||
name: match[1],
|
||||
type: "service",
|
||||
load: "loaded",
|
||||
active,
|
||||
sub,
|
||||
description: "",
|
||||
fileState: "disabled",
|
||||
preset: "",
|
||||
});
|
||||
}
|
||||
for (const line of levels.split("\n")) {
|
||||
const match = /^\s*(\S+)\s*\|\s*(.*)$/.exec(line);
|
||||
if (!match) continue;
|
||||
const runlevels = match[2].trim();
|
||||
const known = units.get(match[1]) ?? {
|
||||
name: match[1],
|
||||
type: "service",
|
||||
load: "loaded",
|
||||
active: "inactive",
|
||||
sub: "stopped",
|
||||
description: "",
|
||||
fileState: "disabled",
|
||||
preset: "",
|
||||
};
|
||||
known.fileState = runlevels ? "enabled" : "disabled";
|
||||
known.description = runlevels ? `Runlevels: ${runlevels}` : "";
|
||||
units.set(match[1], known);
|
||||
}
|
||||
return [...units.values()].sort((a, b) => a.name.localeCompare(b.name));
|
||||
}
|
||||
|
||||
function requireName(name: string): string {
|
||||
if (!isOpenRcName(name))
|
||||
throw new HostScriptError("That is not a valid service name");
|
||||
return name;
|
||||
}
|
||||
|
||||
export function openRcActionScript(name: string, action: UnitAction): string {
|
||||
const s = q(requireName(name));
|
||||
switch (action) {
|
||||
case "start":
|
||||
case "stop":
|
||||
case "restart":
|
||||
return `rc-service ${s} ${action} 2>&1 || { echo "SCRIPT_ERR:rc-service ${action} failed"; exit 1; }\n`;
|
||||
case "enable":
|
||||
return `rc-update add ${s} default 2>&1 || { echo "SCRIPT_ERR:rc-update add failed"; exit 1; }\n`;
|
||||
case "disable":
|
||||
return `rc-update del ${s} 2>&1 || { echo "SCRIPT_ERR:rc-update del failed"; exit 1; }\n`;
|
||||
default:
|
||||
throw new HostScriptError("OpenRC can't do that", 400);
|
||||
}
|
||||
}
|
||||
|
||||
export function openRcStatusScript(name: string): string {
|
||||
const s = q(requireName(name));
|
||||
return `rc-service ${s} status 2>&1; rc-update show -v 2>/dev/null | grep -E '^ *'${s}' *\\|'; exit 0\n`;
|
||||
}
|
||||
@@ -0,0 +1,117 @@
|
||||
/**
|
||||
* How a script reaches the host: the command line runs a shell that reads
|
||||
* the script from stdin (`bash -s`), so names and values in a script are
|
||||
* never parsed out of argv.
|
||||
*/
|
||||
import { shellQuote, toBase64 } from "./text.js";
|
||||
|
||||
// systemctl and friends often live in sbin, which a normal login skips.
|
||||
// TZ=UTC so tools print every time in UTC, which parses the same anywhere.
|
||||
const ENV = "SYSTEMD_COLORS=0 SYSTEMD_PAGER=cat LC_ALL=C TZ=UTC";
|
||||
|
||||
/** Puts sbin on PATH and sets a plain, UTC environment. */
|
||||
export const SCRIPT_PRELUDE = `export PATH="$PATH:/usr/sbin:/sbin:/usr/local/sbin"; export ${ENV}; `;
|
||||
const SUDO = `sudo -n env PATH="$PATH" ${ENV}`;
|
||||
|
||||
/**
|
||||
* - `plain`: the login user.
|
||||
* - `auto`: root when it can be had without a password, else the login user.
|
||||
* - `root`: root or passwordless sudo, fails on anything else.
|
||||
* - `root-only`: root logins only, for hosts where sudo is turned off.
|
||||
*/
|
||||
export type ScriptShellMode = "plain" | "auto" | "root" | "root-only";
|
||||
|
||||
const ERR = "SCRIPT_ERR:";
|
||||
|
||||
/** The command line that runs a script sent on stdin. */
|
||||
export function scriptShell(mode: ScriptShellMode): string {
|
||||
switch (mode) {
|
||||
case "plain":
|
||||
return `${SCRIPT_PRELUDE}exec bash -s`;
|
||||
case "auto":
|
||||
return `${SCRIPT_PRELUDE}if [ "$(id -u)" = "0" ]; then exec bash -s; elif sudo -n true 2>/dev/null; then exec ${SUDO} bash -s; else exec bash -s; fi`;
|
||||
case "root":
|
||||
return `${SCRIPT_PRELUDE}if [ "$(id -u)" = "0" ]; then exec bash -s; else exec ${SUDO} bash -s; fi`;
|
||||
case "root-only":
|
||||
return `${SCRIPT_PRELUDE}if [ "$(id -u)" = "0" ]; then exec bash -s; else echo "${ERR}This needs root, or turn on Use sudo for this host"; exit 1; fi`;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a script as root with a sudo password. The command is `plain`; all of
|
||||
* the returned stdin goes to the host. The password is read by the first
|
||||
* line into a shell variable and piped to `sudo -S`, so it is never in argv,
|
||||
* never in the environment and never run as a command. Root logins and
|
||||
* passwordless sudo skip the password. The script itself travels as base64.
|
||||
*/
|
||||
export function passwordSudoScript(
|
||||
script: string,
|
||||
password: string,
|
||||
): { command: string; stdin: string } {
|
||||
if (/[\r\n\0]/.test(password)) {
|
||||
throw new Error("A sudo password can't contain a line break");
|
||||
}
|
||||
const run = `bash -c "$TERMIX_S"`;
|
||||
const stdin = `IFS= read -r TERMIX_PW
|
||||
${password}
|
||||
TERMIX_S=$(printf '%s' ${shellQuote(toBase64(script))} | base64 -d)
|
||||
if [ "$(id -u)" = "0" ]; then unset TERMIX_PW; exec ${run}
|
||||
elif sudo -n true 2>/dev/null; then unset TERMIX_PW; exec ${SUDO} ${run}
|
||||
else P=$TERMIX_PW; unset TERMIX_PW; printf '%s\\n' "$P" | sudo -k -S -p '' env PATH="$PATH" ${ENV} ${run}; exit $?
|
||||
fi
|
||||
`;
|
||||
return { command: scriptShell("plain"), stdin };
|
||||
}
|
||||
|
||||
/** sudo asked for a password or a terminal it did not get. */
|
||||
export const SUDO_REFUSED_RE =
|
||||
/password is required|a terminal is required|no tty present/i;
|
||||
/** sudo got a password and it was wrong. */
|
||||
export const SUDO_WRONG_RE =
|
||||
/incorrect password|sorry, try again|no password was provided/i;
|
||||
/** The user may not use sudo at all. */
|
||||
export const NOT_SUDOER_RE =
|
||||
/is not in the sudoers file|not allowed to run sudo/i;
|
||||
|
||||
/**
|
||||
* Scripts print `SCRIPT_ERR:` lines (or the older `SERVICES_ERR:`) before a
|
||||
* non zero exit to explain a failure.
|
||||
*/
|
||||
export function scriptError(stdout: string): string {
|
||||
return stdout
|
||||
.split("\n")
|
||||
.map((line) => {
|
||||
if (line.startsWith(ERR)) return line.slice(ERR.length);
|
||||
if (line.startsWith("SERVICES_ERR:")) return line.slice(13);
|
||||
return null;
|
||||
})
|
||||
.filter((line): line is string => line !== null)
|
||||
.join("\n")
|
||||
.trim();
|
||||
}
|
||||
|
||||
/** A line a script prints to explain why it stops. */
|
||||
export function errLine(message: string): string {
|
||||
return `echo ${shellQuote(ERR + message)}`;
|
||||
}
|
||||
|
||||
/**
|
||||
* Runs a long command in the background and stops it once stdin closes,
|
||||
* which happens when the SSH channel ends. A pty can't be trusted for this:
|
||||
* sudo keeps its own and the command would outlive the viewer.
|
||||
*/
|
||||
export function watchdog(command: string): string {
|
||||
return `${command} &
|
||||
P=$!
|
||||
trap 'kill $P 2>/dev/null' EXIT
|
||||
cat >/dev/null
|
||||
`;
|
||||
}
|
||||
|
||||
/** The wrapper a streamed command runs in, as one shell command line. */
|
||||
export function streamCommand(script: string, sudo: boolean): string {
|
||||
const quoted = shellQuote(`${SCRIPT_PRELUDE}${script}`);
|
||||
return sudo
|
||||
? `if [ "$(id -u)" = "0" ]; then exec bash -c ${quoted}; elif sudo -n true 2>/dev/null; then exec ${SUDO} bash -c ${quoted}; else exec bash -c ${quoted}; fi`
|
||||
: `exec bash -c ${quoted}`;
|
||||
}
|
||||
@@ -0,0 +1,389 @@
|
||||
/**
|
||||
* systemd unit scripts and parsers, plus init system detection.
|
||||
* Every script is meant for `scriptShell()`, sent on stdin.
|
||||
*/
|
||||
import { HostScriptError, parseKeys, shellQuote as q } from "./text.js";
|
||||
|
||||
export const UNIT_TYPES = [
|
||||
"service",
|
||||
"socket",
|
||||
"timer",
|
||||
"target",
|
||||
"mount",
|
||||
"automount",
|
||||
"path",
|
||||
"swap",
|
||||
"slice",
|
||||
"scope",
|
||||
"device",
|
||||
] as const;
|
||||
export type UnitType = (typeof UNIT_TYPES)[number];
|
||||
|
||||
// Backslash is allowed for escaped names like dev-disk-by\x2duuid.
|
||||
const UNIT_RE = new RegExp(
|
||||
`^[A-Za-z0-9_][A-Za-z0-9:_.@\\\\-]{0,250}\\.(${UNIT_TYPES.join("|")})$`,
|
||||
);
|
||||
const OPENRC_RE = /^[A-Za-z0-9_][A-Za-z0-9_.@-]{0,127}$/;
|
||||
|
||||
export function isUnit(name: unknown): name is string {
|
||||
return typeof name === "string" && UNIT_RE.test(name);
|
||||
}
|
||||
|
||||
export function unitType(name: string): UnitType {
|
||||
return name.slice(name.lastIndexOf(".") + 1) as UnitType;
|
||||
}
|
||||
|
||||
/** Units a file may be written for. Templates and device style names are out. */
|
||||
export function isWritableUnitName(name: string): boolean {
|
||||
return (
|
||||
isUnit(name) &&
|
||||
!name.includes("\\") &&
|
||||
["service", "socket", "timer", "target", "path", "mount"].includes(
|
||||
unitType(name),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
export function isOpenRcName(name: unknown): name is string {
|
||||
return typeof name === "string" && OPENRC_RE.test(name);
|
||||
}
|
||||
|
||||
export function requireUnit(name: unknown): string {
|
||||
if (!isUnit(name)) throw new HostScriptError("That is not a valid unit name");
|
||||
return name;
|
||||
}
|
||||
|
||||
export type InitSystem = "systemd" | "openrc" | "none";
|
||||
|
||||
/** A unit name or, on OpenRC, a service name. */
|
||||
export function requireService(name: unknown, init: string): string {
|
||||
if (init === "openrc") {
|
||||
if (!isOpenRcName(name))
|
||||
throw new HostScriptError("That is not a valid service name");
|
||||
return name;
|
||||
}
|
||||
return requireUnit(name);
|
||||
}
|
||||
|
||||
export interface UnitSummary {
|
||||
name: string;
|
||||
type: string;
|
||||
load: string;
|
||||
active: string;
|
||||
sub: string;
|
||||
description: string;
|
||||
/** enabled, disabled, static, masked and so on. Empty when unknown. */
|
||||
fileState: string;
|
||||
preset: string;
|
||||
}
|
||||
|
||||
export interface UnitDetail {
|
||||
name: string;
|
||||
props: Record<string, string>;
|
||||
status: string;
|
||||
}
|
||||
|
||||
export interface TimerView {
|
||||
name: string;
|
||||
description: string;
|
||||
active: string;
|
||||
fileState: string;
|
||||
/** Unix ms, or null when not set. */
|
||||
next: number | null;
|
||||
last: number | null;
|
||||
activates: string;
|
||||
schedule: string[];
|
||||
}
|
||||
|
||||
export const UNIT_ACTIONS = [
|
||||
"start",
|
||||
"stop",
|
||||
"restart",
|
||||
"reload",
|
||||
"enable",
|
||||
"disable",
|
||||
"enable-now",
|
||||
"disable-now",
|
||||
"mask",
|
||||
"unmask",
|
||||
"reset-failed",
|
||||
"revert",
|
||||
] as const;
|
||||
export type UnitAction = (typeof UNIT_ACTIONS)[number];
|
||||
|
||||
/** Actions OpenRC can do. */
|
||||
export const OPENRC_ACTIONS: readonly UnitAction[] = [
|
||||
"start",
|
||||
"stop",
|
||||
"restart",
|
||||
"enable",
|
||||
"disable",
|
||||
];
|
||||
|
||||
export const DETECT_SCRIPT = `
|
||||
INIT=none
|
||||
if command -v systemctl >/dev/null 2>&1 && [ -d /run/systemd/system ]; then INIT=systemd
|
||||
elif command -v rc-service >/dev/null 2>&1; then INIT=openrc; fi
|
||||
echo "init=$INIT"
|
||||
if [ "$INIT" = systemd ]; then echo "version=$(systemctl --version 2>/dev/null | head -n1 | awk '{print $2}')"; fi
|
||||
if [ "$INIT" = openrc ]; then echo "version=$(openrc --version 2>/dev/null | head -n1 | awk '{print $NF}')"; fi
|
||||
echo "os=$( . /etc/os-release 2>/dev/null; echo "$PRETTY_NAME")"
|
||||
echo "hostname=$(hostname 2>/dev/null || cat /etc/hostname 2>/dev/null)"
|
||||
echo "uid=$(id -u)"
|
||||
if command -v journalctl >/dev/null 2>&1; then echo "journal=1"; fi
|
||||
if [ "$INIT" = systemd ]; then echo "failed=$(systemctl list-units --state=failed --plain --no-legend --no-pager 2>/dev/null | wc -l)"; fi
|
||||
if [ "$INIT" = openrc ]; then echo "failed=$(rc-status --crashed 2>/dev/null | wc -l)"; fi
|
||||
exit 0
|
||||
`;
|
||||
|
||||
export interface Detected {
|
||||
init: InitSystem;
|
||||
version: string;
|
||||
os: string;
|
||||
hostname: string;
|
||||
root: boolean;
|
||||
journal: boolean;
|
||||
failed: number;
|
||||
}
|
||||
|
||||
export function parseDetect(output: string): Detected {
|
||||
const keys = parseKeys(output);
|
||||
const init =
|
||||
keys.init === "systemd" || keys.init === "openrc" ? keys.init : "none";
|
||||
return {
|
||||
init,
|
||||
version: keys.version ?? "",
|
||||
os: keys.os ?? "",
|
||||
hostname: keys.hostname ?? "",
|
||||
root: keys.uid === "0",
|
||||
journal: keys.journal === "1",
|
||||
failed: Number(keys.failed) || 0,
|
||||
};
|
||||
}
|
||||
|
||||
/** Types the list can show. */
|
||||
export const LIST_TYPES = [
|
||||
"service",
|
||||
"socket",
|
||||
"timer",
|
||||
"target",
|
||||
"path",
|
||||
"mount",
|
||||
] as const;
|
||||
export type ListType = (typeof LIST_TYPES)[number] | "all";
|
||||
|
||||
export function listUnitsScript(type: ListType): string {
|
||||
const types = type === "all" ? LIST_TYPES.join(",") : type;
|
||||
if (type !== "all" && !LIST_TYPES.includes(type))
|
||||
throw new HostScriptError("Unknown unit type");
|
||||
return `
|
||||
systemctl list-units --all --plain --no-legend --no-pager --full --type=${types} 2>/dev/null
|
||||
echo "@@TERMIX_FILES@@"
|
||||
systemctl list-unit-files --plain --no-legend --no-pager --full --type=${types} 2>/dev/null
|
||||
exit 0
|
||||
`;
|
||||
}
|
||||
|
||||
/** Merges list-units and list-unit-files. Template units are left out. */
|
||||
export function parseUnitList(output: string): UnitSummary[] {
|
||||
const [loaded = "", files = ""] = output.split("@@TERMIX_FILES@@");
|
||||
const units = new Map<string, UnitSummary>();
|
||||
for (const raw of loaded.split("\n")) {
|
||||
const line = raw.replace(/^[●*\s]+/, "").trimEnd();
|
||||
if (!line) continue;
|
||||
const match = /^(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s*(.*)$/.exec(line);
|
||||
if (!match) continue;
|
||||
const [, name, load, active, sub, description] = match;
|
||||
if (!name.includes(".") || name.includes("@.")) continue;
|
||||
units.set(name, {
|
||||
name,
|
||||
type: unitType(name),
|
||||
load,
|
||||
active,
|
||||
sub,
|
||||
description: description.trim(),
|
||||
fileState: "",
|
||||
preset: "",
|
||||
});
|
||||
}
|
||||
for (const raw of files.split("\n")) {
|
||||
const line = raw.trim();
|
||||
if (!line) continue;
|
||||
const [name, state = "", preset = ""] = line.split(/\s+/);
|
||||
if (!name || !name.includes(".") || name.includes("@.")) continue;
|
||||
const known = units.get(name);
|
||||
const cleanPreset = preset === "-" ? "" : preset;
|
||||
if (known) {
|
||||
known.fileState = state;
|
||||
known.preset = cleanPreset;
|
||||
} else {
|
||||
units.set(name, {
|
||||
name,
|
||||
type: unitType(name),
|
||||
load: state === "masked" ? "masked" : "unloaded",
|
||||
active: "inactive",
|
||||
sub: "dead",
|
||||
description: "",
|
||||
fileState: state,
|
||||
preset: cleanPreset,
|
||||
});
|
||||
}
|
||||
}
|
||||
return [...units.values()].sort((a, b) => a.name.localeCompare(b.name));
|
||||
}
|
||||
|
||||
export const DETAIL_PROPS = [
|
||||
"Id",
|
||||
"Description",
|
||||
"LoadState",
|
||||
"ActiveState",
|
||||
"SubState",
|
||||
"UnitFileState",
|
||||
"UnitFilePreset",
|
||||
"Result",
|
||||
"MainPID",
|
||||
"ExecMainStartTimestamp",
|
||||
"ActiveEnterTimestamp",
|
||||
"InactiveEnterTimestamp",
|
||||
"MemoryCurrent",
|
||||
"MemoryPeak",
|
||||
"CPUUsageNSec",
|
||||
"TasksCurrent",
|
||||
"NRestarts",
|
||||
"FragmentPath",
|
||||
"DropInPaths",
|
||||
"Requires",
|
||||
"Wants",
|
||||
"After",
|
||||
"WantedBy",
|
||||
"TriggeredBy",
|
||||
"Triggers",
|
||||
"User",
|
||||
"Group",
|
||||
"Restart",
|
||||
"Type",
|
||||
"ExecStart",
|
||||
"CanStart",
|
||||
"CanStop",
|
||||
"CanReload",
|
||||
] as const;
|
||||
|
||||
export function detailScript(unit: string): string {
|
||||
const props = DETAIL_PROPS.map((p) => `-p ${p}`).join(" ");
|
||||
return `
|
||||
systemctl show --no-pager ${props} -- ${q(requireUnit(unit))}
|
||||
echo "@@TERMIX_STATUS@@"
|
||||
systemctl status --no-pager --full -n 0 -- ${q(unit)} 2>&1
|
||||
exit 0
|
||||
`;
|
||||
}
|
||||
|
||||
export function parseDetail(unit: string, output: string): UnitDetail {
|
||||
const [props = "", status = ""] = output.split("@@TERMIX_STATUS@@");
|
||||
return { name: unit, props: parseKeys(props), status: status.trim() };
|
||||
}
|
||||
|
||||
const VERBS: Record<UnitAction, string> = {
|
||||
start: "start",
|
||||
stop: "stop",
|
||||
restart: "restart",
|
||||
reload: "reload",
|
||||
enable: "enable",
|
||||
disable: "disable",
|
||||
"enable-now": "enable --now",
|
||||
"disable-now": "disable --now",
|
||||
mask: "mask",
|
||||
unmask: "unmask",
|
||||
"reset-failed": "reset-failed",
|
||||
revert: "revert",
|
||||
};
|
||||
|
||||
/** The systemctl call for an action. Prints `state=` after it. */
|
||||
export function actionScript(unit: string, action: UnitAction): string {
|
||||
const verb = VERBS[action];
|
||||
if (!verb) throw new HostScriptError("Unknown action");
|
||||
const u = q(requireUnit(unit));
|
||||
return `
|
||||
systemctl ${verb} -- ${u} 2>&1 || { echo "SCRIPT_ERR:systemctl ${verb} failed"; exit 1; }
|
||||
echo "state=$(systemctl is-active -- ${u} 2>/dev/null)"
|
||||
`;
|
||||
}
|
||||
|
||||
/** Times systemctl prints under TZ=UTC, like "Thu 2026-10-22 02:03:51 UTC". */
|
||||
export function parseSystemdTime(value: string | undefined): number | null {
|
||||
if (!value) return null;
|
||||
const match = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/.exec(value);
|
||||
if (!match) return null;
|
||||
const [, y, mo, d, h, mi, s] = match.map(Number);
|
||||
return Date.UTC(y, mo - 1, d, h, mi, s);
|
||||
}
|
||||
|
||||
export const TIMERS_SCRIPT = `
|
||||
UNITS=$( { systemctl list-units --all --type=timer --plain --no-legend --no-pager --full 2>/dev/null | awk '{print $1}'; systemctl list-unit-files --type=timer --plain --no-legend --no-pager --full 2>/dev/null | awk '{print $1}'; } | grep '\\.timer$' | grep -v '@\\.timer$' | sort -u)
|
||||
[ -n "$UNITS" ] || exit 0
|
||||
systemctl show --no-pager -p Id -p Description -p ActiveState -p UnitFileState -p NextElapseUSecRealtime -p LastTriggerUSec -p Triggers -p TimersCalendar -p TimersMonotonic -- $UNITS
|
||||
exit 0
|
||||
`;
|
||||
|
||||
/** Reads systemctl show output for many units, split by blank lines. */
|
||||
export function parseShowBlocks(output: string): Array<Record<string, string>> {
|
||||
const blocks: Array<Record<string, string>> = [];
|
||||
for (const block of output.split(/\n\s*\n/)) {
|
||||
const lines = block.split("\n").filter((line) => line.includes("="));
|
||||
if (!lines.length) continue;
|
||||
// A unit can have several TimersCalendar lines; keep all of them.
|
||||
const keys: Record<string, string> = {};
|
||||
for (const line of lines) {
|
||||
const eq = line.indexOf("=");
|
||||
const key = line.slice(0, eq).trim();
|
||||
const value = line.slice(eq + 1).trim();
|
||||
keys[key] = key in keys ? `${keys[key]}\n${value}` : value;
|
||||
}
|
||||
blocks.push(keys);
|
||||
}
|
||||
return blocks;
|
||||
}
|
||||
|
||||
function schedules(value: string | undefined): string[] {
|
||||
if (!value) return [];
|
||||
const out: string[] = [];
|
||||
for (const line of value.split("\n")) {
|
||||
const match = /\{\s*(\w+)=(.+?)\s*;/.exec(line);
|
||||
if (match) out.push(`${match[1]}=${match[2]}`);
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
export function parseTimers(output: string): TimerView[] {
|
||||
return parseShowBlocks(output)
|
||||
.filter((keys) => keys.Id?.endsWith(".timer"))
|
||||
.map((keys) => ({
|
||||
name: keys.Id,
|
||||
description: keys.Description ?? "",
|
||||
active: keys.ActiveState ?? "",
|
||||
fileState: keys.UnitFileState ?? "",
|
||||
next: parseSystemdTime(keys.NextElapseUSecRealtime),
|
||||
last: parseSystemdTime(keys.LastTriggerUSec),
|
||||
activates: (keys.Triggers ?? "").split(/\s+/)[0] ?? "",
|
||||
schedule: [
|
||||
...schedules(keys.TimersCalendar),
|
||||
...schedules(keys.TimersMonotonic),
|
||||
],
|
||||
}))
|
||||
.sort((a, b) => (a.next ?? Infinity) - (b.next ?? Infinity));
|
||||
}
|
||||
|
||||
/** One line per unit from systemctl is-active, in the order asked. */
|
||||
export function isActiveScript(units: string[]): string {
|
||||
return `systemctl is-active -- ${units.map((u) => q(requireUnit(u))).join(" ")} 2>/dev/null; exit 0\n`;
|
||||
}
|
||||
|
||||
export function parseIsActive(
|
||||
units: string[],
|
||||
output: string,
|
||||
): Map<string, string> {
|
||||
const lines = output.split("\n").map((line) => line.trim());
|
||||
const out = new Map<string, string>();
|
||||
units.forEach((unit, i) => out.set(unit, lines[i] || "unknown"));
|
||||
return out;
|
||||
}
|
||||
@@ -0,0 +1,118 @@
|
||||
/**
|
||||
* Quoting, encoding and the error type the host scripts share.
|
||||
*
|
||||
* No Node APIs here: this entry also runs in the mobile app.
|
||||
*/
|
||||
|
||||
/** A bad input to a host script builder. `status` is the HTTP status to answer with. */
|
||||
export class HostScriptError extends Error {
|
||||
constructor(
|
||||
message: string,
|
||||
readonly status = 400,
|
||||
readonly extra: Record<string, unknown> = {},
|
||||
) {
|
||||
super(message);
|
||||
this.name = "HostScriptError";
|
||||
}
|
||||
}
|
||||
|
||||
/** Wraps a value in single quotes for a POSIX shell. */
|
||||
export function shellQuote(value: string): string {
|
||||
return `'${value.replace(/'/g, `'\\''`)}'`;
|
||||
}
|
||||
|
||||
// Written by hand because some JS engines (Hermes) have no TextDecoder.
|
||||
|
||||
/** UTF-8 bytes of a string. */
|
||||
export function utf8Encode(text: string): Uint8Array {
|
||||
const out: number[] = [];
|
||||
for (const char of text) {
|
||||
const cp = char.codePointAt(0) ?? 0xfffd;
|
||||
if (cp < 0x80) out.push(cp);
|
||||
else if (cp < 0x800) out.push(0xc0 | (cp >> 6), 0x80 | (cp & 63));
|
||||
else if (cp < 0x10000) {
|
||||
out.push(0xe0 | (cp >> 12), 0x80 | ((cp >> 6) & 63), 0x80 | (cp & 63));
|
||||
} else {
|
||||
out.push(
|
||||
0xf0 | (cp >> 18),
|
||||
0x80 | ((cp >> 12) & 63),
|
||||
0x80 | ((cp >> 6) & 63),
|
||||
0x80 | (cp & 63),
|
||||
);
|
||||
}
|
||||
}
|
||||
return Uint8Array.from(out);
|
||||
}
|
||||
|
||||
/** A string from UTF-8 bytes. Bad sequences become U+FFFD. */
|
||||
export function utf8Decode(bytes: ArrayLike<number>): string {
|
||||
let out = "";
|
||||
let i = 0;
|
||||
while (i < bytes.length) {
|
||||
const b = bytes[i];
|
||||
let need = 0;
|
||||
let cp = 0;
|
||||
if (b < 0x80) cp = b;
|
||||
else if (b >= 0xc2 && b < 0xe0) [need, cp] = [1, b & 31];
|
||||
else if (b >= 0xe0 && b < 0xf0) [need, cp] = [2, b & 15];
|
||||
else if (b >= 0xf0 && b < 0xf5) [need, cp] = [3, b & 7];
|
||||
else {
|
||||
out += "\ufffd";
|
||||
i++;
|
||||
continue;
|
||||
}
|
||||
let j = 1;
|
||||
for (; j <= need; j++) {
|
||||
const next = bytes[i + j];
|
||||
if (next === undefined || (next & 0xc0) !== 0x80) break;
|
||||
cp = (cp << 6) | (next & 63);
|
||||
}
|
||||
const tooSmall = [0, 0x80, 0x800, 0x10000][need];
|
||||
if (
|
||||
j <= need ||
|
||||
cp < tooSmall ||
|
||||
cp > 0x10ffff ||
|
||||
(cp >= 0xd800 && cp < 0xe000)
|
||||
) {
|
||||
out += "\ufffd";
|
||||
i += Math.max(1, j);
|
||||
continue;
|
||||
}
|
||||
out += String.fromCodePoint(cp);
|
||||
i += need + 1;
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
const B64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
||||
|
||||
/** Base64 of the UTF-8 bytes of a string, for `base64 -d` on the host. */
|
||||
export function toBase64(text: string): string {
|
||||
const bytes = utf8Encode(text);
|
||||
let out = "";
|
||||
for (let i = 0; i < bytes.length; i += 3) {
|
||||
const a = bytes[i];
|
||||
const b = i + 1 < bytes.length ? bytes[i + 1] : 0;
|
||||
const c = i + 2 < bytes.length ? bytes[i + 2] : 0;
|
||||
const n = (a << 16) | (b << 8) | c;
|
||||
out += B64[(n >> 18) & 63] + B64[(n >> 12) & 63];
|
||||
out += i + 1 < bytes.length ? B64[(n >> 6) & 63] : "=";
|
||||
out += i + 2 < bytes.length ? B64[n & 63] : "=";
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/** Reads key=value lines. Only the first = splits a line. */
|
||||
export function parseKeys(output: string): Record<string, string> {
|
||||
const out: Record<string, string> = {};
|
||||
for (const line of output.split("\n")) {
|
||||
const eq = line.indexOf("=");
|
||||
if (eq > 0) out[line.slice(0, eq).trim()] = line.slice(eq + 1).trim();
|
||||
}
|
||||
return out;
|
||||
}
|
||||
|
||||
/** Trims output and keeps it short enough to show. */
|
||||
export function scrub(text: string, max = 600): string {
|
||||
return text.trim().slice(0, max);
|
||||
}
|
||||
@@ -37,7 +37,7 @@ export {
|
||||
* "^1.2" needs 1.2 or later). engine.termix is checked against the core
|
||||
* version by the server.
|
||||
*/
|
||||
export const PLUGIN_API_VERSION = "1.9.0";
|
||||
export const PLUGIN_API_VERSION = "1.12.0";
|
||||
|
||||
/** The API major, the default engine.api for a new plugin. */
|
||||
export const SUPPORTED_PLUGIN_API_VERSION = String(
|
||||
|
||||
@@ -139,6 +139,7 @@ const offline = () =>
|
||||
}),
|
||||
hostProtocols: () => ["ssh"],
|
||||
useHostActions: () => [],
|
||||
useCompanions: () => [],
|
||||
useActivityTypes: () => [],
|
||||
activityTarget: () => undefined,
|
||||
useExtensions: () => [],
|
||||
|
||||
@@ -80,7 +80,7 @@ DEFAULT_FOLDER_COLOR (value): "#f59145"
|
||||
DEFAULT_FOLDER_ICON (value): "folder"
|
||||
DashboardCardId (type): DashboardCardId
|
||||
DataColumn (type): DataColumn<T>
|
||||
DataView (value): <T>({ items, view, density, getKey, renderCard, columns, listColumns, onRowClick, isRowActive, empty, className, }: { items: T[]; view: PanelViewMode; density?: PanelDensity; getKey: (item: T) => string; renderCard: (item: T) => ReactNode; columns: GridColumns; listColumns: DataColumn<T>[]; onRowClick?: (item: T) => void; isRowActive?: (item: T) => boolean; empty: ReactNode; className?: string; }) => Element
|
||||
DataView (value): <T>({ items, view, density, getKey, renderCard, columns, size, minCardWidth, listColumns, onRowClick, isRowActive, empty, className, }: { items: T[]; view: PanelViewMode; density?: PanelDensity; getKey: (item: T) => string; renderCard: (item: T) => ReactNode; columns: GridColumns; size?: GridSize; minCardWidth?: number; listColumns: DataColumn<T>[]; onRowClick?: (item: T) => void; isRowActive?: (item: T) => boolean; empty: ReactNode; className?: string; }) => Element
|
||||
DefaultOverrides (type): DefaultOverrides
|
||||
DefaultsOnly (value): ({ settingKey, children, }: { settingKey: string; children: ReactNode; }) => Element
|
||||
DesktopUpdateMode (type): DesktopUpdateMode
|
||||
@@ -131,6 +131,7 @@ GridCardCatalogEntry (type): GridCardCatalogEntry
|
||||
GridColSpan (type): GridColSpan
|
||||
GridColumns (type): GridColumns
|
||||
GridLayout (type): GridLayout
|
||||
GridSize (type): GridSize
|
||||
GridSlot (type): GridSlot
|
||||
GroupHeading (value): ({ title, count, action, className, }: { title: string; count?: number; action?: ReactNode; className?: string; }) => Element
|
||||
HexColorPicker (value): ({ value, onChange, }: { value: string; onChange: (hex: string) => void; }) => Element
|
||||
@@ -321,7 +322,7 @@ UserRole (type): UserRole
|
||||
UserSecondFactorSummary (type): UserSecondFactorSummary
|
||||
VersionBadge (value): ({ status, releaseUrl, className, }: VersionBadgeProps) => Element
|
||||
VersionInfo (type): VersionInfo
|
||||
ViewToggle (value): ({ view, onView, density, onDensity, }: { view: PanelViewMode; onView: (next: PanelViewMode) => void; density?: PanelDensity; onDensity?: (next: PanelDensity) => void; }) => Element
|
||||
ViewToggle (value): ({ view, onView, density, onDensity, columns, onColumns, }: { view: PanelViewMode; onView: (next: PanelViewMode) => void; density?: PanelDensity; onDensity?: (next: PanelDensity) => void; columns?: GridSize; onColumns?: (next: GridSize) => void; }) => Element
|
||||
WebSocketConnectionTarget (type): WebSocketConnectionTarget
|
||||
WidgetTitle (value): ({ title, icon, fallback }: WidgetTitleProps) => Element
|
||||
actionOrder (value): (action: HostActionDef) => number
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
*
|
||||
* getBundledPluginsDir() in src/backend/plugins/paths.ts resolves
|
||||
* dist/backend/backend/plugins -> dist/plugins, which is where this writes.
|
||||
* --profile minimal|standard|full (or TERMIX_PLUGIN_PROFILE, default standard)
|
||||
* picks which tiers of the file are staged.
|
||||
* Each .tmxplug is downloaded (or read from a path), checked against its
|
||||
* pinned sha256 and unpacked.
|
||||
*
|
||||
@@ -25,13 +27,16 @@ const {
|
||||
localSdkBuildCommand,
|
||||
copyLocalBuild,
|
||||
buildBundledIndex,
|
||||
resolveProfile,
|
||||
pluginsForProfile,
|
||||
} = require("./lib/bundled-plugins.cjs");
|
||||
|
||||
const root = path.resolve(__dirname, "..");
|
||||
const destination = path.join(root, "dist", "plugins");
|
||||
|
||||
async function main() {
|
||||
const plugins = loadBundledPlugins(root);
|
||||
const profile = resolveProfile();
|
||||
const plugins = pluginsForProfile(loadBundledPlugins(root), profile);
|
||||
const flag = process.argv.indexOf("--local");
|
||||
const localArg =
|
||||
flag !== -1 ? process.argv[flag + 1] : process.env.TERMIX_LOCAL_PLUGINS;
|
||||
@@ -74,7 +79,7 @@ async function main() {
|
||||
);
|
||||
|
||||
console.log(
|
||||
`Bundled ${plugins.length + extra.length} plugin(s): ${[...pinned, ...extra].join(", ")}`,
|
||||
`Bundled ${plugins.length + extra.length} plugin(s) (${profile}): ${[...pinned, ...extra].join(", ")}`,
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -16,6 +16,8 @@ import {
|
||||
localSdkBuildCommand,
|
||||
rebuildLocalPlugins,
|
||||
copyLocalBuild,
|
||||
resolveProfile,
|
||||
pluginsForProfile,
|
||||
} from "./lib/bundled-plugins.cjs";
|
||||
|
||||
const cleanups: Array<() => void> = [];
|
||||
@@ -263,10 +265,52 @@ describe("pinsFromIndex", () => {
|
||||
source: "tmxplug",
|
||||
url: "https://example.test/beta-1.1.0.tmxplug",
|
||||
sha256: "b".repeat(64),
|
||||
tier: "full",
|
||||
});
|
||||
expect(parseBundledPlugins({ plugins: pins }).problems).toEqual([]);
|
||||
});
|
||||
|
||||
it("keeps the tier of an existing pin", () => {
|
||||
const pins = pinsFromIndex(index, null, [
|
||||
{ id: "alpha", tier: "standard" },
|
||||
]);
|
||||
expect(pins[0].tier).toBe("standard");
|
||||
expect(pins[1].tier).toBe("full");
|
||||
});
|
||||
|
||||
it("skips releases whose engine.termix excludes the core version", () => {
|
||||
const withEngine = {
|
||||
plugins: [
|
||||
{
|
||||
id: "gamma",
|
||||
versions: [
|
||||
{
|
||||
version: "2.0.0",
|
||||
url: "https://example.test/gamma-2.0.0.tmxplug",
|
||||
sha256: "d".repeat(64),
|
||||
engine: { api: "^1", termix: ">=26.10.6" },
|
||||
},
|
||||
{
|
||||
version: "1.0.0",
|
||||
url: "https://example.test/gamma-1.0.0.tmxplug",
|
||||
sha256: "e".repeat(64),
|
||||
engine: { api: "^1", termix: ">=26.10.0" },
|
||||
},
|
||||
],
|
||||
},
|
||||
],
|
||||
};
|
||||
expect(pinsFromIndex(withEngine, null, [], "26.10.5")[0].url).toBe(
|
||||
"https://example.test/gamma-1.0.0.tmxplug",
|
||||
);
|
||||
expect(pinsFromIndex(withEngine, null, [], "26.10.6")[0].url).toBe(
|
||||
"https://example.test/gamma-2.0.0.tmxplug",
|
||||
);
|
||||
expect(pinsFromIndex(withEngine, null)[0].url).toBe(
|
||||
"https://example.test/gamma-2.0.0.tmxplug",
|
||||
);
|
||||
});
|
||||
|
||||
it("keeps the onboarding defaults of an existing pin", () => {
|
||||
const current = [
|
||||
{ id: "beta", onboarding: { recommended: true, consent: false } },
|
||||
@@ -511,3 +555,61 @@ describe("default look", () => {
|
||||
expect(fs.existsSync(path.join(out, "themes", "paper.css"))).toBe(true);
|
||||
});
|
||||
});
|
||||
|
||||
describe("plugin profiles", () => {
|
||||
const entry = (id: string, tier?: string) => ({
|
||||
id,
|
||||
source: "tmxplug",
|
||||
url: `https://x/${id}.tmxplug`,
|
||||
sha256: SHA,
|
||||
...(tier ? { tier } : {}),
|
||||
});
|
||||
const { plugins } = parseBundledPlugins({
|
||||
plugins: [
|
||||
entry("look", "minimal"),
|
||||
entry("term", "standard"),
|
||||
entry("extra", "full"),
|
||||
entry("untiered"),
|
||||
],
|
||||
});
|
||||
const ids = (profile: string) =>
|
||||
pluginsForProfile(plugins, profile).map((p: { id: string }) => p.id);
|
||||
|
||||
it("ships each tier and every smaller one", () => {
|
||||
expect(ids("minimal")).toEqual(["look"]);
|
||||
expect(ids("standard")).toEqual(["look", "term"]);
|
||||
expect(ids("full")).toEqual(["look", "term", "extra", "untiered"]);
|
||||
});
|
||||
|
||||
it("rejects an unknown tier", () => {
|
||||
const { problems } = parseBundledPlugins({ plugins: [entry("x", "huge")] });
|
||||
expect(problems[0]).toMatch(/tier must be one of/);
|
||||
});
|
||||
|
||||
it("reads the profile from the flag, then the environment", () => {
|
||||
expect(resolveProfile(["node", "x"], {})).toBe("standard");
|
||||
expect(
|
||||
resolveProfile(["node", "x"], { TERMIX_PLUGIN_PROFILE: "full" }),
|
||||
).toBe("full");
|
||||
expect(
|
||||
resolveProfile(["node", "x", "--profile", "minimal"], {
|
||||
TERMIX_PLUGIN_PROFILE: "full",
|
||||
}),
|
||||
).toBe("minimal");
|
||||
expect(() =>
|
||||
resolveProfile(["node", "x", "--profile", "tiny"], {}),
|
||||
).toThrow(/unknown plugin profile/);
|
||||
});
|
||||
|
||||
it("keeps the real file valid with a default look in the minimal tier", () => {
|
||||
const real = loadBundledPlugins(path.resolve(__dirname, ".."));
|
||||
const minimal = pluginsForProfile(real, "minimal");
|
||||
expect(minimal.length).toBeGreaterThan(0);
|
||||
expect(minimal.every((p: { defaultLook: boolean }) => p.defaultLook)).toBe(
|
||||
true,
|
||||
);
|
||||
expect(pluginsForProfile(real, "standard").length).toBeLessThan(
|
||||
real.length,
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,111 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Buttons are never white.
|
||||
*
|
||||
* Every Button variant is the brand orange with a different background
|
||||
* opacity (or red for destructive, or transparent for ghost). Fails when a
|
||||
* variant in src/ui/components/button.tsx uses a neutral fill, or when a
|
||||
* <Button> anywhere in core or the local plugin checkouts sets a neutral fill
|
||||
* in its className.
|
||||
*/
|
||||
|
||||
const fs = require("node:fs");
|
||||
const path = require("node:path");
|
||||
|
||||
const NEUTRAL =
|
||||
/(?:^|[\s"'`])(?:dark:)?(?:bg-(?:primary|white|foreground|background|secondary|card|popover|muted|accent|input|neutral-\d+|zinc-\d+|gray-\d+|slate-\d+|stone-\d+)(?![\w-])|text-primary-foreground)/;
|
||||
|
||||
/** The opening tag text of each <Button ...> in a source file. */
|
||||
function buttonTags(source) {
|
||||
const tags = [];
|
||||
const re = /<Button(?=[\s/>])/g;
|
||||
let match;
|
||||
while ((match = re.exec(source))) {
|
||||
let depth = 0;
|
||||
let quote = "";
|
||||
let i = match.index + match[0].length;
|
||||
for (; i < source.length; i++) {
|
||||
const c = source[i];
|
||||
if (quote) {
|
||||
if (c === "\\") i++;
|
||||
else if (c === quote) quote = "";
|
||||
} else if (c === '"' || c === "'" || c === "`") quote = c;
|
||||
else if (c === "{") depth++;
|
||||
else if (c === "}") depth--;
|
||||
else if (c === ">" && depth === 0) break;
|
||||
}
|
||||
tags.push(source.slice(match.index, i + 1));
|
||||
}
|
||||
return tags;
|
||||
}
|
||||
|
||||
/** Variant strings from the cva block of button.tsx. */
|
||||
function variantLines(source) {
|
||||
const start = source.indexOf("variant: {");
|
||||
const end = source.indexOf("size: {");
|
||||
if (start < 0 || end < 0) return [];
|
||||
return source
|
||||
.slice(start, end)
|
||||
.split("\n")
|
||||
.filter((line) => /["`]/.test(line) && !line.includes("variant: {"));
|
||||
}
|
||||
|
||||
function walk(dir, out) {
|
||||
if (!fs.existsSync(dir)) return;
|
||||
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
||||
if (["node_modules", "dist", "tests", "__fixtures__"].includes(entry.name))
|
||||
continue;
|
||||
const full = path.join(dir, entry.name);
|
||||
if (entry.isDirectory()) walk(full, out);
|
||||
else if (entry.name.endsWith(".tsx")) out.push(full);
|
||||
}
|
||||
}
|
||||
|
||||
/** Problems found under the given roots. */
|
||||
function scan(roots, buttonFile) {
|
||||
const problems = [];
|
||||
if (buttonFile && fs.existsSync(buttonFile)) {
|
||||
for (const line of variantLines(fs.readFileSync(buttonFile, "utf8"))) {
|
||||
if (NEUTRAL.test(line)) {
|
||||
problems.push(
|
||||
`${buttonFile}: neutral fill in a variant: ${line.trim()}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
const files = [];
|
||||
for (const root of roots) walk(root, files);
|
||||
for (const file of files) {
|
||||
for (const tag of buttonTags(fs.readFileSync(file, "utf8"))) {
|
||||
if (NEUTRAL.test(tag)) {
|
||||
problems.push(
|
||||
`${file}: <Button> with a neutral fill: ${tag.slice(0, 120)}`,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
return problems;
|
||||
}
|
||||
|
||||
module.exports = { scan, buttonTags, variantLines };
|
||||
|
||||
if (require.main === module) {
|
||||
const core = path.resolve(__dirname, "..");
|
||||
const plugins = path.resolve(core, "..", "Plugins");
|
||||
const roots = [path.join(core, "src", "ui")];
|
||||
if (fs.existsSync(plugins)) {
|
||||
for (const entry of fs.readdirSync(plugins)) {
|
||||
roots.push(path.join(plugins, entry, "src"));
|
||||
}
|
||||
}
|
||||
const problems = scan(
|
||||
roots,
|
||||
path.join(core, "src", "ui", "components", "button.tsx"),
|
||||
);
|
||||
if (problems.length) {
|
||||
console.error("Buttons must be the brand orange, never white or neutral:");
|
||||
for (const p of problems) console.error(" " + p);
|
||||
process.exit(1);
|
||||
}
|
||||
console.log("ok button colors");
|
||||
}
|
||||
@@ -0,0 +1,80 @@
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import { createRequire } from "node:module";
|
||||
import fs from "node:fs";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
|
||||
const require = createRequire(import.meta.url);
|
||||
const { scan, buttonTags } = require("./check-button-colors.cjs") as {
|
||||
scan: (roots: string[], buttonFile?: string) => string[];
|
||||
buttonTags: (source: string) => string[];
|
||||
};
|
||||
|
||||
let root: string | null = null;
|
||||
|
||||
afterEach(() => {
|
||||
if (root) fs.rmSync(root, { recursive: true, force: true });
|
||||
root = null;
|
||||
});
|
||||
|
||||
function fixture(files: Record<string, string>): string {
|
||||
root = fs.mkdtempSync(path.join(os.tmpdir(), "button-colors-"));
|
||||
for (const [file, content] of Object.entries(files)) {
|
||||
const full = path.join(root, file);
|
||||
fs.mkdirSync(path.dirname(full), { recursive: true });
|
||||
fs.writeFileSync(full, content);
|
||||
}
|
||||
return root;
|
||||
}
|
||||
|
||||
describe("buttonTags", () => {
|
||||
it("reads a tag with arrow functions inside", () => {
|
||||
const tags = buttonTags(
|
||||
`<Button onClick={() => go(a > b)} className="x">Go</Button>`,
|
||||
);
|
||||
expect(tags).toHaveLength(1);
|
||||
expect(tags[0]).toContain('className="x"');
|
||||
});
|
||||
});
|
||||
|
||||
describe("check-button-colors", () => {
|
||||
it("accepts orange buttons and hover fills", () => {
|
||||
const dir = fixture({
|
||||
"a.tsx": `<Button className="bg-accent-brand/15 text-accent-brand hover:bg-muted" />`,
|
||||
});
|
||||
expect(scan([dir])).toEqual([]);
|
||||
});
|
||||
|
||||
it("rejects a white or neutral fill on a Button", () => {
|
||||
for (const cls of [
|
||||
"bg-primary",
|
||||
"bg-white",
|
||||
"bg-foreground text-background",
|
||||
"dark:bg-secondary",
|
||||
"bg-muted",
|
||||
"text-primary-foreground",
|
||||
]) {
|
||||
const dir = fixture({ "a.tsx": `<Button className="${cls}">x</Button>` });
|
||||
expect(scan([dir]), cls).toHaveLength(1);
|
||||
}
|
||||
});
|
||||
|
||||
it("rejects a neutral fill in a variant", () => {
|
||||
const dir = fixture({
|
||||
"button.tsx": `variant: {\n default: "bg-primary text-primary-foreground",\n ghost: "hover:bg-muted",\n},\nsize: {`,
|
||||
});
|
||||
expect(scan([], path.join(dir, "button.tsx"))).toHaveLength(1);
|
||||
});
|
||||
|
||||
it("passes on the real button", () => {
|
||||
const button = path.resolve(
|
||||
__dirname,
|
||||
"..",
|
||||
"src",
|
||||
"ui",
|
||||
"components",
|
||||
"button.tsx",
|
||||
);
|
||||
expect(scan([], button)).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -151,6 +151,7 @@ const ALLOWED = [
|
||||
"GridCardCatalogEntry",
|
||||
"GridColSpan",
|
||||
"GridColumns",
|
||||
"GridSize",
|
||||
"GridLayout",
|
||||
"GridSlot",
|
||||
"GroupHeading",
|
||||
|
||||
@@ -21,6 +21,8 @@ const packages = [
|
||||
"@img/sharp-win32-x64",
|
||||
].map((name) => `${name}@${sharpPackage.optionalDependencies[name]}`);
|
||||
|
||||
// A .cmd file only starts through a shell on current Node.
|
||||
execFileSync("npm.cmd", ["install", "--force", "--no-save", ...packages], {
|
||||
stdio: "inherit",
|
||||
shell: true,
|
||||
});
|
||||
@@ -16,6 +16,11 @@
|
||||
* environment variables is set, for a server configured before first boot.
|
||||
* Plugins without it start unchecked.
|
||||
*
|
||||
* "tier" says which image profile ships the plugin: "minimal" (only what the
|
||||
* app cannot start without, the default look), "standard" (the default image)
|
||||
* or "full" (everything else). A profile includes its own tier and every
|
||||
* smaller one. A plugin with no tier counts as "full".
|
||||
*
|
||||
* "defaultLook": true marks the plugin whose layout (and that layout's
|
||||
* theme) a fresh install shows. Core finds the default look this way, so it
|
||||
* never names a plugin. Such a plugin always starts enabled and cannot be
|
||||
@@ -31,6 +36,8 @@ const ID = /^[a-z0-9][a-z0-9-]*$/;
|
||||
const ENV_NAME = /^[A-Z][A-Z0-9_]*$/;
|
||||
const ONBOARDING_KEYS = new Set(["recommended", "consent", "enabledByEnv"]);
|
||||
const SHA256 = /^[0-9a-f]{64}$/;
|
||||
const PROFILES = ["minimal", "standard", "full"];
|
||||
const DEFAULT_PROFILE = "standard";
|
||||
|
||||
function parseOnboarding(value, id, problems) {
|
||||
if (value === undefined) return null;
|
||||
@@ -122,6 +129,9 @@ function parseBundledPlugins(raw) {
|
||||
) {
|
||||
problems.push(`${entry.id} defaultLook must be a boolean`);
|
||||
}
|
||||
if (entry.tier !== undefined && !PROFILES.includes(entry.tier)) {
|
||||
problems.push(`${entry.id} tier must be one of ${PROFILES.join(", ")}`);
|
||||
}
|
||||
if (problems.length > before) continue;
|
||||
plugins.push({
|
||||
id: entry.id,
|
||||
@@ -131,6 +141,7 @@ function parseBundledPlugins(raw) {
|
||||
sha256: entry.sha256,
|
||||
onboarding,
|
||||
defaultLook: entry.defaultLook === true,
|
||||
tier: entry.tier ?? "full",
|
||||
});
|
||||
} else {
|
||||
problems.push(`${entry.id} has an unknown source "${entry.source}"`);
|
||||
@@ -241,12 +252,35 @@ function buildBundledIndex(plugins, stagedIds) {
|
||||
return { version: 1, plugins: out };
|
||||
}
|
||||
|
||||
/** The profile to build: --profile, then TERMIX_PLUGIN_PROFILE, then standard. */
|
||||
function resolveProfile(argv = process.argv, env = process.env) {
|
||||
const flag = argv.indexOf("--profile");
|
||||
const value =
|
||||
(flag !== -1 ? argv[flag + 1] : env.TERMIX_PLUGIN_PROFILE) ||
|
||||
DEFAULT_PROFILE;
|
||||
if (!PROFILES.includes(value)) {
|
||||
throw new Error(
|
||||
`unknown plugin profile "${value}", use ${PROFILES.join(", ")}`,
|
||||
);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
|
||||
/** The plugins a profile ships: its own tier and every smaller one. */
|
||||
function pluginsForProfile(plugins, profile) {
|
||||
const rank = PROFILES.indexOf(profile);
|
||||
return plugins.filter((plugin) => PROFILES.indexOf(plugin.tier) <= rank);
|
||||
}
|
||||
|
||||
/**
|
||||
* Pins the newest registry version of each wanted plugin. `ids` is the list
|
||||
* to pin, or null for every plugin in the index. `current` is the existing
|
||||
* pin list, so fields the registry does not know (onboarding) carry over.
|
||||
* pin list, so fields the registry does not know (onboarding, tier) carry over;
|
||||
* a plugin new to the list starts in the full tier. coreVersion, when given,
|
||||
* skips releases whose engine.termix range does not include it, so the image
|
||||
* never ships a plugin its own core cannot run.
|
||||
*/
|
||||
function pinsFromIndex(index, ids, current = []) {
|
||||
function pinsFromIndex(index, ids, current = [], coreVersion = null) {
|
||||
const plugins = Array.isArray(index?.plugins) ? index.plugins : [];
|
||||
const byId = new Map(plugins.map((plugin) => [plugin.id, plugin]));
|
||||
const currentById = new Map(current.map((entry) => [entry.id, entry]));
|
||||
@@ -257,15 +291,25 @@ function pinsFromIndex(index, ids, current = []) {
|
||||
const latest = [...(listed?.versions ?? []), ...(listed?.gated ?? [])]
|
||||
.filter((entry) => semver.valid(entry.version))
|
||||
.filter((entry) => !semver.prerelease(entry.version))
|
||||
.filter(
|
||||
(entry) =>
|
||||
!coreVersion ||
|
||||
!entry.engine?.termix ||
|
||||
semver.satisfies(coreVersion, entry.engine.termix, {
|
||||
includePrerelease: true,
|
||||
}),
|
||||
)
|
||||
.sort((a, b) => semver.rcompare(a.version, b.version))[0];
|
||||
if (!latest) throw new Error(`${id} is not in the registry index`);
|
||||
const onboarding = currentById.get(id)?.onboarding;
|
||||
const defaultLook = currentById.get(id)?.defaultLook === true;
|
||||
const tier = currentById.get(id)?.tier ?? "full";
|
||||
return {
|
||||
id,
|
||||
source: "tmxplug",
|
||||
url: latest.url,
|
||||
sha256: latest.sha256,
|
||||
tier,
|
||||
...(onboarding ? { onboarding } : {}),
|
||||
...(defaultLook ? { defaultLook } : {}),
|
||||
};
|
||||
@@ -409,6 +453,9 @@ function copyLocalBuild(repo, destination) {
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
PROFILES,
|
||||
resolveProfile,
|
||||
pluginsForProfile,
|
||||
findLocalPluginBuilds,
|
||||
isLocalBuildStale,
|
||||
localSdkBuildCommand,
|
||||
|
||||
@@ -4,7 +4,10 @@
|
||||
* re-released.
|
||||
*
|
||||
* node scripts/pin-bundled-plugins.cjs refresh the plugins already listed
|
||||
* node scripts/pin-bundled-plugins.cjs --all list every plugin in the index
|
||||
* node scripts/pin-bundled-plugins.cjs --all also add plugins new to the index (tier full)
|
||||
* --core-version X skip releases whose engine.termix excludes X
|
||||
*
|
||||
* The release workflow runs it with --all and the version being released.
|
||||
*/
|
||||
|
||||
const fs = require("node:fs");
|
||||
@@ -22,6 +25,8 @@ const configPath = path.join(root, "docker", "bundled-plugins.json");
|
||||
|
||||
async function main() {
|
||||
const all = process.argv.includes("--all");
|
||||
const flag = process.argv.indexOf("--core-version");
|
||||
const coreVersion = flag !== -1 ? process.argv[flag + 1] : null;
|
||||
const response = await fetch(INDEX_URL);
|
||||
if (!response.ok) {
|
||||
throw new Error(`registry index download failed with ${response.status}`);
|
||||
@@ -30,7 +35,7 @@ async function main() {
|
||||
|
||||
const current = loadBundledPlugins(root);
|
||||
const ids = all ? null : current.map((plugin) => plugin.id);
|
||||
const plugins = pinsFromIndex(index, ids, current);
|
||||
const plugins = pinsFromIndex(index, ids, current, coreVersion);
|
||||
fs.writeFileSync(configPath, `${JSON.stringify({ plugins }, null, 2)}\n`);
|
||||
console.log(
|
||||
`Pinned ${plugins.length} plugin(s) in docker/bundled-plugins.json`,
|
||||
|
||||
@@ -137,9 +137,19 @@ function verifyArtifact(artifact) {
|
||||
console.log(`Verified macOS sharp packaging: ${path.basename(artifact)}`);
|
||||
} finally {
|
||||
if (mountedAt) {
|
||||
spawnSync("hdiutil", ["detach", mountedAt], { stdio: "ignore" });
|
||||
for (let attempt = 0; attempt < 5; attempt++) {
|
||||
const args =
|
||||
attempt < 3 ? ["detach", mountedAt] : ["detach", "-force", mountedAt];
|
||||
if (spawnSync("hdiutil", args, { stdio: "ignore" }).status === 0) break;
|
||||
Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 2000);
|
||||
}
|
||||
}
|
||||
fs.rmSync(temporaryRoot, { recursive: true, force: true });
|
||||
fs.rmSync(temporaryRoot, {
|
||||
recursive: true,
|
||||
force: true,
|
||||
maxRetries: 5,
|
||||
retryDelay: 1000,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -18,6 +18,7 @@ import {
|
||||
safeLayoutForced,
|
||||
unavailableLooks,
|
||||
} from "../../plugins/looks.js";
|
||||
import { safeModeOn } from "../../plugins/safe-mode.js";
|
||||
|
||||
const router = express.Router();
|
||||
const authManager = AuthManager.getInstance();
|
||||
@@ -36,7 +37,7 @@ async function adminDefaults() {
|
||||
* /user-preferences/look:
|
||||
* get:
|
||||
* summary: Get the layout and theme to show the current user
|
||||
* description: The user's own choice, the admin defaults (a layout no installed plugin brings reads as null), the default look of the bundled plugins, whether TERMIX_SAFE_LAYOUT forces the repair view, and installed layout or theme plugins that could not load. The browser resolves the final look from these.
|
||||
* description: The user's own choice, the admin defaults (a layout no installed plugin brings reads as null), the default look of the bundled plugins, whether TERMIX_SAFE_LAYOUT forces the repair view, whether TERMIX_SAFE_MODE runs only layout and theme plugins, and installed layout or theme plugins that could not load. The browser resolves the final look from these.
|
||||
* tags:
|
||||
* - User Preferences
|
||||
* responses:
|
||||
@@ -75,6 +76,8 @@ async function adminDefaults() {
|
||||
* nullable: true
|
||||
* safeLayout:
|
||||
* type: boolean
|
||||
* safeMode:
|
||||
* type: boolean
|
||||
* unavailable:
|
||||
* type: array
|
||||
* items:
|
||||
@@ -112,6 +115,7 @@ router.get("/", authenticateJWT, async (req: Request, res: Response) => {
|
||||
defaults: { ...defaults, layout: known(defaults.layout) },
|
||||
defaultLook: resolveDefaultLook(loader),
|
||||
safeLayout: safeLayoutForced(),
|
||||
safeMode: safeModeOn(),
|
||||
unavailable: unavailableLooks(loader),
|
||||
});
|
||||
} catch (error) {
|
||||
|
||||
@@ -16,6 +16,7 @@ import { getPluginRuntime } from "../../plugins/index.js";
|
||||
import { resolvePluginDesktopMode } from "@termix-ssh/plugin-sdk/manifest";
|
||||
import { describePluginFrontend } from "../../plugins/assets.js";
|
||||
import { isDefaultLookPlugin } from "../../plugins/bundled-index.js";
|
||||
import { mayRunInSafeMode } from "../../plugins/safe-mode.js";
|
||||
import { invalidatePluginPermissionCache } from "../../plugins/permissions.js";
|
||||
import { getPluginPublicHttpRoutes } from "../../plugins/http.js";
|
||||
import { getPluginPublicWsRoutes } from "../../plugins/ws.js";
|
||||
@@ -249,6 +250,9 @@ export async function listPreLoginPlugins(): Promise<
|
||||
* only run on that server and stay off here on purpose, and, for
|
||||
* admins, `managedByServer` marks plugins whose on/off state the server
|
||||
* decides.
|
||||
*
|
||||
* While TERMIX_SAFE_MODE is on, an enabled plugin that safe mode keeps
|
||||
* off reports `state: "safe-mode"`.
|
||||
* tags:
|
||||
* - Plugins
|
||||
* responses:
|
||||
@@ -354,7 +358,12 @@ router.get("/", authenticateJWT, async (req: Request, res: Response) => {
|
||||
name: record.name,
|
||||
version: record.version,
|
||||
enabled: record.state === "enabled",
|
||||
state: loaded?.state ?? record.state,
|
||||
state:
|
||||
record.state === "enabled" &&
|
||||
loaded?.state !== "active" &&
|
||||
!mayRunInSafeMode(record.id, loader.list())
|
||||
? "safe-mode"
|
||||
: (loaded?.state ?? record.state),
|
||||
runsOnServer: linked && desktopMode === "server",
|
||||
contributes,
|
||||
icon,
|
||||
@@ -936,7 +945,7 @@ router.delete(
|
||||
* 404:
|
||||
* description: No such plugin.
|
||||
* 409:
|
||||
* description: This desktop is linked to a server, which decides whether the plugin runs.
|
||||
* description: This desktop is linked to a server, which decides whether the plugin runs, or safe mode is on and the plugin is not a layout or theme.
|
||||
*/
|
||||
router.patch(
|
||||
"/:id/state",
|
||||
@@ -1050,6 +1059,8 @@ router.patch(
|
||||
* description: The caller lacks admin.plugins.manage.
|
||||
* 404:
|
||||
* description: No such plugin, or it is not on disk.
|
||||
* 409:
|
||||
* description: Safe mode is on and the plugin is not a layout or theme.
|
||||
* 500:
|
||||
* description: The plugin failed to start again.
|
||||
*/
|
||||
@@ -1073,6 +1084,13 @@ router.post(
|
||||
res.status(404).json({ error: "Plugin is not present on disk" });
|
||||
return;
|
||||
}
|
||||
if (!mayRunInSafeMode(pluginId, loader.list())) {
|
||||
res.status(409).json({
|
||||
error: "Safe mode is on, so only layout and theme plugins can start",
|
||||
code: "SAFE_MODE",
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
await repository.update(pluginId, {
|
||||
state: "enabled",
|
||||
|
||||
@@ -14,3 +14,24 @@ export function startablePluginIds(
|
||||
.map((record) => record.id),
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Plugins that shipped in an earlier image and were left on, but whose code is
|
||||
* not in this one (a smaller image tag). They get fetched from the registry.
|
||||
*/
|
||||
export function missingShippedPluginIds(
|
||||
records: { id: string; tier: string; state: string }[],
|
||||
presentIds: ReadonlySet<string>,
|
||||
ignored: ReadonlySet<string>,
|
||||
): string[] {
|
||||
return records
|
||||
.filter(
|
||||
(record) =>
|
||||
record.tier === "bundled" &&
|
||||
record.state !== "disabled" &&
|
||||
!presentIds.has(record.id) &&
|
||||
!ignored.has(record.id),
|
||||
)
|
||||
.map((record) => record.id)
|
||||
.sort();
|
||||
}
|
||||
@@ -56,7 +56,10 @@ import type { PluginTableDefinition } from "@termix-ssh/plugin-sdk/db";
|
||||
import * as syncRegistry from "./sync-registry.js";
|
||||
import { provideSync } from "../sync/provider.js";
|
||||
import { createSyncHost } from "../sync/host.js";
|
||||
import type { PluginSyncHost } from "@termix-ssh/plugin-sdk/backend";
|
||||
import type {
|
||||
PluginSync,
|
||||
PluginSyncHost,
|
||||
} from "@termix-ssh/plugin-sdk/backend";
|
||||
import {
|
||||
needsExplicitPersist,
|
||||
resolveDatabaseDialect,
|
||||
@@ -193,7 +196,7 @@ export function createPluginContext(
|
||||
): PluginContext {
|
||||
const pluginId = manifest.id;
|
||||
let syncHost: PluginSyncHost | undefined;
|
||||
const syncApi: PluginContext["sync"] = {
|
||||
const syncApi: PluginSync = {
|
||||
registerEntity: (entity) => {
|
||||
const dispose = syncRegistry.registerEntity(pluginId, entity);
|
||||
handle.bag.add(dispose, `sync entity ${entity.type}`);
|
||||
@@ -209,7 +212,7 @@ export function createPluginContext(
|
||||
remove();
|
||||
};
|
||||
},
|
||||
} as PluginContext["sync"];
|
||||
} as PluginSync;
|
||||
// Not enumerable, so tools that walk the context do not trip the check.
|
||||
Object.defineProperty(syncApi, "host", {
|
||||
enumerable: false,
|
||||
|
||||
@@ -23,6 +23,11 @@ import { setHostProtocolSource } from "../hosts/protocol-auth/registry.js";
|
||||
import { setSecretResolverOwnerSource } from "../hosts/connect/secret-resolver-registry.js";
|
||||
import { recordConflict } from "./conflicts.js";
|
||||
import { startablePluginIds } from "./boot-state.js";
|
||||
import {
|
||||
mayRunInSafeMode,
|
||||
safeModeOn,
|
||||
safeModePluginIds,
|
||||
} from "./safe-mode.js";
|
||||
import { setPluginImpersonationCheck } from "../utils/auth-manager.js";
|
||||
import { setKeybindingActionSource } from "../database/routes/keybinding-validation.js";
|
||||
|
||||
@@ -237,6 +242,10 @@ export async function initializePlugins(
|
||||
if (loaded.length === 0) return [];
|
||||
|
||||
const fresh = await seedPlugins(loaded, options.freshInstall === true);
|
||||
if (!fresh) {
|
||||
const { restoreMissingPlugins } = await import("./manage.js");
|
||||
loaded.push(...(await restoreMissingPlugins()));
|
||||
}
|
||||
await syncCapabilityGrants(loaded);
|
||||
if (loaded.some((plugin) => plugin.source === "bundled")) {
|
||||
const { offerPluginSetup } = await import("./onboarding.js");
|
||||
@@ -248,8 +257,17 @@ export async function initializePlugins(
|
||||
const records = await createCurrentPluginRepository().listAll();
|
||||
const enabled = startablePluginIds(records);
|
||||
|
||||
const safe = safeModeOn() ? safeModePluginIds(loaded) : null;
|
||||
if (safe) {
|
||||
pluginLogger.warn(
|
||||
"Safe mode is on (TERMIX_SAFE_MODE). Only layout and theme plugins start",
|
||||
{ operation: "plugin_init" },
|
||||
);
|
||||
}
|
||||
|
||||
const candidates = loaded
|
||||
.filter((plugin) => enabled.has(plugin.id))
|
||||
.filter((plugin) => !safe || safe.has(plugin.id))
|
||||
.map((plugin) => plugin.id);
|
||||
|
||||
for (const pluginId of candidates) {
|
||||
@@ -539,6 +557,8 @@ export async function activatePlugin(pluginId: string): Promise<void> {
|
||||
// Before activate: a plugin's own activate() may already want to check one
|
||||
// of its permissions.
|
||||
const plugin = pluginLoader.get(pluginId);
|
||||
// Stays enabled and starts on the next boot without safe mode.
|
||||
if (!mayRunInSafeMode(pluginId, pluginLoader.list())) return;
|
||||
if (plugin) await registerPluginPermissions(plugin);
|
||||
|
||||
await pluginLoader.activate(pluginId);
|
||||
|
||||
@@ -18,6 +18,7 @@ import path from "node:path";
|
||||
import semver from "semver";
|
||||
import { pluginLogger } from "../utils/logger.js";
|
||||
import { isDefaultLookPlugin } from "./bundled-index.js";
|
||||
import { mayRunInSafeMode } from "./safe-mode.js";
|
||||
import {
|
||||
activatePlugin,
|
||||
deactivatePlugin,
|
||||
@@ -25,6 +26,7 @@ import {
|
||||
registerLoadedPlugins,
|
||||
unloadPlugin,
|
||||
} from "./index.js";
|
||||
import { missingShippedPluginIds } from "./boot-state.js";
|
||||
import type { LoadedPlugin, PluginLoader } from "./loader.js";
|
||||
import {
|
||||
getBundledPluginsDir,
|
||||
@@ -763,6 +765,13 @@ export async function setPluginStateUnlocked(
|
||||
if (!loader.get(pluginId)) {
|
||||
throw new PluginManageError("Plugin not found", 404, "NOT_FOUND");
|
||||
}
|
||||
if (enabled && !mayRunInSafeMode(pluginId, loader.list())) {
|
||||
throw new PluginManageError(
|
||||
"Safe mode is on, so only layout and theme plugins can start",
|
||||
409,
|
||||
"SAFE_MODE",
|
||||
);
|
||||
}
|
||||
const plan = await planStateChange(pluginId, enabled);
|
||||
|
||||
if (enabled) {
|
||||
@@ -959,7 +968,11 @@ export function installPlugin(
|
||||
return serialized(async () => {
|
||||
const { createCurrentPluginRepository } = await repos();
|
||||
const repository = createCurrentPluginRepository();
|
||||
if (await repository.findById(pluginId)) {
|
||||
// A record with no code is a plugin an older image shipped: install fills it in.
|
||||
if (
|
||||
(await repository.findById(pluginId)) &&
|
||||
getPluginRuntime().loader.get(pluginId)
|
||||
) {
|
||||
throw new PluginManageError(
|
||||
"Plugin is already installed",
|
||||
409,
|
||||
@@ -1018,6 +1031,63 @@ export function installPlugin(
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Called at boot before plugins start. A plugin the database has on but the
|
||||
* image no longer ships (an update to a smaller image tag) is fetched from the
|
||||
* official registry, so nothing an install used goes missing. One that cannot
|
||||
* be fetched stays as it was and is tried again on the next start.
|
||||
*/
|
||||
export function restoreMissingPlugins(): Promise<LoadedPlugin[]> {
|
||||
return serialized(async () => {
|
||||
const { createCurrentPluginRepository } = await repos();
|
||||
const repository = createCurrentPluginRepository();
|
||||
const { loader } = getPluginRuntime();
|
||||
const ids = missingShippedPluginIds(
|
||||
await repository.listAll(),
|
||||
new Set(loader.list().map((plugin) => plugin.id)),
|
||||
await readUninstalled(),
|
||||
);
|
||||
const restored: LoadedPlugin[] = [];
|
||||
for (const id of ids) {
|
||||
try {
|
||||
const record = await repository.findById(id);
|
||||
const { source, release } = await requireRelease(
|
||||
id,
|
||||
record?.pinnedVersion ?? undefined,
|
||||
channelOf(record),
|
||||
OFFICIAL_REGISTRY_ID,
|
||||
);
|
||||
const plugin = await swapIn(id, { release, source });
|
||||
await repository.update(id, {
|
||||
registryId: source.id,
|
||||
tier: tierFor(plugin, source),
|
||||
});
|
||||
await grantDeclared(plugin, null);
|
||||
restored.push(plugin);
|
||||
pluginLogger.info(
|
||||
`Restored ${id}@${release.version} from the registry`,
|
||||
{
|
||||
operation: "plugin_restore_missing",
|
||||
},
|
||||
);
|
||||
} catch (error) {
|
||||
const message = error instanceof Error ? error.message : String(error);
|
||||
pluginLogger.warn(`Could not restore ${id}: ${message}`, {
|
||||
operation: "plugin_restore_missing",
|
||||
});
|
||||
// The registry is down or offline, so the rest would fail the same way.
|
||||
if (
|
||||
error instanceof PluginManageError &&
|
||||
error.code === "REGISTRY_UNREACHABLE"
|
||||
) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return restored;
|
||||
});
|
||||
}
|
||||
|
||||
export function updatePlugin(
|
||||
pluginId: string,
|
||||
options: InstallOptions,
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
|
||||
import crypto from "node:crypto";
|
||||
import fs from "node:fs";
|
||||
import { isIP } from "node:net";
|
||||
import path from "node:path";
|
||||
import semver from "semver";
|
||||
import {
|
||||
@@ -23,7 +24,11 @@ import {
|
||||
youtubeVideoId,
|
||||
} from "@termix-ssh/plugin-sdk/manifest";
|
||||
import { getLocalVersion } from "../utils/app-version.js";
|
||||
import { safeOutboundFetch } from "../utils/safe-outbound-fetch.js";
|
||||
import {
|
||||
isBlockedAddress,
|
||||
safeOutboundFetch,
|
||||
} from "../utils/safe-outbound-fetch.js";
|
||||
import { fetchWithProxy, getProxyAgent } from "../utils/proxy-agent.js";
|
||||
import { pluginLogger } from "../utils/logger.js";
|
||||
import {
|
||||
COMMUNITY_PLUGIN_KEYS,
|
||||
@@ -278,15 +283,72 @@ export function canRunRelease(
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Hosts the admin lets registry fetches reach on a private address, like a
|
||||
* registry in the LAN. Matched by host name on any port, also when another
|
||||
* index or a redirect points there; every other host stays blocked.
|
||||
*/
|
||||
export function getRegistryPrivateHosts(): string[] {
|
||||
return (process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS ?? "")
|
||||
.split(",")
|
||||
.map((value) => value.trim())
|
||||
.filter(Boolean)
|
||||
.map(normalizePrivateHost)
|
||||
.filter((host): host is string => host !== undefined);
|
||||
}
|
||||
|
||||
/**
|
||||
* The host in the form safeOutboundFetch compares against, or undefined when
|
||||
* the entry carries more than a host, like a scheme, port, path or user.
|
||||
*/
|
||||
function normalizePrivateHost(entry: string): string | undefined {
|
||||
const candidate = isIP(entry) === 6 ? `[${entry}]` : entry;
|
||||
if (/[/?#@\\]|:\d*$/.test(candidate)) return undefined;
|
||||
try {
|
||||
return new URL(`http://${candidate}`).hostname.replace(/^\[|\]$/g, "");
|
||||
} catch {
|
||||
return undefined;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* With HTTP_PROXY or HTTPS_PROXY set, registry traffic goes through the proxy,
|
||||
* which does its own name lookup. Only the URL itself is checked here: web
|
||||
* pages only, no logins in it, and no private address typed in as a literal.
|
||||
*/
|
||||
function fetchThroughProxy(
|
||||
url: string,
|
||||
options: RequestInit,
|
||||
privateHosts: readonly string[],
|
||||
): Promise<Response> {
|
||||
const parsed = new URL(url);
|
||||
const host = parsed.hostname.replace(/^\[|\]$/g, "");
|
||||
if (
|
||||
!["http:", "https:"].includes(parsed.protocol) ||
|
||||
parsed.username ||
|
||||
parsed.password
|
||||
) {
|
||||
throw new Error("Invalid outbound URL");
|
||||
}
|
||||
if (isIP(host) && isBlockedAddress(host) && !privateHosts.includes(host)) {
|
||||
throw new Error("Private destinations are not allowed");
|
||||
}
|
||||
return fetchWithProxy(url, options);
|
||||
}
|
||||
|
||||
/** Follows redirects by hand so each hop still gets the outbound checks. */
|
||||
async function fetchFollowing(url: string): Promise<Response> {
|
||||
const privateHosts = getRegistryPrivateHosts();
|
||||
let current = url;
|
||||
for (let hop = 0; hop <= MAX_REDIRECTS; hop++) {
|
||||
const response = await safeOutboundFetch(current, {
|
||||
const options: RequestInit = {
|
||||
method: "GET",
|
||||
redirect: "manual",
|
||||
headers: { "User-Agent": "Termix" },
|
||||
});
|
||||
};
|
||||
const response = getProxyAgent(current)
|
||||
? await fetchThroughProxy(current, options, privateHosts)
|
||||
: await safeOutboundFetch(current, options, privateHosts);
|
||||
if (response.status >= 300 && response.status < 400) {
|
||||
const location = response.headers.get("location");
|
||||
if (!location) throw new Error(`redirect without a location: ${current}`);
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import type { PluginManifest } from "./manifest.js";
|
||||
|
||||
/** TERMIX_SAFE_MODE=1 starts only the plugins that draw the app. */
|
||||
export function safeModeOn(): boolean {
|
||||
const value = process.env.TERMIX_SAFE_MODE?.trim().toLowerCase();
|
||||
return value === "1" || value === "true";
|
||||
}
|
||||
|
||||
function isLookPlugin(manifest: PluginManifest): boolean {
|
||||
return (
|
||||
(manifest.contributes?.layouts?.length ?? 0) > 0 ||
|
||||
(manifest.contributes?.themes?.length ?? 0) > 0
|
||||
);
|
||||
}
|
||||
|
||||
/** Layout and theme plugins, plus the plugins they need to start. */
|
||||
export function safeModePluginIds(
|
||||
plugins: { id: string; manifest: PluginManifest }[],
|
||||
): Set<string> {
|
||||
const byId = new Map(plugins.map((plugin) => [plugin.id, plugin]));
|
||||
const allowed = new Set<string>();
|
||||
const add = (id: string) => {
|
||||
const plugin = byId.get(id);
|
||||
if (!plugin || allowed.has(id)) return;
|
||||
allowed.add(id);
|
||||
for (const dependency of Object.keys(plugin.manifest.dependencies ?? {})) {
|
||||
add(dependency);
|
||||
}
|
||||
};
|
||||
for (const plugin of plugins) {
|
||||
if (isLookPlugin(plugin.manifest)) add(plugin.id);
|
||||
}
|
||||
return allowed;
|
||||
}
|
||||
|
||||
/** Whether a plugin may run now. Always true outside safe mode. */
|
||||
export function mayRunInSafeMode(
|
||||
pluginId: string,
|
||||
plugins: { id: string; manifest: PluginManifest }[],
|
||||
): boolean {
|
||||
return !safeModeOn() || safeModePluginIds(plugins).has(pluginId);
|
||||
}
|
||||
@@ -7,6 +7,8 @@ import { createCurrentRepositoryContext } from "../database/repositories/factory
|
||||
* On a linked desktop, hosts and credentials someone shared with the account
|
||||
* are read-only copies kept in step by sync. Editing or deleting one here
|
||||
* would be undone by the next sync, so it is refused with a clear reason.
|
||||
* A host's connection origin only means something on this device, so that one
|
||||
* field can still be changed.
|
||||
*/
|
||||
export function rejectSharedCopyWrites(
|
||||
kind: "host" | "credential",
|
||||
@@ -25,6 +27,19 @@ export function rejectSharedCopyWrites(
|
||||
.where(eq(table.id, Number(match[1])))
|
||||
.limit(1);
|
||||
if (row?.sharedSource) {
|
||||
const origin = req.body?.connectionOrigin;
|
||||
if (
|
||||
kind === "host" &&
|
||||
req.method === "PUT" &&
|
||||
(origin === "local" || origin === "remote")
|
||||
) {
|
||||
await createCurrentRepositoryContext()
|
||||
.drizzle.update(hosts)
|
||||
.set({ connectionOrigin: origin })
|
||||
.where(eq(hosts.id, Number(match[1])));
|
||||
res.json({ id: Number(match[1]), connectionOrigin: origin });
|
||||
return;
|
||||
}
|
||||
res.status(403).json({
|
||||
error: "This was shared with you and is managed on the server",
|
||||
code: "SHARED_COPY",
|
||||
|
||||
@@ -102,6 +102,7 @@ beforeEach(async () => {
|
||||
state.defaultLookIds = [];
|
||||
state.installed = [];
|
||||
delete process.env.TERMIX_SAFE_LAYOUT;
|
||||
delete process.env.TERMIX_SAFE_MODE;
|
||||
|
||||
const app = express();
|
||||
app.use(express.json());
|
||||
@@ -113,6 +114,7 @@ beforeEach(async () => {
|
||||
|
||||
afterEach(async () => {
|
||||
delete process.env.TERMIX_SAFE_LAYOUT;
|
||||
delete process.env.TERMIX_SAFE_MODE;
|
||||
await new Promise<void>((resolve) => server.close(() => resolve()));
|
||||
});
|
||||
|
||||
@@ -138,6 +140,7 @@ describe("GET /user-preferences/look", () => {
|
||||
defaults: { layout: null, theme: null },
|
||||
defaultLook: { layout: null, theme: null },
|
||||
safeLayout: false,
|
||||
safeMode: false,
|
||||
unavailable: [],
|
||||
});
|
||||
});
|
||||
@@ -159,6 +162,7 @@ describe("GET /user-preferences/look", () => {
|
||||
{ id: "other", version: null, layouts: [], themes: [], error: "y" },
|
||||
];
|
||||
process.env.TERMIX_SAFE_LAYOUT = "1";
|
||||
process.env.TERMIX_SAFE_MODE = "1";
|
||||
|
||||
const { body } = await getLook();
|
||||
expect(body).toMatchObject({
|
||||
@@ -167,6 +171,7 @@ describe("GET /user-preferences/look", () => {
|
||||
defaults: { layout: "admin-layout", theme: "gruvbox" },
|
||||
defaultLook: { layout: "shipped", theme: "ink" },
|
||||
safeLayout: true,
|
||||
safeMode: true,
|
||||
});
|
||||
expect(body.unavailable.map((plugin: { id: string }) => plugin.id)).toEqual(
|
||||
["broken"],
|
||||
|
||||
@@ -488,6 +488,26 @@ describe("plugins route", () => {
|
||||
}
|
||||
});
|
||||
|
||||
it("reports an enabled plugin that safe mode keeps off", async () => {
|
||||
state.plugins.set("sample-plugin", makePlugin({ state: "enabled" }));
|
||||
|
||||
const read = async () =>
|
||||
(
|
||||
(await (await fetch(`${baseUrl}/plugins`)).json()) as Array<{
|
||||
state: string;
|
||||
enabled: boolean;
|
||||
}>
|
||||
)[0];
|
||||
|
||||
expect((await read()).state).not.toBe("safe-mode");
|
||||
process.env.TERMIX_SAFE_MODE = "1";
|
||||
try {
|
||||
expect(await read()).toMatchObject({ state: "safe-mode", enabled: true });
|
||||
} finally {
|
||||
delete process.env.TERMIX_SAFE_MODE;
|
||||
}
|
||||
});
|
||||
|
||||
it("grants a declared capability", async () => {
|
||||
state.plugins.set("sample-plugin", makePlugin());
|
||||
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import { startablePluginIds } from "../../plugins/boot-state.js";
|
||||
import {
|
||||
missingShippedPluginIds,
|
||||
startablePluginIds,
|
||||
} from "../../plugins/boot-state.js";
|
||||
|
||||
describe("startablePluginIds", () => {
|
||||
it("starts enabled plugins and retries ones that failed or were blocked", () => {
|
||||
@@ -13,3 +16,25 @@ describe("startablePluginIds", () => {
|
||||
expect([...ids].sort()).toEqual(["a", "b", "c"]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("missingShippedPluginIds", () => {
|
||||
const records = [
|
||||
{ id: "gone", tier: "bundled", state: "enabled" },
|
||||
{ id: "here", tier: "bundled", state: "enabled" },
|
||||
{ id: "off", tier: "bundled", state: "disabled" },
|
||||
{ id: "failed", tier: "bundled", state: "failed" },
|
||||
{ id: "community", tier: "community", state: "enabled" },
|
||||
{ id: "removed", tier: "bundled", state: "enabled" },
|
||||
];
|
||||
|
||||
it("lists shipped plugins that are on but not in the image", () => {
|
||||
expect(
|
||||
missingShippedPluginIds(records, new Set(["here"]), new Set(["removed"])),
|
||||
).toEqual(["failed", "gone"]);
|
||||
});
|
||||
|
||||
it("finds nothing when every plugin is present", () => {
|
||||
const present = new Set(records.map((record) => record.id));
|
||||
expect(missingShippedPluginIds(records, present, new Set())).toEqual([]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,211 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
classifyRuntimeError,
|
||||
composeArgsFor,
|
||||
containerCommand,
|
||||
countContainers,
|
||||
diffContainerStates,
|
||||
dockerArgs,
|
||||
parseComposeProjects,
|
||||
parseContainerList,
|
||||
parseContainerStates,
|
||||
parseContainerStats,
|
||||
parseRuntimeVersion,
|
||||
parseServices,
|
||||
parseStackStatus,
|
||||
stackStateFromServices,
|
||||
} from "@termix-ssh/plugin-sdk/host-scripts";
|
||||
|
||||
describe("containerCommand", () => {
|
||||
it("extends PATH on POSIX hosts", () => {
|
||||
const command = containerCommand("podman", "ps");
|
||||
expect(command.startsWith('PATH="')).toBe(true);
|
||||
expect(command.endsWith(" podman ps")).toBe(true);
|
||||
});
|
||||
|
||||
it("runs the plain CLI on Windows hosts", () => {
|
||||
expect(containerCommand("docker", "ps -a", true)).toBe("docker ps -a");
|
||||
});
|
||||
|
||||
it("falls back to docker for an unknown runtime", () => {
|
||||
expect(containerCommand(undefined, "ps", true)).toBe("docker ps");
|
||||
});
|
||||
});
|
||||
|
||||
describe("dockerArgs", () => {
|
||||
it("builds the container commands", () => {
|
||||
expect(dockerArgs.inspect("web")).toBe("inspect web");
|
||||
expect(dockerArgs.action("restart", "web")).toBe("restart web");
|
||||
expect(dockerArgs.remove("web", true)).toBe("rm -f web");
|
||||
expect(dockerArgs.list(true)).toContain("ps -a --format '{");
|
||||
expect(dockerArgs.stats("web")).toContain("stats web --no-stream");
|
||||
});
|
||||
|
||||
it("refuses container ids that could break the command line", () => {
|
||||
expect(() => dockerArgs.inspect("web; rm -rf /")).toThrow();
|
||||
expect(() => dockerArgs.logs("$(id)")).toThrow();
|
||||
expect(() => dockerArgs.action("restart", "-rf")).toThrow();
|
||||
expect(() => dockerArgs.action("kill" as never, "web")).toThrow();
|
||||
});
|
||||
|
||||
it("only passes sane log filters", () => {
|
||||
expect(
|
||||
dockerArgs.logs("web", {
|
||||
tail: 50.7,
|
||||
timestamps: true,
|
||||
since: "2026-10-01T00:00:00Z",
|
||||
}),
|
||||
).toBe("logs web --tail 50 --timestamps --since 2026-10-01T00:00:00Z 2>&1");
|
||||
expect(dockerArgs.logs("web", { since: "1h; id" })).toBe("logs web 2>&1");
|
||||
});
|
||||
});
|
||||
|
||||
describe("docker parsing", () => {
|
||||
it("reads the version and sorts errors", () => {
|
||||
expect(parseRuntimeVersion("Docker version 27.3.1, build ce12230")).toBe(
|
||||
"27.3.1",
|
||||
);
|
||||
expect(parseRuntimeVersion("podman version 5.2.0")).toBe("5.2.0");
|
||||
expect(parseRuntimeVersion("nope")).toBe("unknown");
|
||||
expect(classifyRuntimeError("bash: docker: command not found")).toBe(
|
||||
"NOT_INSTALLED",
|
||||
);
|
||||
expect(
|
||||
classifyRuntimeError(
|
||||
"Cannot connect to the Docker daemon at unix:///var/run/docker.sock",
|
||||
),
|
||||
).toBe("DAEMON_NOT_RUNNING");
|
||||
expect(
|
||||
classifyRuntimeError("permission denied while trying to connect"),
|
||||
).toBe("PERMISSION_DENIED");
|
||||
expect(classifyRuntimeError("something else")).toBe("DOCKER_ERROR");
|
||||
});
|
||||
|
||||
it("skips lines that are not JSON in the list", () => {
|
||||
const rows = parseContainerList(
|
||||
'{"id":"a","name":"web"}\nWARNING: x\n{"id":"b","name":"db"}\n',
|
||||
);
|
||||
expect(rows.map((r) => r.name)).toEqual(["web", "db"]);
|
||||
});
|
||||
|
||||
it("splits the stats columns", () => {
|
||||
const stats = parseContainerStats(
|
||||
'{"cpu":"1.5%","memory":"10MiB / 1GiB","memoryPercent":"1%","netIO":"1kB / 2kB","blockIO":"0B / 0B","pids":"3"}',
|
||||
);
|
||||
expect(stats).toMatchObject({
|
||||
cpu: "1.5%",
|
||||
memoryUsed: "10MiB",
|
||||
memoryLimit: "1GiB",
|
||||
netInput: "1kB",
|
||||
netOutput: "2kB",
|
||||
pids: "3",
|
||||
});
|
||||
});
|
||||
|
||||
const ps = [
|
||||
`{"name":"web","state":"running","status":"Up 2 hours"}`,
|
||||
`{"name":"db","state":"running","status":"Up 2 hours (unhealthy)"}`,
|
||||
`{"name":"old","state":"exited","status":"Exited (0)"}`,
|
||||
].join("\n");
|
||||
|
||||
it("counts running, stopped and unhealthy containers", () => {
|
||||
expect(countContainers(ps)).toEqual({
|
||||
running: 2,
|
||||
stopped: 1,
|
||||
unhealthy: 1,
|
||||
total: 3,
|
||||
});
|
||||
});
|
||||
|
||||
it("turns two snapshots into events", () => {
|
||||
const before = parseContainerStates(ps);
|
||||
const after = parseContainerStates(
|
||||
[
|
||||
`{"name":"web","state":"exited","status":"Exited (1)"}`,
|
||||
`{"name":"db","state":"running","status":"Up (unhealthy)"}`,
|
||||
`{"name":"old","state":"running","status":"Up 1 second"}`,
|
||||
`{"name":"new","state":"running","status":"Up"}`,
|
||||
].join("\n"),
|
||||
);
|
||||
expect(diffContainerStates(before, after)).toEqual([
|
||||
{ container: "web", event: "exited" },
|
||||
{ container: "old", event: "started" },
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("compose", () => {
|
||||
it("reads stack status text", () => {
|
||||
expect(parseStackStatus("running(2), exited(1)")).toEqual({
|
||||
state: "partial",
|
||||
running: 2,
|
||||
total: 3,
|
||||
});
|
||||
expect(parseStackStatus("paused(2)")).toMatchObject({ state: "paused" });
|
||||
expect(parseStackStatus("")).toMatchObject({ state: "not-deployed" });
|
||||
});
|
||||
|
||||
it("reads projects from compose ls", () => {
|
||||
const stacks = parseComposeProjects(
|
||||
JSON.stringify([
|
||||
{
|
||||
Name: "web",
|
||||
Status: "running(2)",
|
||||
ConfigFiles: "/opt/stacks/web/compose.yaml",
|
||||
},
|
||||
{ Name: "Bad Name", Status: "running(1)", ConfigFiles: "" },
|
||||
]),
|
||||
);
|
||||
expect(stacks).toEqual([
|
||||
{
|
||||
name: "web",
|
||||
managed: false,
|
||||
state: "running",
|
||||
running: 2,
|
||||
total: 2,
|
||||
composeFile: "/opt/stacks/web/compose.yaml",
|
||||
},
|
||||
]);
|
||||
});
|
||||
|
||||
it("reads services from compose ps, one line or one array", () => {
|
||||
const row = {
|
||||
Service: "app",
|
||||
Name: "web-app-1",
|
||||
ID: "abc",
|
||||
Image: "nginx",
|
||||
State: "running",
|
||||
Status: "Up",
|
||||
Health: "",
|
||||
Publishers: [
|
||||
{ PublishedPort: 8080, TargetPort: 80 },
|
||||
{ PublishedPort: 8080, TargetPort: 80 },
|
||||
{ PublishedPort: 0, TargetPort: 443 },
|
||||
],
|
||||
};
|
||||
const lines = parseServices(JSON.stringify(row));
|
||||
expect(lines[0]).toMatchObject({ service: "app", ports: "8080:80" });
|
||||
expect(
|
||||
parseServices(JSON.stringify([row, { ...row, State: "exited" }])),
|
||||
).toHaveLength(2);
|
||||
expect(
|
||||
stackStateFromServices(
|
||||
parseServices(JSON.stringify([row, { ...row, State: "exited" }])),
|
||||
),
|
||||
).toEqual({
|
||||
state: "partial",
|
||||
running: 1,
|
||||
total: 2,
|
||||
});
|
||||
});
|
||||
|
||||
it("maps actions to compose commands", () => {
|
||||
expect(composeArgsFor("redeploy", "app", {})).toEqual([
|
||||
"pull app",
|
||||
"up -d --remove-orphans app",
|
||||
]);
|
||||
expect(
|
||||
composeArgsFor("destroy", undefined, { removeVolumes: true }),
|
||||
).toEqual(["down --remove-orphans -v"]);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,400 @@
|
||||
import { describe, it, expect } from "vitest";
|
||||
import {
|
||||
buildFilesystemList,
|
||||
filterExcludedFilesystems,
|
||||
findWorstMountIndex,
|
||||
liveCmd,
|
||||
mergeMonitoredFilesystems,
|
||||
parseCpuLine,
|
||||
parseDfLines,
|
||||
parseLive,
|
||||
selectPrimaryFilesystem,
|
||||
} from "@termix-ssh/plugin-sdk/host-scripts";
|
||||
|
||||
describe("parseCpuLine", () => {
|
||||
it("parses a standard /proc/stat cpu line", () => {
|
||||
// user nice system idle iowait irq softirq
|
||||
const result = parseCpuLine("cpu 100 0 50 800 30 0 20");
|
||||
expect(result).toBeDefined();
|
||||
// idle = idle(800) + iowait(30)
|
||||
expect(result?.idle).toBe(830);
|
||||
// total = sum of all fields
|
||||
expect(result?.total).toBe(100 + 0 + 50 + 800 + 30 + 0 + 20);
|
||||
});
|
||||
|
||||
it("tolerates leading/trailing whitespace", () => {
|
||||
const result = parseCpuLine(" cpu 1 2 3 4 ");
|
||||
expect(result?.total).toBe(10);
|
||||
expect(result?.idle).toBe(4);
|
||||
});
|
||||
|
||||
it("returns undefined for non-cpu lines", () => {
|
||||
expect(parseCpuLine("cpu0 1 2 3 4")).toBeUndefined();
|
||||
expect(parseCpuLine("intr 12345")).toBeUndefined();
|
||||
});
|
||||
|
||||
it("returns undefined when there are fewer than 4 numeric fields", () => {
|
||||
expect(parseCpuLine("cpu 1 2 3")).toBeUndefined();
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseDfLines", () => {
|
||||
it("parses df -T -P output into rows", () => {
|
||||
const output =
|
||||
"/dev/nvme0n1p2 ext4 3848290697216 1046898851840 2606516101120 29% /\n" +
|
||||
"/dev/nvme1n1p1 ext4 15393162788864 15239230844928 153931922841 99% /data\n";
|
||||
const rows = parseDfLines(output);
|
||||
expect(rows).toHaveLength(2);
|
||||
expect(rows[0].mount).toBe("/");
|
||||
expect(rows[0].type).toBe("ext4");
|
||||
expect(rows[1].mount).toBe("/data");
|
||||
});
|
||||
|
||||
it("filters out pseudo filesystems", () => {
|
||||
const output =
|
||||
"tmpfs tmpfs 8000 0 8000 0% /dev/shm\n" +
|
||||
"overlay overlay 100 50 50 50% /\n" +
|
||||
"/dev/sda1 ext4 100 50 50 50% /mnt/data\n";
|
||||
const rows = parseDfLines(output);
|
||||
expect(rows).toHaveLength(1);
|
||||
expect(rows[0].mount).toBe("/mnt/data");
|
||||
});
|
||||
|
||||
it("captures the filesystem type for network shares", () => {
|
||||
const output =
|
||||
"nas.local:/export nfs4 2000 1900 100 95% /mnt/nas\n" +
|
||||
"//server/share cifs 2000 1000 1000 50% /mnt/smb\n";
|
||||
const rows = parseDfLines(output);
|
||||
expect(rows[0].type).toBe("nfs4");
|
||||
expect(rows[1].type).toBe("cifs");
|
||||
});
|
||||
|
||||
it("keeps full image and firmware mounts out of disk usage", () => {
|
||||
const rows = parseDfLines(
|
||||
"/dev/loop0 squashfs 100 100 0 100% /snap/core/1\n" +
|
||||
"efivarfs efivarfs 100 89 11 89% /sys/firmware/efi/efivars\n" +
|
||||
"/dev/sda1 ext4 1000 400 600 40% /\n",
|
||||
);
|
||||
expect(rows.map((row) => row.mount)).toEqual(["/"]);
|
||||
expect(findWorstMountIndex(rows)).toEqual({
|
||||
index: 0,
|
||||
usedBytes: 400,
|
||||
totalBytes: 1000,
|
||||
});
|
||||
});
|
||||
|
||||
it("retains real storage without requiring a /dev source", () => {
|
||||
const rows = parseDfLines(
|
||||
"/dev/sda1 btrfs 1000 400 600 40% /\n" +
|
||||
"tank/data zfs 2000 1000 1000 50% /data\n" +
|
||||
"nas:/export nfs4 2000 1900 100 95% /mnt/nas\n" +
|
||||
"//server/share cifs 2000 1000 1000 50% /mnt/smb\n",
|
||||
);
|
||||
expect(rows.map((row) => row.type)).toEqual([
|
||||
"btrfs",
|
||||
"zfs",
|
||||
"nfs4",
|
||||
"cifs",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("findWorstMountIndex", () => {
|
||||
it("picks the most-utilized mount, not just the first row", () => {
|
||||
const rows = parseDfLines(
|
||||
"/dev/nvme0n1p2 ext4 3848290697216 1046898851840 2606516101120 29% /\n" +
|
||||
"/dev/nvme1n1p1 ext4 15393162788864 15239230844928 153931922841 99% /data\n",
|
||||
);
|
||||
const worst = findWorstMountIndex(rows);
|
||||
expect(worst.index).toBe(1);
|
||||
expect(worst.totalBytes).toBe(15393162788864);
|
||||
expect(worst.usedBytes).toBe(15239230844928);
|
||||
});
|
||||
|
||||
it("falls back to the only mount available", () => {
|
||||
const rows = parseDfLines("/dev/sda1 ext4 100 30 70 30% /\n");
|
||||
const worst = findWorstMountIndex(rows);
|
||||
expect(worst.index).toBe(0);
|
||||
});
|
||||
|
||||
it("skips rows with invalid or zero totals", () => {
|
||||
const rows = parseDfLines(
|
||||
"/dev/sda1 ext4 0 0 0 0% /broken\n" +
|
||||
"/dev/sda2 ext4 100 40 60 40% /ok\n",
|
||||
);
|
||||
const worst = findWorstMountIndex(rows);
|
||||
expect(worst.index).toBe(1);
|
||||
});
|
||||
|
||||
it("returns index -1 when there are no usable rows", () => {
|
||||
const worst = findWorstMountIndex([]);
|
||||
expect(worst.index).toBe(-1);
|
||||
expect(worst.totalBytes).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
const BYTES_OUTPUT =
|
||||
"/dev/nvme0n1p2 ext4 1000 400 600 40% /\n" +
|
||||
"/dev/nvme1n1p1 ext4 2000 1900 100 95% /data\n";
|
||||
const HUMAN_OUTPUT =
|
||||
"/dev/nvme0n1p2 ext4 1.0K 400 600 40% /\n" +
|
||||
"/dev/nvme1n1p1 ext4 2.0K 1.9K 100 95% /data\n";
|
||||
|
||||
describe("buildFilesystemList", () => {
|
||||
it("returns every real filesystem with byte maths and human strings", () => {
|
||||
const list = buildFilesystemList(
|
||||
parseDfLines(BYTES_OUTPUT),
|
||||
parseDfLines(HUMAN_OUTPUT),
|
||||
);
|
||||
expect(list).toHaveLength(2);
|
||||
expect(list[0]).toMatchObject({
|
||||
mount: "/",
|
||||
type: "ext4",
|
||||
percent: 40,
|
||||
usedHuman: "400",
|
||||
totalHuman: "1.0K",
|
||||
availableHuman: "600",
|
||||
usedBytes: 400,
|
||||
totalBytes: 1000,
|
||||
});
|
||||
expect(list[1]).toMatchObject({ mount: "/data", percent: 95 });
|
||||
});
|
||||
|
||||
it("matches human rows by mount when the row counts differ", () => {
|
||||
const list = buildFilesystemList(
|
||||
parseDfLines(BYTES_OUTPUT),
|
||||
parseDfLines("/dev/nvme1n1p1 ext4 2.0K 1.9K 100 95% /data\n"),
|
||||
);
|
||||
expect(list[0].totalHuman).toBeNull();
|
||||
expect(list[1].totalHuman).toBe("2.0K");
|
||||
});
|
||||
|
||||
it("drops filesystems with a zero or invalid total", () => {
|
||||
const list = buildFilesystemList(
|
||||
parseDfLines(
|
||||
"/dev/sda1 ext4 0 0 0 0% /broken\n/dev/sda2 ext4 100 40 60 40% /ok\n",
|
||||
),
|
||||
[],
|
||||
);
|
||||
expect(list).toHaveLength(1);
|
||||
expect(list[0].mount).toBe("/ok");
|
||||
});
|
||||
});
|
||||
|
||||
describe("selectPrimaryFilesystem", () => {
|
||||
it("prefers root over a fuller secondary mount", () => {
|
||||
const list = buildFilesystemList(
|
||||
parseDfLines(BYTES_OUTPUT),
|
||||
parseDfLines(HUMAN_OUTPUT),
|
||||
);
|
||||
expect(selectPrimaryFilesystem(list)?.mount).toBe("/");
|
||||
});
|
||||
|
||||
it("falls back to the most-utilized mount when there is no root", () => {
|
||||
const list = buildFilesystemList(
|
||||
parseDfLines(
|
||||
"/dev/sda1 ext4 1000 100 900 10% /mnt/a\n" +
|
||||
"/dev/sda2 ext4 1000 800 200 80% /mnt/b\n",
|
||||
),
|
||||
[],
|
||||
);
|
||||
expect(selectPrimaryFilesystem(list)?.mount).toBe("/mnt/b");
|
||||
});
|
||||
|
||||
it("returns null for an empty list", () => {
|
||||
expect(selectPrimaryFilesystem([])).toBeNull();
|
||||
});
|
||||
});
|
||||
|
||||
describe("filterExcludedFilesystems", () => {
|
||||
const list = buildFilesystemList(
|
||||
parseDfLines(
|
||||
"/dev/sda1 ext4 1000 400 600 40% /\n" +
|
||||
"nas.local:/export nfs4 2000 1900 100 95% /mnt/nas\n" +
|
||||
"//server/share cifs 2000 1000 1000 50% /mnt/smb\n",
|
||||
),
|
||||
[],
|
||||
);
|
||||
|
||||
it("returns the same list when no mounts are excluded", () => {
|
||||
expect(filterExcludedFilesystems(list)).toHaveLength(3);
|
||||
expect(filterExcludedFilesystems(list, [])).toHaveLength(3);
|
||||
});
|
||||
|
||||
it("excludes an exact mount path match", () => {
|
||||
const filtered = filterExcludedFilesystems(list, ["/mnt/nas"]);
|
||||
expect(filtered.map((fs) => fs.mount)).toEqual(["/", "/mnt/smb"]);
|
||||
});
|
||||
|
||||
it("excludes by filesystem type substring, case-insensitively", () => {
|
||||
const filtered = filterExcludedFilesystems(list, ["NFS"]);
|
||||
expect(filtered.map((fs) => fs.mount)).toEqual(["/", "/mnt/smb"]);
|
||||
});
|
||||
|
||||
it("supports excluding multiple network filesystem types at once", () => {
|
||||
const filtered = filterExcludedFilesystems(list, ["nfs", "cifs"]);
|
||||
expect(filtered.map((fs) => fs.mount)).toEqual(["/"]);
|
||||
});
|
||||
|
||||
it("ignores blank/whitespace-only entries", () => {
|
||||
const filtered = filterExcludedFilesystems(list, [" ", ""]);
|
||||
expect(filtered).toHaveLength(3);
|
||||
});
|
||||
});
|
||||
|
||||
describe("mergeMonitoredFilesystems", () => {
|
||||
it("adds an arbitrary path with a user label", () => {
|
||||
const detected = buildFilesystemList(
|
||||
parseDfLines("/dev/sda1 ext4 1000 400 600 40% /\n"),
|
||||
[],
|
||||
);
|
||||
const custom = buildFilesystemList(
|
||||
parseDfLines("/dev/sda1 ext4 1000 400 600 40% /\n"),
|
||||
[],
|
||||
);
|
||||
const result = mergeMonitoredFilesystems(
|
||||
detected,
|
||||
[{ path: "/config", label: "Home Assistant" }],
|
||||
custom,
|
||||
);
|
||||
|
||||
expect(result).toHaveLength(2);
|
||||
expect(result[1]).toMatchObject({
|
||||
mount: "/config",
|
||||
label: "Home Assistant",
|
||||
totalBytes: 1000,
|
||||
});
|
||||
});
|
||||
|
||||
it("labels a path that is already a detected mount", () => {
|
||||
const detected = buildFilesystemList(
|
||||
parseDfLines("/dev/sda1 ext4 1000 400 600 40% /data\n"),
|
||||
[],
|
||||
);
|
||||
const result = mergeMonitoredFilesystems(
|
||||
detected,
|
||||
[{ path: "/data", label: "Media" }],
|
||||
detected,
|
||||
);
|
||||
|
||||
expect(result).toHaveLength(1);
|
||||
expect(result[0].label).toBe("Media");
|
||||
});
|
||||
});
|
||||
|
||||
const out = (
|
||||
agg: [number, number],
|
||||
core: [number, number],
|
||||
rx: number,
|
||||
up: number,
|
||||
procs: string,
|
||||
page = "4096",
|
||||
) =>
|
||||
[
|
||||
`cpu ${agg[0]} 0 0 ${agg[1]} 0 0 0 0 0 0\ncpu0 ${core[0]} 0 0 ${core[1]} 0 0 0 0 0 0`,
|
||||
"MemTotal: 1000 kB\nMemAvailable: 400 kB\nSwapTotal: 0 kB\nSwapFree: 0 kB",
|
||||
`0.1 0.2 0.3 1/2 3\n${up} 5`,
|
||||
`Inter-|\n eth0: ${rx} 0 0 0 0 0 0 0 ${rx * 2} 0\n lo: 9 0 0 0 0 0 0 0 9 0`,
|
||||
page,
|
||||
procs,
|
||||
].join("\n@@\n");
|
||||
|
||||
const proc = (pid: number, ticks: number, start: number, name = "java") =>
|
||||
`${pid}\t${ticks}\t10\t${start}\tR\t1\t${name}\n`;
|
||||
|
||||
describe("parseLive extras", () => {
|
||||
it("reports state, parent, CPU mix, cache and the running count", () => {
|
||||
const mk = (user: number, sys: number, wait: number, idle: number) =>
|
||||
out([user, idle], [user, idle], 1, 10, procs).replace(
|
||||
/cpu {2}\d+ 0 0 \d+ 0 0 0 0/,
|
||||
`cpu ${user} 0 ${sys} ${idle} ${wait} 0 0 0`,
|
||||
);
|
||||
const procs = "5\t1\t10\t7\tR\t2\tjava\n6\t1\t10\t8\tS\t5\tsh\n";
|
||||
const a = parseLive(mk(0, 0, 0, 0), undefined, 0);
|
||||
const b = parseLive(mk(30, 10, 10, 50), a.next, 1000);
|
||||
expect(b.sample.cpuMix).toMatchObject({ user: 30, system: 10, iowait: 10 });
|
||||
expect(b.sample.running).toBe(1);
|
||||
expect(b.sample.procs.find((p) => p.pid === 6)).toMatchObject({
|
||||
state: "S",
|
||||
ppid: 5,
|
||||
});
|
||||
expect(b.sample.memCachedKb).toBe(0);
|
||||
});
|
||||
});
|
||||
|
||||
describe("liveCmd", () => {
|
||||
it("asks for the page size once, then passes the cached number", () => {
|
||||
expect(liveCmd()).toContain('pg="$(getconf PAGESIZE)"');
|
||||
expect(liveCmd(16384)).toContain("pg=16384 ");
|
||||
expect(liveCmd(16384)).not.toContain("getconf");
|
||||
});
|
||||
});
|
||||
|
||||
describe("parseLive", () => {
|
||||
it("has no rates on the first sample", () => {
|
||||
const { sample } = parseLive(
|
||||
out([100, 100], [100, 100], 1000, 10, proc(7, 0, 1)),
|
||||
undefined,
|
||||
);
|
||||
expect(sample.cpu).toBeNull();
|
||||
expect(sample.net[0].rxBps).toBeNull();
|
||||
expect(sample.memUsedKb).toBe(600);
|
||||
});
|
||||
|
||||
it("derives cpu, per-core, net and process rates from the delta", () => {
|
||||
const a = parseLive(
|
||||
out([100, 100], [100, 100], 1000, 10, proc(7, 0, 1)),
|
||||
undefined,
|
||||
);
|
||||
// aggregate: +50 busy, +50 idle; core 0: +25 busy, +75 idle
|
||||
const { sample } = parseLive(
|
||||
out([150, 150], [125, 175], 3000, 11, proc(7, 50, 1)),
|
||||
a.next,
|
||||
);
|
||||
expect(sample.cpu).toBeCloseTo(50, 0);
|
||||
expect(sample.cores[0]).toBeCloseTo(25, 0);
|
||||
expect(sample.net).toEqual([{ name: "eth0", rxBps: 2000, txBps: 4000 }]);
|
||||
expect(sample.procs[0]).toMatchObject({ pid: 7, name: "java", memKb: 40 });
|
||||
expect(sample.procs[0].cpu).toBeCloseTo(50, 0);
|
||||
});
|
||||
|
||||
it("does not charge a reused pid with the old process's ticks", () => {
|
||||
const a = parseLive(
|
||||
out([100, 100], [100, 100], 1000, 10, proc(7, 5, 1)),
|
||||
undefined,
|
||||
);
|
||||
// same pid, new start time, lower ticks must not look like a huge delta
|
||||
const { sample } = parseLive(
|
||||
out([150, 150], [125, 175], 3000, 11, proc(7, 9000, 2)),
|
||||
a.next,
|
||||
);
|
||||
expect(sample.procs[0].cpu).toBe(0);
|
||||
});
|
||||
|
||||
it("keeps the cached page size when a run omits it, and keeps names with tabs", () => {
|
||||
const a = parseLive(
|
||||
out([1, 1], [1, 1], 1, 10, proc(1, 0, 1), "16384"),
|
||||
undefined,
|
||||
);
|
||||
expect(a.next.pageBytes).toBe(16384);
|
||||
const b = parseLive(
|
||||
out([2, 2], [2, 2], 2, 11, proc(1, 0, 1, "a b"), ""),
|
||||
a.next,
|
||||
);
|
||||
expect(b.next.pageBytes).toBe(16384);
|
||||
expect(b.sample.procs[0]).toMatchObject({ name: "a\tb", memKb: 160 });
|
||||
});
|
||||
|
||||
it("starts rates again after a reboot", () => {
|
||||
const a = parseLive(
|
||||
out([100, 100], [100, 100], 5000, 900, proc(7, 0, 1)),
|
||||
undefined,
|
||||
);
|
||||
const { sample } = parseLive(
|
||||
out([10, 10], [10, 10], 20, 5, proc(7, 0, 1)),
|
||||
a.next,
|
||||
);
|
||||
expect(sample.cpu).toBeNull();
|
||||
expect(sample.net[0].rxBps).toBeNull();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,244 @@
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
isUnit,
|
||||
journalArgs,
|
||||
parseBoots,
|
||||
parseDetect,
|
||||
parseEntry,
|
||||
parseIsActive,
|
||||
parseJournal,
|
||||
parseJournalQuery,
|
||||
parseOpenRcList,
|
||||
parseSystemdTime,
|
||||
parseTimers,
|
||||
parseUnitList,
|
||||
parseUsage,
|
||||
shellQuote as q,
|
||||
vacuumScript,
|
||||
} from "@termix-ssh/plugin-sdk/host-scripts";
|
||||
|
||||
describe("names", () => {
|
||||
it("quotes for bash", () => {
|
||||
expect(q("a'b")).toBe(`'a'\\''b'`);
|
||||
});
|
||||
|
||||
it("takes unit names and refuses anything else", () => {
|
||||
expect(isUnit("nginx.service")).toBe(true);
|
||||
expect(isUnit("getty@tty1.service")).toBe(true);
|
||||
expect(isUnit("dev-disk-by\\x2duuid-1.device")).toBe(true);
|
||||
expect(isUnit("-rf.service")).toBe(false);
|
||||
expect(isUnit("a;b.service")).toBe(false);
|
||||
expect(isUnit("a b.service")).toBe(false);
|
||||
expect(isUnit("nginx")).toBe(false);
|
||||
expect(isUnit("$(id).service")).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("systemd parsing", () => {
|
||||
const list = [
|
||||
"cron.service loaded active running Regular background program",
|
||||
"● bad.service loaded failed failed Broken thing",
|
||||
"getty@tty1.service loaded active running Getty on tty1",
|
||||
"@@TERMIX_FILES@@",
|
||||
"cron.service enabled enabled",
|
||||
"bad.service disabled enabled",
|
||||
"getty@.service enabled enabled",
|
||||
"old.service masked -",
|
||||
"",
|
||||
].join("\n");
|
||||
|
||||
it("merges loaded units with unit files and skips templates", () => {
|
||||
const units = parseUnitList(list);
|
||||
expect(units.map((u) => u.name)).toEqual([
|
||||
"bad.service",
|
||||
"cron.service",
|
||||
"getty@tty1.service",
|
||||
"old.service",
|
||||
]);
|
||||
const cron = units.find((u) => u.name === "cron.service")!;
|
||||
expect(cron).toMatchObject({
|
||||
active: "active",
|
||||
sub: "running",
|
||||
description: "Regular background program",
|
||||
fileState: "enabled",
|
||||
preset: "enabled",
|
||||
});
|
||||
expect(units.find((u) => u.name === "bad.service")!.active).toBe("failed");
|
||||
expect(units.find((u) => u.name === "old.service")).toMatchObject({
|
||||
load: "masked",
|
||||
active: "inactive",
|
||||
preset: "",
|
||||
});
|
||||
});
|
||||
|
||||
it("reads UTC times", () => {
|
||||
expect(parseSystemdTime("Thu 2026-10-22 02:03:51 UTC")).toBe(
|
||||
Date.UTC(2026, 9, 22, 2, 3, 51),
|
||||
);
|
||||
expect(parseSystemdTime("")).toBeNull();
|
||||
expect(parseSystemdTime("n/a")).toBeNull();
|
||||
});
|
||||
|
||||
it("reads timers from systemctl show blocks", () => {
|
||||
const out = [
|
||||
"TimersCalendar={ OnCalendar=*-*-* 06,18:00:00 ; next_elapse=@1792605600 }",
|
||||
"NextElapseUSecRealtime=Thu 2026-10-22 02:03:51 UTC",
|
||||
"LastTriggerUSec=Wed 2026-10-21 17:02:58 UTC",
|
||||
"Id=apt-daily.timer",
|
||||
"Triggers=apt-daily.service",
|
||||
"ActiveState=active",
|
||||
"",
|
||||
"TimersMonotonic={ OnUnitActiveUSec=1d ; next_elapse=1d }",
|
||||
"TimersMonotonic={ OnBootUSec=15min ; next_elapse=15min }",
|
||||
"NextElapseUSecRealtime=",
|
||||
"LastTriggerUSec=",
|
||||
"Id=clean.timer",
|
||||
"Triggers=clean.service",
|
||||
].join("\n");
|
||||
const timers = parseTimers(out);
|
||||
expect(timers[0]).toMatchObject({
|
||||
name: "apt-daily.timer",
|
||||
activates: "apt-daily.service",
|
||||
next: Date.UTC(2026, 9, 22, 2, 3, 51),
|
||||
schedule: ["OnCalendar=*-*-* 06,18:00:00"],
|
||||
});
|
||||
expect(timers[1]).toMatchObject({
|
||||
name: "clean.timer",
|
||||
next: null,
|
||||
last: null,
|
||||
schedule: ["OnUnitActiveUSec=1d", "OnBootUSec=15min"],
|
||||
});
|
||||
});
|
||||
|
||||
it("maps is-active lines to units", () => {
|
||||
const states = parseIsActive(
|
||||
["a.service", "b.service"],
|
||||
"active\nfailed\n",
|
||||
);
|
||||
expect(states.get("a.service")).toBe("active");
|
||||
expect(states.get("b.service")).toBe("failed");
|
||||
});
|
||||
|
||||
it("reads what detect prints", () => {
|
||||
expect(
|
||||
parseDetect(
|
||||
"init=systemd\nversion=257\nos=Debian GNU/Linux 13 (trixie)\nuid=0\njournal=1\nfailed=2\n",
|
||||
),
|
||||
).toMatchObject({
|
||||
init: "systemd",
|
||||
version: "257",
|
||||
root: true,
|
||||
journal: true,
|
||||
failed: 2,
|
||||
});
|
||||
expect(parseDetect("init=weird\nuid=1000\n")).toMatchObject({
|
||||
init: "none",
|
||||
root: false,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe("journal", () => {
|
||||
it("checks filters", () => {
|
||||
const query = parseJournalQuery({
|
||||
unit: ["nginx.service", "ssh.service"],
|
||||
priority: "3",
|
||||
since: "-1h",
|
||||
boot: "-1",
|
||||
grep: "fail'ed",
|
||||
lines: "99999",
|
||||
});
|
||||
expect(query.lines).toBe(5000);
|
||||
const args = journalArgs(query);
|
||||
expect(args).toContain("-u 'nginx.service' -u 'ssh.service'");
|
||||
expect(args).toContain("-p 3");
|
||||
expect(args).toContain("--since '-1h'");
|
||||
expect(args).toContain("-b '-1'");
|
||||
expect(args).toContain(`-g 'fail'\\''ed'`);
|
||||
expect(() => parseJournalQuery({ unit: "x;rm" })).toThrow();
|
||||
expect(() => parseJournalQuery({ priority: "9" })).toThrow();
|
||||
expect(() => parseJournalQuery({ since: "$(id)" })).toThrow();
|
||||
expect(() => parseJournalQuery({ boot: "abc" })).toThrow();
|
||||
});
|
||||
|
||||
it("parses entries, binary messages included", () => {
|
||||
const entry = parseEntry(
|
||||
JSON.stringify({
|
||||
__REALTIME_TIMESTAMP: "1792612429684000",
|
||||
PRIORITY: "3",
|
||||
_SYSTEMD_UNIT: "x.service",
|
||||
SYSLOG_IDENTIFIER: "x",
|
||||
_PID: "12",
|
||||
MESSAGE: [104, 105],
|
||||
}),
|
||||
);
|
||||
expect(entry).toEqual({
|
||||
time: 1792612429684,
|
||||
priority: 3,
|
||||
unit: "x.service",
|
||||
ident: "x",
|
||||
pid: "12",
|
||||
message: "hi",
|
||||
});
|
||||
expect(parseEntry("not json")).toBeNull();
|
||||
});
|
||||
|
||||
it("filters here when journalctl has no -g", () => {
|
||||
const line = (message: string) =>
|
||||
JSON.stringify({ __REALTIME_TIMESTAMP: "1000", MESSAGE: message });
|
||||
const out = `@@TERMIX_NOGREP@@\n${line("Disk Error")}\n${line("ok")}\n`;
|
||||
const query = parseJournalQuery({ grep: "error", lines: "10" });
|
||||
expect(parseJournal(out, query).map((e) => e.message)).toEqual([
|
||||
"Disk Error",
|
||||
]);
|
||||
});
|
||||
|
||||
it("reads boots and disk use", () => {
|
||||
const boots = parseBoots(
|
||||
[
|
||||
"IDX BOOT ID FIRST ENTRY LAST ENTRY",
|
||||
"-1 d2785a657f4c4561a1f436db27555b50 Tue 2026-10-20 13:56:45 UTC Wed 2026-10-21 10:37:00 UTC",
|
||||
" 0 61b15588a75b4c0cb8dea321fcc438ab Wed 2026-10-21 10:38:10 UTC Wed 2026-10-21 20:00:00 UTC",
|
||||
].join("\n"),
|
||||
);
|
||||
expect(boots.map((b) => b.offset)).toEqual([0, -1]);
|
||||
expect(boots[0].first).toBe("Wed 2026-10-21 10:38:10 UTC");
|
||||
expect(
|
||||
parseUsage(
|
||||
"Archived and active journals take up 378.6M in the file system.",
|
||||
),
|
||||
).toBe("378.6M");
|
||||
});
|
||||
|
||||
it("only takes sane vacuum values", () => {
|
||||
expect(vacuumScript({ size: "500M" })).toContain("--vacuum-size=500M");
|
||||
expect(vacuumScript({ time: "4w" })).toContain("--vacuum-time=4w");
|
||||
expect(() => vacuumScript({ size: "1; rm -rf /" })).toThrow();
|
||||
expect(() => vacuumScript({})).toThrow();
|
||||
});
|
||||
});
|
||||
|
||||
describe("openrc", () => {
|
||||
it("maps services and runlevels", () => {
|
||||
const units = parseOpenRcList(
|
||||
[
|
||||
" sshd [ started ]",
|
||||
" crond [ stopped ]",
|
||||
" nginx [ crashed ]",
|
||||
"@@TERMIX_RUNLEVELS@@",
|
||||
" sshd | default",
|
||||
" nginx | ",
|
||||
"",
|
||||
].join("\n"),
|
||||
);
|
||||
expect(units.find((u) => u.name === "sshd")).toMatchObject({
|
||||
active: "active",
|
||||
fileState: "enabled",
|
||||
});
|
||||
expect(units.find((u) => u.name === "nginx")).toMatchObject({
|
||||
active: "failed",
|
||||
fileState: "disabled",
|
||||
});
|
||||
expect(units.find((u) => u.name === "crond")!.active).toBe("inactive");
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,130 @@
|
||||
import { execFileSync } from "node:child_process";
|
||||
import { describe, expect, it } from "vitest";
|
||||
import {
|
||||
actionScript,
|
||||
errLine,
|
||||
isActiveScript,
|
||||
listUnitsScript,
|
||||
openRcActionScript,
|
||||
parseKeys,
|
||||
passwordSudoScript,
|
||||
scriptError,
|
||||
scriptShell,
|
||||
SUDO_REFUSED_RE,
|
||||
SUDO_WRONG_RE,
|
||||
toBase64,
|
||||
utf8Decode,
|
||||
utf8Encode,
|
||||
watchdog,
|
||||
} from "@termix-ssh/plugin-sdk/host-scripts";
|
||||
|
||||
describe("text helpers", () => {
|
||||
it("encodes base64 like Buffer does", () => {
|
||||
for (const text of [
|
||||
"",
|
||||
"a",
|
||||
"ab",
|
||||
"abc",
|
||||
"héllo wörld",
|
||||
"emoji 🙂 here",
|
||||
"line\nbreak",
|
||||
]) {
|
||||
expect(toBase64(text)).toBe(Buffer.from(text, "utf8").toString("base64"));
|
||||
}
|
||||
});
|
||||
|
||||
it("round trips UTF-8 and replaces bad bytes", () => {
|
||||
const text = "plain, ünïcode, 日本, 🙂";
|
||||
expect(utf8Decode(utf8Encode(text))).toBe(text);
|
||||
expect(Array.from(utf8Encode(text))).toEqual(
|
||||
Array.from(Buffer.from(text, "utf8")),
|
||||
);
|
||||
expect(utf8Decode([0x61, 0xff, 0x62])).toBe("a\ufffdb");
|
||||
expect(utf8Decode([0xe6, 0x97])).toBe("\ufffd");
|
||||
});
|
||||
|
||||
it("reads key=value lines", () => {
|
||||
expect(parseKeys("a=1\nb = two=2\njunk\n")).toEqual({ a: "1", b: "two=2" });
|
||||
});
|
||||
});
|
||||
|
||||
describe("script shells", () => {
|
||||
it("always reads the script from stdin", () => {
|
||||
for (const mode of ["plain", "auto", "root"] as const) {
|
||||
expect(scriptShell(mode)).toContain("bash -s");
|
||||
}
|
||||
expect(scriptShell("auto")).toContain("sudo -n true");
|
||||
expect(scriptShell("root-only")).toContain("SCRIPT_ERR:");
|
||||
});
|
||||
|
||||
it("collects error lines, old and new markers", () => {
|
||||
expect(scriptError("x\nSCRIPT_ERR:one\nSERVICES_ERR:two\n")).toBe(
|
||||
"one\ntwo",
|
||||
);
|
||||
expect(errLine("it's broken")).toBe(`echo 'SCRIPT_ERR:it'\\''s broken'`);
|
||||
});
|
||||
|
||||
it("matches sudo refusals", () => {
|
||||
expect(SUDO_REFUSED_RE.test("sudo: a password is required")).toBe(true);
|
||||
expect(SUDO_WRONG_RE.test("sudo: 1 incorrect password attempt")).toBe(true);
|
||||
});
|
||||
|
||||
it("keeps the sudo password out of the command line", () => {
|
||||
const { command, stdin } = passwordSudoScript(
|
||||
"systemctl restart 'a.service'\n",
|
||||
"s3cr'et $(id)",
|
||||
);
|
||||
expect(command).not.toContain("s3cr");
|
||||
expect(stdin.split("\n")[0]).toBe("IFS= read -r TERMIX_PW");
|
||||
expect(stdin.split("\n")[1]).toBe("s3cr'et $(id)");
|
||||
expect(stdin).toContain("sudo -k -S -p ''");
|
||||
expect(stdin).not.toContain("systemctl restart");
|
||||
expect(() => passwordSudoScript("x", "a\nb")).toThrow();
|
||||
});
|
||||
|
||||
it.runIf(process.platform !== "win32")(
|
||||
"runs the script and never runs the password",
|
||||
() => {
|
||||
const { stdin } = passwordSudoScript(
|
||||
'echo "ran:$1${TERMIX_PW:-none}"\n',
|
||||
"touch /tmp/should-not-exist",
|
||||
);
|
||||
// No sudo here: swap it for a fake that drops its own stdin line.
|
||||
const fake = stdin.replace(
|
||||
/printf '%s\\n' "\$P" \| sudo -k -S -p '' env PATH="\$PATH" [^\n]* bash -c "\$TERMIX_S"/,
|
||||
'printf "%s\\n" "$P" | { IFS= read -r _; bash -c "$TERMIX_S"; }',
|
||||
);
|
||||
expect(fake).not.toBe(stdin);
|
||||
const out = execFileSync(
|
||||
"bash",
|
||||
["-c", "sudo() { return 1; }; export -f sudo; exec bash -s"],
|
||||
{
|
||||
input: fake,
|
||||
encoding: "utf8",
|
||||
},
|
||||
);
|
||||
expect(out.trim()).toBe("ran:none");
|
||||
},
|
||||
);
|
||||
});
|
||||
|
||||
describe("unit scripts", () => {
|
||||
it("quotes units and refuses bad names", () => {
|
||||
expect(actionScript("a.service", "enable-now")).toContain(
|
||||
"systemctl enable --now -- 'a.service'",
|
||||
);
|
||||
expect(() => actionScript("a;b.service", "start")).toThrow();
|
||||
expect(isActiveScript(["a.service", "b.timer"])).toContain(
|
||||
"-- 'a.service' 'b.timer'",
|
||||
);
|
||||
expect(() => listUnitsScript("bogus" as never)).toThrow();
|
||||
expect(openRcActionScript("sshd", "enable")).toContain(
|
||||
"rc-update add 'sshd' default",
|
||||
);
|
||||
expect(() => openRcActionScript("sshd", "mask")).toThrow();
|
||||
});
|
||||
|
||||
it("stops a watched command once stdin closes", () => {
|
||||
expect(watchdog("journalctl -f")).toContain("cat >/dev/null");
|
||||
});
|
||||
});
|
||||
@@ -621,6 +621,26 @@ describe("dependencies", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("safe mode", () => {
|
||||
afterEach(() => {
|
||||
delete process.env.TERMIX_SAFE_MODE;
|
||||
});
|
||||
|
||||
it("refuses to start a plugin that is not a layout or theme, but still stops one", async () => {
|
||||
createFixturePlugin({ id: "base", root: bundled });
|
||||
const loader = await boot();
|
||||
await manage.setPluginState("base", false);
|
||||
|
||||
process.env.TERMIX_SAFE_MODE = "1";
|
||||
await expect(manage.setPluginState("base", true)).rejects.toMatchObject({
|
||||
status: 409,
|
||||
code: "SAFE_MODE",
|
||||
});
|
||||
expect(loader.get("base")?.state).toBe("stopped");
|
||||
expect(db.rows.get("base")?.state).toBe("disabled");
|
||||
});
|
||||
});
|
||||
|
||||
describe("reloading a bundled plugin for the dev runner", () => {
|
||||
it("loads the rebuilt copy and restarts what depends on it", async () => {
|
||||
createFixturePlugin({ id: "base", root: bundled });
|
||||
|
||||
@@ -8,10 +8,23 @@ import * as tar from "tar";
|
||||
const fetchMock = vi.hoisted(() => vi.fn());
|
||||
const testKey = vi.hoisted(() => ({ value: null as null | object }));
|
||||
|
||||
vi.mock("../../utils/safe-outbound-fetch.js", () => ({
|
||||
vi.mock("../../utils/safe-outbound-fetch.js", async (importOriginal) => ({
|
||||
...(await importOriginal<
|
||||
typeof import("../../utils/safe-outbound-fetch.js")
|
||||
>()),
|
||||
safeOutboundFetch: fetchMock,
|
||||
}));
|
||||
|
||||
const proxyMock = vi.hoisted(() => ({
|
||||
on: false,
|
||||
fetch: vi.fn(),
|
||||
}));
|
||||
|
||||
vi.mock("../../utils/proxy-agent.js", () => ({
|
||||
getProxyAgent: () => (proxyMock.on ? {} : undefined),
|
||||
fetchWithProxy: proxyMock.fetch,
|
||||
}));
|
||||
|
||||
vi.mock("../../utils/app-version.js", () => ({
|
||||
getLocalVersion: () => "26.10.3",
|
||||
}));
|
||||
@@ -43,9 +56,11 @@ vi.mock("../../plugins/trust.js", async (importOriginal) => {
|
||||
import {
|
||||
communitySource,
|
||||
downloadRelease,
|
||||
fetchIndexAt,
|
||||
fetchRegistryIndex,
|
||||
fetchRegistryStats,
|
||||
findRelease,
|
||||
getRegistryPrivateHosts,
|
||||
latestOnChannel,
|
||||
getStatsUrl,
|
||||
canRunRelease,
|
||||
@@ -409,6 +424,91 @@ describe("fetchRegistryIndex", () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe("registry fetches with a proxy", () => {
|
||||
afterEach(() => {
|
||||
proxyMock.on = false;
|
||||
proxyMock.fetch.mockReset();
|
||||
});
|
||||
|
||||
it("goes through the proxy when one is configured", async () => {
|
||||
proxyMock.on = true;
|
||||
proxyMock.fetch.mockResolvedValueOnce(
|
||||
response(JSON.stringify({ plugins: [] })),
|
||||
);
|
||||
await fetchIndexAt("https://registry.example/index.json");
|
||||
expect(proxyMock.fetch).toHaveBeenCalledTimes(1);
|
||||
expect(fetchMock).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
it("still refuses a private address typed in as a literal", async () => {
|
||||
proxyMock.on = true;
|
||||
await expect(fetchIndexAt("https://127.0.0.1/index.json")).rejects.toThrow(
|
||||
"Private destinations are not allowed",
|
||||
);
|
||||
expect(proxyMock.fetch).not.toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
|
||||
describe("private registry hosts", () => {
|
||||
afterEach(() => {
|
||||
delete process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS;
|
||||
});
|
||||
|
||||
it("reads a comma separated list of host names", () => {
|
||||
process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS =
|
||||
" GitLab.lan ,, 192.168.1.5 ";
|
||||
expect(getRegistryPrivateHosts()).toEqual(["gitlab.lan", "192.168.1.5"]);
|
||||
delete process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS;
|
||||
expect(getRegistryPrivateHosts()).toEqual([]);
|
||||
});
|
||||
|
||||
it("brings each entry into the form the fetch compares against", () => {
|
||||
process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS =
|
||||
"GitLab.LAN,[FD00::0001],fd00::2,bücher.lan";
|
||||
expect(getRegistryPrivateHosts()).toEqual([
|
||||
"gitlab.lan",
|
||||
"fd00::1",
|
||||
"fd00::2",
|
||||
"xn--bcher-kva.lan",
|
||||
]);
|
||||
});
|
||||
|
||||
it("drops entries with more than a host", () => {
|
||||
process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS =
|
||||
"gitlab.lan:8443,https://git.lan,[fd00::1]:80,nas.lan";
|
||||
expect(getRegistryPrivateHosts()).toEqual(["nas.lan"]);
|
||||
});
|
||||
|
||||
it("allows the listed hosts on every hop", async () => {
|
||||
process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS = "gitlab.lan";
|
||||
fetchMock
|
||||
.mockResolvedValueOnce(
|
||||
response("", 302, { location: "https://gitlab.lan/raw/index.json" }),
|
||||
)
|
||||
.mockResolvedValueOnce(response(JSON.stringify({ plugins: [] })));
|
||||
await fetchIndexAt("https://gitlab.lan/index.json");
|
||||
expect(fetchMock.mock.calls.map((call) => call[2])).toEqual([
|
||||
["gitlab.lan"],
|
||||
["gitlab.lan"],
|
||||
]);
|
||||
});
|
||||
|
||||
it("still blocks a redirect to a private host that is not listed", async () => {
|
||||
process.env.TERMIX_PLUGIN_REGISTRY_PRIVATE_HOSTS = "gitlab.lan";
|
||||
const actual = await vi.importActual<
|
||||
typeof import("../../utils/safe-outbound-fetch.js")
|
||||
>("../../utils/safe-outbound-fetch.js");
|
||||
fetchMock
|
||||
.mockResolvedValueOnce(
|
||||
response("", 302, { location: "https://127.0.0.1/index.json" }),
|
||||
)
|
||||
.mockImplementationOnce(actual.safeOutboundFetch);
|
||||
await expect(fetchIndexAt("https://gitlab.lan/index.json")).rejects.toThrow(
|
||||
"Private destinations are not allowed",
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
/** A real .tmxplug holding only a manifest, enough for the checks. */
|
||||
function pack(manifest: Record<string, unknown>): Buffer {
|
||||
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "termix-pack-"));
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
import { afterEach, describe, expect, it } from "vitest";
|
||||
import {
|
||||
mayRunInSafeMode,
|
||||
safeModeOn,
|
||||
safeModePluginIds,
|
||||
} from "../../plugins/safe-mode.js";
|
||||
import type { PluginManifest } from "../../plugins/manifest.js";
|
||||
|
||||
function plugin(id: string, manifest: Partial<PluginManifest> = {}) {
|
||||
return { id, manifest: { id, ...manifest } as PluginManifest };
|
||||
}
|
||||
|
||||
const plugins = [
|
||||
plugin("layout", {
|
||||
contributes: { layouts: [{ id: "classic" }] },
|
||||
dependencies: { helper: "^1.0.0" },
|
||||
} as Partial<PluginManifest>),
|
||||
plugin("themes", {
|
||||
contributes: { themes: [{ id: "dark" }] },
|
||||
} as Partial<PluginManifest>),
|
||||
plugin("helper"),
|
||||
plugin("docker"),
|
||||
];
|
||||
|
||||
afterEach(() => {
|
||||
delete process.env.TERMIX_SAFE_MODE;
|
||||
});
|
||||
|
||||
describe("safeModeOn", () => {
|
||||
it("reads 1 and true, anything else is off", () => {
|
||||
expect(safeModeOn()).toBe(false);
|
||||
process.env.TERMIX_SAFE_MODE = "1";
|
||||
expect(safeModeOn()).toBe(true);
|
||||
process.env.TERMIX_SAFE_MODE = " TRUE ";
|
||||
expect(safeModeOn()).toBe(true);
|
||||
process.env.TERMIX_SAFE_MODE = "0";
|
||||
expect(safeModeOn()).toBe(false);
|
||||
});
|
||||
});
|
||||
|
||||
describe("safeModePluginIds", () => {
|
||||
it("keeps layout and theme plugins and what they depend on", () => {
|
||||
expect([...safeModePluginIds(plugins)].sort()).toEqual([
|
||||
"helper",
|
||||
"layout",
|
||||
"themes",
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
||||
describe("mayRunInSafeMode", () => {
|
||||
it("lets every plugin run when safe mode is off", () => {
|
||||
expect(mayRunInSafeMode("docker", plugins)).toBe(true);
|
||||
});
|
||||
|
||||
it("only lets look plugins run when safe mode is on", () => {
|
||||
process.env.TERMIX_SAFE_MODE = "1";
|
||||
expect(mayRunInSafeMode("docker", plugins)).toBe(false);
|
||||
expect(mayRunInSafeMode("layout", plugins)).toBe(true);
|
||||
expect(mayRunInSafeMode("helper", plugins)).toBe(true);
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,77 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
|
||||
const h = vi.hoisted(() => ({
|
||||
row: { sharedSource: '{"owner":"x"}' } as { sharedSource: string | null },
|
||||
updates: [] as unknown[],
|
||||
}));
|
||||
|
||||
vi.mock("../../database/repositories/factory.js", () => ({
|
||||
createCurrentRepositoryContext: () => ({
|
||||
drizzle: {
|
||||
select: () => ({
|
||||
from: () => ({ where: () => ({ limit: async () => [h.row] }) }),
|
||||
}),
|
||||
update: () => ({
|
||||
set: (values: unknown) => ({
|
||||
where: async () => {
|
||||
h.updates.push(values);
|
||||
},
|
||||
}),
|
||||
}),
|
||||
},
|
||||
}),
|
||||
}));
|
||||
|
||||
const { rejectSharedCopyWrites } =
|
||||
await import("../../sync/shared-copy-guard.js");
|
||||
|
||||
function run(body: Record<string, unknown>) {
|
||||
const guard = rejectSharedCopyWrites("host", /^\/db\/host\/(\d+)$/);
|
||||
const res = {
|
||||
code: 0,
|
||||
payload: undefined as unknown,
|
||||
status(code: number) {
|
||||
this.code = code;
|
||||
return this;
|
||||
},
|
||||
json(payload: unknown) {
|
||||
this.payload = payload;
|
||||
return this;
|
||||
},
|
||||
};
|
||||
const next = vi.fn();
|
||||
return guard(
|
||||
{ method: "PUT", path: "/db/host/5", body } as never,
|
||||
res as never,
|
||||
next,
|
||||
).then(() => ({ res, next }));
|
||||
}
|
||||
|
||||
beforeEach(() => {
|
||||
process.env.ELECTRON_EMBEDDED = "true";
|
||||
h.row = { sharedSource: '{"owner":"x"}' };
|
||||
h.updates = [];
|
||||
});
|
||||
|
||||
describe("shared copy guard", () => {
|
||||
it("refuses edits to a shared copy", async () => {
|
||||
const { res, next } = await run({ name: "new" });
|
||||
expect(res.code).toBe(403);
|
||||
expect(next).not.toHaveBeenCalled();
|
||||
expect(h.updates).toEqual([]);
|
||||
});
|
||||
|
||||
it("still lets the connection origin change on this device", async () => {
|
||||
const { res, next } = await run({ name: "new", connectionOrigin: "local" });
|
||||
expect(res.code).toBe(0);
|
||||
expect(res.payload).toMatchObject({ connectionOrigin: "local" });
|
||||
expect(next).not.toHaveBeenCalled();
|
||||
expect(h.updates).toEqual([{ connectionOrigin: "local" }]);
|
||||
});
|
||||
|
||||
it("passes hosts that are not shared copies", async () => {
|
||||
h.row = { sharedSource: null };
|
||||
const { next } = await run({ name: "new" });
|
||||
expect(next).toHaveBeenCalled();
|
||||
});
|
||||
});
|
||||
+28
-3
@@ -1,5 +1,10 @@
|
||||
/* eslint-disable react-refresh/only-export-components */
|
||||
import { prepareClientCacheVersion } from "@/lib/client-cache-version";
|
||||
import {
|
||||
TitleBar,
|
||||
TITLE_BAR_OFFSET,
|
||||
useTitleBarOverlayColors,
|
||||
} from "@/shell/TitleBar";
|
||||
import { StrictMode, Suspense, lazy, useState, useRef, useEffect } from "react";
|
||||
import { createRoot } from "react-dom/client";
|
||||
import "./ui/index.css";
|
||||
@@ -7,6 +12,7 @@ import { ThemeProvider } from "@/components/theme-provider";
|
||||
import "./ui/i18n/i18n";
|
||||
import { isElectron } from "@/lib/electron";
|
||||
import { isEmbeddedAuthFrame } from "@/lib/embedded-frame";
|
||||
import { captureAppReturn } from "@/lib/app-return";
|
||||
import { rememberViewLink, resumeViewLink } from "@/lib/view-link-resume";
|
||||
import { getEmbeddedServerFailure } from "@/lib/embedded-server-status";
|
||||
import { Toaster } from "@/components/sonner";
|
||||
@@ -160,9 +166,14 @@ function FullscreenAppGate() {
|
||||
}
|
||||
|
||||
function App() {
|
||||
// Keeps the window controls the system draws in the colors of the theme.
|
||||
useTitleBarOverlayColors();
|
||||
const stored = getStoredAuth();
|
||||
// A sign in for the mobile app always shows the login form, so the app gets
|
||||
// its own fresh session.
|
||||
const [appReturn] = useState(captureAppReturn);
|
||||
const [phase, setPhase] = useState<Phase>(
|
||||
stored?.loggedIn ? "verifying" : "idle-auth",
|
||||
stored?.loggedIn && !appReturn ? "verifying" : "idle-auth",
|
||||
);
|
||||
const [authUsername, setAuthUsername] = useState(stored?.username ?? "");
|
||||
const [verifyRetryCount, setVerifyRetryCount] = useState(0);
|
||||
@@ -370,10 +381,17 @@ function App() {
|
||||
|
||||
const { t } = useTranslation();
|
||||
const isTransitioning = phase === "fading-in" || phase === "fading-out";
|
||||
// The desktop app draws a title bar on top of the window, so everything
|
||||
// below it starts lower. The bar sets the offset only while it shows.
|
||||
const titleBarOffset = TITLE_BAR_OFFSET;
|
||||
|
||||
if (phase === "verifying" || phase === "loading-app") {
|
||||
return (
|
||||
<div className="fixed inset-0 flex items-center justify-center bg-background">
|
||||
<div
|
||||
className="fixed inset-0 flex items-center justify-center bg-background"
|
||||
style={{ paddingTop: titleBarOffset }}
|
||||
>
|
||||
<TitleBar />
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<div className="w-5 h-5 border-2 border-primary border-t-transparent rounded-full animate-spin" />
|
||||
<p className="text-sm text-muted-foreground">{t("common.loading")}</p>
|
||||
@@ -384,8 +402,13 @@ function App() {
|
||||
|
||||
return (
|
||||
<>
|
||||
<TitleBar />
|
||||
|
||||
{isTransitioning && (
|
||||
<div className="fixed inset-0 z-0 flex items-center justify-center bg-background">
|
||||
<div
|
||||
className="fixed inset-0 z-0 flex items-center justify-center bg-background"
|
||||
style={{ paddingTop: titleBarOffset }}
|
||||
>
|
||||
<div className="flex flex-col items-center gap-4">
|
||||
<div className="w-5 h-5 border-2 border-primary border-t-transparent rounded-full animate-spin" />
|
||||
<p className="text-sm text-muted-foreground">
|
||||
@@ -416,6 +439,7 @@ function App() {
|
||||
style={{
|
||||
opacity: appOpacity,
|
||||
pointerEvents: phase === "idle-app" ? "auto" : "none",
|
||||
paddingTop: titleBarOffset,
|
||||
}}
|
||||
>
|
||||
<Suspense fallback={null}>
|
||||
@@ -432,6 +456,7 @@ function App() {
|
||||
style={{
|
||||
opacity: authOpacity,
|
||||
pointerEvents: phase === "idle-auth" ? "auto" : "none",
|
||||
paddingTop: titleBarOffset,
|
||||
}}
|
||||
>
|
||||
<Auth onLogin={handleLogin} />
|
||||
|
||||
@@ -19,6 +19,8 @@ export interface LookResponse {
|
||||
defaultLook: { layout: string | null; theme: string | null };
|
||||
/** TERMIX_SAFE_LAYOUT is set on the server. */
|
||||
safeLayout: boolean;
|
||||
/** TERMIX_SAFE_MODE is set: only layout and theme plugins run. */
|
||||
safeMode?: boolean;
|
||||
unavailable: UnavailableLook[];
|
||||
}
|
||||
|
||||
|
||||
@@ -237,7 +237,7 @@ export interface PluginSummary {
|
||||
name: string;
|
||||
version: string;
|
||||
enabled: boolean;
|
||||
/** enabled | disabled | blocked | failed, or the loader's live state. */
|
||||
/** enabled | disabled | blocked | failed | safe-mode, or the loader's live state. */
|
||||
state: string;
|
||||
/** A linked desktop leaves this plugin to its server. */
|
||||
runsOnServer?: boolean;
|
||||
|
||||
+33
-19
@@ -1,9 +1,11 @@
|
||||
/* eslint-disable react-refresh/only-export-components */
|
||||
import {
|
||||
isEmbeddedAuthFrame,
|
||||
isInElectronWebView,
|
||||
isInMobileWebView,
|
||||
type EmbeddedFrameWindow,
|
||||
} from "@/lib/embedded-frame";
|
||||
import { handOffToApp, pendingAppReturn } from "@/lib/app-return";
|
||||
import { useState, useEffect, useCallback, useRef } from "react";
|
||||
import { Button } from "@/components/button";
|
||||
import { Input } from "@/components/input";
|
||||
@@ -145,6 +147,13 @@ export function storeAuth(username: string) {
|
||||
);
|
||||
}
|
||||
|
||||
/** A browser login the mobile app asked for goes back to the app. */
|
||||
async function handOffLogin(token?: string | null): Promise<boolean> {
|
||||
if (!pendingAppReturn() || isEmbeddedAuthFrame()) return false;
|
||||
const value = token || (await getCurrentToken());
|
||||
return handOffToApp(value ? { token: value } : { error: "no_token" });
|
||||
}
|
||||
|
||||
type AuthView = "login" | "register" | "reset" | "second-factor" | "external";
|
||||
type ResetStep = "email" | "code" | "newpass";
|
||||
|
||||
@@ -331,8 +340,9 @@ export function Auth({ onLogin }: AuthProps) {
|
||||
if (proxySigninHandledRef.current || isElectron()) return;
|
||||
proxySigninHandledRef.current = true;
|
||||
requestTrustedProxyLogin()
|
||||
.then((result) => {
|
||||
.then(async (result) => {
|
||||
if (!result.enabled || !result.success) return;
|
||||
if (await handOffLogin()) return;
|
||||
storeAuth(result.username || "");
|
||||
onLogin(
|
||||
result.username || "",
|
||||
@@ -625,24 +635,27 @@ export function Auth({ onLogin }: AuthProps) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
getUserInfo()
|
||||
.then((meRes) => {
|
||||
storeAuth(meRes.username || "");
|
||||
clearDesktopManualLogout();
|
||||
onLogin(
|
||||
meRes.username || "",
|
||||
meRes.userId || undefined,
|
||||
!!meRes.is_admin,
|
||||
);
|
||||
window.history.replaceState(
|
||||
{},
|
||||
document.title,
|
||||
window.location.pathname,
|
||||
);
|
||||
})
|
||||
.catch(() => {
|
||||
toast.error(t("errors.failedUserInfo"));
|
||||
});
|
||||
void handOffLogin(urlParams.get("token")).then((handedOff) => {
|
||||
if (handedOff) return;
|
||||
getUserInfo()
|
||||
.then((meRes) => {
|
||||
storeAuth(meRes.username || "");
|
||||
clearDesktopManualLogout();
|
||||
onLogin(
|
||||
meRes.username || "",
|
||||
meRes.userId || undefined,
|
||||
!!meRes.is_admin,
|
||||
);
|
||||
window.history.replaceState(
|
||||
{},
|
||||
document.title,
|
||||
window.location.pathname,
|
||||
);
|
||||
})
|
||||
.catch(() => {
|
||||
toast.error(t("errors.failedUserInfo"));
|
||||
});
|
||||
});
|
||||
}
|
||||
}, [onLogin, t]);
|
||||
|
||||
@@ -746,6 +759,7 @@ export function Auth({ onLogin }: AuthProps) {
|
||||
setWebviewAuthSuccess(true);
|
||||
return;
|
||||
}
|
||||
if (await handOffLogin(res?.token)) return;
|
||||
const meRes = await getUserInfo();
|
||||
const name =
|
||||
meRes.username || res.username || options.fallbackUsername || "";
|
||||
|
||||
@@ -10,16 +10,17 @@ const buttonVariants = cva(
|
||||
{
|
||||
variants: {
|
||||
variant: {
|
||||
default: "bg-primary text-primary-foreground [a]:hover:bg-primary/80",
|
||||
default:
|
||||
"border-accent-brand/40 bg-accent-brand/15 text-accent-brand hover:bg-accent-brand/25 aria-expanded:bg-accent-brand/25",
|
||||
outline:
|
||||
"border-border bg-background hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:border-input dark:bg-input/30 dark:hover:bg-input/50",
|
||||
"border-accent-brand/40 bg-transparent text-accent-brand hover:bg-accent-brand/10 aria-expanded:bg-accent-brand/10",
|
||||
secondary:
|
||||
"bg-secondary text-secondary-foreground hover:bg-secondary/80 aria-expanded:bg-secondary aria-expanded:text-secondary-foreground",
|
||||
"border-accent-brand/20 bg-accent-brand/10 text-accent-brand hover:bg-accent-brand/20 aria-expanded:bg-accent-brand/20",
|
||||
ghost:
|
||||
"hover:bg-muted hover:text-foreground aria-expanded:bg-muted aria-expanded:text-foreground dark:hover:bg-muted/50",
|
||||
destructive:
|
||||
"bg-destructive/10 text-destructive hover:bg-destructive/20 focus-visible:border-destructive/40 focus-visible:ring-destructive/20 dark:bg-destructive/20 dark:hover:bg-destructive/30 dark:focus-visible:ring-destructive/40",
|
||||
link: "text-primary underline-offset-4 hover:underline",
|
||||
link: "text-accent-brand underline-offset-4 hover:underline",
|
||||
},
|
||||
size: {
|
||||
default:
|
||||
|
||||
@@ -2,6 +2,8 @@ import type React from "react";
|
||||
import { cn } from "@/lib/utils";
|
||||
import {
|
||||
PANEL,
|
||||
gridSizeStyle,
|
||||
type GridSize,
|
||||
type PanelDensity,
|
||||
type PanelViewMode,
|
||||
} from "@/components/panel-layout";
|
||||
@@ -67,6 +69,8 @@ export function DataView<T>({
|
||||
getKey,
|
||||
renderCard,
|
||||
columns,
|
||||
size,
|
||||
minCardWidth,
|
||||
listColumns,
|
||||
onRowClick,
|
||||
isRowActive,
|
||||
@@ -78,7 +82,12 @@ export function DataView<T>({
|
||||
density?: PanelDensity;
|
||||
getKey: (item: T) => string;
|
||||
renderCard: (item: T) => React.ReactNode;
|
||||
/** Breakpoint columns, used when no size is given. */
|
||||
columns: GridColumns;
|
||||
/** Columns the user picked with ViewToggle. Wins over columns. */
|
||||
size?: GridSize;
|
||||
/** Narrowest card in auto mode, in px. */
|
||||
minCardWidth?: number;
|
||||
listColumns: DataColumn<T>[];
|
||||
onRowClick?: (item: T) => void;
|
||||
isRowActive?: (item: T) => boolean;
|
||||
@@ -93,9 +102,19 @@ export function DataView<T>({
|
||||
|
||||
if (view === "grid") {
|
||||
return (
|
||||
<div className={cn("grid", PANEL.gap, gridClass(columns), className)}>
|
||||
<div
|
||||
className={cn(
|
||||
"grid",
|
||||
PANEL.gap,
|
||||
!size && gridClass(columns),
|
||||
className,
|
||||
)}
|
||||
style={size ? gridSizeStyle(size, minCardWidth) : undefined}
|
||||
>
|
||||
{items.map((item) => (
|
||||
<div key={getKey(item)}>{renderCard(item)}</div>
|
||||
<div key={getKey(item)} className="flex flex-col *:flex-1">
|
||||
{renderCard(item)}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -1,11 +1,26 @@
|
||||
/* eslint-disable react-refresh/only-export-components */
|
||||
import { Children, Fragment, isValidElement, useRef } from "react";
|
||||
import type React from "react";
|
||||
import { ArrowLeft, Grid3X3, List, Rows3, Search, X } from "lucide-react";
|
||||
import {
|
||||
ArrowLeft,
|
||||
Columns3,
|
||||
Grid3X3,
|
||||
List,
|
||||
Rows3,
|
||||
Search,
|
||||
X,
|
||||
} from "lucide-react";
|
||||
import { useTranslation } from "react-i18next";
|
||||
import { cn } from "@/lib/utils";
|
||||
import { Separator } from "@/components/separator";
|
||||
import { DocsLink } from "@/components/docs-link";
|
||||
import {
|
||||
Select,
|
||||
SelectContent,
|
||||
SelectItem,
|
||||
SelectTrigger,
|
||||
SelectValue,
|
||||
} from "@/components/select";
|
||||
|
||||
/** One spacing rhythm for every panel and tab. */
|
||||
export const PANEL = {
|
||||
@@ -19,6 +34,37 @@ export const PANEL = {
|
||||
export type PanelViewMode = "grid" | "list";
|
||||
export type PanelDensity = "comfortable" | "compact";
|
||||
|
||||
/** Cards per row. "auto" fits as many as the pane has room for. */
|
||||
export type GridSize = "auto" | "1" | "2" | "3" | "4" | "5" | "6";
|
||||
|
||||
export const GRID_SIZES: readonly GridSize[] = [
|
||||
"auto",
|
||||
"1",
|
||||
"2",
|
||||
"3",
|
||||
"4",
|
||||
"5",
|
||||
"6",
|
||||
];
|
||||
|
||||
// Sized off the pane's own width, not the window. Cards keep a min width,
|
||||
// so narrow panes drop columns on their own.
|
||||
export function gridSizeStyle(
|
||||
size: GridSize,
|
||||
minCardWidth = 320,
|
||||
gap = "0.5rem",
|
||||
): React.CSSProperties {
|
||||
if (size === "auto") {
|
||||
return {
|
||||
gridTemplateColumns: `repeat(auto-fill, minmax(min(100%, ${minCardWidth}px), 1fr))`,
|
||||
};
|
||||
}
|
||||
const n = Number(size);
|
||||
return {
|
||||
gridTemplateColumns: `repeat(auto-fill, minmax(max(min(100%, 220px), calc((100% - ${n - 1} * ${gap}) / ${n} - 0.5px)), 1fr))`,
|
||||
};
|
||||
}
|
||||
|
||||
/** The header, toolbar band and body every tab and panel draws. */
|
||||
export function PanelShell({
|
||||
chrome = true,
|
||||
@@ -308,20 +354,25 @@ export function Segmented<T extends string>({
|
||||
);
|
||||
}
|
||||
|
||||
/** Grid or list, plus the compact rows toggle. */
|
||||
/** Grid or list, plus the compact rows toggle and the cards per row picker. */
|
||||
export function ViewToggle({
|
||||
view,
|
||||
onView,
|
||||
density,
|
||||
onDensity,
|
||||
columns,
|
||||
onColumns,
|
||||
}: {
|
||||
view: PanelViewMode;
|
||||
onView: (next: PanelViewMode) => void;
|
||||
density?: PanelDensity;
|
||||
onDensity?: (next: PanelDensity) => void;
|
||||
/** Cards per row in grid view. Pass with onColumns to show the picker. */
|
||||
columns?: GridSize;
|
||||
onColumns?: (next: GridSize) => void;
|
||||
}) {
|
||||
const { t } = useTranslation();
|
||||
return (
|
||||
const toggle = (
|
||||
<div className="flex items-center border border-border">
|
||||
<ToggleButton
|
||||
active={view === "grid"}
|
||||
@@ -356,6 +407,34 @@ export function ViewToggle({
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
|
||||
if (!columns || !onColumns || view !== "grid") return toggle;
|
||||
|
||||
return (
|
||||
<div className="flex items-center gap-2">
|
||||
<Select value={columns} onValueChange={(v) => onColumns(v as GridSize)}>
|
||||
<SelectTrigger
|
||||
size="sm"
|
||||
className="w-auto gap-1.5 text-xs"
|
||||
title={t("panel.columns.title")}
|
||||
aria-label={t("panel.columns.title")}
|
||||
>
|
||||
<Columns3 className="size-3.5 text-muted-foreground" />
|
||||
<SelectValue />
|
||||
</SelectTrigger>
|
||||
<SelectContent>
|
||||
{GRID_SIZES.map((size) => (
|
||||
<SelectItem key={size} value={size} className="text-xs">
|
||||
{size === "auto"
|
||||
? t("panel.columns.auto")
|
||||
: t("panel.columns.count", { count: Number(size) })}
|
||||
</SelectItem>
|
||||
))}
|
||||
</SelectContent>
|
||||
</Select>
|
||||
{toggle}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
function ToggleButton({
|
||||
|
||||
@@ -555,3 +555,28 @@ html.fs-xl {
|
||||
background-color: color-mix(in oklab, var(--accent-brand) 35%, transparent);
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/*
|
||||
* The title bar the desktop app draws on top of its window. The window has
|
||||
* no native frame, so this strip is what moves the window around: the whole
|
||||
* bar drags, everything inside it that takes clicks does not.
|
||||
*/
|
||||
.termix-titlebar {
|
||||
-webkit-app-region: drag;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.termix-titlebar button,
|
||||
.termix-titlebar a,
|
||||
.termix-titlebar input,
|
||||
.termix-titlebar [role="button"] {
|
||||
-webkit-app-region: no-drag;
|
||||
}
|
||||
|
||||
/*
|
||||
* Layouts size themselves to the viewport with h-dvh. Under the app-drawn
|
||||
* title bar the usable height is shorter, so trim it while the bar shows.
|
||||
*/
|
||||
.h-dvh {
|
||||
height: calc(100dvh - var(--termix-titlebar-height, 0px));
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
/**
|
||||
* Sign in for the Termix mobile app in a real browser. The app opens the
|
||||
* login page with ?return_to=termix-mobile://..., and after any login method
|
||||
* the page sends the token back to that address. Only the app's own scheme
|
||||
* is accepted, so the value can never send a token to a website.
|
||||
*/
|
||||
|
||||
const STORAGE_KEY = "termix-app-return";
|
||||
const PARAM = "return_to";
|
||||
const APP_RETURN = /^termix-mobile:\/\/[A-Za-z0-9._~/-]*$/;
|
||||
|
||||
export function isAppReturn(value: unknown): value is string {
|
||||
return typeof value === "string" && APP_RETURN.test(value);
|
||||
}
|
||||
|
||||
/** Reads return_to from the address bar once and keeps it for this tab. */
|
||||
export function captureAppReturn(): string | null {
|
||||
try {
|
||||
const url = new URL(window.location.href);
|
||||
const value = url.searchParams.get(PARAM);
|
||||
if (value !== null) {
|
||||
url.searchParams.delete(PARAM);
|
||||
window.history.replaceState({}, document.title, url.toString());
|
||||
if (isAppReturn(value)) sessionStorage.setItem(STORAGE_KEY, value);
|
||||
else sessionStorage.removeItem(STORAGE_KEY);
|
||||
}
|
||||
return pendingAppReturn();
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function pendingAppReturn(): string | null {
|
||||
try {
|
||||
const value = sessionStorage.getItem(STORAGE_KEY);
|
||||
return isAppReturn(value) ? value : null;
|
||||
} catch {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export function appReturnUrl(
|
||||
base: string,
|
||||
params: Record<string, string>,
|
||||
): string {
|
||||
const query = new URLSearchParams(params).toString();
|
||||
return query ? `${base}?${query}` : base;
|
||||
}
|
||||
|
||||
/** Sends the result to the app. False when no app asked for it. */
|
||||
export function handOffToApp(params: Record<string, string>): boolean {
|
||||
const base = pendingAppReturn();
|
||||
if (!base) return false;
|
||||
try {
|
||||
sessionStorage.removeItem(STORAGE_KEY);
|
||||
} catch {
|
||||
// The redirect still goes out.
|
||||
}
|
||||
window.location.replace(appReturnUrl(base, params));
|
||||
return true;
|
||||
}
|
||||
+14
-7
@@ -235,6 +235,10 @@
|
||||
"ready": "Termix {{version}} is ready to install",
|
||||
"readyHint": "It installs the next time Termix restarts."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Safe mode",
|
||||
"description": "Only layout and theme plugins are running. Restart the server without TERMIX_SAFE_MODE to turn the rest back on."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Close panel",
|
||||
"moveSide": "Move panel",
|
||||
@@ -1098,6 +1102,8 @@
|
||||
"resetEveryone": "Reset the default for everyone",
|
||||
"update": "Update {{name}} to {{version}}",
|
||||
"disable": "Turn off {{name}}",
|
||||
"enable": "Turn on {{name}}",
|
||||
"startAgain": "Start {{name}} again",
|
||||
"install": "Find layouts and themes",
|
||||
"installTitle": "Layouts and themes",
|
||||
"installButton": "Install",
|
||||
@@ -1309,7 +1315,8 @@
|
||||
"disabled": "Disabled",
|
||||
"failed": "Stopped unexpectedly",
|
||||
"blocked": "Waiting on another plugin",
|
||||
"server": "Runs on your server"
|
||||
"server": "Runs on your server",
|
||||
"safeMode": "Off in safe mode"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Running",
|
||||
@@ -1323,11 +1330,6 @@
|
||||
"updated": "Recently updated",
|
||||
"category": "Category"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Columns",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} wide"
|
||||
},
|
||||
"table": {
|
||||
"name": "Name",
|
||||
"description": "Description",
|
||||
@@ -1652,7 +1654,12 @@
|
||||
"gridView": "Grid",
|
||||
"listView": "List",
|
||||
"compactRows": "Compact rows",
|
||||
"comfortableRows": "Comfortable rows"
|
||||
"comfortableRows": "Comfortable rows",
|
||||
"columns": {
|
||||
"title": "Columns",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} wide"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Saved. Type to replace it."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Sommige plugins kon nie verander word nie. Jy kan hulle later regstel vanaf die Plugins-oortjie. Druk Volgende om voort te gaan.",
|
||||
"pluginsApplyFailed": "Jou keuses kon nie gestoor word nie. Probeer weer, of gaan voort en verander hulle later vanaf die Plugins-oortjie.",
|
||||
"pluginsLoadFailed": "Die pluginlys kon nie gelaai word nie. Jy kan plugins later kies vanaf die Plugins-oortjie.",
|
||||
"presetTitle": "Hoeveel wil jy op die skerm hê?",
|
||||
"presetIntro": "Kies hoeveel op die skerm wys.",
|
||||
"presetChangeLater": "Jy kan later voorinstellings wissel of enige enkele instelling verander in Instellings, onder Koppelvlak.",
|
||||
"appearanceTitle": "Maak dit joune",
|
||||
"appearanceIntro": "Kies 'n tema, 'n aksentkleur, 'n lettertipe en jou taal. Veranderinge wys dadelik, en jy kan hulle later in Instellings verander.",
|
||||
"securityTitle": "Beveilig jou rekening",
|
||||
"securityIntro": "Voeg 'n passkey of 'n autentikator-toepassing by jou rekening. Jy kan dit ook later doen in Instellings, onder Beveiliging.",
|
||||
"desktopTitle": "Hoe wil jy Termix gebruik?",
|
||||
"desktopBody": "Jy kan dit op enige tyd verander vanaf Sinkroniseer in die sybalk.",
|
||||
"desktopLocalTitle": "Slegs op hierdie toestel",
|
||||
"desktopLocalBody": "Alles word hier gestoor. Niks om op te stel nie.",
|
||||
"desktopLinkTitle": "Met my Termix-bediener",
|
||||
"desktopLinkBody": "Teken in op jou bediener om dieselfde gasheer en instellings op elke toestel te gebruik.",
|
||||
"desktopLinked": "Gekoppel aan {{server}}",
|
||||
"pluginsDocsLink": "Lees oor elkeen"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} is gereed om te installeer",
|
||||
"readyHint": "Dit word die volgende keer wat Termix herbegin geïnstalleer."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Veilige modus",
|
||||
"description": "Slegs uitleg- en tema-plug-ins word uitgevoer. Herbegin die bediener sonder TERMIX_SAFE_MODE om die res weer aan te skakel."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Maak paneel toe",
|
||||
"moveSide": "Skuif paneel",
|
||||
"resize": "Verander grootte van paneel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Tuis",
|
||||
"terminal": "Terminaal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Gasheer",
|
||||
"credentials": "Aanmeldingsgegewens",
|
||||
"connections": "Verbindings",
|
||||
"sync": "Sinkroniseer",
|
||||
"reconnectDisconnectedTerminals": "Herstel al die ontkoppelde terminale",
|
||||
"reconnectingTerminals_one": "Herstel tans {{count}} terminaal",
|
||||
"reconnectingTerminals_other": "Herstel tans {{count}} terminale",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Probeer weer",
|
||||
"refresh": "Verfris",
|
||||
"optional": "Opsioneel",
|
||||
"downloadSample": "Laai Voorbeeld Af",
|
||||
"failedToDeleteHost": "Kon nie {{name}} verwyder nie",
|
||||
"importSkipExisting": "Voer in (slaas bestaande oor)",
|
||||
"importSSHConfig": "Voer in vanaf SSH-konfigurasie",
|
||||
"connectionDetails": "Verbindingsbesonderhede",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Geen gids nie)",
|
||||
"deleteSelected": "Vee uit",
|
||||
"exitSelection": "Verlaat seleksie",
|
||||
"importSkip": "Voer in (slaag bestaande oor)",
|
||||
"importOverwrite": "Voer in (skryf oor)",
|
||||
"collapseBtn": "Vou in",
|
||||
"importExportBtn": "Voer in / Voer uit",
|
||||
"hostStatusesRefreshed": "Gasheer-statusse opgedateer",
|
||||
"failedToRefreshHosts": "Kon nie gasheer opdateer nie",
|
||||
"movedHostTo": "Het {{host}} na \"{{folder}}\" geskuif",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Vee \"{{name}}\" en sy {{count}} gasheer uit? Dit kan nie ongedaan gemaak word nie.",
|
||||
"deleteFolderConfirm_other": "Vee \"{{name}}\" en sy {{count}} gasheer uit? Dit kan nie ongedaan gemaak word nie.",
|
||||
"failedToMoveHosts": "Kon nie gasheerbedieners skuif nie",
|
||||
"managedBanner": "Hierdie gasheer word bestuur deur {{plugin}}. Wysig dit daar. Jy kan dit steeds vassteek en van volgorde verander.",
|
||||
"managedTooltip": "Bestuur deur {{plugin}}",
|
||||
"addBlocked": "Gasheer word bestuur deur {{plugin}}, so nuwe gasheer kan nie hier bygevoeg word nie.",
|
||||
"failedToReorder": "Kon nie herorden nie",
|
||||
"expandAll": "Vou alle gidse uit",
|
||||
"collapseAll": "Vou alle gidse in",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Voeg Geloofsbriew By",
|
||||
"checkingHostStatuses": "Hoststatusse word nagegaan...",
|
||||
"pinnedSection": "Vastegemaak",
|
||||
"hostsExported": "Hosts is suksesvol geëksporteer",
|
||||
"export": {
|
||||
"menuItem": "Eksporteer...",
|
||||
"title": "Eksporteer hosts",
|
||||
"scope": "Reikwydte",
|
||||
"scopeAll": "Alles",
|
||||
"scopeSelected": "Geselekteer",
|
||||
"searchHosts": "Soek hosts...",
|
||||
"include": "Sluit in",
|
||||
"groupConnection": "Verbinding",
|
||||
"groupCredentials": "Aanmeldingsbesonderhede",
|
||||
"groupNotes": "Notas",
|
||||
"groupTags": "Etikette & vasmaak",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Oorsprongshosts",
|
||||
"groupFeatureFlags": "Plugin-instellings",
|
||||
"groupAdvanced": "Gevorderde konfigurasie",
|
||||
"preview": "Voorskou",
|
||||
"moreHosts_one": "... {{count}} meer gasheer",
|
||||
"moreHosts_other": "... {{count}} meer gasheer",
|
||||
"summary": "{{selected}} van {{total}} hosts",
|
||||
"credentialsIncluded": "aanmeldingsbesonderhede ingesluit",
|
||||
"credentialsExcluded": "aanmeldingsbesonderhede uitgesluit",
|
||||
"noneSelected": "Geen hosts geselekteer nie",
|
||||
"cancel": "Kanselleer",
|
||||
"confirm": "Eksporteer",
|
||||
"fetchFailed": "Kon nie hosts laai vir eksport nie",
|
||||
"bulkButton": "Eksporteer"
|
||||
},
|
||||
"sampleDownloaded": "Voorbeeldlêer is afgelaai",
|
||||
"failedToDeleteCredential2": "Kon nie aanmeldingsbesonderhede verwyder nie",
|
||||
"noFolderOption": "(Geen gids nie)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Wysig Gasheer",
|
||||
"editorAdd": "Voeg Gasheer by",
|
||||
"speedSearch": "Soek gasheer. Pyltjies om te kies, Enter om te verbind, Esc om te sluit",
|
||||
"speedSearchList": "Gasheerlys. Tik of druk / om te soek.",
|
||||
"importNoHosts": "Geen gasheer in die lêer gevind nie",
|
||||
"importTooMany": "Jy kan tot {{max}} gasheer gelyktydig invoer",
|
||||
"importSummary": "Invoer gedoen: {{imported}} ingevoer, {{updated}} opgedateer, {{failed}} misluk",
|
||||
"importHostsFailed": "Kon nie gasheer invoer nie"
|
||||
"speedSearchList": "Gasheerlys. Tik of druk / om te soek."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Gesplete skerm",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Maak kleurkiezer oop",
|
||||
"themeSystem": "Stelsel",
|
||||
"themeLight": "Lig",
|
||||
"themeDark": "Donker",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Donker"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Hoe die hele app gelê is. Temas en lêe kom van plugins.",
|
||||
"defaultsLabel": "Verstek vir almal",
|
||||
"defaultsHint": "Wat mense sien totdat hulle hul eie lê of tema kies.",
|
||||
"followDefault": "Gebruik die verstek",
|
||||
"defaultSaved": "Verstek voorkoms gestoor",
|
||||
"saveFailed": "Kon nie die voorkoms stoor nie",
|
||||
"repair": {
|
||||
"title": "Hierdie lê kon nie gewys word nie",
|
||||
"safeTitle": "Veilige modus",
|
||||
"layout": "Lê",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Rede",
|
||||
"error": "Fout",
|
||||
"noError": "Geen foutboodskap nie.",
|
||||
"copy": "Kopieer",
|
||||
"copied": "Gekopieer",
|
||||
"copyFailed": "Kon nie die besonderhede kopieer nie",
|
||||
"retry": "Probeer weer",
|
||||
"reset": "Stel terug na die verstek voorkoms",
|
||||
"resetEveryone": "Stel die verstek vir almal terug",
|
||||
"update": "Dateer {{name}} op na {{version}}",
|
||||
"disable": "Skakel {{name}} af",
|
||||
"enable": "Skakel {{name}} aan",
|
||||
"startAgain": "Begin {{name}} weer",
|
||||
"install": "Vind lêe en temas",
|
||||
"installTitle": "Lêe en temas",
|
||||
"installButton": "Installeer",
|
||||
"nothingToInstall": "Daar is tans geen ander lêe of temas beskikbaar nie.",
|
||||
"registryUnreachable": "Die plugin-register kon nie bereik word nie.",
|
||||
"askAdmin": "Vra 'n admin om hierdie lê op te dateer of te herstel. Jy kan hieronder na 'n ander lê of tema skakel.",
|
||||
"switchLayout": "Wissel lê",
|
||||
"switchTheme": "Wissel tema",
|
||||
"saveFailed": "Kon nie jou keuse stoor nie",
|
||||
"reasons": {
|
||||
"safe-url": "Die adres het om veilige modus gevra. Kies 'n lê hieronder, of verwyder ?safe-layout=1 uit die adres.",
|
||||
"safe-env": "Die bediener is gestart met TERMIX_SAFE_LAYOUT, so almal sien hierdie skerm totdat dit verwyder word.",
|
||||
"missing": "Geen geïnstalleerde plugin verskaf hierdie lê nie.",
|
||||
"disabled": "Die plugin wat hierdie lê verskaf, is afgeskakel.",
|
||||
"blocked": "Die plugin wat hierdie lê verskaf, wag op iets wat dit nodig het.",
|
||||
"incompatible": "Die plugin wat hierdie lê verskaf, werk nie met hierdie weergawe van Termix nie.",
|
||||
"failed": "Die lê het misluk om te begin.",
|
||||
"crashed": "Die lê het twee keer gekraak terwyl die app geteken is."
|
||||
},
|
||||
"noLayout": "Geen lê is gestel nie",
|
||||
"restore": "Herstel die ingeboude {{name}}",
|
||||
"restoreFailed": "Kon nie die ingeboude kopie herstel nie"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Hanteer aanmelding",
|
||||
"consequence": "Dit kan 'n aanmeldmetode, 'n tweede faktor of 'n SSH-aanmeldtipe byvoeg."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Stel aanmeldreëls",
|
||||
"consequence": "Dit kan mense uitteken wanneer hulle inaktief is, sessieduur beperk, \"onthou my\" afskakel en 'n tweede faktor vereis."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Kies hoe gasheer bereik word",
|
||||
"consequence": "Dit kan die SSH-verbinding na 'n gasheer oor sy eie roete dra, so dit sien alles wat na en van daardie gasheer gestuur word, insluitende wagwoorde."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Voer sinkronisering uit",
|
||||
"consequence": "Dit kan al die sinkronisversoek beantwoord, so dit sien die data wat toestelle en bedieners sinkroniseer."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Bestuur sertifikate",
|
||||
"consequence": "Dit kan die sertifikaat vervang wat Termix oor HTTPS verskaf en domeinkontroles van sertifikaatautoriteite beantwoord."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Toegang tot reeks- en USB-toestelle",
|
||||
"consequence": "Dit kan 'n fisiese reekspoort op die masjien wat Termix uitvoer, oopmaak."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Voer gasheer uit met hul geheime",
|
||||
"consequence": "Kan jou gasheer in sy geheel lees, insluitende gestoorde wagwoorde en sleutels, en dit uitdeel. Elke uitvoer word in die ouditering gelog."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Skep en verander bedieners",
|
||||
"consequence": "Dit kan bedieners byvoeg en die een wat jy reeds het, redigeer."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Lees die ouditlogboek",
|
||||
"consequence": "Dit kan sien wie wat gedoen het en wanneer."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Kyk of poorte antwoord",
|
||||
"consequence": "Kan 'n plat verbinding na enige adres vanaf die bediener oopmaak, om te sien of dit bereikbaar is."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Verskaf gasheerstatus",
|
||||
"consequence": "Word die bron van die aanlyn- en aflyn-punte vir elke gasheer."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Bewaar onlangse aktiwiteit",
|
||||
"consequence": "Word die bergplek vir die onlangse aktiwiteitslys van elke gebruiker."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Bestuur gasheer as slegs-lees",
|
||||
"consequence": "Gasheer wat dit bestuur, kan nie deur iemand anders redigeer, verwyder of hergedeel word nie."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Maak burebladvensters oop",
|
||||
"consequence": "Slegs in die Termix-burebladtoepassing."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Gebruik hierdie rekenaar",
|
||||
"consequence": "Kan lêers lees en verander, 'n skul uitvoer en plaaslike poorte op hierdie rekenaar oopmaak. Slegs in die Termix-bureaubladprogram."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Tree op as ander gebruikers",
|
||||
"consequence": "Voer agtergrondwerk uit met 'n ander gebruiker se toegang, soos geskeduleerde take. Elke gebruik word in die ouditlogboek geskryf."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Voeg sy eie skerm by",
|
||||
"consequence": "Oortjies, panele en instellings wat jy later kan verberg."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Vervang die hele programlêer",
|
||||
"consequence": "Wanneer gekies, teken sy kode elke skerm, insluitend jou terminale en instellings."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Voeg kleurtemas by",
|
||||
"consequence": "Slegs kleure en styl. Geen kode word vir 'n tema uitgevoer nie."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Afgeskakel",
|
||||
"failed": "Onverwags gestop",
|
||||
"blocked": "Wag op 'n ander plugin",
|
||||
"server": "Loop op jou bediener"
|
||||
"server": "Loop op jou bediener",
|
||||
"safeMode": "Af in veilige modus"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Aktief",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Onlangs opgedateer",
|
||||
"category": "Kategorie"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Kolomme",
|
||||
"auto": "Outo",
|
||||
"count": "{{count}} breed"
|
||||
},
|
||||
"table": {
|
||||
"name": "Naam",
|
||||
"description": "Beskrywing",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Kon nie opsies vir {{name}} stoor nie: {{error}}",
|
||||
"deleteData": "Kon nie data vir {{name}} verwyder nie: {{error}}",
|
||||
"managedByServer": "Hierdie werkskerm is aan 'n bediener gekoppel, wat sy plugins bepaal.",
|
||||
"defaultLook": "{{name}} is die standaard voorkoms, so dit kan afgeskakel of vervang word, maar nie onteinstalleer nie.",
|
||||
"hasDependents": "{{name}} word deur {{list}} benodig. Skakel daardie eers af of deïnstalleer hulle.",
|
||||
"missingDependencies": "{{name}} het {{list}} nodig, wat nie geïnstalleer is nie.",
|
||||
"consentChanged": "Wat hierdie plugin vra, het verander sedert jy gekyk het. Kyk weer na die lys.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Geen toegang tot jou bedieners nie",
|
||||
"searchInstalled": "Soek geïnstalleerdes",
|
||||
"searchPlugins": "Soek plugins",
|
||||
"allCategories": "Almal",
|
||||
"nothingMatches": "Niets pas by nie.",
|
||||
"noneInstalled": "Nog geen plugins geïnstalleer nie. Blaai om sommige by te voeg.",
|
||||
"nothingHere": "Niets hier nie.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Dokumentasie",
|
||||
"envVars": "Omgewingsveranderlikes",
|
||||
"envRequired": "Verpligtend",
|
||||
"envDefault": "Verstek: {{value}}"
|
||||
"envDefault": "Verstek: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Indeling",
|
||||
"themes": "Tema's",
|
||||
"tabs": "Oortjies",
|
||||
"panels": "Sypaneelpanele",
|
||||
"dashboardCards": "Kontrolepaneelkaarte",
|
||||
"protocols": "Verbindingstipes",
|
||||
"auth": "Aanmeldmetodes",
|
||||
"actions": "Aksies",
|
||||
"hostCapability": "Gasheerinstellings"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tipe",
|
||||
"allTypes": "Alle tipes",
|
||||
"category": "Kategorie",
|
||||
"allCategories": "Alle kategorieë",
|
||||
"results_one": "{{count}} invoegprogram",
|
||||
"results_other": "{{count}} invoegprogramme",
|
||||
"remove": "Verwyder filter {{name}}",
|
||||
"clear": "Vee filters uit",
|
||||
"button": "Filters",
|
||||
"buttonCount": "Filters ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} van {{total}}",
|
||||
"page": "Bladsy {{page}} van {{pages}}",
|
||||
"previous": "Vorige bladsy",
|
||||
"next": "Volgende bladsy",
|
||||
"perPage": "{{count}} per bladsy",
|
||||
"perPageLabel": "Invoegprogramme per bladsy"
|
||||
},
|
||||
"showUnsupportedHint": "Hierdie word gelys, maar geen vrylasing loop nog op hierdie weergawe nie. Werk Termix op om dit te installeer.",
|
||||
"unsupported": "Benodig 'n nuwer Termix",
|
||||
"unsupportedHint": "Geen vrylasing van hierdie invoegprogram loop op hierdie weergawe van Termix nie. Werk Termix op om dit te installeer.",
|
||||
"needsTermix": "Benodig Termix {{range}}",
|
||||
"showUnsupported": "Wys nie-ondersteunde ({{count}})",
|
||||
"showMore": "Wys {{count}} meer ({{total}} oor)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Geen data nie",
|
||||
"filter": "Filter..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minuut gelede",
|
||||
"minutesAgo_other": "{{count}} minute gelede",
|
||||
"hoursAgo_one": "{{count}} uur gelede",
|
||||
"hoursAgo_other": "{{count}} uur gelede",
|
||||
"pending_one": "{{count}} verandering wag om te sinkroniseer",
|
||||
"pending_other": "{{count}} veranderinge wag om te sinkroniseer",
|
||||
"proxy": {
|
||||
"headersTitle": "Bykomende koptekste",
|
||||
"headersHint": "Word saam met elke versoek na die bediener gestuur, byvoorbeeld 'n Cloudflare Access-diens token.",
|
||||
"headerName": "Koptekstnaam",
|
||||
"headerValue": "Waarde",
|
||||
"savedValue": "Opgeslaan, tik om te verander",
|
||||
"addHeader": "Voeg koptekst by",
|
||||
"removeHeader": "Verwyder koptekst",
|
||||
"basicAuthTitle": "Gebruikersnaam en wagwoord",
|
||||
"basicAuthHint": "Vir 'n proxy wat om 'n gebruikersnaam en wagwoord vra voordat Termix laai.",
|
||||
"username": "Gebruikersnaam",
|
||||
"password": "Wagwoord",
|
||||
"allowInvalidCertificate": "Vertrou 'n self-ondertekende sertifikaat",
|
||||
"allowInvalidCertificateHint": "Slegs vir jou eie bediener, wanneer sy sertifikaat nie van 'n bekende owerheid kom nie."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Dit lyk nie soos 'n webadres nie.",
|
||||
"unreachable": "Kon nie die bediener bereik nie. Kontroleer die adres en dat die bediener loop.",
|
||||
"unreachableWithReason": "Kon nie die bediener bereik nie: {{reason}}",
|
||||
"tlsUntrusted": "Die bediener se sertifikaat word nie vertrou nie. As dit jou eie bediener is met 'n self-ondertekende sertifikaat, skakel die opsie hieronder aan.",
|
||||
"basicAuthRequired": "Iets voor die bediener vra vir 'n gebruikersnaam en wagwoord. Voer hulle hieronder in.",
|
||||
"proxyLogin": "'n Aanmeldbladsy of proxy het geantwoord in plaas van Termix. Voeg die koppe wat dit benodig hieronder by, of kontroleer die adres.",
|
||||
"notTermix": "Daar is geen Termix-bedienaar op daardie adres nie. As dit onder 'n pad loop, sluit dit in, soos https://voorbeeld.com/termix.",
|
||||
"versionMismatch": "Daardie bediener loop 'n ouer Termix. Werk dit op na 2.9 of nuwer om te koppel.",
|
||||
"differentAccount": "Jy het aangemeld by 'n ander rekening. Meld aan by die rekening waaraan hierdie toestel gekoppel is, of ontkoppel eers."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Koppel aan 'n Termix-bedienaar",
|
||||
"reloginTitle": "Meld weer aan",
|
||||
"savedServers": "Onlangse bedieners",
|
||||
"removeServer": "Verwyder van die lys",
|
||||
"serverDescription": "Voer die adres in wat jy gebruik om Termix in jou blaaier oop te maak.",
|
||||
"signinDescription": "Meld aan by {{url}}",
|
||||
"chooseDescription": "Hierdie toestel het reeds data. Wat moet daarmee gebeur?",
|
||||
"finishingDescription": "Koppel hierdie toestel.",
|
||||
"serverUrl": "Bedienaaradres",
|
||||
"serverUrlHint": "Byvoorbeeld https://termix.voorbeeld.com",
|
||||
"showProxySettings": "Omgekeerde proxy-instellings",
|
||||
"hideProxySettings": "Versteek omgekeerde proxy-instellings",
|
||||
"continue": "Gaan voort",
|
||||
"back": "Terug",
|
||||
"mergeTitle": "Voeg dit by my rekening",
|
||||
"mergeBody_one": "Die item op hierdie toestel word by jou rekening gevoeg. Items wat jou rekening reeds het, bly soos hulle op die bediener is.",
|
||||
"mergeBody_other": "Die {{count}} items op hierdie toestel word by jou rekening gevoeg. Items wat jou rekening reeds het, bly soos hulle op die bediener is.",
|
||||
"replaceTitle": "Vervang dit met my rekening",
|
||||
"replaceBody_one": "Die item op hierdie toestel word verwyder, en hierdie toestel neem alles van jou rekening. Hosts wat slegs op hierdie toestel gehou word, bly.",
|
||||
"replaceBody_other": "Die {{count}} items op hierdie toestel word verwyder, en hierdie toestel neem alles van jou rekening. Hosts wat slegs op hierdie toestel gehou word, bly.",
|
||||
"link": "Koppel",
|
||||
"linking": "Koppel en voer die eerste sinkronisering uit...",
|
||||
"linked": "Gekoppel. Jou data word nou gesinkroniseer.",
|
||||
"signedInAgain": "Aangemeld. Sinkronisering loop weer."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Bedieners",
|
||||
"sshCredentials": "Inlogbesonderhede",
|
||||
"sshFolders": "Vouers",
|
||||
"userPreferences": "Voorkeure",
|
||||
"pluginUserSettings": "Plugin-instellings",
|
||||
"sharedHosts": "Bedieners wat met jou gedeel is",
|
||||
"sharedCredentials": "Inlogbesonderhede wat met jou gedeel is",
|
||||
"vaultProfiles": "Vault-profile",
|
||||
"snippetFolders": "Snippet-vouers",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Diensskakels",
|
||||
"homepageItems": "Tuisblad-items",
|
||||
"networkTopology": "Netwerkkaart",
|
||||
"workspaces": "Werkruimtes",
|
||||
"hostDefaults": "Bediener-standaarde",
|
||||
"hostDefaultsAdmin": "Bediener se bediener-standaarde",
|
||||
"aiProviders": "AI-lewerders",
|
||||
"homepageLayouts": "Tuisblad-lêers",
|
||||
"accountProfile": "Rekeningprofiel"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Map {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Rooster",
|
||||
"listView": "Lys",
|
||||
"compactRows": "Kompakte rye",
|
||||
"comfortableRows": "Gerieflike rye"
|
||||
"comfortableRows": "Gerieflike rye",
|
||||
"columns": {
|
||||
"title": "Kolomme",
|
||||
"auto": "Outo",
|
||||
"count": "{{count}} breed"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Opgeslaan. Tik om dit te vervang."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "تعذر تغيير بعض الإضافات. يمكنك إصلاحها لاحقاً من علامة التبويب الإضافات. اضغط التالي للمتابعة.",
|
||||
"pluginsApplyFailed": "تعذر حفظ اختياراتك. حاول مرة أخرى، أو تابع وقم بتغييرها لاحقاً من علامة التبويب الإضافات.",
|
||||
"pluginsLoadFailed": "تعذر تحميل قائمة الإضافات. يمكنك اختيار الإضافات لاحقاً من علامة التبويب الإضافات.",
|
||||
"presetTitle": "كم تريد أن يظهر على الشاشة؟",
|
||||
"presetIntro": "اختر مقدار ما يظهر على الشاشة.",
|
||||
"presetChangeLater": "يمكنك التبديل بين الإعدادات الجاهزة أو تغيير أي إعداد فردي لاحقاً في الإعدادات، تحت واجهة المستخدم.",
|
||||
"appearanceTitle": "اجعله خاصاً بك",
|
||||
"appearanceIntro": "اختر سمة، ولوناً مميزاً، وخطاً، ولغتك. تظهر التغييرات فوراً، ويمكنك تغييرها لاحقاً في الإعدادات.",
|
||||
"securityTitle": "أمن حسابك",
|
||||
"securityIntro": "أضف مفتاح مرور أو تطبيق مصادقة إلى حسابك. يمكنك أيضاً القيام بذلك لاحقاً في الإعدادات، تحت الأمان.",
|
||||
"desktopTitle": "كيف تريد استخدام Termix؟",
|
||||
"desktopBody": "يمكنك تغيير ذلك في أي وقت من المزامنة في الشريط الجانبي.",
|
||||
"desktopLocalTitle": "على هذا الجهاز فقط",
|
||||
"desktopLocalBody": "يتم تخزين كل شيء هنا. لا حاجة للإعداد.",
|
||||
"desktopLinkTitle": "مع خادم Termix الخاص بي",
|
||||
"desktopLinkBody": "سجّل الدخول إلى خادمك لاستخدام نفس المضيفين والإعدادات على كل جهاز.",
|
||||
"desktopLinked": "مرتبطة بـ {{server}}",
|
||||
"pluginsDocsLink": "اقرأ عن كل منها"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} جاهز للتثبيت",
|
||||
"readyHint": "سيتم تثبيته في المرة القادمة التي يعاد فيها تشغيل Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "الوضع الآمن",
|
||||
"description": "لا تعمل سوى إضافات التخطيط والمظهر. أعد تشغيل الخادم بدون TERMIX_SAFE_MODE لإعادة تشغيل الباقي."
|
||||
},
|
||||
"companion": {
|
||||
"close": "إغلاق اللوحة",
|
||||
"moveSide": "نقل اللوحة",
|
||||
"resize": "تغيير حجم اللوحة"
|
||||
},
|
||||
"nav": {
|
||||
"home": "الرئيسية",
|
||||
"terminal": "الطرفية",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "المضيفين",
|
||||
"credentials": "بيانات الاعتماد",
|
||||
"connections": "الاتصالات",
|
||||
"sync": "مزامنة",
|
||||
"reconnectDisconnectedTerminals": "إعادة توصيل جميع المحطات المنفصلة",
|
||||
"reconnectingTerminals_zero": "جاري إعادة توصيل {{count}} محطة",
|
||||
"reconnectingTerminals_one": "جاري إعادة توصيل {{count}} محطة",
|
||||
@@ -291,10 +287,7 @@
|
||||
"retry": "إعادة المحاولة",
|
||||
"refresh": "تحديث",
|
||||
"optional": "اختياري",
|
||||
"downloadSample": "تحميل نموذج",
|
||||
"failedToDeleteHost": "فشل في حذف {{name}}",
|
||||
"importSkipExisting": "استيراد (تخطي الموجود)",
|
||||
"importSSHConfig": "استيراد من إعدادات SSH",
|
||||
"connectionDetails": "تفاصيل الاتصال",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -517,10 +510,7 @@
|
||||
"noFolder": "(بدون مجلد)",
|
||||
"deleteSelected": "حذف",
|
||||
"exitSelection": "خروج من التحديد",
|
||||
"importSkip": "استيراد (تخطي الموجود)",
|
||||
"importOverwrite": "استيراد (استبدال)",
|
||||
"collapseBtn": "طي",
|
||||
"importExportBtn": "استيراد / تصدير",
|
||||
"hostStatusesRefreshed": "تم تحديث حالات المضيفين",
|
||||
"failedToRefreshHosts": "فشل تحديث المضيفين",
|
||||
"movedHostTo": "تم نقل {{host}} إلى \"{{folder}}\"",
|
||||
@@ -583,6 +573,9 @@
|
||||
"deleteFolderConfirm_many": "هل تريد حذف \"{{name}}\" و{{count}} مضيفًا؟ لا يمكن التراجع عن هذا الإجراء.",
|
||||
"deleteFolderConfirm_other": "هل تريد حذف \"{{name}}\" و{{count}} مضيف؟ لا يمكن التراجع عن هذا الإجراء.",
|
||||
"failedToMoveHosts": "فشل نقل الأجهزة",
|
||||
"managedBanner": "هذا المضيف مُدار بواسطة {{plugin}}. قم بتغييره هناك. يمكنك لا يزال تثبيته وإعادة ترتيبه.",
|
||||
"managedTooltip": "مُدار بواسطة {{plugin}}",
|
||||
"addBlocked": "المضيفون مُدارون بواسطة {{plugin}}، لذا لا يمكن إضافة مضيفين جدد هنا.",
|
||||
"failedToReorder": "فشل إعادة الترتيب",
|
||||
"expandAll": "توسيع جميع المجلدات",
|
||||
"collapseAll": "طي جميع المجلدات",
|
||||
@@ -697,39 +690,6 @@
|
||||
"addCredentialBtn2": "إضافة بيانات اعتماد",
|
||||
"checkingHostStatuses": "جاري التحقق من حالات المضيفين...",
|
||||
"pinnedSection": "مثبّتة",
|
||||
"hostsExported": "تم تصدير المضيفين بنجاح",
|
||||
"export": {
|
||||
"menuItem": "تصدير...",
|
||||
"title": "تصدير المضيفين",
|
||||
"scope": "النطاق",
|
||||
"scopeAll": "الكل",
|
||||
"scopeSelected": "المحددة",
|
||||
"searchHosts": "البحث عن المضيفين...",
|
||||
"include": "تضمين",
|
||||
"groupConnection": "الاتصال",
|
||||
"groupCredentials": "بيانات الاعتماد",
|
||||
"groupNotes": "ملاحظات",
|
||||
"groupTags": "الوسوم والتثبيت",
|
||||
"groupProxy": "الوكيل",
|
||||
"groupJumpHosts": "مضيفي القفز",
|
||||
"groupFeatureFlags": "إعدادات الإضافات",
|
||||
"groupAdvanced": "إعدادات متقدمة",
|
||||
"preview": "معاينة",
|
||||
"moreHosts_zero": "... و{{count}} مضيف آخر",
|
||||
"moreHosts_one": "... ومضيف واحد آخر",
|
||||
"moreHosts_two": "... و{{count}} مضيفين آخرين",
|
||||
"moreHosts_few": "... و{{count}} مضيفين آخرين",
|
||||
"moreHosts_many": "... و{{count}} مضيفًا آخر",
|
||||
"moreHosts_other": "... و{{count}} مضيف آخر",
|
||||
"summary": "{{selected}} من أصل {{total}} مضيف",
|
||||
"credentialsIncluded": "تم تضمين بيانات الاعتماد",
|
||||
"credentialsExcluded": "تم استبعاد بيانات الاعتماد",
|
||||
"noneSelected": "لم يتم تحديد أي مضيفين",
|
||||
"cancel": "إلغاء",
|
||||
"confirm": "تصدير",
|
||||
"fetchFailed": "فشل في تحميل المضيفين للتصدير",
|
||||
"bulkButton": "تصدير"
|
||||
},
|
||||
"sampleDownloaded": "تم تنزيل الملف النموذجي",
|
||||
"failedToDeleteCredential2": "فشل في حذف بيانات الاعتماد",
|
||||
"noFolderOption": "(بدون مجلد)",
|
||||
@@ -912,11 +872,7 @@
|
||||
"editorUpdate": "تحديث المضيف",
|
||||
"editorAdd": "إضافة مضيف",
|
||||
"speedSearch": "البحث عن المضيفين. مفاتيح الأسهم للاختيار، Enter للاتصال، Esc للإغلاق",
|
||||
"speedSearchList": "قائمة المضيفين. اكتب أو اضغط / للبحث.",
|
||||
"importNoHosts": "لم يتم العثور على مضيفين في الملف",
|
||||
"importTooMany": "يمكنك استيراد ما يصل إلى {{max}} مضيفين في وقت واحد",
|
||||
"importSummary": "اكتمل الاستيراد: {{imported}} تم استيرادها، {{updated}} تم تحديثها، {{failed}} فشلت",
|
||||
"importHostsFailed": "فشل في استيراد المضيفين"
|
||||
"speedSearchList": "قائمة المضيفين. اكتب أو اضغط / للبحث."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "شاشة مقسمة",
|
||||
@@ -1126,26 +1082,10 @@
|
||||
"hostCount_other": "{{count}} مضيف"
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_zero": "{{count}} مستخدم",
|
||||
"usersCount_one": "مستخدم واحد",
|
||||
"usersCount_two": "{{count}} مستخدمين",
|
||||
"usersCount_few": "{{count}} مستخدمين",
|
||||
"usersCount_many": "{{count}} مستخدمًا",
|
||||
"rolesCount_zero": "{{count}} دور",
|
||||
"rolesCount_one": "دور واحد",
|
||||
"rolesCount_two": "{{count}} دورين",
|
||||
"rolesCount_few": "{{count}} أدوار",
|
||||
"rolesCount_many": "{{count}} دورًا",
|
||||
"apiKeysCount_zero": "{{count}} مفتاح",
|
||||
"apiKeysCount_one": "مفتاح واحد",
|
||||
"apiKeysCount_two": "{{count}} مفتاحين",
|
||||
"apiKeysCount_few": "{{count}} مفاتيح",
|
||||
"apiKeysCount_many": "{{count}} مفتاحًا",
|
||||
"sessionsActive_zero": "0 نشط",
|
||||
"sessionsActive_one": "1 نشط",
|
||||
"sessionsActive_two": "2 نشط",
|
||||
"sessionsActive_few": "{{count}} نشطة",
|
||||
"sessionsActive_many": "{{count}} نشطة",
|
||||
"hostsCount_zero": "{{count}} مضيف",
|
||||
"hostsCount_one": "مضيف واحد",
|
||||
"hostsCount_two": "{{count}} مضيفين",
|
||||
@@ -1159,11 +1099,7 @@
|
||||
"credentialsCount_many": "{{count}} بيانات اعتماد",
|
||||
"credentialsCount_other": "{{count}} بيانات اعتماد",
|
||||
"rolePermissions": {
|
||||
"count_zero": "{{count}} إذن",
|
||||
"count_one": "إذن واحد",
|
||||
"count_two": "{{count}} إذنين",
|
||||
"count_few": "{{count}} أذونات",
|
||||
"count_many": "{{count}} إذنًا",
|
||||
"groups": {
|
||||
"hosts": "المضيفين",
|
||||
"credentials": "بيانات الاعتماد",
|
||||
@@ -1203,25 +1139,63 @@
|
||||
"interfaceFontLabel": "خط الواجهة",
|
||||
"interfaceFontDescription": "يغيّر خط واجهة التطبيق. تحتفظ ملفات تعريف المحطة الطرفية بإعدادات الخط الخاصة بها.",
|
||||
"accentColorLabel": "لون التمييز",
|
||||
"apiKeyCount_zero": "{{count}} مفتاح",
|
||||
"apiKeyCount_one": "مفتاح واحد",
|
||||
"apiKeyCount_two": "{{count}} مفتاحين",
|
||||
"apiKeyCount_few": "{{count}} مفاتيح",
|
||||
"apiKeyCount_many": "{{count}} مفتاحًا",
|
||||
"colorPickerTooltip": "فتح منتقي الألوان",
|
||||
"themeSystem": "النظام",
|
||||
"themeLight": "فاتح",
|
||||
"themeDark": "داكن",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "داكن"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "كيف يتم تخطيط التطبيق بأكمله. تأتي السمات والتخطيطات من الإضافات.",
|
||||
"defaultsLabel": "الافتراضي للجميع",
|
||||
"defaultsHint": "ما يراه الناس حتى يختاروا تخطيطهم أو سماتهم الخاصة.",
|
||||
"followDefault": "استخدام الافتراضي",
|
||||
"defaultSaved": "تم حفظ المظهر الافتراضي",
|
||||
"saveFailed": "تعذر حفظ المظهر",
|
||||
"repair": {
|
||||
"title": "تعذر عرض هذا التخطيط",
|
||||
"safeTitle": "الوضع الآمن",
|
||||
"layout": "التخطيط",
|
||||
"plugin": "الإضافة",
|
||||
"reason": "السبب",
|
||||
"error": "خطأ",
|
||||
"noError": "لا توجد رسالة خطأ.",
|
||||
"copy": "نسخ",
|
||||
"copied": "تم النسخ",
|
||||
"copyFailed": "تعذر نسخ التفاصيل",
|
||||
"retry": "حاول مرة أخرى",
|
||||
"reset": "إعادة تعيين إلى المظهر الافتراضي",
|
||||
"resetEveryone": "إعادة تعيين الافتراضي للجميع",
|
||||
"update": "تحديث {{name}} إلى {{version}}",
|
||||
"disable": "إيقاف {{name}}",
|
||||
"enable": "تفعيل {{name}}",
|
||||
"startAgain": "إعادة تشغيل {{name}}",
|
||||
"install": "البحث عن التخطيطات والسمات",
|
||||
"installTitle": "التخطيطات والسمات",
|
||||
"installButton": "تثبيت",
|
||||
"nothingToInstall": "لا توجد تخطيطات أو سمات أخرى متاحة حالياً.",
|
||||
"registryUnreachable": "تعذر الوصول إلى سجل الإضافات.",
|
||||
"askAdmin": "اطلب من المسؤول تحديث أو إصلاح هذا التخطيط. يمكنك التبديل إلى تخطيط أو سمة أخرى لنفسك أدناه.",
|
||||
"switchLayout": "تبديل التخطيط",
|
||||
"switchTheme": "تبديل السمة",
|
||||
"saveFailed": "تعذر حفظ اختيارك",
|
||||
"reasons": {
|
||||
"safe-url": "العنوان طلب الوضع الآمن. اختر تخطيطاً أدناه، أو احذف ?safe-layout=1 من العنوان.",
|
||||
"safe-env": "تم تشغيل الخادم مع TERMIX_SAFE_LAYOUT، لذا يرى الجميع هذه الشاشة حتى يتم إزالته.",
|
||||
"missing": "لا توجد إضافة مثبتة توفر هذا التخطيط.",
|
||||
"disabled": "الإضافة التي توفر هذا التخطيط معطلة.",
|
||||
"blocked": "الإضافة التي توفر هذا التخطيط تنتظر شيئاً تحتاجه.",
|
||||
"incompatible": "الإضافة التي توفر هذا التخطيط لا تعمل مع هذه النسخة من Termix.",
|
||||
"failed": "فشل التخطيط في البدء.",
|
||||
"crashed": "تعطل التخطيط مرتين أثناء رسم التطبيق."
|
||||
},
|
||||
"noLayout": "لم يتم تعيين أي تخطيط",
|
||||
"restore": "استعادة {{name}} المرفقة",
|
||||
"restoreFailed": "تعذر استعادة النسخة المرفقة"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1244,6 +1218,18 @@
|
||||
"title": "إدارة تسجيل الدخول",
|
||||
"consequence": "يمكنه إضافة طريقة تسجيل دخول، أو عامل تحقق ثانٍ، أو نوع تسجيل دخول عبر SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "تعيين قواعد تسجيل الدخول",
|
||||
"consequence": "يمكنه تسجيل خروج الأشخاص عند الخمول، وتقييد مدة الجلسة، وإيقاف تذكرني، ومتطلب عامل ثانٍ."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "اختر كيفية الوصول إلى المضيفين",
|
||||
"consequence": "يمكنه نقل اتصال SSH إلى مضيف عبر مساره الخاص، لذا يرى كل ما يُرسل إلى ومن تلك المضيفين، بما في ذلك كلمات المرور."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "تشغيل المزامنة",
|
||||
"consequence": "يمكنه الإجابة على جميع طلبات المزامنة، لذا يرى البيانات التي تزامن الأجهزة والخوادم."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "إدارة الشهادات",
|
||||
"consequence": "يمكنه استبدال الشهادة التي يقدمها Termix عبر HTTPS والرد على فحوصات النطاق من جهات إصدار الشهادات."
|
||||
@@ -1252,6 +1238,10 @@
|
||||
"title": "الوصول إلى الأجهزة التسلسلية و USB",
|
||||
"consequence": "يمكنه فتح منفذ تسلسلي مادي على الجهاز الذي يعمل عليه Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "تصدير المضيفين مع أسرارهم",
|
||||
"consequence": "يمكنه قراءة مضيفيك بالكامل، بما في ذلك كلمات المرور والمفاتيح المحفوظة، وتسليمها. يتم كتابة كل تصدير في سجل التدقيق."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "إنشاء وتعديل الخوادم",
|
||||
"consequence": "يمكنه إضافة خوادم وتعديل تلك التي لديك بالفعل."
|
||||
@@ -1296,10 +1286,30 @@
|
||||
"title": "قراءة سجل التدقيق",
|
||||
"consequence": "يمكنه رؤية من فعل ماذا ومتى."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "التحقق مما إذا كانت المنافذ تجيب",
|
||||
"consequence": "يمكنه فتح اتصال عادي إلى أي عنوان من الخادم، لمعرفة ما إذا كان يمكن الوصول إليه."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "توفير حالة المضيف",
|
||||
"consequence": "يصبح مصدر النقاط عبر الإنترنت وغير المتصلة لكل مضيف."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "تخزين النشاط الأخير",
|
||||
"consequence": "يُصبح مخزناً لقائمة النشاطات الأخيرة لكل مستخدم."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "إدارة المضيفين كقراءة فقط",
|
||||
"consequence": "لا يمكن لأي شخص آخر تعديل أو حذف أو إعادة مشاركة المضيفين التي يديرها."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "فتح نوافذ سطح المكتب",
|
||||
"consequence": "فقط في تطبيق سطح المكتب الخاص بـ Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "استخدام هذا الكمبيوتر",
|
||||
"consequence": "يمكنه قراءة وتغيير الملفات، وتشغيل shell، وفتح المنافذ المحلية على هذا الكمبيوتر. فقط في تطبيق Termix المكتبي."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "التصرف كمستخدمين آخرين",
|
||||
"consequence": "يؤدي العمل في الخلفية باستخدام صلاحيات مستخدم آخر، مثل المهام المجدولة. يتم تسجيل كل استخدام في سجل التدقيق."
|
||||
@@ -1339,6 +1349,14 @@
|
||||
"ui:surface": {
|
||||
"title": "إضافة شاشات خاصة بها",
|
||||
"consequence": "علامات تبويب، ولوحات، وإعدادات يمكنك إخفاؤها لاحقاً."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "استبدال تخطيط التطبيق بالكامل",
|
||||
"consequence": "عند اختياره، يقوم كوده برسم كل شاشة، بما في ذلك طرفياتك وإعداداتك."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "إضافة سمات ألوان",
|
||||
"consequence": "ألوان وأنماط فقط. لا يتم تشغيل أي كود لسمات."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1365,7 +1383,8 @@
|
||||
"disabled": "معطلة",
|
||||
"failed": "توقفت بشكل غير متوقع",
|
||||
"blocked": "في انتظار إضافة أخرى",
|
||||
"server": "يعمل على خادمك"
|
||||
"server": "يعمل على خادمك",
|
||||
"safeMode": "معطل في الوضع الآمن"
|
||||
},
|
||||
"groups": {
|
||||
"running": "تعمل",
|
||||
@@ -1379,11 +1398,6 @@
|
||||
"updated": "تم تحديثها مؤخراً",
|
||||
"category": "الفئة"
|
||||
},
|
||||
"columns": {
|
||||
"title": "الأعمدة",
|
||||
"auto": "تلقائي",
|
||||
"count": "عرض {{count}}"
|
||||
},
|
||||
"table": {
|
||||
"name": "الاسم",
|
||||
"description": "الوصف",
|
||||
@@ -1516,6 +1530,7 @@
|
||||
"options": "تعذر حفظ خيارات {{name}}: {{error}}",
|
||||
"deleteData": "تعذر حذف بيانات {{name}}: {{error}}",
|
||||
"managedByServer": "هذا سطح المكتب مرتبط بخادم، وهو الذي يحدد إضافاته.",
|
||||
"defaultLook": "{{name}} هو المظهر الافتراضي، لذا يمكن إيقافه أو استبداله ولكن لا يمكن إلغاء تثبيته.",
|
||||
"hasDependents": "{{name}} مطلوب من قبل {{list}}. قم بتعطيلها أو إلغاء تثبيتها أولاً.",
|
||||
"missingDependencies": "{{name}} يحتاج إلى {{list}}، وهو غير مثبت.",
|
||||
"consentChanged": "تغير ما تطلبه هذه الإضافة منذ أن نظرته. تحقق من القائمة مرة أخرى.",
|
||||
@@ -1601,7 +1616,6 @@
|
||||
"noServerAccess": "لا يوجد وصول إلى خوادمك",
|
||||
"searchInstalled": "البحث في المثبتة",
|
||||
"searchPlugins": "البحث في الإضافات",
|
||||
"allCategories": "الكل",
|
||||
"nothingMatches": "لا شيء يطابق ذلك.",
|
||||
"noneInstalled": "لم يتم تثبيت أي إضافات بعد. تصفح لإضافة بعض.",
|
||||
"nothingHere": "لا شيء هنا.",
|
||||
@@ -1707,7 +1721,48 @@
|
||||
"documentation": "التوثيق",
|
||||
"envVars": "متغيرات البيئة",
|
||||
"envRequired": "مطلوب",
|
||||
"envDefault": "الافتراضي: {{value}}"
|
||||
"envDefault": "الافتراضي: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "التخطيطات",
|
||||
"themes": "السمات",
|
||||
"tabs": "العلامات",
|
||||
"panels": "لوحات الشريط الجانبي",
|
||||
"dashboardCards": "بطاقات لوحة التحكم",
|
||||
"protocols": "أنواع الاتصال",
|
||||
"auth": "طرق تسجيل الدخول",
|
||||
"actions": "الإجراءات",
|
||||
"hostCapability": "إعدادات المضيف"
|
||||
},
|
||||
"filters": {
|
||||
"type": "النوع",
|
||||
"allTypes": "جميع الأنواع",
|
||||
"category": "الفئة",
|
||||
"allCategories": "جميع الفئات",
|
||||
"results_zero": "لا توجد إضافات",
|
||||
"results_one": "إضافة واحدة",
|
||||
"results_two": "إضافتان",
|
||||
"results_few": "{{count}} إضافات",
|
||||
"results_many": "{{count}} إضافة",
|
||||
"results_other": "{{count}} إضافة",
|
||||
"remove": "إزالة الفلتر {{name}}",
|
||||
"clear": "مسح الفلاتر",
|
||||
"button": "الفلاتر",
|
||||
"buttonCount": "الفلاتر ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} من {{total}}",
|
||||
"page": "الصفحة {{page}} من {{pages}}",
|
||||
"previous": "الصفحة السابقة",
|
||||
"next": "الصفحة التالية",
|
||||
"perPage": "{{count}} في كل صفحة",
|
||||
"perPageLabel": "الإضافات في كل صفحة"
|
||||
},
|
||||
"showUnsupportedHint": "هذه مدرجة ولكن لا يوجد إصدار يعمل على هذا الإصدار بعد. قم بتحديث Termix لتثبيتها.",
|
||||
"unsupported": "يتطلب إصدار أحدث من Termix",
|
||||
"unsupportedHint": "لا يوجد إصدار من هذه الإضافة يعمل على هذا الإصدار من Termix. قم بتحديث Termix لتثبيتها.",
|
||||
"needsTermix": "يتطلب Termix {{range}}",
|
||||
"showUnsupported": "إظهار غير المدعوم ({{count}})",
|
||||
"showMore": "إظهار {{count}} أخرى ({{total}} متبقية)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1723,107 +1778,6 @@
|
||||
"noData": "لا توجد بيانات",
|
||||
"filter": "تصفية..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_zero": "منذ {{count}} دقائق",
|
||||
"minutesAgo_one": "منذ دقيقة واحدة",
|
||||
"minutesAgo_two": "منذ دقيقتين",
|
||||
"minutesAgo_few": "منذ {{count}} دقائق",
|
||||
"minutesAgo_many": "منذ {{count}} دقيقة",
|
||||
"minutesAgo_other": "منذ {{count}} دقيقة",
|
||||
"hoursAgo_zero": "منذ {{count}} ساعات",
|
||||
"hoursAgo_one": "منذ ساعة واحدة",
|
||||
"hoursAgo_two": "منذ ساعتين",
|
||||
"hoursAgo_few": "منذ {{count}} ساعات",
|
||||
"hoursAgo_many": "منذ {{count}} ساعة",
|
||||
"hoursAgo_other": "منذ {{count}} ساعة",
|
||||
"pending_zero": "{{count}} تغييرات في انتظار المزامنة",
|
||||
"pending_one": "تغيير واحد في انتظار المزامنة",
|
||||
"pending_two": "تغييران في انتظار المزامنة",
|
||||
"pending_few": "{{count}} تغييرات في انتظار المزامنة",
|
||||
"pending_many": "{{count}} تغييراً في انتظار المزامنة",
|
||||
"pending_other": "{{count}} تغيير في انتظار المزامنة",
|
||||
"proxy": {
|
||||
"headersTitle": "رؤوس إضافية",
|
||||
"headersHint": "تُرسَل مع كل طلب إلى الخادم، على سبيل المثال رمز خدمة Cloudflare Access.",
|
||||
"headerName": "اسم الرأس",
|
||||
"headerValue": "القيمة",
|
||||
"savedValue": "تم الحفظ، اكتب لتغيير",
|
||||
"addHeader": "إضافة رأس",
|
||||
"removeHeader": "إزالة الرأس",
|
||||
"basicAuthTitle": "اسم المستخدم وكلمة المرور",
|
||||
"basicAuthHint": "لوكيل يطلب اسم مستخدم وكلمة مرور قبل Termix.",
|
||||
"username": "اسم المستخدم",
|
||||
"password": "كلمة المرور",
|
||||
"allowInvalidCertificate": "الثقة بشهادة موقعة ذاتياً",
|
||||
"allowInvalidCertificateHint": "فقط لخادمك الخاص، عندما لا تكون شهادته من جهة معروفة."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "هذا لا يبدو كعنوان ويب.",
|
||||
"unreachable": "تعذر الوصول إلى الخادم. تحقق من العنوان وأن الخادم قيد التشغيل.",
|
||||
"unreachableWithReason": "تعذر الوصول إلى الخادم: {{reason}}",
|
||||
"tlsUntrusted": "شهادة الخادم غير موثوقة. إذا كان هذا خادمك الخاص بشهادة موقعة ذاتيًا، فعّل الخيار أدناه.",
|
||||
"basicAuthRequired": "شيء ما أمام الخادم يطلب اسم مستخدم وكلمة مرور. أدخلهما أدناه.",
|
||||
"proxyLogin": "صفحة تسجيل دخول أو وكيل (Proxy) أجابت بدلاً من Termix. أضف الرؤوس (Headers) التي يحتاجها أدناه، أو تحقق من العنوان.",
|
||||
"notTermix": "لا يوجد خادم Termix عند هذا العنوان. إذا كان يعمل تحت مسار، فقم بتضمينه، مثل https://example.com/termix.",
|
||||
"versionMismatch": "يعمل ذلك الخادم على إصدار أقدم من Termix. قم بتحديثه إلى 2.9 أو أحدث للربط.",
|
||||
"differentAccount": "لقد قمت بتسجيل الدخول إلى حساب مختلف. سجّل الدخول إلى الحساب المرتبط بهذا الجهاز، أو قم بإلغاء الربط أولاً."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "الربط بخادم Termix",
|
||||
"reloginTitle": "تسجيل الدخول مرة أخرى",
|
||||
"savedServers": "الخوادم الأخيرة",
|
||||
"removeServer": "إزالة من القائمة",
|
||||
"serverDescription": "أدخل العنوان الذي تستخدمه لفتح Termix في متصفحك.",
|
||||
"signinDescription": "تسجيل الدخول إلى {{url}}",
|
||||
"chooseDescription": "هذا الجهاز يحتوي بالفعل على بيانات. ماذا يجب أن يحدث لها؟",
|
||||
"finishingDescription": "جارٍ ربط هذا الجهاز.",
|
||||
"serverUrl": "عنوان الخادم",
|
||||
"serverUrlHint": "على سبيل المثال https://termix.example.com",
|
||||
"showProxySettings": "إعدادات الوكيل العكسي",
|
||||
"hideProxySettings": "إخفاء إعدادات الوكيل العكسي",
|
||||
"continue": "متابعة",
|
||||
"back": "رجوع",
|
||||
"mergeTitle": "إضافته إلى حسابي",
|
||||
"mergeBody_zero": "تمت إضافة العناصر الموجودة على هذا الجهاز إلى حسابك. العناصر التي يمتلكها حسابك بالفعل تبقى كما هي على الخادم.",
|
||||
"mergeBody_one": "تمت إضافة العنصر الموجود على هذا الجهاز إلى حسابك. العناصر التي يمتلكها حسابك بالفعل تبقى كما هي على الخادم.",
|
||||
"mergeBody_two": "تمت إضافة العنصرين الموجودين على هذا الجهاز إلى حسابك. العناصر التي يمتلكها حسابك بالفعل تبقى كما هي على الخادم.",
|
||||
"mergeBody_few": "تمت إضافة العناصر الموجودة على هذا الجهاز إلى حسابك. العناصر التي يمتلكها حسابك بالفعل تبقى كما هي على الخادم.",
|
||||
"mergeBody_many": "تمت إضافة العناصر الموجودة على هذا الجهاز إلى حسابك. العناصر التي يمتلكها حسابك بالفعل تبقى كما هي على الخادم.",
|
||||
"mergeBody_other": "تمت إضافة {{count}} عنصرًا موجودًا على هذا الجهاز إلى حسابك. العناصر التي يمتلكها حسابك بالفعل تبقى كما هي على الخادم.",
|
||||
"replaceTitle": "استبداله بحسابي",
|
||||
"replaceBody_zero": "تمت إزالة العناصر الموجودة على هذا الجهاز، وسيأخذ هذا الجهاز كل شيء من حسابك. ستبقى المضيفات المحفوظة على هذا الجهاز فقط.",
|
||||
"replaceBody_one": "تمت إزالة العنصر الموجود على هذا الجهاز، وسيأخذ هذا الجهاز كل شيء من حسابك. ستبقى المضيفات المحفوظة على هذا الجهاز فقط.",
|
||||
"replaceBody_two": "تمت إزالة العنصرين الموجودين على هذا الجهاز، وسيأخذ هذا الجهاز كل شيء من حسابك. ستبقى المضيفات المحفوظة على هذا الجهاز فقط.",
|
||||
"replaceBody_few": "تمت إزالة العناصر الموجودة على هذا الجهاز، وسيأخذ هذا الجهاز كل شيء من حسابك. ستبقى المضيفات المحفوظة على هذا الجهاز فقط.",
|
||||
"replaceBody_many": "تمت إزالة العناصر الموجودة على هذا الجهاز، وسيأخذ هذا الجهاز كل شيء من حسابك. ستبقى المضيفات المحفوظة على هذا الجهاز فقط.",
|
||||
"replaceBody_other": "تمت إزالة {{count}} عنصرًا موجودًا على هذا الجهاز، وسيأخذ هذا الجهاز كل شيء من حسابك. ستبقى المضيفات المحفوظة على هذا الجهاز فقط.",
|
||||
"link": "ربط",
|
||||
"linking": "جارٍ الربط وتشغيل المزامنة الأولى...",
|
||||
"linked": "تم الربط. بياناتك تتم مزامنتها الآن.",
|
||||
"signedInAgain": "تم تسجيل الدخول. المزامنة تعمل مرة أخرى."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "المضيفين",
|
||||
"sshCredentials": "بيانات الاعتماد",
|
||||
"sshFolders": "المجلدات",
|
||||
"userPreferences": "التفضيلات",
|
||||
"pluginUserSettings": "إعدادات الإضافات",
|
||||
"sharedHosts": "المضيفين المشتركين معك",
|
||||
"sharedCredentials": "بيانات الاعتماد المشتركة معك",
|
||||
"vaultProfiles": "ملفات تعريف Vault",
|
||||
"snippetFolders": "مجلدات المقاطع",
|
||||
"snippets": "المقاطع",
|
||||
"dashboardServiceLinks": "روابط الخدمات",
|
||||
"homepageItems": "عناصر الصفحة الرئيسية",
|
||||
"networkTopology": "خريطة الشبكة",
|
||||
"workspaces": "مساحات العمل",
|
||||
"hostDefaults": "الإعدادات الافتراضية للمضيفين",
|
||||
"hostDefaultsAdmin": "الإعدادات الافتراضية لمضيفي الخادم",
|
||||
"aiProviders": "مزودي الذكاء الاصطناعي",
|
||||
"homepageLayouts": "تخطيطات الصفحة الرئيسية",
|
||||
"accountProfile": "ملف تعريف الحساب"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "مجلد {{name}}",
|
||||
@@ -1868,7 +1822,12 @@
|
||||
"gridView": "شبكة",
|
||||
"listView": "قائمة",
|
||||
"compactRows": "صفوف مدمجة",
|
||||
"comfortableRows": "صفوف مريحة"
|
||||
"comfortableRows": "صفوف مريحة",
|
||||
"columns": {
|
||||
"title": "الأعمدة",
|
||||
"auto": "تلقائي",
|
||||
"count": "عرض {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "تم الحفظ. اكتب لاستبداله."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Някои плъгини не могат да бъдат променени. Можете да ги поправите по-късно от раздела Плъгини. Натиснете Напред, за да продължите.",
|
||||
"pluginsApplyFailed": "Вашите избори не могат да бъдат запазени. Опитайте отново или продължете и ги променете по-късно от раздела Плъгини.",
|
||||
"pluginsLoadFailed": "Списъкът с плъгини не може да бъде зареден. Можете да изберете плъгини по-късно от раздела Плъгини.",
|
||||
"presetTitle": "Колко искате да виждате на екрана?",
|
||||
"presetIntro": "Изберете колко се показва на екрана.",
|
||||
"presetChangeLater": "Можете да смените предварителните настройки или да промените всяка отделна настройка по-късно в Настройки, под Интерфейс.",
|
||||
"appearanceTitle": "Направете го ваше",
|
||||
"appearanceIntro": "Изберете тема, акцентен цвят, шрифт и език. Промените се виждат веднага и можете да ги промените по-късно в Настройки.",
|
||||
"securityTitle": "Сигурност на акаунта",
|
||||
"securityIntro": "Добавете passkey или приложение за автентикация към вашия акаунт. Можете да направите това и по-късно в Настройки, под Сигурност.",
|
||||
"desktopTitle": "Как искате да използвате Termix?",
|
||||
"desktopBody": "Можете да промените това по всяко време от Синхронизация в страничната лента.",
|
||||
"desktopLocalTitle": "Само на това устройство",
|
||||
"desktopLocalBody": "Всичко се съхранява тук. Няма нужда от настройка.",
|
||||
"desktopLinkTitle": "С моя Termix сървър",
|
||||
"desktopLinkBody": "Влезте в сървъра си, за да използвате същите хостове и настройки на всяко устройство.",
|
||||
"desktopLinked": "Връзка с {{server}}",
|
||||
"pluginsDocsLink": "Прочетете за всеки от тях"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} е готов за инсталация",
|
||||
"readyHint": "Ще се инсталира следващия път, когато Termix се рестартира."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Режим на безопасност",
|
||||
"description": "Само плъгините за подредба и тема са активни. Рестартирайте сървъра без променливата TERMIX_SAFE_MODE, за да активирате останалите."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Затвори панела",
|
||||
"moveSide": "Премести панела",
|
||||
"resize": "Промени размера на панела"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Начало",
|
||||
"terminal": "Терминал",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Хостове",
|
||||
"credentials": "Удостоверения",
|
||||
"connections": "Връзки",
|
||||
"sync": "Синхронизиране",
|
||||
"reconnectDisconnectedTerminals": "Повторно свързване на всички прекъснати терминали",
|
||||
"reconnectingTerminals_one": "Повторно свързване на {{count}} терминал",
|
||||
"reconnectingTerminals_other": "Повторно свързване на {{count}} терминала",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Опитай отново",
|
||||
"refresh": "Опресни",
|
||||
"optional": "По избор",
|
||||
"downloadSample": "Изтегли пример",
|
||||
"failedToDeleteHost": "Неуспешно изтриване на {{name}}",
|
||||
"importSkipExisting": "Импортиране (пропусни съществуващите)",
|
||||
"importSSHConfig": "Импортиране от SSH конфигурация",
|
||||
"connectionDetails": "Детайли за връзката",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Без папка)",
|
||||
"deleteSelected": "Изтриване",
|
||||
"exitSelection": "Изход от избора",
|
||||
"importSkip": "Импортиране (пропускане на съществуващи)",
|
||||
"importOverwrite": "Импортиране (записване върху съществуващи)",
|
||||
"collapseBtn": "Свиване",
|
||||
"importExportBtn": "Импортиране / Експортиране",
|
||||
"hostStatusesRefreshed": "Статусите на хостовете са обновени",
|
||||
"failedToRefreshHosts": "Грешка при обновяването на хостовете",
|
||||
"movedHostTo": "Преместихте {{host}} в \"{{folder}}\"",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Изтриване на \"{{name}}\" и неговия {{count}} хост? Това действие е необратимо.",
|
||||
"deleteFolderConfirm_other": "Изтриване на \"{{name}}\" и неговите {{count}} хоста? Това действие е необратимо.",
|
||||
"failedToMoveHosts": "Грешка при преместване на хостовете",
|
||||
"managedBanner": "Този хост се управлява от {{plugin}}. Направете промени там. Все още можете да го закрепите и да промените реда му.",
|
||||
"managedTooltip": "Управлява се от {{plugin}}",
|
||||
"addBlocked": "Хостовете се управляват от {{plugin}}, така че тук не могат да се добавят нови хостове.",
|
||||
"failedToReorder": "Грешка при преподреждане",
|
||||
"expandAll": "Разгъване на всички папки",
|
||||
"collapseAll": "Свиване на всички папки",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Добавяне на идентификационни данни",
|
||||
"checkingHostStatuses": "Проверяване на състоянието на хостовете...",
|
||||
"pinnedSection": "Закачени",
|
||||
"hostsExported": "Хостовете бяха експортирани успешно",
|
||||
"export": {
|
||||
"menuItem": "Експортиране...",
|
||||
"title": "Експортиране на хостове",
|
||||
"scope": "Обхват",
|
||||
"scopeAll": "Всички",
|
||||
"scopeSelected": "Избрани",
|
||||
"searchHosts": "Търсене на хостове...",
|
||||
"include": "Включване",
|
||||
"groupConnection": "Връзка",
|
||||
"groupCredentials": "Удостоверения",
|
||||
"groupNotes": "Бележки",
|
||||
"groupTags": "Етикети и закачане",
|
||||
"groupProxy": "Прокси",
|
||||
"groupJumpHosts": "Промежътъчни хостове",
|
||||
"groupFeatureFlags": "Настройки на плъгините",
|
||||
"groupAdvanced": "Разширена конфигурация",
|
||||
"preview": "Преглед",
|
||||
"moreHosts_one": "... още {{count}} хост",
|
||||
"moreHosts_other": "... още {{count}} хоста",
|
||||
"summary": "{{selected}} от {{total}} хоста",
|
||||
"credentialsIncluded": "включени удостоверения",
|
||||
"credentialsExcluded": "изключени удостоверения",
|
||||
"noneSelected": "Няма избрани хостове",
|
||||
"cancel": "Отказ",
|
||||
"confirm": "Експортиране",
|
||||
"fetchFailed": "Грешка при зареждане на хостовете за експортиране",
|
||||
"bulkButton": "Експортиране"
|
||||
},
|
||||
"sampleDownloaded": "Примерният файл беше изтеглен",
|
||||
"failedToDeleteCredential2": "Грешка при изтриване на удостоверение",
|
||||
"noFolderOption": "(Без папка)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Актуализирай хост",
|
||||
"editorAdd": "Добави хост",
|
||||
"speedSearch": "Търсене на хостове. Стрелки за избор, Enter за връзка, Esc за затваряне",
|
||||
"speedSearchList": "Списък с хостове. Напишете или натиснете / за търсене.",
|
||||
"importNoHosts": "Не са намерени хостове във файла",
|
||||
"importTooMany": "Можете да импортирате до {{max}} хоста наведнъж",
|
||||
"importSummary": "Импортирането е завършено: {{imported}} импортирани, {{updated}} актуализирани, {{failed}} неуспешни",
|
||||
"importHostsFailed": "Неуспешно импортиране на хостове"
|
||||
"speedSearchList": "Списък с хостове. Напишете или натиснете / за търсене."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Разделен екран",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Отваряне на изборника на цветове",
|
||||
"themeSystem": "Системна",
|
||||
"themeLight": "Светла",
|
||||
"themeDark": "Тъмна",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Тъмна"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Как е подредено цялото приложение. Темите и подредбите идват от плъгини.",
|
||||
"defaultsLabel": "По подразбиране за всички",
|
||||
"defaultsHint": "Какво виждат потребителите, докато не изберат своя собствена подредба или тема.",
|
||||
"followDefault": "Използвай по подразбиране",
|
||||
"defaultSaved": "Външният вид по подразбиране е запазен",
|
||||
"saveFailed": "Външният вид не може да бъде запазен",
|
||||
"repair": {
|
||||
"title": "Тази подредба не може да бъде показана",
|
||||
"safeTitle": "Сигурен режим",
|
||||
"layout": "Подредба",
|
||||
"plugin": "Плъгин",
|
||||
"reason": "Причина",
|
||||
"error": "Грешка",
|
||||
"noError": "Няма съобщение за грешка.",
|
||||
"copy": "Копирай",
|
||||
"copied": "Копирано",
|
||||
"copyFailed": "Детайлите не могат да бъдат копирани",
|
||||
"retry": "Опитай отново",
|
||||
"reset": "Върни външния вид по подразбиране",
|
||||
"resetEveryone": "Върни настройките по подразбиране за всички",
|
||||
"update": "Актуализирай {{name}} до {{version}}",
|
||||
"disable": "Изключи {{name}}",
|
||||
"enable": "Активиране на {{name}}",
|
||||
"startAgain": "Стартиране на {{name}} отново",
|
||||
"install": "Намери подредби и теми",
|
||||
"installTitle": "Подредби и теми",
|
||||
"installButton": "Инсталирай",
|
||||
"nothingToInstall": "В момента няма други налични подредби или теми.",
|
||||
"registryUnreachable": "Регистърът на плъгините не може да бъде достигнат.",
|
||||
"askAdmin": "Попитайте администратор да актуализира или поправи тази подредба. По-долу можете да превключите на друга подредба или тема само за себе си.",
|
||||
"switchLayout": "Превключи подредба",
|
||||
"switchTheme": "Превключи тема",
|
||||
"saveFailed": "Вашият избор не може да бъде запазен",
|
||||
"reasons": {
|
||||
"safe-url": "Адресът изисква сигурен режим. Изберете подредба по-долу или премахнете ?safe-layout=1 от адреса.",
|
||||
"safe-env": "Сървърът е стартиран с TERMIX_SAFE_LAYOUT, така че всички виждат този екран, докато той не бъде премахнат.",
|
||||
"missing": "Няма инсталиран плъгин, който да предоставя тази подредба.",
|
||||
"disabled": "Плъгинът, който предоставя тази подредба, е изключен.",
|
||||
"blocked": "Плъгинът, който предоставя тази подредба, чака нещо, от което се нуждае.",
|
||||
"incompatible": "Плъгинът, който предоставя тази подредба, не работи с тази версия на Termix.",
|
||||
"failed": "Подредбата не успя да се стартира.",
|
||||
"crashed": "Подредбата се срина два пъти, докато зареждаше приложението."
|
||||
},
|
||||
"noLayout": "Няма зададена подредба",
|
||||
"restore": "Възстанови вградената {{name}}",
|
||||
"restoreFailed": "Вградената копия не може да бъде възстановена"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Управление на влизането",
|
||||
"consequence": "Може да добавя метод за влизане, втори фактор или тип SSH влизане."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Задайте правила за влизане",
|
||||
"consequence": "Може да излиза потребителите при бездействие, да ограничава продължителността на сесията, да изключва опцията „Запомни ме“ и да изисква втор фактор."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Изберете как се достъпват хостовете",
|
||||
"consequence": "Може да пренасочва SSH връзката към хост през собствен си маршрут, така че вижда всичко, изпратено до и от тези хостове, включително пароли."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Изпълни синхронизация",
|
||||
"consequence": "Може да отговаря на всички заявки за синхронизация, така че вижда данните, които устройствата и сървърите синхронизират."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Управление на сертификати",
|
||||
"consequence": "Може да замени сертификата, който Termix предоставя чрез HTTPS, и да отговаря на проверки от домейни от органи за издаване на сертификати."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Достъп до серийни и USB устройства",
|
||||
"consequence": "Може да отвори физически серийен порт на устройството, което изпълнява Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Експортирай хостове с техните тайни",
|
||||
"consequence": "Може да чете хостовете ви напълно, включително запазените пароли и ключове, и да ги предоставя. Всеки експорт се записва в журнала за одит."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Създаване и промяна на хостове",
|
||||
"consequence": "Може да добавя хостове и да редактира тези, които вече имате."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Четене на одитния журнал",
|
||||
"consequence": "Може да вижда кой какво е направил и кога."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Провери дали портовете отговарят",
|
||||
"consequence": "Може да отваря обикновена връзка към всеки адрес от сървъра, за да види дали е достъпен."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Предоставяне на статус на хоста",
|
||||
"consequence": "Става източник на точките за онлайн и офлайн статус за всеки хост."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Съхраняване на последната активност",
|
||||
"consequence": "Станва хранилище за списъка с последната активност на всеки потребител."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Управление на хостове само за четене",
|
||||
"consequence": "Хостовете, които управлява, не могат да бъдат редактирани, изтривани или споделяни отново от никого друг."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Отваряне на прозорци на работния плот",
|
||||
"consequence": "Само в десктоп приложението на Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Използване на този компютър",
|
||||
"consequence": "Може да чете и променя файлове, да стартира shell и да отваря локални портове на този компютър. Само в десктоп приложението на Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Действане от името на други потребители",
|
||||
"consequence": "Изпълнява фоновата работа с достъпа на друг потребител, като например планирани задачи. Всяко използване се записва в одитния журнал."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Добавя свои собствени екрани",
|
||||
"consequence": "Раздели, панели и настройки, които можете да скриете по-късно."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Замяна на цялата структура на приложението",
|
||||
"consequence": "Когато е избран, неговият код изчертава всеки екран, включително терминалите и настройките ви."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Добавяне на цветови теми",
|
||||
"consequence": "Само цветове и стилове. За тема не се изпълнява код."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Изключена",
|
||||
"failed": "Спряна неочаквано",
|
||||
"blocked": "Чака друга добавка",
|
||||
"server": "Работи на вашия сървър"
|
||||
"server": "Работи на вашия сървър",
|
||||
"safeMode": "Изключен в режим на безопасност"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Работещи",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Наскоро актуализирани",
|
||||
"category": "Категория"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Колони",
|
||||
"auto": "Автоматично",
|
||||
"count": "{{count}} колони"
|
||||
},
|
||||
"table": {
|
||||
"name": "Име",
|
||||
"description": "Описание",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Не можа да се запазят опциите за {{name}}: {{error}}",
|
||||
"deleteData": "Не можа да се изтрият данните за {{name}}: {{error}}",
|
||||
"managedByServer": "Този работен плот е свързан със сървър, който определя плъгините му.",
|
||||
"defaultLook": "{{name}} е стандартният външен вид, така че може да бъде изключен или заменен, но не и деинсталиран.",
|
||||
"hasDependents": "{{name}} е необходим за {{list}}. Изключете ги или ги деинсталирайте първо.",
|
||||
"missingDependencies": "{{name}} се нуждае от {{list}}, който не е инсталиран.",
|
||||
"consentChanged": "Какво изисква този плъгин се е променило от последния път, когато го проверихте. Проверете списъка отново.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Няма достъп до сървърите ви",
|
||||
"searchInstalled": "Търси сред инсталираните",
|
||||
"searchPlugins": "Търси плъгини",
|
||||
"allCategories": "Всички",
|
||||
"nothingMatches": "Няма съвпадения.",
|
||||
"noneInstalled": "Все още няма инсталирани плъгини. Разгледайте каталога, за да добавите някой.",
|
||||
"nothingHere": "Тук няма нищо.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Документация",
|
||||
"envVars": "Променливи на средата",
|
||||
"envRequired": "Задължителни",
|
||||
"envDefault": "По подразбиране: {{value}}"
|
||||
"envDefault": "По подразбиране: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Структури",
|
||||
"themes": "Теми",
|
||||
"tabs": "Раздели",
|
||||
"panels": "Панели в страничната лента",
|
||||
"dashboardCards": "Карти на таблото",
|
||||
"protocols": "Видове връзки",
|
||||
"auth": "Методи за вписване",
|
||||
"actions": "Действия",
|
||||
"hostCapability": "Настройки на хоста"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Вид",
|
||||
"allTypes": "Всички видове",
|
||||
"category": "Категория",
|
||||
"allCategories": "Всички категории",
|
||||
"results_one": "{{count}} плъгин",
|
||||
"results_other": "{{count}} плъгина",
|
||||
"remove": "Премахване на филтъра {{name}}",
|
||||
"clear": "Изчистване на филтрите",
|
||||
"button": "Филтри",
|
||||
"buttonCount": "Филтри ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} от {{total}}",
|
||||
"page": "Страница {{page}} от {{pages}}",
|
||||
"previous": "Предишна страница",
|
||||
"next": "Следваща страница",
|
||||
"perPage": "{{count}} на страница",
|
||||
"perPageLabel": "Плъгини на страница"
|
||||
},
|
||||
"showUnsupportedHint": "Тези са изброени, но все още няма версия, която да работи с тази версия. Актуализирайте Termix, за да ги инсталирате.",
|
||||
"unsupported": "Изисква по-нова версия на Termix",
|
||||
"unsupportedHint": "Няма версия на този плъгин, която да работи с тази версия на Termix. Актуализирайте Termix, за да го инсталирате.",
|
||||
"needsTermix": "Изисква Termix {{range}}",
|
||||
"showUnsupported": "Показване на неподдържани ({{count}})",
|
||||
"showMore": "Показване на още {{count}} (остава {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Няма данни",
|
||||
"filter": "Филтър..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "преди {{count}} минута",
|
||||
"minutesAgo_other": "преди {{count}} минути",
|
||||
"hoursAgo_one": "преди {{count}} час",
|
||||
"hoursAgo_other": "преди {{count}} часа",
|
||||
"pending_one": "{{count}} промяна чака синхронизиране",
|
||||
"pending_other": "{{count}} промени чакат синхронизиране",
|
||||
"proxy": {
|
||||
"headersTitle": "Допълнителни хедъри",
|
||||
"headersHint": "Изпращат се с всяка заявка към сървъра, например токен за услуга Cloudflare Access.",
|
||||
"headerName": "Име на хедъра",
|
||||
"headerValue": "Стойност",
|
||||
"savedValue": "Запазено, въведете за промяна",
|
||||
"addHeader": "Добави хедър",
|
||||
"removeHeader": "Премахни хедър",
|
||||
"basicAuthTitle": "Потребителско име и парола",
|
||||
"basicAuthHint": "За прокси, който изисква потребителско име и парола преди Termix.",
|
||||
"username": "Потребителско име",
|
||||
"password": "Парола",
|
||||
"allowInvalidCertificate": "Да доверя самоподписан сертификат",
|
||||
"allowInvalidCertificateHint": "Само за вашия собствен сървър, когато сертификатът му не е от известен орган."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Това не изглежда като уеб адрес.",
|
||||
"unreachable": "Не може да се свърже със сървъра. Проверете адреса и дали сървърът работи.",
|
||||
"unreachableWithReason": "Не може да се свърже със сървъра: {{reason}}",
|
||||
"tlsUntrusted": "Сертификатът на сървъра не е доверен. Ако това е ваш собствен сървър със самоподписан сертификат, включете опцията по-долу.",
|
||||
"basicAuthRequired": "Някакво устройство пред сървъра изисква потребителско име и парола. Въведете ги по-долу.",
|
||||
"proxyLogin": "Страница за вход или прокси отговори вместо Termix. Добавете необходимите хедъри по-долу или проверете адреса.",
|
||||
"notTermix": "На този адрес няма Termix сървър. Ако работи под път, включете го, например https://example.com/termix.",
|
||||
"versionMismatch": "Този сървър използва по-стара версия на Termix. Актуализирайте го до 2.9 или по-нова, за да го свържете.",
|
||||
"differentAccount": "Влязохте в различен акаунт. Влезте в акаунта, към който е свързано това устройство, или първо го разкачете."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Свързване с Termix сървър",
|
||||
"reloginTitle": "Влезте отново",
|
||||
"savedServers": "Последни сървъри",
|
||||
"removeServer": "Премахване от списъка",
|
||||
"serverDescription": "Въведете адреса, който използвате за отваряне на Termix в браузъра си.",
|
||||
"signinDescription": "Влезте в {{url}}",
|
||||
"chooseDescription": "Това устройство вече има данни. Какво да се случи с тях?",
|
||||
"finishingDescription": "Свързване на това устройство.",
|
||||
"serverUrl": "Адрес на сървъра",
|
||||
"serverUrlHint": "Например https://termix.example.com",
|
||||
"showProxySettings": "Настройки на обратния прокси",
|
||||
"hideProxySettings": "Скриване на настройките на обратния прокси",
|
||||
"continue": "Продължи",
|
||||
"back": "Назад",
|
||||
"mergeTitle": "Добави ги към моя акаунт",
|
||||
"mergeBody_one": "Елементът на това устройство се добавя към вашия акаунт. Елементите, които вече има акаунтът ви, остават непроменени на сървъра.",
|
||||
"mergeBody_other": "{{count}} елемента от това устройство се добавят към вашия акаунт. Елементите, които вече има акаунтът ви, остават непроменени на сървъра.",
|
||||
"replaceTitle": "Замени ги с моя акаунт",
|
||||
"replaceBody_one": "Елементът на това устройство се премахва, а устройството приема всичко от вашия акаунт. Хостове, запазени само на това устройство, остават.",
|
||||
"replaceBody_other": "{{count}} елемента от това устройство се премахват, а устройството приема всичко от вашия акаунт. Хостове, запазени само на това устройство, остават.",
|
||||
"link": "Свържи",
|
||||
"linking": "Свързване и стартиране на първата синхронизация...",
|
||||
"linked": "Свързано. Данните ви се синхронизират.",
|
||||
"signedInAgain": "Влезте. Синхронизацията работи отново."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Хостове",
|
||||
"sshCredentials": "Идентификационни данни",
|
||||
"sshFolders": "Папки",
|
||||
"userPreferences": "Предпочитания",
|
||||
"pluginUserSettings": "Настройки на плъгините",
|
||||
"sharedHosts": "Хостове, споделени с вас",
|
||||
"sharedCredentials": "Идентификационни данни, споделени с вас",
|
||||
"vaultProfiles": "Профили на Vault",
|
||||
"snippetFolders": "Папки със снипети",
|
||||
"snippets": "Снипети",
|
||||
"dashboardServiceLinks": "Връзки към услуги",
|
||||
"homepageItems": "Елементи на началната страница",
|
||||
"networkTopology": "Мрежова карта",
|
||||
"workspaces": "Работни пространства",
|
||||
"hostDefaults": "Стандартни настройки на хостовете",
|
||||
"hostDefaultsAdmin": "Стандартни настройки на хостовете на сървъра",
|
||||
"aiProviders": "AI доставчици",
|
||||
"homepageLayouts": "Разположения на началната страница",
|
||||
"accountProfile": "Профил на акаунта"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Папка {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Мрежа",
|
||||
"listView": "Списък",
|
||||
"compactRows": "Компактни редове",
|
||||
"comfortableRows": "Комфортни редове"
|
||||
"comfortableRows": "Комфортни редове",
|
||||
"columns": {
|
||||
"title": "Колони",
|
||||
"auto": "Автоматично",
|
||||
"count": "ширина {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Запазено. Въведете ново, за да го замените."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "কিছু প্লাগইন পরিবর্তন করা যায়নি। আপনি পরে প্লাগইন ট্যাব থেকে এগুলো ঠিক করতে পারবেন। চালিয়ে যেতে পরবর্তী চাপুন।",
|
||||
"pluginsApplyFailed": "আপনার পছন্দ সংরক্ষণ করা যায়নি। আবার চেষ্টা করুন, অথবা চালিয়ে যান এবং পরে প্লাগইন ট্যাব থেকে এগুলো পরিবর্তন করুন।",
|
||||
"pluginsLoadFailed": "প্লাগইন তালিকা লোড করা যায়নি। আপনি পরে প্লাগইন ট্যাব থেকে প্লাগইন বেছে নিতে পারবেন।",
|
||||
"presetTitle": "আপনি স্ক্রিনে কতটা দেখতে চান?",
|
||||
"presetIntro": "স্ক্রিনে কতটা দেখাবে তা বেছে নিন।",
|
||||
"presetChangeLater": "আপনি পরে সেটিংসে, ইন্টারফেস অংশে প্রিসেট পরিবর্তন বা যেকোনো একক সেটিং পরিবর্তন করতে পারবেন।",
|
||||
"appearanceTitle": "এটিকে আপনার নিজস্ব করুন",
|
||||
"appearanceIntro": "একটি থিম, একটি অ্যাকসেন্ট রঙ, একটি ফন্ট এবং আপনার ভাষা বেছে নিন। পরিবর্তনগুলো সাথে সাথে দেখা যাবে, এবং আপনি পরে সেটিংস থেকে এগুলো পরিবর্তন করতে পারবেন।",
|
||||
"securityTitle": "আপনার অ্যাকাউন্ট নিরাপদ করুন",
|
||||
"securityIntro": "আপনার অ্যাকাউন্টে একটি পাসকি বা অথেন্টিকেটর অ্যাপ যোগ করুন। আপনি এটি পরে সেটিংসে, নিরাপত্তা অংশেও করতে পারবেন।",
|
||||
"desktopTitle": "আপনি Termix কেভাবে ব্যবহার করতে চান?",
|
||||
"desktopBody": "আপনি যেকোনো সময় সাইডবারের সিঙ্ক থেকে এটি পরিবর্তন করতে পারবেন।",
|
||||
"desktopLocalTitle": "শুধুমাত্র এই ডিভাইসে",
|
||||
"desktopLocalBody": "সবকিছু এখানে সংরক্ষিত থাকে। সেটআপের কিছু নেই।",
|
||||
"desktopLinkTitle": "আমার Termix সার্ভারের সাথে",
|
||||
"desktopLinkBody": "প্রতিটি ডিভাইসে একই হোস্ট এবং সেটিংস ব্যবহার করতে আপনার সার্ভারে সাইন ইন করুন।",
|
||||
"desktopLinked": "{{server}} এর সাথে লিঙ্ক করা",
|
||||
"pluginsDocsLink": "প্রতিটির সম্পর্কে পড়ুন"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} ইনস্টল করার জন্য প্রস্তুত",
|
||||
"readyHint": "এটি পরবর্তীবার Termix রিস্টার্ট করলে ইনস্টল হবে।"
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "সেফ মোড",
|
||||
"description": "শুধুমাত্র লেআউট এবং থিম প্লাগইন চলছে। বাকিগুলো আবার চালু করতে TERMIX_SAFE_MODE ছাড়া সার্ভারটি রিস্টার্ট করুন।"
|
||||
},
|
||||
"companion": {
|
||||
"close": "প্যানেল বন্ধ করুন",
|
||||
"moveSide": "প্যানেল সরান",
|
||||
"resize": "প্যানেলের আকার পরিবর্তন করুন"
|
||||
},
|
||||
"nav": {
|
||||
"home": "হোম",
|
||||
"terminal": "টার্মিনাল",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "হোস্টসমূহ",
|
||||
"credentials": "ক্রেডেনশিয়াল",
|
||||
"connections": "কানেকশন",
|
||||
"sync": "সিঙ্ক",
|
||||
"reconnectDisconnectedTerminals": "সব বিচ্ছিন্ন টার্মিনাল পুনরায় সংযোগ করুন",
|
||||
"reconnectingTerminals_one": "{{count}} টার্মিনাল পুনরায় সংযোগ করা হচ্ছে",
|
||||
"reconnectingTerminals_other": "{{count}} টার্মিনাল পুনরায় সংযোগ করা হচ্ছে",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "পুনরায় চেষ্টা করুন",
|
||||
"refresh": "রিফ্রেশ করুন",
|
||||
"optional": "ঐচ্ছিক",
|
||||
"downloadSample": "নমুনা ডাউনলোড করুন",
|
||||
"failedToDeleteHost": "{{name}} মুছে ফেলা যায়নি",
|
||||
"importSkipExisting": "ইমপোর্ট (বিদ্যমান উপেক্ষা করুন)",
|
||||
"importSSHConfig": "SSH কনফিগ থেকে ইমপোর্ট করুন",
|
||||
"connectionDetails": "কানেকশন বিবরণ",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(কোনো ফোল্ডার নেই)",
|
||||
"deleteSelected": "মুছে ফেলুন",
|
||||
"exitSelection": "নির্বাচন থেকে বের হন",
|
||||
"importSkip": "আমদানি (বিদ্যমান উপেক্ষা করুন)",
|
||||
"importOverwrite": "আমদানি (অবমূল্যায়ন করুন)",
|
||||
"collapseBtn": "সংকুচিত করুন",
|
||||
"importExportBtn": "আমদানি / রপ্তানি",
|
||||
"hostStatusesRefreshed": "হোস্টের অবস্থা রিফ্রেশ করা হয়েছে",
|
||||
"failedToRefreshHosts": "হোস্ট রিফ্রেশ করতে ব্যর্থ হয়েছে",
|
||||
"movedHostTo": "{{host}} কে \"{{folder}}\" এ সরানো হয়েছে",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "\"{{name}}\" এবং এর {{count}}টি হোস্ট মুছে ফেলবেন? এটি পূর্বাবস্থায় ফেরানো যাবে না।",
|
||||
"deleteFolderConfirm_other": "\"{{name}}\" এবং এর {{count}}টি হোস্ট মুছে ফেলবেন? এটি পূর্বাবস্থায় ফেরানো যাবে না।",
|
||||
"failedToMoveHosts": "হোস্ট সরানো যায়নি",
|
||||
"managedBanner": "এই হোস্টটি {{plugin}} দ্বারা পরিচালিত হয়। সেখানে এটি পরিবর্তন করুন। আপনি এখনও এটি পিন এবং পুনর্বিন্যাস করতে পারেন।",
|
||||
"managedTooltip": "{{plugin}} দ্বারা পরিচালিত",
|
||||
"addBlocked": "হোস্টগুলো {{plugin}} দ্বারা পরিচালিত হয়, তাই এখানে নতুন হোস্ট যোগ করা যাবে না।",
|
||||
"failedToReorder": "পুনর্বিন্যাস করা যায়নি",
|
||||
"expandAll": "সব ফোল্ডার প্রসারিত করুন",
|
||||
"collapseAll": "সব ফোল্ডার সংকুচিত করুন",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "ক্রেডেনশিয়াল যোগ করুন",
|
||||
"checkingHostStatuses": "হোস্টের অবস্থা যাচাই করা হচ্ছে...",
|
||||
"pinnedSection": "পিন করা",
|
||||
"hostsExported": "হোস্টগুলো সফলভাবে রপ্তানি করা হয়েছে",
|
||||
"export": {
|
||||
"menuItem": "রপ্তানি...",
|
||||
"title": "হোস্ট রপ্তানি করুন",
|
||||
"scope": "পরিসর",
|
||||
"scopeAll": "সব",
|
||||
"scopeSelected": "নির্বাচিত",
|
||||
"searchHosts": "হোস্ট খুঁজুন...",
|
||||
"include": "সহ অন্তর্ভুক্ত করুন",
|
||||
"groupConnection": "কানেকশন",
|
||||
"groupCredentials": "ক্রেডেনশিয়াল",
|
||||
"groupNotes": "নোট",
|
||||
"groupTags": "ট্যাগ ও পিন",
|
||||
"groupProxy": "প্রক্সি",
|
||||
"groupJumpHosts": "জাম্প হোস্ট",
|
||||
"groupFeatureFlags": "প্লাগইন সেটিংস",
|
||||
"groupAdvanced": "অ্যাডভান্সড কনফিগ",
|
||||
"preview": "পূর্বরূপ",
|
||||
"moreHosts_one": "... আরও {{count}}টি হোস্ট",
|
||||
"moreHosts_other": "... আরও {{count}}টি হোস্ট",
|
||||
"summary": "{{total}}টির মধ্যে {{selected}}টি হোস্ট",
|
||||
"credentialsIncluded": "ক্রেডেনশিয়াল অন্তর্ভুক্ত",
|
||||
"credentialsExcluded": "ক্রেডেনশিয়াল বাদ দেওয়া হয়েছে",
|
||||
"noneSelected": "কোনো হোস্ট নির্বাচন করা হয়নি",
|
||||
"cancel": "বাতিল",
|
||||
"confirm": "রপ্তানি",
|
||||
"fetchFailed": "রপ্তানির জন্য হোস্ট লোড করতে ব্যর্থ হয়েছে",
|
||||
"bulkButton": "রপ্তানি"
|
||||
},
|
||||
"sampleDownloaded": "নমুনা ফাইল ডাউনলোড হয়েছে",
|
||||
"failedToDeleteCredential2": "ক্রেডেনশিয়াল মুছে ফেলতে ব্যর্থ হয়েছে",
|
||||
"noFolderOption": "(কোনো ফোল্ডার নেই)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "হোস্ট আপডেট করুন",
|
||||
"editorAdd": "হোস্ট যোগ করুন",
|
||||
"speedSearch": "হোস্ট খুঁজুন। নির্বাচন করতে অ্যারো কী, সংযোগ করতে Enter, বন্ধ করতে Esc",
|
||||
"speedSearchList": "হোস্ট তালিকা। খুঁজতে টাইপ করুন অথবা / চাপুন।",
|
||||
"importNoHosts": "ফাইলে কোনো হোস্ট পাওয়া যায়নি",
|
||||
"importTooMany": "আপনি একসাথে সর্বোচ্চ {{max}} হোস্ট ইমপোর্ট করতে পারেন",
|
||||
"importSummary": "ইমপোর্ট সম্পন্ন: {{imported}} ইমপোর্ট করা হয়েছে, {{updated}} আপডেট করা হয়েছে, {{failed}} ব্যর্থ হয়েছে",
|
||||
"importHostsFailed": "হোস্ট ইমপোর্ট করতে ব্যর্থ হয়েছে"
|
||||
"speedSearchList": "হোস্ট তালিকা। খুঁজতে টাইপ করুন অথবা / চাপুন।"
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "স্প্লিট স্ক্রিন",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "কালার পিকার খুলুন",
|
||||
"themeSystem": "সিস্টেম",
|
||||
"themeLight": "লাইট",
|
||||
"themeDark": "ডার্ক",
|
||||
"themeDracula": "ড্রাকুলা",
|
||||
"themeCatppuccin": "ক্যাটপুচিন",
|
||||
"themeNord": "নর্ড",
|
||||
"themeSolarized": "সোলারাইজড",
|
||||
"themeTokyoNight": "টোকিও নাইট",
|
||||
"themeOneDark": "ওয়ান ডার্ক",
|
||||
"themeGruvbox": "গ্রুভবক্স"
|
||||
"themeDark": "ডার্ক"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "পুরো অ্যাপটি কীভাবে সাজানো থাকবে। থিম এবং লেআউট প্লাগইন থেকে আসে।",
|
||||
"defaultsLabel": "সবার জন্য ডিফল্ট",
|
||||
"defaultsHint": "ব্যবহারকারীরা তাদের নিজস্ব লেআউট বা থিম না বেছে নেওয়া পর্যন্ত যা দেখা যাবে।",
|
||||
"followDefault": "ডিফল্ট ব্যবহার করুন",
|
||||
"defaultSaved": "ডিফল্ট লুক সংরক্ষিত হয়েছে",
|
||||
"saveFailed": "লুক সংরক্ষণ করা যায়নি",
|
||||
"repair": {
|
||||
"title": "এই লেআউটটি প্রদর্শন করা যায়নি",
|
||||
"safeTitle": "সেফ মোড",
|
||||
"layout": "লেআউট",
|
||||
"plugin": "প্লাগইন",
|
||||
"reason": "কারণ",
|
||||
"error": "ত্রুটি",
|
||||
"noError": "কোনো ত্রুটি বার্তা নেই।",
|
||||
"copy": "কপি করুন",
|
||||
"copied": "কপি হয়েছে",
|
||||
"copyFailed": "বিস্তারিত কপি করা যায়নি",
|
||||
"retry": "আবার চেষ্টা করুন",
|
||||
"reset": "ডিফল্ট লুকে রিসেট করুন",
|
||||
"resetEveryone": "সবার জন্য ডিফল্ট রিসেট করুন",
|
||||
"update": "{{name}} কে {{version}} এ আপডেট করুন",
|
||||
"disable": "{{name}} বন্ধ করুন",
|
||||
"enable": "{{name}} চালু করুন",
|
||||
"startAgain": "{{name}} আবার শুরু করুন",
|
||||
"install": "লেআউট এবং থিম খুঁজুন",
|
||||
"installTitle": "লেআউট এবং থিম",
|
||||
"installButton": "ইনস্টল করুন",
|
||||
"nothingToInstall": "এখন অন্য কোনো লেআউট বা থিম উপলব্ধ নেই।",
|
||||
"registryUnreachable": "প্লাগইন রেজিস্ট্রিতে পৌঁছানো যায়নি।",
|
||||
"askAdmin": "এই লেআউটটি আপডেট বা ঠিক করতে একজন অ্যাডমিনকে অনুরোধ করুন। নিচে আপনি আপনার জন্য অন্য কোনো লেআউট বা থিম সিলেক্ট করতে পারেন।",
|
||||
"switchLayout": "লেআউট পরিবর্তন করুন",
|
||||
"switchTheme": "থিম পরিবর্তন করুন",
|
||||
"saveFailed": "আপনার পছন্দ সংরক্ষণ করা যায়নি",
|
||||
"reasons": {
|
||||
"safe-url": "ঠিকানাটি সেফ মোডের জন্য অনুরোধ করেছে। নিচে একটি লেআউট বেছে নিন, অথবা ঠিকানা থেকে ?safe-layout=1 সরিয়ে দিন।",
|
||||
"safe-env": "সার্ভারটি TERMIX_SAFE_LAYOUT দিয়ে চালু হয়েছে, তাই এটি সরানো না হওয়া পর্যন্ত সবাই এই স্ক্রিন দেখবে।",
|
||||
"missing": "কোনো ইনস্টল করা প্লাগইন এই লেআউট প্রদান করে না।",
|
||||
"disabled": "এই লেআউট প্রদানকারী প্লাগইনটি বন্ধ আছে।",
|
||||
"blocked": "এই লেআউট প্রদানকারী প্লাগইনটি তার প্রয়োজনীয় কিছু অপেক্ষা করছে।",
|
||||
"incompatible": "এই লেআউট প্রদানকারী প্লাগইনটি Termix-এর এই সংস্করণের সাথে কাজ করে না।",
|
||||
"failed": "লেআউটটি চালু হতে ব্যর্থ হয়েছে।",
|
||||
"crashed": "অ্যাপটি আঁকতে গিয়ে লেআউটটি দুবার ক্র্যাশ করেছে।"
|
||||
},
|
||||
"noLayout": "কোনো লেআউট সেট করা নেই",
|
||||
"restore": "বান্ডল করা {{name}} পুনরুদ্ধার করুন",
|
||||
"restoreFailed": "বান্ডল করা কপি পুনরুদ্ধার করা যায়নি"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "সাইন ইন পরিচালনা করুন",
|
||||
"consequence": "এটি একটি লগইন পদ্ধতি, দ্বিতীয় ফ্যাক্টর বা SSH সাইন-ইন টাইপ যোগ করতে পারে।"
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "সাইন ইন নিয়ম সেট করুন",
|
||||
"consequence": "এটি অবসর অবস্থায় ব্যবহারকারীদের সাইন আউট করতে পারে, সেশনের দৈর্ঘ্য সীমিত করতে পারে, 'মনে রাখো' বন্ধ করতে পারে এবং দ্বিতীয় ফ্যাক্টর প্রয়োজন করতে পারে।"
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "হোস্টগুলো কীভাবে পৌঁছানো হবে তা বেছে নিন",
|
||||
"consequence": "এটি হোস্টের সাথে SSH সংযোগটি তার নিজস্ব রুটের মাধ্যমে বহন করতে পারে, তাই এটি সেই হোস্টগুলোর সাথে যাওয়া-আসা করা সবকিছু দেখতে পায়, পাসওয়ার্ড সহ।"
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "সিঙ্ক চালান",
|
||||
"consequence": "এটি সমস্ত সিঙ্ক অনুরোধের উত্তর দিতে পারে, তাই এটি ডিভাইস এবং সার্ভার যে ডেটা সিঙ্ক করে তা দেখতে পায়।"
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "সার্টিফিকেট পরিচালনা করুন",
|
||||
"consequence": "এটি HTTPS এর মাধ্যমে Termix যে সার্টিফিকেট পরিবেশন করে তা প্রতিস্থাপন করতে পারে এবং সার্টিফিকেট কর্তৃপক্ষ থেকে ডোমেইন চেকের উত্তর দিতে পারে।"
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "সিরিয়াল এবং USB ডিভাইসে অ্যাক্সেস",
|
||||
"consequence": "এটি Termix চালু মেশিনে একটি শারীরিক সিরিয়াল পোর্ট খুলতে পারে।"
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "তাদের গোপন তথ্যসহ হোস্ট রপ্তানি করুন",
|
||||
"consequence": "সংরক্ষিত পাসওয়ার্ড এবং কী সহ আপনার হোস্টগুলোর সম্পূর্ণ তথ্য পড়তে পারে এবং তা প্রদান করতে পারে। প্রতিটি রপ্তানি অডিট লগে লেখা হয়।"
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "হোস্ট তৈরি এবং পরিবর্তন করুন",
|
||||
"consequence": "এটি নতুন হোস্ট যোগ করতে এবং আপনার বিদ্যমান হোস্ট সম্পাদনা করতে পারে।"
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "অডিট লগ পড়ুন",
|
||||
"consequence": "এটি দেখতে পারে কে কী করেছে এবং কখন।"
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "পোর্টের উত্তর আসছে কিনা তা পরীক্ষা করুন",
|
||||
"consequence": "সার্ভার থেকে যেকোনো ঠিকানায় সাধারণ সংযোগ খুলতে পারে, এটি পৌঁছানো যায় কিনা তা দেখার জন্য।"
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "হোস্টের অবস্থা প্রদান করুন",
|
||||
"consequence": "প্রতিটি হোস্টের অনলাইন এবং অফলাইন ডটের উৎস হয়ে ওঠে।"
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "সাম্প্রতিক কার্যকলাপ সংরক্ষণ করুন",
|
||||
"consequence": "প্রতিটি ব্যবহারকারীর সাম্প্রতিক কার্যকলাপের তালিকার জন্য এটি স্টোর হিসেবে কাজ করে।"
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "হোস্টগুলোকে রিড-অনলি হিসেবে পরিচালনা করুন",
|
||||
"consequence": "এটি পরিচালিত হোস্টগুলোকে অন্য কেউ সম্পাদনা, মুছে ফেলা বা পুনরায় শেয়ার করতে পারবে না।"
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "ডেস্কটপ উইন্ডো খুলুন",
|
||||
"consequence": "শুধুমাত্র Termix ডেস্কটপ অ্যাপে।"
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "এই কম্পিউটারটি ব্যবহার করুন",
|
||||
"consequence": "এই কম্পিউটারে ফাইল পড়া ও পরিবর্তন করা, শেল চালানো এবং স্থানীয় পোর্ট খোলা যায়। শুধুমাত্র Termix ডেস্কটপ অ্যাপে।"
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "অন্য ব্যবহারকারী হিসেবে কাজ করুন",
|
||||
"consequence": "অন্য ব্যবহারকারীর অ্যাক্সেস দিয়ে ব্যাকগ্রাউন্ড কাজ চালায়, যেমন নির্ধারিত জব। প্রতিটি ব্যবহার অডিট লগে লেখা হয়।"
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "নিজের স্ক্রিন যোগ করুন",
|
||||
"consequence": "ট্যাব, প্যানেল এবং সেটিংস যা আপনি পরে লুকিয়ে রাখতে পারেন।"
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "পুরো অ্যাপ লেআউট প্রতিস্থাপন করুন",
|
||||
"consequence": "নির্বাচন করলে, এর কোড প্রতিটি স্ক্রিন আঁকে, আপনার টার্মিনাল এবং সেটিংসসহ।"
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "রঙের থিম যোগ করুন",
|
||||
"consequence": "শুধুমাত্র রঙ এবং স্টাইল। কোনো থিমের জন্য কোড চলে না।"
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "নিষ্ক্রিয়",
|
||||
"failed": "অপ্রত্যাশিতভাবে থেমে গেছে",
|
||||
"blocked": "অন্য প্লাগইনের জন্য অপেক্ষা করছে",
|
||||
"server": "আপনার সার্ভারে চলে"
|
||||
"server": "আপনার সার্ভারে চলে",
|
||||
"safeMode": "সেফ মোডে বন্ধ"
|
||||
},
|
||||
"groups": {
|
||||
"running": "চলমান",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "সাম্প্রতিক আপডেট",
|
||||
"category": "ক্যাটাগরি"
|
||||
},
|
||||
"columns": {
|
||||
"title": "কলাম",
|
||||
"auto": "স্বয়ংক্রিয়",
|
||||
"count": "{{count}} প্রশস্ত"
|
||||
},
|
||||
"table": {
|
||||
"name": "নাম",
|
||||
"description": "বিবরণ",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "{{name}} এর জন্য অপশন সেভ করা যায়নি: {{error}}",
|
||||
"deleteData": "{{name}} এর ডেটা মুছে ফেলা যায়নি: {{error}}",
|
||||
"managedByServer": "এই ডেস্কটপটি একটি সার্ভারের সাথে লিঙ্ক করা, যা এর প্লাগইন নির্ধারণ করে।",
|
||||
"defaultLook": "{{name}} ডিফল্ট লুক, তাই এটি বন্ধ বা পরিবর্তন করা যায় কিন্তু আনইনস্টল করা যায় না।",
|
||||
"hasDependents": "{{name}} এর প্রয়োজন {{list}} এর। আগে সেগুলো বন্ধ করুন বা আনইনস্টল করুন।",
|
||||
"missingDependencies": "{{name}} এর প্রয়োজন {{list}}, যা ইনস্টল করা নেই।",
|
||||
"consentChanged": "আপনি দেখার পর থেকে এই প্লাগইনটি যা চায় তা পরিবর্তন হয়েছে। তালিকাটি আবার চেক করুন।",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "আপনার সার্ভারগুলোর কোনো অ্যাক্সেস নেই",
|
||||
"searchInstalled": "ইনস্টল করা প্লাগইন খুঁজুন",
|
||||
"searchPlugins": "প্লাগইন খুঁজুন",
|
||||
"allCategories": "সব",
|
||||
"nothingMatches": "কিছুই মিলছে না।",
|
||||
"noneInstalled": "এখনো কোনো প্লাগইন ইনস্টল করা হয়নি। কিছু যোগ করতে ব্রাউজ করুন।",
|
||||
"nothingHere": "এখানে কিছু নেই।",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "ডকুমেন্টেশন",
|
||||
"envVars": "এনভায়রনমেন্ট ভেরিয়েবল",
|
||||
"envRequired": "প্রয়োজনীয়",
|
||||
"envDefault": "ডিফল্ট: {{value}}"
|
||||
"envDefault": "ডিফল্ট: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "লেআউট",
|
||||
"themes": "থিম",
|
||||
"tabs": "ট্যাব",
|
||||
"panels": "সাইডবার প্যানেল",
|
||||
"dashboardCards": "ড্যাশবোর্ড কার্ড",
|
||||
"protocols": "কানেকশন টাইপ",
|
||||
"auth": "সাইন ইন পদ্ধতি",
|
||||
"actions": "অ্যাকশন",
|
||||
"hostCapability": "হোস্ট সেটিংস"
|
||||
},
|
||||
"filters": {
|
||||
"type": "টাইপ",
|
||||
"allTypes": "সব টাইপ",
|
||||
"category": "ক্যাটাগরি",
|
||||
"allCategories": "সব ক্যাটাগরি",
|
||||
"results_one": "{{count}} প্লাগইন",
|
||||
"results_other": "{{count}} প্লাগইন",
|
||||
"remove": "ফিল্টার {{name}} সরান",
|
||||
"clear": "ফিল্টার মুছুন",
|
||||
"button": "ফিল্টার",
|
||||
"buttonCount": "ফিল্টার ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{total}} এর মধ্যে {{from}}-{{to}}",
|
||||
"page": "{{pages}} এর মধ্যে পৃষ্ঠা {{page}}",
|
||||
"previous": "পূর্ববর্তী পৃষ্ঠা",
|
||||
"next": "পরবর্তী পৃষ্ঠা",
|
||||
"perPage": "প্রতি পৃষ্ঠায় {{count}}",
|
||||
"perPageLabel": "প্রতি পৃষ্ঠায় প্লাগইন"
|
||||
},
|
||||
"showUnsupportedHint": "এগুলো তালিকাভুক্ত আছে কিন্তু এই ভার্সনে এখনও কোনো রিলিজ চলে না। এগুলো ইনস্টল করতে Termix আপডেট করুন।",
|
||||
"unsupported": "নতুন Termix প্রয়োজন",
|
||||
"unsupportedHint": "এই প্লাগইনের কোনো রিলিজ এই Termix ভার্সনে চলে না। এটি ইনস্টল করতে Termix আপডেট করুন।",
|
||||
"needsTermix": "Termix {{range}} প্রয়োজন",
|
||||
"showUnsupported": "অসমর্থিত দেখান ({{count}})",
|
||||
"showMore": "{{count}} আরও দেখান ({{total}} বাকি)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "কোনো তথ্য নেই",
|
||||
"filter": "ফিল্টার..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} মিনিট আগে",
|
||||
"minutesAgo_other": "{{count}} মিনিট আগে",
|
||||
"hoursAgo_one": "{{count}} ঘণ্টা আগে",
|
||||
"hoursAgo_other": "{{count}} ঘণ্টা আগে",
|
||||
"pending_one": "{{count}} পরিবর্তন সিঙ্ক হওয়ার অপেক্ষায়",
|
||||
"pending_other": "{{count}} পরিবর্তন সিঙ্ক হওয়ার অপেক্ষায়",
|
||||
"proxy": {
|
||||
"headersTitle": "অতিরিক্ত হেডার",
|
||||
"headersHint": "সার্ভারে প্রতিটি অনুরোধের সাথে পাঠানো হয়, যেমন একটি Cloudflare Access সার্ভিস টোকেন।",
|
||||
"headerName": "হেডারের নাম",
|
||||
"headerValue": "মান",
|
||||
"savedValue": "সংরক্ষিত, পরিবর্তন করতে টাইপ করুন",
|
||||
"addHeader": "হেডার যোগ করুন",
|
||||
"removeHeader": "হেডার সরান",
|
||||
"basicAuthTitle": "ইউজারনেম এবং পাসওয়ার্ড",
|
||||
"basicAuthHint": "একটি প্রক্সির জন্য যা Termix-এর আগে ইউজারনেম এবং পাসওয়ার্ড চায়।",
|
||||
"username": "ইউজারনেম",
|
||||
"password": "পাসওয়ার্ড",
|
||||
"allowInvalidCertificate": "সেলফ-সাইনড সার্টিফিকেটকে বিশ্বাস করুন",
|
||||
"allowInvalidCertificateHint": "শুধুমাত্র আপনার নিজস্ব সার্ভারের জন্য, যখন এর সার্টিফিকেট কোনো পরিচিত কর্তৃপক্ষ থেকে না আসে।"
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "এটি একটি ওয়েব ঠিকানার মতো দেখাচ্ছে না।",
|
||||
"unreachable": "সার্ভারে সংযোগ করা যাচ্ছে না। ঠিকানাটি এবং সার্ভারটি চালু আছে কিনা তা পরীক্ষা করুন।",
|
||||
"unreachableWithReason": "সার্ভারে সংযোগ করা যাচ্ছে না: {{reason}}",
|
||||
"tlsUntrusted": "সার্ভার সার্টিফিকেটটি বিশ্বস্ত নয়। যদি এটি আপনার নিজস্ব সার্ভার হয় এবং এতে সেলফ-সাইন্ড সার্টিফিকেট থাকে, তবে নিচের অপশনটি চালু করুন।",
|
||||
"basicAuthRequired": "সার্ভারের সামনে থাকা কোনো কিছু ব্যবহারকারীর নাম এবং পাসওয়ার্ড চাইছে। সেগুলো নিচে লিখুন।",
|
||||
"proxyLogin": "টার্মিক্সের পরিবর্তে একটি লগইন পেজ বা প্রক্সি উত্তর দিয়েছে। নিচে প্রয়োজনীয় হেডারগুলো যোগ করুন, অথবা ঠিকানাটি পরীক্ষা করুন।",
|
||||
"notTermix": "এই ঠিকানায় কোনো টার্মিক্স সার্ভার নেই। যদি এটি কোনো পাথে চলছে, তবে তা অন্তর্ভুক্ত করুন, যেমন https://example.com/termix।",
|
||||
"versionMismatch": "সেই সার্ভারে পুরনো টার্মিক্স চলছে। লিংক করতে এটি ২.৯ বা তার নতুনতর সংস্করণে আপডেট করুন।",
|
||||
"differentAccount": "আপনি একটি ভিন্ন অ্যাকাউন্টে সাইন ইন করেছেন। এই ডিভাইসটি যে অ্যাকাউন্টের সাথে লিংক করা আছে, সেটিতে সাইন ইন করুন, অথবা আগে আনলিংক করুন।"
|
||||
},
|
||||
"wizard": {
|
||||
"title": "একটি টার্মিক্স সার্ভারের সাথে লিংক করুন",
|
||||
"reloginTitle": "আবার সাইন ইন করুন",
|
||||
"savedServers": "সাম্প্রতিক সার্ভারগুলো",
|
||||
"removeServer": "তালিকা থেকে সরান",
|
||||
"serverDescription": "আপনার ব্রাউজারে টার্মিক্স খোলার জন্য যে ঠিকানাটি ব্যবহার করেন তা লিখুন।",
|
||||
"signinDescription": "{{url}} এ সাইন ইন করুন",
|
||||
"chooseDescription": "এই ডিভাইসে ইতিমধ্যে ডেটা আছে। এটি নিয়ে কী করা উচিত?",
|
||||
"finishingDescription": "এই ডিভাইসটি লিংক করা হচ্ছে।",
|
||||
"serverUrl": "সার্ভার ঠিকানা",
|
||||
"serverUrlHint": "উদাহরণস্বরূপ https://termix.example.com",
|
||||
"showProxySettings": "রিভার্স প্রক্সি সেটিংস",
|
||||
"hideProxySettings": "রিভার্স প্রক্সি সেটিংস লুকান",
|
||||
"continue": "চালিয়ে যান",
|
||||
"back": "পিছনে যান",
|
||||
"mergeTitle": "এটি আমার অ্যাকাউন্টে যোগ করুন",
|
||||
"mergeBody_one": "এই ডিভাইসের আইটেমটি আপনার অ্যাকাউন্টে যোগ করা হবে। আপনার অ্যাকাউন্টে ইতিমধ্যে থাকা আইটেমগুলো সার্ভারে তাদের অবস্থানেই থাকবে।",
|
||||
"mergeBody_other": "এই ডিভাইসের {{count}}টি আইটেম আপনার অ্যাকাউন্টে যোগ করা হবে। আপনার অ্যাকাউন্টে ইতিমধ্যে থাকা আইটেমগুলো সার্ভারে তাদের অবস্থানেই থাকবে।",
|
||||
"replaceTitle": "এটি আমার অ্যাকাউন্ট দিয়ে প্রতিস্থাপন করুন",
|
||||
"replaceBody_one": "এই ডিভাইসের আইটেমটি সরানো হবে, এবং এই ডিভাইসটি আপনার অ্যাকাউন্ট থেকে সবকিছু নেবে। শুধুমাত্র এই ডিভাইসে রাখা হোস্টগুলোই থাকবে।",
|
||||
"replaceBody_other": "এই ডিভাইসের {{count}}টি আইটেম সরানো হবে, এবং এই ডিভাইসটি আপনার অ্যাকাউন্ট থেকে সবকিছু নেবে। শুধুমাত্র এই ডিভাইসে রাখা হোস্টগুলোই থাকবে।",
|
||||
"link": "লিংক করুন",
|
||||
"linking": "লিংক করা হচ্ছে এবং প্রথম সিঙ্ক চালানো হচ্ছে...",
|
||||
"linked": "লিংক করা হয়েছে। আপনার ডেটা এখন সিঙ্ক হচ্ছে।",
|
||||
"signedInAgain": "সাইন ইন করা হয়েছে। সিঙ্ক আবার চলছে।"
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "হোস্ট",
|
||||
"sshCredentials": "ক্রেডেনশিয়াল",
|
||||
"sshFolders": "ফোল্ডার",
|
||||
"userPreferences": "পছন্দ",
|
||||
"pluginUserSettings": "প্লাগইন সেটিংস",
|
||||
"sharedHosts": "আপনার সাথে শেয়ার করা হোস্ট",
|
||||
"sharedCredentials": "আপনার সাথে শেয়ার করা ক্রেডেনশিয়াল",
|
||||
"vaultProfiles": "Vault প্রোফাইল",
|
||||
"snippetFolders": "স্নিপেট ফোল্ডার",
|
||||
"snippets": "স্নিপেট",
|
||||
"dashboardServiceLinks": "সার্ভিস লিঙ্ক",
|
||||
"homepageItems": "হোমপেজ আইটেম",
|
||||
"networkTopology": "নেটওয়ার্ক ম্যাপ",
|
||||
"workspaces": "ওয়ার্কস্পেস",
|
||||
"hostDefaults": "হোস্ট ডিফল্ট",
|
||||
"hostDefaultsAdmin": "সার্ভার হোস্ট ডিফল্ট",
|
||||
"aiProviders": "AI প্রোভাইডার",
|
||||
"homepageLayouts": "হোমপেজ লেআউট",
|
||||
"accountProfile": "অ্যাকাউন্ট প্রোফাইল"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "ফোল্ডার {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "গ্রিড",
|
||||
"listView": "তালিকা",
|
||||
"compactRows": "কমপ্যাক্ট সারি",
|
||||
"comfortableRows": "আরামদায়ক সারি"
|
||||
"comfortableRows": "আরামদায়ক সারি",
|
||||
"columns": {
|
||||
"title": "কলাম",
|
||||
"auto": "স্বয়ংক্রিয়",
|
||||
"count": "{{count}} প্রশস্ত"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "সংরক্ষিত হয়েছে। এটি প্রতিস্থাপন করতে টাইপ করুন।"
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "No s'han pogut canviar alguns complements. Pots corregir-ho més tard des de la pestanya de complements. Prem Següent per continuar.",
|
||||
"pluginsApplyFailed": "No s'han pogut desar les teves eleccions. Torna-ho a provar o continua i canvia-les més tard des de la pestanya de complements.",
|
||||
"pluginsLoadFailed": "No s'ha pogut carregar la llista de complements. Pots triar complements més tard des de la pestanya de complements.",
|
||||
"presetTitle": "Quant de contingut vols a la pantalla?",
|
||||
"presetIntro": "Tria quant de contingut es mostra a la pantalla.",
|
||||
"presetChangeLater": "Pots canviar els predefinits o qualsevol configuració individual més tard a Configuració, sota Interfície.",
|
||||
"appearanceTitle": "Fes-ho teu",
|
||||
"appearanceIntro": "Tria un tema, un color d'accentuació, una tipografia i la teva llengua. Els canvis es mostren immediatament i els pots modificar més tard a Configuració.",
|
||||
"securityTitle": "Seguretat del teu compte",
|
||||
"securityIntro": "Afegeix una clau de pas o una aplicació d'autenticació al teu compte. També pots fer-ho més tard a Configuració, sota Seguretat.",
|
||||
"desktopTitle": "Com vols fer servir Termix?",
|
||||
"desktopBody": "Pots canviar-ho en qualsevol moment des de Sincronització a la barra lateral.",
|
||||
"desktopLocalTitle": "Només en aquest dispositiu",
|
||||
"desktopLocalBody": "Tot s'emmagatzema aquí. No cal configurar res.",
|
||||
"desktopLinkTitle": "Amb el meu servidor Termix",
|
||||
"desktopLinkBody": "Inicia la sessió al teu servidor per fer servir els mateixos amfitrions i configuracions en tots els dispositius.",
|
||||
"desktopLinked": "Vinculat a {{server}}",
|
||||
"pluginsDocsLink": "Llegeix sobre cadascun"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} està llest per instal·lar-se",
|
||||
"readyHint": "S'instal·larà la propera vegada que reiniciïs Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Mode segur",
|
||||
"description": "Només s'estan executant els complements de disseny i tema. Reinicia el servidor sense TERMIX_SAFE_MODE per activar la resta."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Tanca el panell",
|
||||
"moveSide": "Mou el panell",
|
||||
"resize": "Redimensiona el panell"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Inici",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Amfitrions",
|
||||
"credentials": "Credencials",
|
||||
"connections": "Connexions",
|
||||
"sync": "Sincronitzar",
|
||||
"reconnectDisconnectedTerminals": "Tornar a connectar tots els terminals desconnectats",
|
||||
"reconnectingTerminals_one": "Tornant a connectar {{count}} terminal",
|
||||
"reconnectingTerminals_many": "Tornant a connectar {{count}} terminals",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Tornar-ho a provar",
|
||||
"refresh": "Actualitzar",
|
||||
"optional": "Opcional",
|
||||
"downloadSample": "Descarregar l'exemple",
|
||||
"failedToDeleteHost": "No s'ha pogut eliminar {{name}}",
|
||||
"importSkipExisting": "Importar (ometre els existents)",
|
||||
"importSSHConfig": "Importar des de la configuració SSH",
|
||||
"connectionDetails": "Detalls de la connexió",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Sense carpeta)",
|
||||
"deleteSelected": "Suprimeix",
|
||||
"exitSelection": "Sorteix de la selecció",
|
||||
"importSkip": "Importa (omet els existents)",
|
||||
"importOverwrite": "Importa (sobreescriu)",
|
||||
"collapseBtn": "Replega",
|
||||
"importExportBtn": "Importa / Exporta",
|
||||
"hostStatusesRefreshed": "Estat dels hosts actualitzat",
|
||||
"failedToRefreshHosts": "No s'han pogut actualitzar els hosts",
|
||||
"movedHostTo": "S'ha mogut {{host}} a «{{folder}}»",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_many": "Voleu suprimir «{{name}}» i els seus {{count}} amfitrions? Aquesta acció no es pot desfer.",
|
||||
"deleteFolderConfirm_other": "Voleu suprimir «{{name}}» i el seu {{count}} amfitrió? Aquesta acció no es pot desfer.",
|
||||
"failedToMoveHosts": "No s'han pogut moure els amfitrions",
|
||||
"managedBanner": "Aquest host està gestionat per {{plugin}}. Fes-hi els canvis allà. Encara pots fixar-lo i reordenar-lo.",
|
||||
"managedTooltip": "Gestionat per {{plugin}}",
|
||||
"addBlocked": "Els hosts estan gestionats per {{plugin}}, per tant no es poden afegir hosts nous aquí.",
|
||||
"failedToReorder": "No s'ha pogut reordenar",
|
||||
"expandAll": "Expandeix totes les carpetes",
|
||||
"collapseAll": "Redueix totes les carpetes",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Afegeix una credencial",
|
||||
"checkingHostStatuses": "Comprovant l'estat dels hosts...",
|
||||
"pinnedSection": "Fixats",
|
||||
"hostsExported": "Hosts exportats correctament",
|
||||
"export": {
|
||||
"menuItem": "Exporta...",
|
||||
"title": "Exporta hosts",
|
||||
"scope": "Àmbit",
|
||||
"scopeAll": "Tots",
|
||||
"scopeSelected": "Seleccionats",
|
||||
"searchHosts": "Cerca hosts...",
|
||||
"include": "Inclou",
|
||||
"groupConnection": "Connexió",
|
||||
"groupCredentials": "Credencials",
|
||||
"groupNotes": "Notes",
|
||||
"groupTags": "Etiquetes i fixat",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Hosts de salt",
|
||||
"groupFeatureFlags": "Configuració dels plugins",
|
||||
"groupAdvanced": "Configuració avançada",
|
||||
"preview": "Vista prèvia",
|
||||
"moreHosts_one": "... {{count}} amfitrió més",
|
||||
"moreHosts_many": "... {{count}} amfitrions més",
|
||||
"moreHosts_other": "... {{count}} amfitrió més",
|
||||
"summary": "{{selected}} de {{total}} hosts",
|
||||
"credentialsIncluded": "credencials incloses",
|
||||
"credentialsExcluded": "credencials excloses",
|
||||
"noneSelected": "Cap host seleccionat",
|
||||
"cancel": "Cancel·la",
|
||||
"confirm": "Exporta",
|
||||
"fetchFailed": "No s'han pogut carregar els hosts per a l'exportació",
|
||||
"bulkButton": "Exporta"
|
||||
},
|
||||
"sampleDownloaded": "Fitxer d'exemple descarregat",
|
||||
"failedToDeleteCredential2": "No s'ha pogut eliminar la credencial",
|
||||
"noFolderOption": "(Sense carpeta)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Actualitzar host",
|
||||
"editorAdd": "Afegir host",
|
||||
"speedSearch": "Cercar hosts. Fletxes per seleccionar, Retorn per connectar, Esc per tancar",
|
||||
"speedSearchList": "Llista d'hosts. Escriviu o premeu / per cercar.",
|
||||
"importNoHosts": "No s'han trobat hosts al fitxer",
|
||||
"importTooMany": "Podeu importar fins a {{max}} hosts alhora",
|
||||
"importSummary": "Importació completada: {{imported}} importats, {{updated}} actualitzats, {{failed}} fallits",
|
||||
"importHostsFailed": "No s'han pogut importar els hosts"
|
||||
"speedSearchList": "Llista d'hosts. Escriviu o premeu / per cercar."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Pantalla dividida",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} usuari",
|
||||
"usersCount_many": "{{count}} usuaris",
|
||||
"rolesCount_one": "{{count}} rol",
|
||||
"rolesCount_many": "{{count}} rols",
|
||||
"apiKeysCount_one": "{{count}} clau",
|
||||
"apiKeysCount_many": "{{count}} claus",
|
||||
"sessionsActive_one": "{{count}} actiu",
|
||||
"sessionsActive_many": "{{count}} actius",
|
||||
"hostsCount_one": "{{count}} amfitrió",
|
||||
"hostsCount_many": "{{count}} amfitrions",
|
||||
"hostsCount_other": "{{count}} amfitrió",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} credencial",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} permís",
|
||||
"count_many": "{{count}} permisos",
|
||||
"groups": {
|
||||
"hosts": "Amfitrions",
|
||||
"credentials": "Credencials",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Canvia la font de la interfície de l'aplicació. Els perfils de terminal conserven la seva pròpia configuració de font.",
|
||||
"accentColorLabel": "Color d'accent",
|
||||
"apiKeyCount_one": "{{count}} clau",
|
||||
"apiKeyCount_many": "{{count}} claus",
|
||||
"colorPickerTooltip": "Obre el selector de color",
|
||||
"themeSystem": "Sistema",
|
||||
"themeLight": "Clar",
|
||||
"themeDark": "Fosc",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Fosc"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Com s'organitza tota l'aplicació. Els temes i els dissenys provenen de connectors.",
|
||||
"defaultsLabel": "Predeterminat per a tothom",
|
||||
"defaultsHint": "El que veuran les persones fins que triïn el seu propi disseny o tema.",
|
||||
"followDefault": "Utilitza el predeterminat",
|
||||
"defaultSaved": "Aparença predeterminada desada",
|
||||
"saveFailed": "No s'ha pogut desar l'aparença",
|
||||
"repair": {
|
||||
"title": "No s'ha pogut mostrar aquest disseny",
|
||||
"safeTitle": "Mode segur",
|
||||
"layout": "Disseny",
|
||||
"plugin": "Connector",
|
||||
"reason": "Motiu",
|
||||
"error": "Error",
|
||||
"noError": "No hi ha missatge d'error.",
|
||||
"copy": "Copia",
|
||||
"copied": "Copiat",
|
||||
"copyFailed": "No s'han pogut copiar els detalls",
|
||||
"retry": "Torna-ho a provar",
|
||||
"reset": "Restableix l'aparença predeterminada",
|
||||
"resetEveryone": "Restableix el predeterminat per a tothom",
|
||||
"update": "Actualitza {{name}} a {{version}}",
|
||||
"disable": "Desactiva {{name}}",
|
||||
"enable": "Activar {{name}}",
|
||||
"startAgain": "Reiniciar {{name}}",
|
||||
"install": "Cerca dissenys i temes",
|
||||
"installTitle": "Disseny i temes",
|
||||
"installButton": "Instal·la",
|
||||
"nothingToInstall": "Actualment no hi ha altres dissenys o temes disponibles.",
|
||||
"registryUnreachable": "No s'ha pogut accedir al registre de connectors.",
|
||||
"askAdmin": "Demana a un administrador que actualitzi o corregeixi aquest disseny. A continuació pots canviar a un altre disseny o tema per a tu mateix.",
|
||||
"switchLayout": "Canvia el disseny",
|
||||
"switchTheme": "Canvia el tema",
|
||||
"saveFailed": "No s'ha pogut desar la teva elecció",
|
||||
"reasons": {
|
||||
"safe-url": "L'adreça ha sol·licitat el mode segur. Tria un disseny a continuació o elimina ?safe-layout=1 de l'adreça.",
|
||||
"safe-env": "El servidor s'ha iniciat amb TERMIX_SAFE_LAYOUT, per tant tothom veurà aquesta pantalla fins que s'elimini.",
|
||||
"missing": "Cap connector instal·lat proporciona aquest disseny.",
|
||||
"disabled": "El connector que proporciona aquest disseny està desactivat.",
|
||||
"blocked": "El connector que proporciona aquest disseny està esperant alguna cosa que necessita.",
|
||||
"incompatible": "El connector que proporciona aquest disseny no funciona amb aquesta versió de Termix.",
|
||||
"failed": "El disseny no s'ha pogut iniciar.",
|
||||
"crashed": "El disseny s'ha bloquejat dues vegades mentre dibuixava l'aplicació."
|
||||
},
|
||||
"noLayout": "No s'ha configurat cap disseny",
|
||||
"restore": "Restaura {{name}} inclòs",
|
||||
"restoreFailed": "No s'ha pogut restaurar la còpia inclosa"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Gestionar l'inici de sessió",
|
||||
"consequence": "Pot afegir un mètode d'inici de sessió, un segon factor o un tipus d'inici de sessió SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Estableix les regles d'inici de sessió",
|
||||
"consequence": "Pot tancar la sessió de les persones quan estan inactives, limitar la durada de la sessió, desactivar l'opció «Recorda'm» i exigir un segon factor."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Tria com s'hi accedeix als hosts",
|
||||
"consequence": "Pot transportar la connexió SSH a un host a través de la seva pròpia ruta, de manera que veu tot el que s'envia i rep d'aquests hosts, incloses les contrasenyes."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Executa la sincronització",
|
||||
"consequence": "Pot respondre a totes les sol·licituds de sincronització, de manera que veu les dades que sincronitzen els dispositius i els servidors."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Gestionar certificats",
|
||||
"consequence": "Pot substituir el certificat que Termix serveix per HTTPS i respondre a les comprovacions de domini de les autoritats de certificació."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Accedir a dispositius sèrie i USB",
|
||||
"consequence": "Pot obrir un port sèrie físic a l'ordinador que executa Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Exporta els hosts amb els seus secrets",
|
||||
"consequence": "Pot llegir els teus hosts en tota la seva extensió, incloses les contrasenyes i les claus desades, i distribuir-los. Tota exportació s'escriu al registre d'auditoria."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Crear i modificar servidors",
|
||||
"consequence": "Pot afegir servidors i editar els que ja teniu."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Llegir el registre d'auditoria",
|
||||
"consequence": "Pot veure qui ha fet què i quan."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Comprova si els ports responen",
|
||||
"consequence": "Pot obrir una connexió senzilla a qualsevol adreça des del servidor, per veure si és accessible."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Proporciona l'estat de l'host",
|
||||
"consequence": "Esdevé la font dels punts en línia i fora de línia per a cada host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Emmagatzema l'activitat recent",
|
||||
"consequence": "Esdevé l'emmagatzematge de la llista d'activitat recent de cada usuari."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Gestionar els amfitrions com a només lectura",
|
||||
"consequence": "Els amfitrions que gestiona no es poden editar, suprimir ni tornar a compartir per ningú més."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Obrir finestres d'escriptori",
|
||||
"consequence": "Només a l'aplicació d'escriptori de Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Utilitzar aquest ordinador",
|
||||
"consequence": "Pot llegir i modificar fitxers, executar un shell i obrir ports locals en aquest ordinador. Només a l'aplicació d'escriptori de Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Actuar com a altres usuaris",
|
||||
"consequence": "Executa tasques en segon pla amb l'accés d'un altre usuari, com ara feines programades. Cada ús s'escriu al registre d'auditoria."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Afegir les seves pròpies pantalles",
|
||||
"consequence": "Pestanyes, panells i configuració que pots amagar més endavant."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Substituir la disposició completa de l'aplicació",
|
||||
"consequence": "Quan s'escull, el seu codi dibuixa cada pantalla, inclosos els terminals i la configuració."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Afegir temes de colors",
|
||||
"consequence": "Només colors i estils. No s'executa cap codi per a un tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Desactivat",
|
||||
"failed": "Aturat inesperadament",
|
||||
"blocked": "Esperant un altre plugin",
|
||||
"server": "S'executa al teu servidor"
|
||||
"server": "S'executa al teu servidor",
|
||||
"safeMode": "Desactivat en mode segur"
|
||||
},
|
||||
"groups": {
|
||||
"running": "En execució",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Actualitzats recentment",
|
||||
"category": "Categoria"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Columnes",
|
||||
"auto": "Automàtic",
|
||||
"count": "{{count}} d'amplada"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nom",
|
||||
"description": "Descripció",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "No s'han pogut desar les opcions de {{name}}: {{error}}",
|
||||
"deleteData": "No s'han pogut eliminar les dades de {{name}}: {{error}}",
|
||||
"managedByServer": "Aquest escriptori està enllaçat a un servidor, que decideix els seus complements.",
|
||||
"defaultLook": "{{name}} és l'aspecte predeterminat, per la qual cosa es pot desactivar o substituir, però no desinstal·lar.",
|
||||
"hasDependents": "{{name}} és necessari per a {{list}}. Desactiva'ls o desinstal·la'ls primer.",
|
||||
"missingDependencies": "{{name}} necessita {{list}}, que no està instal·lat.",
|
||||
"consentChanged": "El que demana aquest complement ha canviat des que ho vas consultar. Revisa la llista de nou.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Sense accés als teus servidors",
|
||||
"searchInstalled": "Cercar entre els instal·lats",
|
||||
"searchPlugins": "Cercar complements",
|
||||
"allCategories": "Tots",
|
||||
"nothingMatches": "Res no coincideix amb la cerca.",
|
||||
"noneInstalled": "Encara no tens cap complement instal·lat. Navega per afegir-ne alguns.",
|
||||
"nothingHere": "No hi ha res aquí.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Documentació",
|
||||
"envVars": "Variables d'entorn",
|
||||
"envRequired": "Obligatori",
|
||||
"envDefault": "Per defecte: {{value}}"
|
||||
"envDefault": "Per defecte: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Disposicions",
|
||||
"themes": "Temes",
|
||||
"tabs": "Pestanyes",
|
||||
"panels": "Panells de la barra lateral",
|
||||
"dashboardCards": "Targetes del tauler de control",
|
||||
"protocols": "Tipus de connexió",
|
||||
"auth": "Mètodes d'inici de sessió",
|
||||
"actions": "Accions",
|
||||
"hostCapability": "Configuració de l'amfitrió"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tipus",
|
||||
"allTypes": "Tots els tipus",
|
||||
"category": "Categoria",
|
||||
"allCategories": "Totes les categories",
|
||||
"results_one": "{{count}} complement",
|
||||
"results_many": "{{count}} complements",
|
||||
"results_other": "{{count}} complements",
|
||||
"remove": "Eliminar el filtre {{name}}",
|
||||
"clear": "Esborrar filtres",
|
||||
"button": "Filtres",
|
||||
"buttonCount": "Filtres ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} de {{total}}",
|
||||
"page": "Pàgina {{page}} de {{pages}}",
|
||||
"previous": "Pàgina anterior",
|
||||
"next": "Pàgina següent",
|
||||
"perPage": "{{count}} per pàgina",
|
||||
"perPageLabel": "Complements per pàgina"
|
||||
},
|
||||
"showUnsupportedHint": "Aquests es llisten, però encara no hi ha cap versió que s'executi en aquesta versió. Actualitza Termix per instal·lar-los.",
|
||||
"unsupported": "Cal una versió més recent de Termix",
|
||||
"unsupportedHint": "Cap versió d'aquest complement s'executa en aquesta versió de Termix. Actualitza Termix per instal·lar-lo.",
|
||||
"needsTermix": "Cal Termix {{range}}",
|
||||
"showUnsupported": "Mostrar els no compatibles ({{count}})",
|
||||
"showMore": "Mostrar {{count}} més ({{total}} restants)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Sense dades",
|
||||
"filter": "Filtra..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "fa {{count}} minut",
|
||||
"minutesAgo_many": "fa {{count}} minuts",
|
||||
"minutesAgo_other": "fa {{count}} minuts",
|
||||
"hoursAgo_one": "fa {{count}} hora",
|
||||
"hoursAgo_many": "fa {{count}} hores",
|
||||
"hoursAgo_other": "fa {{count}} hores",
|
||||
"pending_one": "{{count}} canvi pendent de sincronitzar",
|
||||
"pending_many": "{{count}} canvis pendents de sincronitzar",
|
||||
"pending_other": "{{count}} canvis pendents de sincronitzar",
|
||||
"proxy": {
|
||||
"headersTitle": "Encapçalaments addicionals",
|
||||
"headersHint": "S'envien amb cada sol·licitud al servidor, per exemple, un testimoni de servei de Cloudflare Access.",
|
||||
"headerName": "Nom de l'encapçalament",
|
||||
"headerValue": "Valor",
|
||||
"savedValue": "Desat, escriu per canviar",
|
||||
"addHeader": "Afegeix encapçalament",
|
||||
"removeHeader": "Elimina encapçalament",
|
||||
"basicAuthTitle": "Nom d'usuari i contrasenya",
|
||||
"basicAuthHint": "Per a un proxy que demana un nom d'usuari i contrasenya abans de Termix.",
|
||||
"username": "Nom d'usuari",
|
||||
"password": "Contrasenya",
|
||||
"allowInvalidCertificate": "Confia en un certificat autofirmat",
|
||||
"allowInvalidCertificateHint": "Només per al teu propi servidor, quan el seu certificat no prové d'una autoritat coneguda."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Això no sembla una adreça web.",
|
||||
"unreachable": "No s'ha pogut connectar al servidor. Comproveu l'adreça i que el servidor estigui en funcionament.",
|
||||
"unreachableWithReason": "No s'ha pogut connectar al servidor: {{reason}}",
|
||||
"tlsUntrusted": "El certificat del servidor no és de confiança. Si es tracta del vostre propi servidor amb un certificat autofirmat, activeu l'opció següent.",
|
||||
"basicAuthRequired": "Alguna cosa davant del servidor demana un nom d'usuari i una contrasenya. Introduïu-los a continuació.",
|
||||
"proxyLogin": "Una pàgina d'inici de sessió o un proxy ha respost en lloc de Termix. Afegiu els encapçalaments que necessita a continuació o comproveu l'adreça.",
|
||||
"notTermix": "No hi ha cap servidor Termix en aquesta adreça. Si s'executa en una ruta, incloeu-la, com ara https://example.com/termix.",
|
||||
"versionMismatch": "Aquest servidor executa una versió antiga de Termix. Actualitzeu-lo a la 2.9 o superior per enllaçar-lo.",
|
||||
"differentAccount": "Heu iniciat sessió en un compte diferent. Inicieu sessió en el compte amb què està enllaçat aquest dispositiu o desenllaceu-lo primer."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Enllaçar a un servidor Termix",
|
||||
"reloginTitle": "Inicieu sessió de nou",
|
||||
"savedServers": "Servidors recents",
|
||||
"removeServer": "Eliminar de la llista",
|
||||
"serverDescription": "Introduïu l'adreça que utilitzeu per obrir Termix al vostre navegador.",
|
||||
"signinDescription": "Inicieu sessió a {{url}}",
|
||||
"chooseDescription": "Aquest dispositiu ja té dades. Què s'ha de fer amb elles?",
|
||||
"finishingDescription": "Vinculant aquest dispositiu.",
|
||||
"serverUrl": "Adreça del servidor",
|
||||
"serverUrlHint": "Per exemple, https://termix.example.com",
|
||||
"showProxySettings": "Configuració del proxy invers",
|
||||
"hideProxySettings": "Amaga la configuració del proxy invers",
|
||||
"continue": "Continua",
|
||||
"back": "Enrere",
|
||||
"mergeTitle": "Afegeix-ho al meu compte",
|
||||
"mergeBody_one": "L'element d'aquest dispositiu s'afegeix al teu compte. Els elements que el teu compte ja té es mantenen tal com són al servidor.",
|
||||
"mergeBody_many": "Els {{count}} elements d'aquest dispositiu s'afegeixen al teu compte. Els elements que el teu compte ja té es mantenen tal com són al servidor.",
|
||||
"mergeBody_other": "Els {{count}} elements d'aquest dispositiu s'afegeixen al teu compte. Els elements que el teu compte ja té es mantenen tal com són al servidor.",
|
||||
"replaceTitle": "Substitueix-ho pel meu compte",
|
||||
"replaceBody_one": "L'element d'aquest dispositiu s'elimina i aquest dispositiu pren tot del teu compte. Només es mantenen els amfitrions que es conserven només en aquest dispositiu.",
|
||||
"replaceBody_many": "Els {{count}} elements d'aquest dispositiu s'eliminen i aquest dispositiu pren tot del teu compte. Només es mantenen els amfitrions que es conserven només en aquest dispositiu.",
|
||||
"replaceBody_other": "Els {{count}} elements d'aquest dispositiu s'eliminen i aquest dispositiu pren tot del teu compte. Només es mantenen els amfitrions que es conserven només en aquest dispositiu.",
|
||||
"link": "Vincula",
|
||||
"linking": "Vinculant i executant la primera sincronització...",
|
||||
"linked": "Vinculat. Les teves dades s'estan sincronitzant ara.",
|
||||
"signedInAgain": "Iniciat la sessió. La sincronització s'ha tornat a executar."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Amfitrions",
|
||||
"sshCredentials": "Credencials",
|
||||
"sshFolders": "Carpetes",
|
||||
"userPreferences": "Preferències",
|
||||
"pluginUserSettings": "Configuració del complement",
|
||||
"sharedHosts": "Amfitrions compartits amb tu",
|
||||
"sharedCredentials": "Credencials compartides amb tu",
|
||||
"vaultProfiles": "Perfils de Vault",
|
||||
"snippetFolders": "Carpetes de fragments",
|
||||
"snippets": "Fragments",
|
||||
"dashboardServiceLinks": "Enllaços de servei",
|
||||
"homepageItems": "Elements de la pàgina d'inici",
|
||||
"networkTopology": "Mapa de xarxa",
|
||||
"workspaces": "Espais de treball",
|
||||
"hostDefaults": "Valors predeterminats de l'amfitrió",
|
||||
"hostDefaultsAdmin": "Valors predeterminats de l'amfitrió del servidor",
|
||||
"aiProviders": "Proveïdors d'IA",
|
||||
"homepageLayouts": "Disseny de la pàgina d'inici",
|
||||
"accountProfile": "Perfil del compte"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Carpeta {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Graella",
|
||||
"listView": "Llista",
|
||||
"compactRows": "Files compactes",
|
||||
"comfortableRows": "Files còmodes"
|
||||
"comfortableRows": "Files còmodes",
|
||||
"columns": {
|
||||
"title": "Columnes",
|
||||
"auto": "Automàtic",
|
||||
"count": "{{count}} d'ample"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Desat. Escriu per substituir-lo."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Některé pluginy se nepodařilo změnit. Opravíte je později ze záložky Pluginy. Stiskněte Další pro pokračování.",
|
||||
"pluginsApplyFailed": "Vaše volby se nepodařilo uložit. Zkuste to znovu, nebo pokračujte a změňte je později ze záložky Pluginy.",
|
||||
"pluginsLoadFailed": "Seznam pluginů se nepodařilo načíst. Pluginy můžete vybrat později ze záložky Pluginy.",
|
||||
"presetTitle": "Kolik obsahu chcete na obrazovce?",
|
||||
"presetIntro": "Vyberte, kolik obsahu se zobrazí na obrazovce.",
|
||||
"presetChangeLater": "Přepínání předvoleb nebo změnu jednotlivých nastavení můžete provést později v Nastavení pod rozbalovací nabídkou Rozhraní.",
|
||||
"appearanceTitle": "Přizpůsobte si vzhled",
|
||||
"appearanceIntro": "Vyberte si motiv, akcentní barvu, písmo a jazyk. Změny se projeví okamžitě a později je můžete upravit v Nastavení.",
|
||||
"securityTitle": "Zabezpečte svůj účet",
|
||||
"securityIntro": "Přidejte do svého účtu passkey nebo aplikaci pro ověřování. Toto můžete provést také později v Nastavení pod Bezpečnost.",
|
||||
"desktopTitle": "Jak chcete Termix používat?",
|
||||
"desktopBody": "Toto můžete kdykoli změnit v Synchronizace v postranním panelu.",
|
||||
"desktopLocalTitle": "Pouze na tomto zařízení",
|
||||
"desktopLocalBody": "Vše je uloženo zde. Nic k nastavování.",
|
||||
"desktopLinkTitle": "S mým serverem Termix",
|
||||
"desktopLinkBody": "Přihlaste se ke svému serveru pro použití stejných hostitelů a nastavení na všech zařízeních.",
|
||||
"desktopLinked": "Propojeno s {{server}}",
|
||||
"pluginsDocsLink": "Přečtěte si o každém z nich"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} je připraven k instalaci",
|
||||
"readyHint": "Nainstaluje se při příštím restartu Termixu."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Režim nouzového spuštění",
|
||||
"description": "Spouštějí se pouze zásuvné moduly rozložení a motivu. Restartujte server bez proměnné TERMIX_SAFE_MODE, abyste znovu povolili zbytek."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Zavřít panel",
|
||||
"moveSide": "Přesunout panel",
|
||||
"resize": "Změnit velikost panelu"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Domů",
|
||||
"terminal": "Terminál",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hostitelé",
|
||||
"credentials": "Přihlašovací údaje",
|
||||
"connections": "Připojení",
|
||||
"sync": "Synchronizace",
|
||||
"reconnectDisconnectedTerminals": "Znovu připojit všechny odpojené terminály",
|
||||
"reconnectingTerminals_one": "Znovu se připojuji k {{count}} terminálu",
|
||||
"reconnectingTerminals_few": "Znovu se připojuji k {{count}} terminálům",
|
||||
@@ -285,10 +281,7 @@
|
||||
"retry": "Zkusit znovu",
|
||||
"refresh": "Obnovit",
|
||||
"optional": "Volitelné",
|
||||
"downloadSample": "Stáhnout vzor",
|
||||
"failedToDeleteHost": "Nepodařilo se smazat {{name}}",
|
||||
"importSkipExisting": "Importovat (přeskočit existující)",
|
||||
"importSSHConfig": "Importovat ze SSH konfigurace",
|
||||
"connectionDetails": "Podrobnosti o připojení",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -509,10 +502,7 @@
|
||||
"noFolder": "(Žádná složka)",
|
||||
"deleteSelected": "Smazat",
|
||||
"exitSelection": "Ukončit výběr",
|
||||
"importSkip": "Importovat (přeskočit existující)",
|
||||
"importOverwrite": "Importovat (přepsat)",
|
||||
"collapseBtn": "Sbalit",
|
||||
"importExportBtn": "Import / Export",
|
||||
"hostStatusesRefreshed": "Stavy hostitelů obnoveny",
|
||||
"failedToRefreshHosts": "Nepodařilo se obnovit hostitele",
|
||||
"movedHostTo": "Přesunuto {{host}} do \"{{folder}}\"",
|
||||
@@ -571,6 +561,9 @@
|
||||
"deleteFolderConfirm_many": "Smazat \"{{name}}\" a jeho {{count}} hostů? Tuto akci nelze vrátit zpět.",
|
||||
"deleteFolderConfirm_other": "Smazat \"{{name}}\" a jeho {{count}} hostů? Tuto akci nelze vrátit zpět.",
|
||||
"failedToMoveHosts": "Nepodařilo se přesunout hosty",
|
||||
"managedBanner": "Tento hostitel je spravován prostřednictvím {{plugin}}. Změňte jej tam. Stále jej můžete připnout a změnit pořadí.",
|
||||
"managedTooltip": "Spravováno prostřednictvím {{plugin}}",
|
||||
"addBlocked": "Hostitelé jsou spravováni prostřednictvím {{plugin}}, takže zde nelze přidávat nové hostitele.",
|
||||
"failedToReorder": "Nepodařilo se změnit pořadí",
|
||||
"expandAll": "Rozbalit všechny složky",
|
||||
"collapseAll": "Sbalit všechny složky",
|
||||
@@ -683,37 +676,6 @@
|
||||
"addCredentialBtn2": "Přidat přihlašovací údaje",
|
||||
"checkingHostStatuses": "Kontrola stavů hostitelů...",
|
||||
"pinnedSection": "Připnuté",
|
||||
"hostsExported": "Hostitelé úspěšně exportováni",
|
||||
"export": {
|
||||
"menuItem": "Exportovat...",
|
||||
"title": "Export hostitelů",
|
||||
"scope": "Rozsah",
|
||||
"scopeAll": "Všechny",
|
||||
"scopeSelected": "Vybrané",
|
||||
"searchHosts": "Hledat hostitele...",
|
||||
"include": "Zahrnout",
|
||||
"groupConnection": "Připojení",
|
||||
"groupCredentials": "Přihlašovací údaje",
|
||||
"groupNotes": "Poznámky",
|
||||
"groupTags": "Štítky a připnutí",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Překopové hostitele",
|
||||
"groupFeatureFlags": "Nastavení pluginů",
|
||||
"groupAdvanced": "Rozšířená konfigurace",
|
||||
"preview": "Náhled",
|
||||
"moreHosts_one": "... a {{count}} další host",
|
||||
"moreHosts_few": "... a {{count}} další hosté",
|
||||
"moreHosts_many": "... a {{count}} dalších hostů",
|
||||
"moreHosts_other": "... a {{count}} dalších hostů",
|
||||
"summary": "{{selected}} z {{total}} hostitelů",
|
||||
"credentialsIncluded": "zahrnuty přihlašovací údaje",
|
||||
"credentialsExcluded": "vynechány přihlašovací údaje",
|
||||
"noneSelected": "Nejsou vybráni žádní hostitelé",
|
||||
"cancel": "Zrušit",
|
||||
"confirm": "Exportovat",
|
||||
"fetchFailed": "Nepodařilo se načíst hostitele pro export",
|
||||
"bulkButton": "Exportovat"
|
||||
},
|
||||
"sampleDownloaded": "Vzorkový soubor stažen",
|
||||
"failedToDeleteCredential2": "Nepodařilo se smazat přihlašovací údaje",
|
||||
"noFolderOption": "(Žádná složka)",
|
||||
@@ -886,11 +848,7 @@
|
||||
"editorUpdate": "Aktualizovat hostitele",
|
||||
"editorAdd": "Přidat hostitele",
|
||||
"speedSearch": "Hledat hostitele. Šipky pro výběr, Enter pro připojení, Esc pro uzavření",
|
||||
"speedSearchList": "Seznam hostitelů. Píšte nebo stiskněte / pro hledání.",
|
||||
"importNoHosts": "V souboru nebyly nalezeny žádné hostitele",
|
||||
"importTooMany": "Naraz můžete importovat až {{max}} hostitelů",
|
||||
"importSummary": "Import dokončen: {{imported}} importováno, {{updated}} aktualizováno, {{failed}} selhalo",
|
||||
"importHostsFailed": "Nepodařilo se importovat hostitele"
|
||||
"speedSearchList": "Seznam hostitelů. Píšte nebo stiskněte / pro hledání."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Rozdělená obrazovka",
|
||||
@@ -1095,17 +1053,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} uživatel",
|
||||
"usersCount_few": "{{count}} uživatelé",
|
||||
"usersCount_many": "{{count}} uživatelů",
|
||||
"rolesCount_one": "{{count}} role",
|
||||
"rolesCount_few": "{{count}} role",
|
||||
"rolesCount_many": "{{count}} rolí",
|
||||
"apiKeysCount_one": "{{count}} klíč",
|
||||
"apiKeysCount_few": "{{count}} klíče",
|
||||
"apiKeysCount_many": "{{count}} klíčů",
|
||||
"sessionsActive_one": "{{count}} aktivní",
|
||||
"sessionsActive_few": "{{count}} aktivní",
|
||||
"sessionsActive_many": "{{count}} aktivních",
|
||||
"hostsCount_one": "{{count}} host",
|
||||
"hostsCount_few": "{{count}} hosté",
|
||||
"hostsCount_many": "{{count}} hostů",
|
||||
@@ -1116,8 +1066,6 @@
|
||||
"credentialsCount_other": "{{count}} přihlašovacích údajů",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} oprávnění",
|
||||
"count_few": "{{count}} oprávnění",
|
||||
"count_many": "{{count}} oprávnění",
|
||||
"groups": {
|
||||
"hosts": "Hostitelé",
|
||||
"credentials": "Přihlašovací údaje",
|
||||
@@ -1158,22 +1106,62 @@
|
||||
"interfaceFontDescription": "Změní písmo uživatelského rozhraní aplikace. Profily terminálu si zachovávají vlastní nastavení písma.",
|
||||
"accentColorLabel": "Akcentová barva",
|
||||
"apiKeyCount_one": "{{count}} klíč",
|
||||
"apiKeyCount_few": "{{count}} klíče",
|
||||
"apiKeyCount_many": "{{count}} klíčů",
|
||||
"colorPickerTooltip": "Otevřít výběr barev",
|
||||
"themeSystem": "Systém",
|
||||
"themeLight": "Světlý",
|
||||
"themeDark": "Tmavý",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Tmavý"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Jak je celá aplikace rozložena. Motivy a rozložení pocházejí z pluginů.",
|
||||
"defaultsLabel": "Výchozí pro všechny",
|
||||
"defaultsHint": "Co lidé uvidí, dokud si nevyberou vlastní rozložení nebo motiv.",
|
||||
"followDefault": "Použít výchozí nastavení",
|
||||
"defaultSaved": "Vzhled uložen jako výchozí",
|
||||
"saveFailed": "Vzhled se nepodařilo uložit",
|
||||
"repair": {
|
||||
"title": "Toto rozložení se nepodařilo zobrazit",
|
||||
"safeTitle": "Bezpečný režim",
|
||||
"layout": "Rozložení",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Důvod",
|
||||
"error": "Chyba",
|
||||
"noError": "Žádná chybová zpráva.",
|
||||
"copy": "Kopírovat",
|
||||
"copied": "Zkopírováno",
|
||||
"copyFailed": "Podrobnosti se nepodařilo zkopírovat",
|
||||
"retry": "Zkusit znovu",
|
||||
"reset": "Obnovit výchozí vzhled",
|
||||
"resetEveryone": "Obnovit výchozí nastavení pro všechny",
|
||||
"update": "Aktualizovat {{name}} na {{version}}",
|
||||
"disable": "Vypnout {{name}}",
|
||||
"enable": "Zapnout {{name}}",
|
||||
"startAgain": "Spustit {{name}} znovu",
|
||||
"install": "Hledat rozložení a motivy",
|
||||
"installTitle": "Rozložení a motivy",
|
||||
"installButton": "Instalovat",
|
||||
"nothingToInstall": "Právě teď nejsou k dispozici žádná jiná rozložení ani motivy.",
|
||||
"registryUnreachable": "Nelze se připojit k rejstříku pluginů.",
|
||||
"askAdmin": "Požádejte správce, aby aktualizoval nebo opravil toto rozložení. Níže si můžete přepnout na jiné rozložení nebo motiv.",
|
||||
"switchLayout": "Přepnout rozložení",
|
||||
"switchTheme": "Přepnout motiv",
|
||||
"saveFailed": "Vaše volba se nepodařilo uložit",
|
||||
"reasons": {
|
||||
"safe-url": "Adresa požadovala bezpečný režim. Vyberte rozložení níže nebo z adresy odeberte ?safe-layout=1.",
|
||||
"safe-env": "Server byl spuštěn s TERMIX_SAFE_LAYOUT, takže všichni uvidí tuto obrazovku, dokud nebude odstraněn.",
|
||||
"missing": "Žádný nainstalovaný plugin toto rozložení neposkytuje.",
|
||||
"disabled": "Plugin, který toto rozložení poskytuje, je vypnutý.",
|
||||
"blocked": "Plugin, který toto rozložení poskytuje, čeká na něco, co potřebuje.",
|
||||
"incompatible": "Plugin, který toto rozložení poskytuje, nefunguje s touto verzí Termix.",
|
||||
"failed": "Rozložení se nepodařilo spustit.",
|
||||
"crashed": "Rozložení dvakrát selhalo při vykreslování aplikace."
|
||||
},
|
||||
"noLayout": "Není nastaveno žádné rozložení",
|
||||
"restore": "Obnovit dodané {{name}}",
|
||||
"restoreFailed": "Nepodařilo se obnovit dodanou kopii"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1196,6 +1184,18 @@
|
||||
"title": "Spravovat přihlašování",
|
||||
"consequence": "Může přidat metodu přihlášení, druhý faktor nebo typ SSH přihlášení."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Nastavit pravidla pro přihlášení",
|
||||
"consequence": "Může odhlásit lidi při nečinnosti, omezit délku relace, vypnout funkci Zapamatovat si mě a vyžadovat druhé ověření."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Vyberte, jak se k hostitelům přistupuje",
|
||||
"consequence": "Může přenášet SSH připojení k hostiteli přes vlastní trasu, takže vidí vše, co se k těmto hostitelům odesílá a od nich přijímá, včetně hesel."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Spustit synchronizaci",
|
||||
"consequence": "Může odpovídat na všechny požadavky na synchronizaci, takže vidí data, která synchronizují zařízení a servery."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Spravovat certifikáty",
|
||||
"consequence": "Může nahradit certifikát, který Termix poskytuje přes HTTPS, a odpovídat na ověřování domén od certifikačních autorit."
|
||||
@@ -1204,6 +1204,10 @@
|
||||
"title": "Přístup k sériovým a USB zařízením",
|
||||
"consequence": "Může otevřít fyzický sériový port na počítači, kde běží Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Exportovat hostitele s jejich tajnými informacemi",
|
||||
"consequence": "Může číst vaše hostitele v plném rozsahu, včetně uložených hesel a klíčů, a předávat je dál. Každý export je zapsán do auditního protokolu."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Vytvářet a měnit hostitele",
|
||||
"consequence": "Může přidávat hostitele a upravovat ty, které již máte."
|
||||
@@ -1248,10 +1252,30 @@
|
||||
"title": "Číst auditní protokol",
|
||||
"consequence": "Může vidět, kdo co a kdy udělal."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Zkontrolovat, zda porty odpovídají",
|
||||
"consequence": "Může otevřít obyčejné připojení k libovolné adrese ze serveru, aby zjistil, zda je dosažitelná."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Poskytovat stav hostitele",
|
||||
"consequence": "Stává se zdrojem teček online a offline pro každého hostitele."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Ukládat nedávnou aktivitu",
|
||||
"consequence": "Stává se úložištěm seznamu nedávné aktivity pro každého uživatele."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Spravovat hostitele jako pouze pro čtení",
|
||||
"consequence": "Hostitele, které spravuje, nemůže nikdo jiný upravovat, mazat ani znovu sdílet."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Otevírat okna plochy",
|
||||
"consequence": "Pouze v desktopové aplikaci Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Použít tento počítač",
|
||||
"consequence": "Může číst a měnit soubory, spouštět shell a otevírat místní porty na tomto počítači. Pouze v desktopové aplikaci Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Jednat jménem jiných uživatelů",
|
||||
"consequence": "Spouští pozadí úlohy s přístupem jiného uživatele, například plánované úlohy. Každé použití je zaznamenáno v auditním protokolu."
|
||||
@@ -1291,6 +1315,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Přidat vlastní obrazovky",
|
||||
"consequence": "Záložky, panely a nastavení, která lze později skrýt."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Nahradit celé rozložení aplikace",
|
||||
"consequence": "Pokud je vybráno, jeho kód vykresluje každou obrazovku, včetně vašich terminálů a nastavení."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Přidat barevná témata",
|
||||
"consequence": "Pouze barvy a styly. Pro téma se žádný kód nespouští."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1317,7 +1349,8 @@
|
||||
"disabled": "Zakázáno",
|
||||
"failed": "Neočekávaně zastaveno",
|
||||
"blocked": "Čeká na jiný plugin",
|
||||
"server": "Běží na vašem serveru"
|
||||
"server": "Běží na vašem serveru",
|
||||
"safeMode": "Vypnuto v režimu nouzového spuštění"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Spuštěné",
|
||||
@@ -1331,11 +1364,6 @@
|
||||
"updated": "Nedávno aktualizované",
|
||||
"category": "Kategorie"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Sloupce",
|
||||
"auto": "Automaticky",
|
||||
"count": "Šířka {{count}}"
|
||||
},
|
||||
"table": {
|
||||
"name": "Název",
|
||||
"description": "Popis",
|
||||
@@ -1444,6 +1472,7 @@
|
||||
"options": "Nelze uložit možnosti pro {{name}}: {{error}}",
|
||||
"deleteData": "Nelze smazat data pro {{name}}: {{error}}",
|
||||
"managedByServer": "Tento plocha je propojena se serverem, který určuje její pluginy.",
|
||||
"defaultLook": "{{name}} je výchozí vzhled, takže lze vypnout nebo zaměnit, ale ne odinstalovat.",
|
||||
"hasDependents": "{{name}} je potřeba pro {{list}}. Nejprve je vypněte nebo odinstalujte.",
|
||||
"missingDependencies": "{{name}} potřebuje {{list}}, který není nainstalován.",
|
||||
"consentChanged": "Požadavky tohoto pluginu se od vašeho posledního zobrazení změnily. Zkontrolujte seznam znovu.",
|
||||
@@ -1521,7 +1550,6 @@
|
||||
"noServerAccess": "Žádný přístup k vašim serverům",
|
||||
"searchInstalled": "Hledat mezi nainstalovanými",
|
||||
"searchPlugins": "Hledat pluginy",
|
||||
"allCategories": "Vše",
|
||||
"nothingMatches": "Nic neodpovídá této položce.",
|
||||
"noneInstalled": "Zatím nejsou nainstalovány žádné pluginy. Prohledejte je a přidejte nějaké.",
|
||||
"nothingHere": "Nic zde není.",
|
||||
@@ -1619,7 +1647,46 @@
|
||||
"documentation": "Dokumentace",
|
||||
"envVars": "Proměnné prostředí",
|
||||
"envRequired": "Povinné",
|
||||
"envDefault": "Výchozí: {{value}}"
|
||||
"envDefault": "Výchozí: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Rozložení",
|
||||
"themes": "Témata",
|
||||
"tabs": "Záložky",
|
||||
"panels": "Panely postranního panelu",
|
||||
"dashboardCards": "Karty přehledu",
|
||||
"protocols": "Typy připojení",
|
||||
"auth": "Způsoby přihlášení",
|
||||
"actions": "Akce",
|
||||
"hostCapability": "Nastavení hostitele"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Typ",
|
||||
"allTypes": "Všechny typy",
|
||||
"category": "Kategorie",
|
||||
"allCategories": "Všechny kategorie",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_few": "{{count}} pluginy",
|
||||
"results_many": "{{count}} pluginů",
|
||||
"results_other": "{{count}} pluginů",
|
||||
"remove": "Odebrat filtr {{name}}",
|
||||
"clear": "Vymazat filtry",
|
||||
"button": "Filtry",
|
||||
"buttonCount": "Filtry ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} z {{total}}",
|
||||
"page": "Strana {{page}} z {{pages}}",
|
||||
"previous": "Předchozí strana",
|
||||
"next": "Další strana",
|
||||
"perPage": "{{count}} na stranu",
|
||||
"perPageLabel": "Pluginů na stranu"
|
||||
},
|
||||
"showUnsupportedHint": "Tyto jsou uvedeny, ale žádná verze zatím na této verzi neběží. Aktualizujte Termix pro jejich instalaci.",
|
||||
"unsupported": "Vyžaduje novější Termix",
|
||||
"unsupportedHint": "Žádná verze tohoto pluginu neběží na této verzi Termix. Aktualizujte Termix pro jeho instalaci.",
|
||||
"needsTermix": "Vyžaduje Termix {{range}}",
|
||||
"showUnsupported": "Zobrazit nepodporované ({{count}})",
|
||||
"showMore": "Zobrazit {{count}} dalších (zbývá {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1635,97 +1702,6 @@
|
||||
"noData": "Žádná data",
|
||||
"filter": "Filtrovat..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "před {{count}} minutou",
|
||||
"minutesAgo_few": "před {{count}} minutami",
|
||||
"minutesAgo_many": "před {{count}} minutami",
|
||||
"minutesAgo_other": "před {{count}} minutami",
|
||||
"hoursAgo_one": "před {{count}} hodinou",
|
||||
"hoursAgo_few": "před {{count}} hodinami",
|
||||
"hoursAgo_many": "před {{count}} hodinami",
|
||||
"hoursAgo_other": "před {{count}} hodinami",
|
||||
"pending_one": "{{count}} změna čeká na synchronizaci",
|
||||
"pending_few": "{{count}} změny čekají na synchronizaci",
|
||||
"pending_many": "{{count}} změn čeká na synchronizaci",
|
||||
"pending_other": "{{count}} změn čeká na synchronizaci",
|
||||
"proxy": {
|
||||
"headersTitle": "Další hlavičky",
|
||||
"headersHint": "Odesílány s každým požadavkem na server, například token služby Cloudflare Access.",
|
||||
"headerName": "Název hlavičky",
|
||||
"headerValue": "Hodnota",
|
||||
"savedValue": "Uloženo, pro změnu napište novou hodnotu",
|
||||
"addHeader": "Přidat hlavičku",
|
||||
"removeHeader": "Odstranit hlavičku",
|
||||
"basicAuthTitle": "Uživatelské jméno a heslo",
|
||||
"basicAuthHint": "Pro proxy, která vyžaduje uživatelské jméno a heslo před Termixem.",
|
||||
"username": "Uživatelské jméno",
|
||||
"password": "Heslo",
|
||||
"allowInvalidCertificate": "Důvěřovat certifikátu podepsanému sám sebou",
|
||||
"allowInvalidCertificateHint": "Pouze pro váš vlastní server, pokud jeho certifikát není od známé autority."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "To nevypadá jako webová adresa.",
|
||||
"unreachable": "Nelze se připojit k serveru. Zkontrolujte adresu a zda je server spuštěn.",
|
||||
"unreachableWithReason": "Nelze se připojit k serveru: {{reason}}",
|
||||
"tlsUntrusted": "Certifikát serveru není důvěryhodný. Pokud je to váš vlastní server se self-signed certifikátem, povolte možnost níže.",
|
||||
"basicAuthRequired": "Něco před serverem vyžaduje uživatelské jméno a heslo. Zadejte je níže.",
|
||||
"proxyLogin": "Místo Termix odpověděla přihlašovací stránka nebo proxy. Níže přidejte potřebné hlavičky nebo zkontrolujte adresu.",
|
||||
"notTermix": "Na této adrese není žádný Termix server. Pokud běží na konkrétní cestě, uveďte ji, například https://example.com/termix.",
|
||||
"versionMismatch": "Tento server používá starší verzi Termix. Pro propojení jej aktualizujte na verzi 2.9 nebo novější.",
|
||||
"differentAccount": "Přihlásili jste se do jiného účtu. Přihlaste se do účtu, ke kterému je toto zařízení propojeno, nebo jej nejprve odpojte."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Propojit s Termix serverem",
|
||||
"reloginTitle": "Přihlásit se znovu",
|
||||
"savedServers": "Nedávné servery",
|
||||
"removeServer": "Odebrat ze seznamu",
|
||||
"serverDescription": "Zadejte adresu, kterou používáte k otevření Termixu ve vašem prohlížeči.",
|
||||
"signinDescription": "Přihlaste se do {{url}}",
|
||||
"chooseDescription": "Toto zařízení již obsahuje data. Co s nimi máte udělat?",
|
||||
"finishingDescription": "Propojuji toto zařízení.",
|
||||
"serverUrl": "Adresa serveru",
|
||||
"serverUrlHint": "Například https://termix.example.com",
|
||||
"showProxySettings": "Nastavení reverzní proxy",
|
||||
"hideProxySettings": "Skrýt nastavení reverzní proxy",
|
||||
"continue": "Pokračovat",
|
||||
"back": "Zpět",
|
||||
"mergeTitle": "Přidat do mého účtu",
|
||||
"mergeBody_one": "Položka na tomto zařízení je přidána do vašeho účtu. Položky, které váš účet již má, zůstanou na serveru beze změny.",
|
||||
"mergeBody_few": "{{count}} položky na tomto zařízení jsou přidány do vašeho účtu. Položky, které váš účet již má, zůstanou na serveru beze změny.",
|
||||
"mergeBody_many": "{{count}} položek na tomto zařízení je přidáno do vašeho účtu. Položky, které váš účet již má, zůstanou na serveru beze změny.",
|
||||
"mergeBody_other": "{{count}} položek na tomto zařízení je přidáno do vašeho účtu. Položky, které váš účet již má, zůstanou na serveru beze změny.",
|
||||
"replaceTitle": "Nahradit obsahem mého účtu",
|
||||
"replaceBody_one": "Položka na tomto zařízení je odstraněna a toto zařízení přebere vše z vašeho účtu. Hosté uložené pouze na tomto zařízení zůstanou.",
|
||||
"replaceBody_few": "{{count}} položky na tomto zařízení jsou odstraněny a toto zařízení přebere vše z vašeho účtu. Hosté uložené pouze na tomto zařízení zůstanou.",
|
||||
"replaceBody_many": "{{count}} položek na tomto zařízení je odstraněno a toto zařízení přebere vše z vašeho účtu. Hosté uložené pouze na tomto zařízení zůstanou.",
|
||||
"replaceBody_other": "{{count}} položek na tomto zařízení je odstraněno a toto zařízení přebere vše z vašeho účtu. Hosté uložené pouze na tomto zařízení zůstanou.",
|
||||
"link": "Propojit",
|
||||
"linking": "Probíhá propojování a první synchronizace...",
|
||||
"linked": "Propojeno. Vaše data se nyní synchronizují.",
|
||||
"signedInAgain": "Přihlášen. Synchronizace běží znovu."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hostitelé",
|
||||
"sshCredentials": "Přihlašovací údaje",
|
||||
"sshFolders": "Složky",
|
||||
"userPreferences": "Předvolby",
|
||||
"pluginUserSettings": "Nastavení pluginů",
|
||||
"sharedHosts": "Hostitelé sdílení s vámi",
|
||||
"sharedCredentials": "Přihlašovací údaje sdílené s vámi",
|
||||
"vaultProfiles": "Profily Vault",
|
||||
"snippetFolders": "Složky úryvků",
|
||||
"snippets": "Úryvky",
|
||||
"dashboardServiceLinks": "Odkazy na služby",
|
||||
"homepageItems": "Položky na domovské stránce",
|
||||
"networkTopology": "Mapa sítě",
|
||||
"workspaces": "Pracovní prostory",
|
||||
"hostDefaults": "Výchozí hodnoty hostitelů",
|
||||
"hostDefaultsAdmin": "Výchozí hodnoty hostitelů serveru",
|
||||
"aiProviders": "Poskytovatelé AI",
|
||||
"homepageLayouts": "Rozložení domovské stránky",
|
||||
"accountProfile": "Profil účtu"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Složka {{name}}",
|
||||
@@ -1762,7 +1738,12 @@
|
||||
"gridView": "Mřížka",
|
||||
"listView": "Seznam",
|
||||
"compactRows": "Kompaktní řádky",
|
||||
"comfortableRows": "Pohodlné řádky"
|
||||
"comfortableRows": "Pohodlné řádky",
|
||||
"columns": {
|
||||
"title": "Sloupce",
|
||||
"auto": "Automaticky",
|
||||
"count": "šířka {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Uloženo. Napište pro nahrazení."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Nogle plugins kunne ikke ændres. Du kan rette dem senere fra Plugins-fanen. Tryk på Næste for at fortsætte.",
|
||||
"pluginsApplyFailed": "Dine valg kunne ikke gemmes. Prøv igen, eller fortsæt og ændr dem senere fra Plugins-fanen.",
|
||||
"pluginsLoadFailed": "Pluginlisten kunne ikke indlæses. Du kan vælge plugins senere fra Plugins-fanen.",
|
||||
"presetTitle": "Hvor meget vil du have på skærmen?",
|
||||
"presetIntro": "Vælg, hvor meget der vises på skærmen.",
|
||||
"presetChangeLater": "Du kan skifte forudindstillinger eller ændre enhver enkelt indstilling senere i Indstillinger under Grænseflade.",
|
||||
"appearanceTitle": "Gør det dit eget",
|
||||
"appearanceIntro": "Vælg et tema, en accentfarve, en skrifttype og dit sprog. Ændringer vises med det samme, og du kan ændre dem senere i Indstillinger.",
|
||||
"securityTitle": "Sikr din konto",
|
||||
"securityIntro": "Tilføj en passkey eller en autentifikator-app til din konto. Du kan også gøre dette senere i Indstillinger under Sikkerhed.",
|
||||
"desktopTitle": "Hvordan vil du bruge Termix?",
|
||||
"desktopBody": "Du kan ændre dette når som helst fra Sync i sidebjælken.",
|
||||
"desktopLocalTitle": "Kun på denne enhed",
|
||||
"desktopLocalBody": "Alt gemmes her. Intet skal opsættes.",
|
||||
"desktopLinkTitle": "Med min Termix-server",
|
||||
"desktopLinkBody": "Log ind på din server for at bruge de samme værter og indstillinger på alle enheder.",
|
||||
"desktopLinked": "Linket til {{server}}",
|
||||
"pluginsDocsLink": "Læs om hver enkelt"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} er klar til installation",
|
||||
"readyHint": "Den installeres næste gang Termix genstartes."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Sikker tilstand",
|
||||
"description": "Kun layout- og tema-plugins kører. Genstart serveren uden TERMIX_SAFE_MODE for at aktivere de øvrige plugins igen."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Luk panel",
|
||||
"moveSide": "Flyt panel",
|
||||
"resize": "Ændr størrelse på panel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Hjem",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Værter",
|
||||
"credentials": "Legitimationsoplysninger",
|
||||
"connections": "Forbindelser",
|
||||
"sync": "Synkroniser",
|
||||
"reconnectDisconnectedTerminals": "Genopret alle afbrudte terminaler",
|
||||
"reconnectingTerminals_one": "Genopretter {{count}} terminal",
|
||||
"reconnectingTerminals_other": "Genopretter {{count}} terminaler",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Prøv igen",
|
||||
"refresh": "Opdater",
|
||||
"optional": "Valgfrit",
|
||||
"downloadSample": "Download eksempel",
|
||||
"failedToDeleteHost": "Kunne ikke slette {{name}}",
|
||||
"importSkipExisting": "Importer (spring eksisterende over)",
|
||||
"importSSHConfig": "Importer fra SSH-konfiguration",
|
||||
"connectionDetails": "Forbindelsesdetaljer",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Ingen mappe)",
|
||||
"deleteSelected": "Slet",
|
||||
"exitSelection": "Afslut markering",
|
||||
"importSkip": "Importer (spring eksisterende over)",
|
||||
"importOverwrite": "Importer (overskriv)",
|
||||
"collapseBtn": "Skjul",
|
||||
"importExportBtn": "Importer / Eksporter",
|
||||
"hostStatusesRefreshed": "Værtstatusser opdateret",
|
||||
"failedToRefreshHosts": "Kunne ikke opdatere værter",
|
||||
"movedHostTo": "Flyttet {{host}} til \"{{folder}}\"",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Slet \"{{name}}\" og dens {{count}} vært? Dette kan ikke fortrydes.",
|
||||
"deleteFolderConfirm_other": "Slet \"{{name}}\" og dens {{count}} værter? Dette kan ikke fortrydes.",
|
||||
"failedToMoveHosts": "Kunne ikke flytte værter",
|
||||
"managedBanner": "Denne vært styres af {{plugin}}. Ændr den der. Du kan stadig fastgøre og omorganisere den.",
|
||||
"managedTooltip": "Styres af {{plugin}}",
|
||||
"addBlocked": "Værter styres af {{plugin}}, så nye værter kan ikke tilføjes her.",
|
||||
"failedToReorder": "Kunne ikke omorganisere",
|
||||
"expandAll": "Udvid alle mapper",
|
||||
"collapseAll": "Skjul alle mapper",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Tilføj legitimationsoplysninger",
|
||||
"checkingHostStatuses": "Tjekker værtstatus...",
|
||||
"pinnedSection": "Fastgjort",
|
||||
"hostsExported": "Værter eksporteret succesfuldt",
|
||||
"export": {
|
||||
"menuItem": "Eksportér...",
|
||||
"title": "Eksportér værter",
|
||||
"scope": "Omfang",
|
||||
"scopeAll": "Alle",
|
||||
"scopeSelected": "Valgte",
|
||||
"searchHosts": "Søg i værter...",
|
||||
"include": "Inkluder",
|
||||
"groupConnection": "Forbindelse",
|
||||
"groupCredentials": "Legitimationsoplysninger",
|
||||
"groupNotes": "Noter",
|
||||
"groupTags": "Tags & fastgørelse",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump hosts",
|
||||
"groupFeatureFlags": "Plugin-indstillinger",
|
||||
"groupAdvanced": "Avanceret konfiguration",
|
||||
"preview": "Forhåndsvisning",
|
||||
"moreHosts_one": "... {{count}} mere vært",
|
||||
"moreHosts_other": "... {{count}} flere værter",
|
||||
"summary": "{{selected}} af {{total}} værter",
|
||||
"credentialsIncluded": "legitimationsoplysninger inkluderet",
|
||||
"credentialsExcluded": "legitimationsoplysninger ekskluderet",
|
||||
"noneSelected": "Ingen værter valgt",
|
||||
"cancel": "Annuller",
|
||||
"confirm": "Eksportér",
|
||||
"fetchFailed": "Kunne ikke indlæse værter til eksport",
|
||||
"bulkButton": "Eksportér"
|
||||
},
|
||||
"sampleDownloaded": "Eksempelfil downloadet",
|
||||
"failedToDeleteCredential2": "Kunne ikke slette legitimationsoplysninger",
|
||||
"noFolderOption": "(Ingen mappe)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Opdater vært",
|
||||
"editorAdd": "Tilføj vært",
|
||||
"speedSearch": "Søg i værter. Piltaster til valg, Enter til forbindelse, Esc til lukning",
|
||||
"speedSearchList": "Værtliste. Skriv eller tryk / for at søge.",
|
||||
"importNoHosts": "Ingen værter fundet i filen",
|
||||
"importTooMany": "Du kan importere op til {{max}} værter ad gangen",
|
||||
"importSummary": "Import fuldført: {{imported}} importeret, {{updated}} opdateret, {{failed}} fejlet",
|
||||
"importHostsFailed": "Kunne ikke importere værter"
|
||||
"speedSearchList": "Værtliste. Skriv eller tryk / for at søge."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Delt skærm",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Åbn farvevælger",
|
||||
"themeSystem": "System",
|
||||
"themeLight": "Lys",
|
||||
"themeDark": "Mørk",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Mørk"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Hvordan hele appen er indrettet. Temaer og layouts kommer fra plugins.",
|
||||
"defaultsLabel": "Standard for alle",
|
||||
"defaultsHint": "Hvad folk ser, indtil de vælger deres eget layout eller tema.",
|
||||
"followDefault": "Brug standardindstillingen",
|
||||
"defaultSaved": "Standardudseende gemt",
|
||||
"saveFailed": "Kunne ikke gemme udseendet",
|
||||
"repair": {
|
||||
"title": "Dette layout kunne ikke vises",
|
||||
"safeTitle": "Sikker tilstand",
|
||||
"layout": "Layout",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Årsag",
|
||||
"error": "Fejl",
|
||||
"noError": "Ingen fejlmeddelelse.",
|
||||
"copy": "Kopiér",
|
||||
"copied": "Kopieret",
|
||||
"copyFailed": "Kunne ikke kopiere detaljerne",
|
||||
"retry": "Prøv igen",
|
||||
"reset": "Nulstil til standardudseende",
|
||||
"resetEveryone": "Nulstil standardindstillingen for alle",
|
||||
"update": "Opdater {{name}} til {{version}}",
|
||||
"disable": "Sluk {{name}}",
|
||||
"enable": "Aktivér {{name}}",
|
||||
"startAgain": "Start {{name}} igen",
|
||||
"install": "Find layouts og temaer",
|
||||
"installTitle": "Layouts og temaer",
|
||||
"installButton": "Installer",
|
||||
"nothingToInstall": "Der er ikke andre layouts eller temaer tilgængelige lige nu.",
|
||||
"registryUnreachable": "Plugin-registret kunne ikke nås.",
|
||||
"askAdmin": "Bed en administrator om at opdatere eller reparere dette layout. Du kan skifte til et andet layout eller tema for dig selv nedenfor.",
|
||||
"switchLayout": "Skift layout",
|
||||
"switchTheme": "Skift tema",
|
||||
"saveFailed": "Kunne ikke gemme dit valg",
|
||||
"reasons": {
|
||||
"safe-url": "Adressen bad om sikker tilstand. Vælg et layout nedenfor, eller fjern ?safe-layout=1 fra adressen.",
|
||||
"safe-env": "Serveren er startet med TERMIX_SAFE_LAYOUT, så alle ser denne skærm, indtil den fjernes.",
|
||||
"missing": "Intet installeret plugin leverer dette layout.",
|
||||
"disabled": "Pluginet, der leverer dette layout, er slukket.",
|
||||
"blocked": "Pluginet, der leverer dette layout, venter på noget, det har brug for.",
|
||||
"incompatible": "Pluginet, der leverer dette layout, fungerer ikke med denne version af Termix.",
|
||||
"failed": "Layoutet kunne ikke starte.",
|
||||
"crashed": "Layoutet kørte to gange i jorden, mens appen blev tegnet."
|
||||
},
|
||||
"noLayout": "Intet layout er indstillet",
|
||||
"restore": "Gendan den medfølgende {{name}}",
|
||||
"restoreFailed": "Kunne ikke gendanne den medfølgende kopi"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Håndter login",
|
||||
"consequence": "Den kan tilføje en loginmetode, en anden faktor eller en SSH-login-type."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Indstil loginsregler",
|
||||
"consequence": "Det kan logge folk ud, når de er inaktive, begrænse sessionens længde, slukke for \"Husk mig\" og kræve en anden faktor."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Vælg, hvordan værter nås",
|
||||
"consequence": "Det kan bære SSH-forbindelsen til en vært over sin egen rute, så det ser alt, der sendes til og fra disse værter, inklusive adgangskoder."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Kør synkronisering",
|
||||
"consequence": "Det kan besvare alle synkroniseringsanmodninger, så det ser de data, som enheder og servere synkroniserer."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Administrer certifikater",
|
||||
"consequence": "Den kan erstatte det certifikat, Termix serverer over HTTPS, og besvare domænekontroller fra certifikatautoriteter."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Adgang til serielle og USB-enheder",
|
||||
"consequence": "Den kan åbne en fysisk seriell port på maskinen, der kører Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Eksportér værter med deres hemmeligheder",
|
||||
"consequence": "Kan læse dine værter i fuld udstrækning, inklusive gemte adgangskoder og nøgler, og udlevere dem. Hver eksport skrives til revisionsloggen."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Opret og ændre værter",
|
||||
"consequence": "Den kan tilføje værter og redigere dem, du allerede har."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Læs revisionsloggen",
|
||||
"consequence": "Den kan se, hvem der gjorde hvad og hvornår."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Tjek, om porte svarer",
|
||||
"consequence": "Kan åbne en simpel forbindelse til enhver adresse fra serveren for at se, om den er tilgængelig."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Lever værstatus",
|
||||
"consequence": "Bliver kilden til de online- og offline-prikker for hver vært."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Gem seneste aktivitet",
|
||||
"consequence": "Bliver lageret for den seneste aktivitetsliste for hver bruger."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Administrer værter som skrivebeskyttet",
|
||||
"consequence": "Værter, den administrerer, kan ikke redigeres, slettes eller deles videre af andre."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Åbn skrivebordsvinduer",
|
||||
"consequence": "Kun i Termix-skivebordsappen."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Brug denne computer",
|
||||
"consequence": "Kan læse og ændre filer, køre en shell og åbne lokale porte på denne computer. Kun i Termix desktop-appen."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Udfør som andre brugere",
|
||||
"consequence": "Kører baggrundsarbejde med en anden brugers adgang, f.eks. planlagte jobs. Hver brug skrives til revisionsloggen."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Tilføje sine egne skærme",
|
||||
"consequence": "Faner, paneler og indstillinger, du kan skjule senere."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Erstat hele appens layout",
|
||||
"consequence": "Når valgt, tegner dens kode hver skærm, inklusive dine terminaler og indstillinger."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Tilføj farvetemaer",
|
||||
"consequence": "Kun farver og stilarter. Der køres ingen kode for et tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Deaktiveret",
|
||||
"failed": "Stoppet uventet",
|
||||
"blocked": "Venter på et andet plugin",
|
||||
"server": "Kører på din server"
|
||||
"server": "Kører på din server",
|
||||
"safeMode": "Deaktiveret i sikker tilstand"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Kører",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Nyligt opdateret",
|
||||
"category": "Kategori"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Kolonner",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} bred"
|
||||
},
|
||||
"table": {
|
||||
"name": "Navn",
|
||||
"description": "Beskrivelse",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Kunne ikke gemme indstillinger for {{name}}: {{error}}",
|
||||
"deleteData": "Kunne ikke slette data for {{name}}: {{error}}",
|
||||
"managedByServer": "Denne desktop er knyttet til en server, som bestemmer dens plugins.",
|
||||
"defaultLook": "{{name}} er standardudseendet, så det kan slås fra eller skiftes, men ikke afinstalleres.",
|
||||
"hasDependents": "{{name}} er nødvendig for {{list}}. Sluk dem eller afinstaller dem først.",
|
||||
"missingDependencies": "{{name}} har brug for {{list}}, som ikke er installeret.",
|
||||
"consentChanged": "Det, dette plugin anmoder om, er ændret siden du kiggede. Tjek listen igen.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Ingen adgang til dine servere",
|
||||
"searchInstalled": "Søg i installerede",
|
||||
"searchPlugins": "Søg i plugins",
|
||||
"allCategories": "Alle",
|
||||
"nothingMatches": "Intet matcher dette.",
|
||||
"noneInstalled": "Ingen plugins er installeret endnu. Gennemse for at tilføje nogle.",
|
||||
"nothingHere": "Intet her.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Dokumentation",
|
||||
"envVars": "Miljøvariabler",
|
||||
"envRequired": "Påkrævet",
|
||||
"envDefault": "Standard: {{value}}"
|
||||
"envDefault": "Standard: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Layouts",
|
||||
"themes": "Temaer",
|
||||
"tabs": "Faner",
|
||||
"panels": "Sidepaneler",
|
||||
"dashboardCards": "Dashboard-kort",
|
||||
"protocols": "Forbindelsestyper",
|
||||
"auth": "Login-metoder",
|
||||
"actions": "Handlinger",
|
||||
"hostCapability": "Værtsindstillinger"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Type",
|
||||
"allTypes": "Alle typer",
|
||||
"category": "Kategori",
|
||||
"allCategories": "Alle kategorier",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_other": "{{count}} plugins",
|
||||
"remove": "Fjern filter {{name}}",
|
||||
"clear": "Ryd filtre",
|
||||
"button": "Filtre",
|
||||
"buttonCount": "Filtre ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} af {{total}}",
|
||||
"page": "Side {{page}} af {{pages}}",
|
||||
"previous": "Forrige side",
|
||||
"next": "Næste side",
|
||||
"perPage": "{{count}} pr. side",
|
||||
"perPageLabel": "Plugins pr. side"
|
||||
},
|
||||
"showUnsupportedHint": "Disse er opført, men der er endnu ingen udgivelse, der kører på denne version. Opdater Termix for at installere dem.",
|
||||
"unsupported": "Kræver en nyere Termix",
|
||||
"unsupportedHint": "Der er ingen udgivelse af dette plugin, der kører på denne version af Termix. Opdater Termix for at installere det.",
|
||||
"needsTermix": "Kræver Termix {{range}}",
|
||||
"showUnsupported": "Vis understøttet ({{count}})",
|
||||
"showMore": "Vis {{count}} mere ({{total}} tilbage)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Ingen data",
|
||||
"filter": "Filtrer..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minut siden",
|
||||
"minutesAgo_other": "{{count}} minutter siden",
|
||||
"hoursAgo_one": "{{count}} time siden",
|
||||
"hoursAgo_other": "{{count}} timer siden",
|
||||
"pending_one": "{{count}} ændring venter på synkronisering",
|
||||
"pending_other": "{{count}} ændringer venter på synkronisering",
|
||||
"proxy": {
|
||||
"headersTitle": "Ekstra headers",
|
||||
"headersHint": "Sendes med hver anmodning til serveren, f.eks. en Cloudflare Access service-token.",
|
||||
"headerName": "Header-navn",
|
||||
"headerValue": "Værdi",
|
||||
"savedValue": "Gemt, skriv for at ændre",
|
||||
"addHeader": "Tilføj header",
|
||||
"removeHeader": "Fjern header",
|
||||
"basicAuthTitle": "Brugernavn og adgangskode",
|
||||
"basicAuthHint": "Til en proxy, der beder om brugernavn og adgangskode før Termix.",
|
||||
"username": "Brugernavn",
|
||||
"password": "Adgangskode",
|
||||
"allowInvalidCertificate": "Stol på et selvsigneret certifikat",
|
||||
"allowInvalidCertificateHint": "Kun til din egen server, når dens certifikat ikke er fra en kendt autoritet."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Det ligner ikke en webadresse.",
|
||||
"unreachable": "Kunne ikke nå serveren. Tjek adressen og at serveren kører.",
|
||||
"unreachableWithReason": "Kunne ikke nå serveren: {{reason}}",
|
||||
"tlsUntrusted": "Servercertifikatet er ikke betroet. Hvis dette er din egen server med et selvsigneret certifikat, skal du slå indstillingen nedenfor til.",
|
||||
"basicAuthRequired": "Noget foran serveren beder om et brugernavn og en adgangskode. Indtast dem nedenfor.",
|
||||
"proxyLogin": "En login-side eller en proxy svarede i stedet for Termix. Tilføj de headers, den har brug for, nedenfor, eller tjek adressen.",
|
||||
"notTermix": "Der er ingen Termix-server på den adresse. Hvis den kører under en sti, skal du inkludere den, f.eks. https://example.com/termix.",
|
||||
"versionMismatch": "Den server kører en ældre version af Termix. Opdater den til 2.9 eller nyere for at linke.",
|
||||
"differentAccount": "Du er logget ind på en anden konto. Log ind på den konto, denne enhed er linket til, eller fjern linket først."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Link til en Termix-server",
|
||||
"reloginTitle": "Log ind igen",
|
||||
"savedServers": "Seneste servere",
|
||||
"removeServer": "Fjern fra listen",
|
||||
"serverDescription": "Indtast den adresse, du bruger til at åbne Termix i din browser.",
|
||||
"signinDescription": "Log ind på {{url}}",
|
||||
"chooseDescription": "Denne enhed har allerede data. Hvad skal der ske med dem?",
|
||||
"finishingDescription": "Linker denne enhed.",
|
||||
"serverUrl": "Serveradresse",
|
||||
"serverUrlHint": "For eksempel https://termix.example.com",
|
||||
"showProxySettings": "Indstillinger for reverse proxy",
|
||||
"hideProxySettings": "Skjul indstillinger for reverse proxy",
|
||||
"continue": "Fortsæt",
|
||||
"back": "Tilbage",
|
||||
"mergeTitle": "Tilføj det til min konto",
|
||||
"mergeBody_one": "Elementet på denne enhed tilføjes til din konto. Elementer, din konto allerede har, forbliver som de er på serveren.",
|
||||
"mergeBody_other": "De {{count}} elementer på denne enhed tilføjes til din konto. Elementer, din konto allerede har, forbliver som de er på serveren.",
|
||||
"replaceTitle": "Erstat det med min konto",
|
||||
"replaceBody_one": "Elementet på denne enhed fjernes, og denne enhed tager alt fra din konto. Værter, der kun er gemt på denne enhed, forbliver.",
|
||||
"replaceBody_other": "De {{count}} elementer på denne enhed fjernes, og denne enhed tager alt fra din konto. Værter, der kun er gemt på denne enhed, forbliver.",
|
||||
"link": "Link",
|
||||
"linking": "Linker og kører den første synkronisering...",
|
||||
"linked": "Linket. Dine data synkroniseres nu.",
|
||||
"signedInAgain": "Logget ind. Synkroniseringen kører igen."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Værter",
|
||||
"sshCredentials": "Legitimationsoplysninger",
|
||||
"sshFolders": "Mapper",
|
||||
"userPreferences": "Præferencer",
|
||||
"pluginUserSettings": "Plugin-indstillinger",
|
||||
"sharedHosts": "Værter delt med dig",
|
||||
"sharedCredentials": "Legitimationsoplysninger delt med dig",
|
||||
"vaultProfiles": "Vault-profiler",
|
||||
"snippetFolders": "Snippet-mapper",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Service-links",
|
||||
"homepageItems": "Startside-elementer",
|
||||
"networkTopology": "Netværkskort",
|
||||
"workspaces": "Arbejdsområder",
|
||||
"hostDefaults": "Standardindstillinger for værter",
|
||||
"hostDefaultsAdmin": "Standardindstillinger for serverværter",
|
||||
"aiProviders": "AI-leverandører",
|
||||
"homepageLayouts": "Startside-layouts",
|
||||
"accountProfile": "Kontoprofil"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Mappe {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Gitter",
|
||||
"listView": "Liste",
|
||||
"compactRows": "Kompakte rækker",
|
||||
"comfortableRows": "Komfortable rækker"
|
||||
"comfortableRows": "Komfortable rækker",
|
||||
"columns": {
|
||||
"title": "Søjler",
|
||||
"auto": "Automatisk",
|
||||
"count": "{{count}} bred"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Gemt. Skriv for at erstatte det."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Einige Plugins konnten nicht geändert werden. Sie können sie später im Tab „Plugins“ beheben. Drücken Sie Weiter, um fortzufahren.",
|
||||
"pluginsApplyFailed": "Ihre Auswahl konnte nicht gespeichert werden. Versuchen Sie es erneut oder fahren Sie fort und ändern Sie sie später im Tab „Plugins“.",
|
||||
"pluginsLoadFailed": "Die Plugin-Liste konnte nicht geladen werden. Sie können Plugins später im Tab „Plugins“ auswählen.",
|
||||
"presetTitle": "Wie viel möchten Sie auf dem Bildschirm sehen?",
|
||||
"presetIntro": "Wählen Sie aus, wie viel auf dem Bildschirm angezeigt wird.",
|
||||
"presetChangeLater": "Sie können später in den Einstellungen unter „Schnittstelle“ zwischen Voreinstellungen wechseln oder einzelne Einstellungen ändern.",
|
||||
"appearanceTitle": "Machen Sie es zu Ihrem eigenen",
|
||||
"appearanceIntro": "Wählen Sie ein Design, eine Akzentfarbe, eine Schriftart und Ihre Sprache. Änderungen werden sofort angezeigt und können später in den Einstellungen geändert werden.",
|
||||
"securityTitle": "Sichern Sie Ihr Konto",
|
||||
"securityIntro": "Fügen Sie Ihrem Konto einen Passkey oder eine Authenticator-App hinzu. Sie können dies auch später in den Einstellungen unter „Sicherheit“ tun.",
|
||||
"desktopTitle": "Wie möchten Sie Termix verwenden?",
|
||||
"desktopBody": "Sie können dies jederzeit über „Sync“ in der Seitenleiste ändern.",
|
||||
"desktopLocalTitle": "Nur auf diesem Gerät",
|
||||
"desktopLocalBody": "Alles wird hier gespeichert. Keine Einrichtung erforderlich.",
|
||||
"desktopLinkTitle": "Mit meinem Termix-Server",
|
||||
"desktopLinkBody": "Melden Sie sich bei Ihrem Server an, um dieselben Hosts und Einstellungen auf jedem Gerät zu verwenden.",
|
||||
"desktopLinked": "Verknüpft mit {{server}}",
|
||||
"pluginsDocsLink": "Mehr über jedes Plugin erfahren"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} ist bereit zur Installation",
|
||||
"readyHint": "Es wird beim nächsten Neustart von Termix installiert."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Sicherer Modus",
|
||||
"description": "Nur Layout- und Themen-Plugins sind aktiv. Starten Sie den Server ohne TERMIX_SAFE_MODE neu, um die restlichen Plugins wieder zu aktivieren."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Panel schließen",
|
||||
"moveSide": "Panel verschieben",
|
||||
"resize": "Panelgröße ändern"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Startseite",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Anmeldeinformationen",
|
||||
"connections": "Verbindungen",
|
||||
"sync": "Synchronisieren",
|
||||
"reconnectDisconnectedTerminals": "Alle getrennten Terminals wiederherstellen",
|
||||
"reconnectingTerminals_one": "Stelle {{count}} Terminal wieder her",
|
||||
"reconnectingTerminals_other": "Stelle {{count}} Terminals wieder her",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Wiederholen",
|
||||
"refresh": "Aktualisieren",
|
||||
"optional": "Optional",
|
||||
"downloadSample": "Beispiel herunterladen",
|
||||
"failedToDeleteHost": "{{name}} konnte nicht gelöscht werden",
|
||||
"importSkipExisting": "Importieren (vorhandene überspringen)",
|
||||
"importSSHConfig": "Aus SSH-Konfiguration importieren",
|
||||
"connectionDetails": "Verbindungsdetails",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Kein Ordner)",
|
||||
"deleteSelected": "Löschen",
|
||||
"exitSelection": "Auswahl beenden",
|
||||
"importSkip": "Importieren (vorhandene überspringen)",
|
||||
"importOverwrite": "Importieren (überschreiben)",
|
||||
"collapseBtn": "Einklappen",
|
||||
"importExportBtn": "Importieren / Exportieren",
|
||||
"hostStatusesRefreshed": "Host-Status aktualisiert",
|
||||
"failedToRefreshHosts": "Aktualisieren der Hosts fehlgeschlagen",
|
||||
"movedHostTo": "{{host}} nach \"{{folder}}\" verschoben",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "\"{{name}}\" und seinen {{count}} Host löschen? Dies kann nicht rückgängig gemacht werden.",
|
||||
"deleteFolderConfirm_other": "\"{{name}}\" und seine {{count}} Hosts löschen? Dies kann nicht rückgängig gemacht werden.",
|
||||
"failedToMoveHosts": "Hosts konnten nicht verschoben werden",
|
||||
"managedBanner": "Dieser Host wird von {{plugin}} verwaltet. Ändere ihn dort. Du kannst ihn weiterhin anheften und neu anordnen.",
|
||||
"managedTooltip": "Verwaltet von {{plugin}}",
|
||||
"addBlocked": "Hosts werden von {{plugin}} verwaltet, daher können hier keine neuen Hosts hinzugefügt werden.",
|
||||
"failedToReorder": "Neuanordnung fehlgeschlagen",
|
||||
"expandAll": "Alle Verzeichnisse aufklappen",
|
||||
"collapseAll": "Alle Verzeichnisse zuklappen",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Anmeldeinformationen hinzufügen",
|
||||
"checkingHostStatuses": "Host-Status werden überprüft...",
|
||||
"pinnedSection": "Angeheftet",
|
||||
"hostsExported": "Hosts erfolgreich exportiert",
|
||||
"export": {
|
||||
"menuItem": "Exportieren...",
|
||||
"title": "Hosts exportieren",
|
||||
"scope": "Umfang",
|
||||
"scopeAll": "Alle",
|
||||
"scopeSelected": "Ausgewählt",
|
||||
"searchHosts": "Hosts durchsuchen...",
|
||||
"include": "Einschließen",
|
||||
"groupConnection": "Verbindung",
|
||||
"groupCredentials": "Anmeldedaten",
|
||||
"groupNotes": "Notizen",
|
||||
"groupTags": "Tags & Anheften",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump Hosts",
|
||||
"groupFeatureFlags": "Plugin-Einstellungen",
|
||||
"groupAdvanced": "Erweiterte Konfiguration",
|
||||
"preview": "Vorschau",
|
||||
"moreHosts_one": "... {{count}} weiterer Host",
|
||||
"moreHosts_other": "... {{count}} weitere Hosts",
|
||||
"summary": "{{selected}} von {{total}} Hosts",
|
||||
"credentialsIncluded": "Anmeldedaten enthalten",
|
||||
"credentialsExcluded": "Anmeldedaten ausgeschlossen",
|
||||
"noneSelected": "Keine Hosts ausgewählt",
|
||||
"cancel": "Abbrechen",
|
||||
"confirm": "Exportieren",
|
||||
"fetchFailed": "Hosts konnten nicht für den Export geladen werden",
|
||||
"bulkButton": "Exportieren"
|
||||
},
|
||||
"sampleDownloaded": "Beispieldatei heruntergeladen",
|
||||
"failedToDeleteCredential2": "Anmeldedaten konnten nicht gelöscht werden",
|
||||
"noFolderOption": "(Kein Ordner)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Host aktualisieren",
|
||||
"editorAdd": "Host hinzufügen",
|
||||
"speedSearch": "Hosts durchsuchen. Pfeiltasten zum Auswählen, Enter zum Verbinden, Esc zum Schließen",
|
||||
"speedSearchList": "Hostliste. Tippen Sie oder drücken Sie / zum Suchen.",
|
||||
"importNoHosts": "Keine Hosts in der Datei gefunden",
|
||||
"importTooMany": "Sie können auf einmal bis zu {{max}} Hosts importieren",
|
||||
"importSummary": "Import abgeschlossen: {{imported}} importiert, {{updated}} aktualisiert, {{failed}} fehlgeschlagen",
|
||||
"importHostsFailed": "Import von Hosts fehlgeschlagen"
|
||||
"speedSearchList": "Hostliste. Tippen Sie oder drücken Sie / zum Suchen."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Geteilter Bildschirm",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Farbauswahl öffnen",
|
||||
"themeSystem": "System",
|
||||
"themeLight": "Hell",
|
||||
"themeDark": "Dunkel",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Dunkel"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Wie die gesamte App angeordnet ist. Themes und Layouts stammen von Plugins.",
|
||||
"defaultsLabel": "Standard für alle",
|
||||
"defaultsHint": "Was Benutzer sehen, bis sie ihr eigenes Layout oder Theme auswählen.",
|
||||
"followDefault": "Standard verwenden",
|
||||
"defaultSaved": "Standardansicht gespeichert",
|
||||
"saveFailed": "Ansicht konnte nicht gespeichert werden",
|
||||
"repair": {
|
||||
"title": "Dieses Layout konnte nicht angezeigt werden",
|
||||
"safeTitle": "Sicherer Modus",
|
||||
"layout": "Layout",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Grund",
|
||||
"error": "Fehler",
|
||||
"noError": "Keine Fehlermeldung.",
|
||||
"copy": "Kopieren",
|
||||
"copied": "Kopiert",
|
||||
"copyFailed": "Details konnten nicht kopiert werden",
|
||||
"retry": "Erneut versuchen",
|
||||
"reset": "Auf Standardansicht zurücksetzen",
|
||||
"resetEveryone": "Standard für alle zurücksetzen",
|
||||
"update": "{{name}} auf {{version}} aktualisieren",
|
||||
"disable": "{{name}} deaktivieren",
|
||||
"enable": "{{name}} aktivieren",
|
||||
"startAgain": "{{name}} neu starten",
|
||||
"install": "Layouts und Themes finden",
|
||||
"installTitle": "Layouts und Themes",
|
||||
"installButton": "Installieren",
|
||||
"nothingToInstall": "Derzeit sind keine anderen Layouts oder Themes verfügbar.",
|
||||
"registryUnreachable": "Das Plugin-Register konnte nicht erreicht werden.",
|
||||
"askAdmin": "Bitte einen Administrator, dieses Layout zu aktualisieren oder zu reparieren. Du kannst unten auf ein anderes Layout oder Theme umschalten.",
|
||||
"switchLayout": "Layout wechseln",
|
||||
"switchTheme": "Theme wechseln",
|
||||
"saveFailed": "Deine Auswahl konnte nicht gespeichert werden",
|
||||
"reasons": {
|
||||
"safe-url": "Die Adresse hat den sicheren Modus angefordert. Wähle unten ein Layout oder entferne ?safe-layout=1 aus der Adresse.",
|
||||
"safe-env": "Der Server wurde mit TERMIX_SAFE_LAYOUT gestartet, daher sehen alle Benutzer diesen Bildschirm, bis dies entfernt wird.",
|
||||
"missing": "Kein installiertes Plugin stellt dieses Layout bereit.",
|
||||
"disabled": "Das Plugin, das dieses Layout bereitstellt, ist deaktiviert.",
|
||||
"blocked": "Das Plugin, das dieses Layout bereitstellt, wartet auf eine benötigte Ressource.",
|
||||
"incompatible": "Das Plugin, das dieses Layout bereitstellt, ist mit dieser Version von Termix nicht kompatibel.",
|
||||
"failed": "Das Layout konnte nicht gestartet werden.",
|
||||
"crashed": "Das Layout ist beim Rendern der App zweimal abgestürzt."
|
||||
},
|
||||
"noLayout": "Kein Layout festgelegt",
|
||||
"restore": "Beigefügtes {{name}} wiederherstellen",
|
||||
"restoreFailed": "Beigefügte Kopie konnte nicht wiederhergestellt werden"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Anmeldung verwalten",
|
||||
"consequence": "Es kann eine Anmeldemethode, einen zweiten Faktor oder einen SSH-Anmeldetyp hinzufügen."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Anmelderegeln festlegen",
|
||||
"consequence": "Es kann Benutzer bei Inaktivität abmelden, die Sitzungsdauer begrenzen, „Angemeldet bleiben“ deaktivieren und einen zweiten Faktor erfordern."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Wählen, wie Hosts erreicht werden",
|
||||
"consequence": "Es kann die SSH-Verbindung zu einem Host über seinen eigenen Pfad leiten, sodass es alles sieht, was zu und von diesen Hosts gesendet wird, einschließlich Passwörtern."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Synchronisierung ausführen",
|
||||
"consequence": "Es kann alle Synchronisierungsanfragen beantworten, sodass es die Daten sieht, die Geräte und Server synchronisieren."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Zertifikate verwalten",
|
||||
"consequence": "Es kann das Zertifikat ersetzen, das Termix über HTTPS bereitstellt, und Domänenprüfungen von Zertifizierungsstellen beantworten."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Auf serielle und USB-Geräte zugreifen",
|
||||
"consequence": "Es kann einen physischen seriellen Port auf dem Computer öffnen, auf dem Termix läuft."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Hosts mit ihren Geheimnissen exportieren",
|
||||
"consequence": "Kann deine Hosts vollständig lesen, einschließlich gespeicherter Passwörter und Schlüssel, und sie weitergeben. Jeder Export wird im Audit-Log protokolliert."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Hosts erstellen und ändern",
|
||||
"consequence": "Es kann Hosts hinzufügen und bestehende bearbeiten."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Audit-Log lesen",
|
||||
"consequence": "Es kann sehen, wer was und wann getan hat."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Prüfen, ob Ports antworten",
|
||||
"consequence": "Kann eine unverschlüsselte Verbindung zu jeder Adresse vom Server aus öffnen, um zu sehen, ob sie erreichbar ist."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Hoststatus bereitstellen",
|
||||
"consequence": "Wird zur Quelle der Online- und Offline-Punkte für jeden Host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Letzte Aktivitäten speichern",
|
||||
"consequence": "Dient als Speicher für die Liste der letzten Aktivitäten jedes Nutzers."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Hosts schreibgeschützt verwalten",
|
||||
"consequence": "Die verwalteten Hosts können von niemandem anderem bearbeitet, gelöscht oder erneut geteilt werden."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Desktop-Fenster öffnen",
|
||||
"consequence": "Nur in der Termix-Desktop-App."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Diesen Computer verwenden",
|
||||
"consequence": "Kann auf diesem Computer Dateien lesen und ändern, eine Shell ausführen und lokale Ports öffnen. Nur in der Termix-Desktop-App."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Als andere Benutzer handeln",
|
||||
"consequence": "Führt Hintergrundarbeit mit dem Zugriff eines anderen Benutzers aus, z. B. geplante Jobs. Jede Verwendung wird im Audit-Log festgehalten."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Eigene Bildschirme hinzufügen",
|
||||
"consequence": "Tabs, Panels und Einstellungen, die Sie später ausblenden können."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Gesamtes App-Layout ersetzen",
|
||||
"consequence": "Wenn ausgewählt, zeichnet sein Code jeden Bildschirm, einschließlich Ihrer Terminals und Einstellungen."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Farbschemata hinzufügen",
|
||||
"consequence": "Nur Farben und Stile. Für ein Farbschema wird kein Code ausgeführt."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Deaktiviert",
|
||||
"failed": "Unerwartet gestoppt",
|
||||
"blocked": "Wartet auf ein anderes Plugin",
|
||||
"server": "Läuft auf deinem Server"
|
||||
"server": "Läuft auf deinem Server",
|
||||
"safeMode": "Im sicheren Modus deaktiviert"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Aktiv",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Kürzlich aktualisiert",
|
||||
"category": "Kategorie"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Spalten",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} Spalten breit"
|
||||
},
|
||||
"table": {
|
||||
"name": "Name",
|
||||
"description": "Beschreibung",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Optionen für {{name}} konnten nicht gespeichert werden: {{error}}",
|
||||
"deleteData": "Daten für {{name}} konnten nicht gelöscht werden: {{error}}",
|
||||
"managedByServer": "Dieser Desktop ist mit einem Server verknüpft, der die Plugins bestimmt.",
|
||||
"defaultLook": "{{name}} ist das Standardschema, daher kann es deaktiviert oder ersetzt, aber nicht deinstalliert werden.",
|
||||
"hasDependents": "{{name}} wird von {{list}} benötigt. Deaktiviere oder deinstalliere diese zuerst.",
|
||||
"missingDependencies": "{{name}} benötigt {{list}}, das nicht installiert ist.",
|
||||
"consentChanged": "Die Anforderungen dieses Plugins haben sich seit deinem letzten Blick geändert. Prüfe die Liste erneut.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Kein Zugriff auf Ihre Server",
|
||||
"searchInstalled": "Installierte durchsuchen",
|
||||
"searchPlugins": "Plugins durchsuchen",
|
||||
"allCategories": "Alle",
|
||||
"nothingMatches": "Nichts passt dazu.",
|
||||
"noneInstalled": "Noch keine Plugins installiert. Stöbern Sie, um welche hinzuzufügen.",
|
||||
"nothingHere": "Hier ist nichts.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Dokumentation",
|
||||
"envVars": "Umgebungsvariablen",
|
||||
"envRequired": "Erforderlich",
|
||||
"envDefault": "Standard: {{value}}"
|
||||
"envDefault": "Standard: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Layouts",
|
||||
"themes": "Farbschemata",
|
||||
"tabs": "Tabs",
|
||||
"panels": "Seitenleisten-Panel",
|
||||
"dashboardCards": "Dashboard-Karten",
|
||||
"protocols": "Verbindungstypen",
|
||||
"auth": "Anmeldemethoden",
|
||||
"actions": "Aktionen",
|
||||
"hostCapability": "Host-Einstellungen"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Typ",
|
||||
"allTypes": "Alle Typen",
|
||||
"category": "Kategorie",
|
||||
"allCategories": "Alle Kategorien",
|
||||
"results_one": "{{count}} Plugin",
|
||||
"results_other": "{{count}} Plugins",
|
||||
"remove": "Filter {{name}} entfernen",
|
||||
"clear": "Filter löschen",
|
||||
"button": "Filter",
|
||||
"buttonCount": "Filter ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} von {{total}}",
|
||||
"page": "Seite {{page}} von {{pages}}",
|
||||
"previous": "Vorherige Seite",
|
||||
"next": "Nächste Seite",
|
||||
"perPage": "{{count}} pro Seite",
|
||||
"perPageLabel": "Plugins pro Seite"
|
||||
},
|
||||
"showUnsupportedHint": "Diese werden aufgelistet, aber es gibt noch keine Version, die mit dieser Version läuft. Aktualisieren Sie Termix, um sie zu installieren.",
|
||||
"unsupported": "Benötigt eine neuere Termix-Version",
|
||||
"unsupportedHint": "Keine Version dieses Plugins läuft mit dieser Version von Termix. Aktualisieren Sie Termix, um es zu installieren.",
|
||||
"needsTermix": "Benötigt Termix {{range}}",
|
||||
"showUnsupported": "Nicht unterstützte anzeigen ({{count}})",
|
||||
"showMore": "{{count}} weitere anzeigen ({{total}} übrig)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Keine Daten",
|
||||
"filter": "Filtern..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "vor {{count}} Minute",
|
||||
"minutesAgo_other": "vor {{count}} Minuten",
|
||||
"hoursAgo_one": "vor {{count}} Stunde",
|
||||
"hoursAgo_other": "vor {{count}} Stunden",
|
||||
"pending_one": "{{count}} Änderung wartet auf Synchronisierung",
|
||||
"pending_other": "{{count}} Änderungen warten auf Synchronisierung",
|
||||
"proxy": {
|
||||
"headersTitle": "Zusätzliche Header",
|
||||
"headersHint": "Wird mit jeder Anfrage an den Server gesendet, z. B. ein Cloudflare Access Service-Token.",
|
||||
"headerName": "Header-Name",
|
||||
"headerValue": "Wert",
|
||||
"savedValue": "Gespeichert, zum Ändern tippen",
|
||||
"addHeader": "Header hinzufügen",
|
||||
"removeHeader": "Header entfernen",
|
||||
"basicAuthTitle": "Benutzername und Passwort",
|
||||
"basicAuthHint": "Für einen Proxy, der vor Termix nach Benutzername und Passwort fragt.",
|
||||
"username": "Benutzername",
|
||||
"password": "Passwort",
|
||||
"allowInvalidCertificate": "Selbstsigniertes Zertifikat vertrauen",
|
||||
"allowInvalidCertificateHint": "Nur für Ihren eigenen Server, wenn dessen Zertifikat nicht von einer bekannten Stelle stammt."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Das sieht nicht nach einer Webadresse aus.",
|
||||
"unreachable": "Der Server konnte nicht erreicht werden. Überprüfen Sie die Adresse und stellen Sie sicher, dass der Server läuft.",
|
||||
"unreachableWithReason": "Der Server konnte nicht erreicht werden: {{reason}}",
|
||||
"tlsUntrusted": "Das Zertifikat des Servers ist nicht vertrauenswürdig. Wenn dies Ihr eigener Server mit einem selbstsignierten Zertifikat ist, aktivieren Sie die Option unten.",
|
||||
"basicAuthRequired": "Ein System vor dem Server fordert einen Benutzernamen und ein Passwort an. Geben Sie diese unten ein.",
|
||||
"proxyLogin": "Eine Anmeldeseite oder ein Proxy hat anstelle von Termix geantwortet. Fügen Sie unten die erforderlichen Header hinzu oder überprüfen Sie die Adresse.",
|
||||
"notTermix": "Unter dieser Adresse befindet sich kein Termix-Server. Wenn er unter einem Pfad läuft, fügen Sie diesen hinzu, z. B. https://example.com/termix.",
|
||||
"versionMismatch": "Dieser Server verwendet eine ältere Version von Termix. Aktualisieren Sie ihn auf Version 2.9 oder höher, um ihn zu verknüpfen.",
|
||||
"differentAccount": "Sie haben sich bei einem anderen Konto angemeldet. Melden Sie sich beim Konto an, mit dem dieses Gerät verknüpft ist, oder trennen Sie zuerst die Verknüpfung."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Mit einem Termix-Server verknüpfen",
|
||||
"reloginTitle": "Erneut anmelden",
|
||||
"savedServers": "Zuletzt verwendete Server",
|
||||
"removeServer": "Aus der Liste entfernen",
|
||||
"serverDescription": "Geben Sie die Adresse ein, die Sie verwenden, um Termix in Ihrem Browser zu öffnen.",
|
||||
"signinDescription": "Bei {{url}} anmelden",
|
||||
"chooseDescription": "Dieses Gerät enthält bereits Daten. Was soll mit ihnen geschehen?",
|
||||
"finishingDescription": "Dieses Gerät wird verknüpft.",
|
||||
"serverUrl": "Serveradresse",
|
||||
"serverUrlHint": "Zum Beispiel https://termix.example.com",
|
||||
"showProxySettings": "Reverse-Proxy-Einstellungen",
|
||||
"hideProxySettings": "Reverse-Proxy-Einstellungen ausblenden",
|
||||
"continue": "Weiter",
|
||||
"back": "Zurück",
|
||||
"mergeTitle": "Zu meinem Konto hinzufügen",
|
||||
"mergeBody_one": "Der Eintrag auf diesem Gerät wird zu Ihrem Konto hinzugefügt. Einträge, die Ihr Konto bereits hat, bleiben auf dem Server unverändert.",
|
||||
"mergeBody_other": "Die {{count}} Einträge auf diesem Gerät werden zu Ihrem Konto hinzugefügt. Einträge, die Ihr Konto bereits hat, bleiben auf dem Server unverändert.",
|
||||
"replaceTitle": "Durch mein Konto ersetzen",
|
||||
"replaceBody_one": "Der Eintrag auf diesem Gerät wird entfernt und dieses Gerät übernimmt alles von Ihrem Konto. Hosts, die nur auf diesem Gerät gespeichert sind, bleiben erhalten.",
|
||||
"replaceBody_other": "Die {{count}} Einträge auf diesem Gerät werden entfernt und dieses Gerät übernimmt alles von Ihrem Konto. Hosts, die nur auf diesem Gerät gespeichert sind, bleiben erhalten.",
|
||||
"link": "Verknüpfen",
|
||||
"linking": "Verknüpfung wird hergestellt und erste Synchronisierung wird ausgeführt...",
|
||||
"linked": "Verknüpft. Ihre Daten werden jetzt synchronisiert.",
|
||||
"signedInAgain": "Angemeldet. Die Synchronisierung läuft wieder."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hosts",
|
||||
"sshCredentials": "Anmeldeinformationen",
|
||||
"sshFolders": "Ordner",
|
||||
"userPreferences": "Einstellungen",
|
||||
"pluginUserSettings": "Plugin-Einstellungen",
|
||||
"sharedHosts": "Mit Ihnen geteilte Hosts",
|
||||
"sharedCredentials": "Mit Ihnen geteilte Anmeldeinformationen",
|
||||
"vaultProfiles": "Vault-Profile",
|
||||
"snippetFolders": "Snippet-Ordner",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Service-Links",
|
||||
"homepageItems": "Startseiten-Elemente",
|
||||
"networkTopology": "Netzwerkübersicht",
|
||||
"workspaces": "Arbeitsbereiche",
|
||||
"hostDefaults": "Host-Standardwerte",
|
||||
"hostDefaultsAdmin": "Server-Host-Standardwerte",
|
||||
"aiProviders": "AI-Anbieter",
|
||||
"homepageLayouts": "Startseiten-Layouts",
|
||||
"accountProfile": "Kontoprofil"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Ordner {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Raster",
|
||||
"listView": "Liste",
|
||||
"compactRows": "Kompakte Zeilen",
|
||||
"comfortableRows": "Bequeme Zeilen"
|
||||
"comfortableRows": "Bequeme Zeilen",
|
||||
"columns": {
|
||||
"title": "Spalten",
|
||||
"auto": "Automatisch",
|
||||
"count": "{{count}} Spalten breit"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Gespeichert. Tippen, um es zu ersetzen."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Ορισμένοι προσθέτες δεν μπόρεσαν να αλλάξουν. Μπορείτε να τους διορθώσετε αργότερα από την καρτέλα Προσθέτες. Πατήστε Επόμενο για να συνεχίσετε.",
|
||||
"pluginsApplyFailed": "Οι επιλογές σας δεν μπόρεσαν να αποθηκευτούν. Δοκιμάστε ξανά ή συνεχίστε και αλλάξτε τις αργότερα από την καρτέλα Προσθέτες.",
|
||||
"pluginsLoadFailed": "Δεν μπόρεσε να φορτωθεί η λίστα προσθέτων. Μπορείτε να επιλέξετε προσθέτες αργότερα από την καρτέλα Προσθέτες.",
|
||||
"presetTitle": "Πόσα θέλετε να φαίνονται στην οθόνη;",
|
||||
"presetIntro": "Επιλέξτε πόσα εμφανίζονται στην οθόνη.",
|
||||
"presetChangeLater": "Μπορείτε να αλλάξετε προεπιλογές ή οποιαδήποτε μεμονωμένη ρύθμιση αργότερα στις Ρυθμίσεις, κάτω από Επαφή.",
|
||||
"appearanceTitle": "Κάντε το δικό σας",
|
||||
"appearanceIntro": "Επιλέξτε ένα θέμα, ένα χρώμα έμφασης, μια γραμματοσειρά και τη γλώσσα σας. Οι αλλαγές εμφανίζονται αμέσως και μπορείτε να τις αλλάξετε αργότερα στις Ρυθμίσεις.",
|
||||
"securityTitle": "Ασφαλίστε τον λογαριασμό σας",
|
||||
"securityIntro": "Προσθέστε ένα passkey ή μια εφαρμογή ελέγχου ταυτότητας στον λογαριασμό σας. Μπορείτε επίσης να το κάνετε αυτό αργότερα στις Ρυθμίσεις, κάτω από Ασφάλεια.",
|
||||
"desktopTitle": "Πώς θέλετε να χρησιμοποιήσετε το Termix;",
|
||||
"desktopBody": "Μπορείτε να αλλάξετε αυτό ανά πάσα στιγμή από τη Συγχρονισμό στη πλευρική γραμμή.",
|
||||
"desktopLocalTitle": "Μόνο σε αυτήν τη συσκευή",
|
||||
"desktopLocalBody": "Όλα αποθηκεύονται εδώ. Τίποτα για ρύθμιση.",
|
||||
"desktopLinkTitle": "Με τον διακομιστή Termix μου",
|
||||
"desktopLinkBody": "Συνδεθείτε στον διακομιστή σας για να χρησιμοποιείτε τους ίδιους διακομιστές και ρυθμίσεις σε κάθε συσκευή.",
|
||||
"desktopLinked": "Συνδεδεμένο με {{server}}",
|
||||
"pluginsDocsLink": "Διαβάστε για καθένα"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Το Termix {{version}} είναι έτοιμο για εγκατάσταση",
|
||||
"readyHint": "Εγκαθίσταται την επόμενη φορά που θα επανεκκινήσει το Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Λειτουργία ασφαλείας",
|
||||
"description": "Τρέχουν μόνο οι προσθήκες διάταξης και θέματος. Επανεκκινήστε τον διακομιστή χωρίς το TERMIX_SAFE_MODE για να ενεργοποιήσετε ξανά τις υπόλοιπες."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Κλείσιμο πάνελ",
|
||||
"moveSide": "Μετακίνηση πάνελ",
|
||||
"resize": "Αλλαγή μεγέθους πάνελ"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Αρχική",
|
||||
"terminal": "Τερματικό",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Διακομιστές",
|
||||
"credentials": "Στοιχεία Εισόδου",
|
||||
"connections": "Συνδέσεις",
|
||||
"sync": "Συγχρονισμός",
|
||||
"reconnectDisconnectedTerminals": "Επανασύνδεση όλων των αποσυνδεδεμένων τερματικών",
|
||||
"reconnectingTerminals_one": "Επανασύνδεση {{count}} τερματικού",
|
||||
"reconnectingTerminals_other": "Επανασύνδεση {{count}} τερματικών",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Επανάληψη",
|
||||
"refresh": "Ανανέωση",
|
||||
"optional": "Προαιρετικό",
|
||||
"downloadSample": "Λήψη Παραδείγματος",
|
||||
"failedToDeleteHost": "Αποτυχία διαγραφής του {{name}}",
|
||||
"importSkipExisting": "Εισαγωγή (παράλειψη υπαρχόντων)",
|
||||
"importSSHConfig": "Εισαγωγή από ρυθμίσεις SSH",
|
||||
"connectionDetails": "Λεπτομέρειες Σύνδεσης",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Χωρίς φάκελο)",
|
||||
"deleteSelected": "Διαγραφή",
|
||||
"exitSelection": "Έξοδος από επιλογή",
|
||||
"importSkip": "Εισαγωγή (παράλειψη υπαρχόντων)",
|
||||
"importOverwrite": "Εισαγωγή (αντικατάσταση)",
|
||||
"collapseBtn": "Σύμπτυξη",
|
||||
"importExportBtn": "Εισαγωγή / Εξαγωγή",
|
||||
"hostStatusesRefreshed": "Οι καταστάσεις των hosts ανανεώθηκαν",
|
||||
"failedToRefreshHosts": "Αποτυχία ανανέωσης των hosts",
|
||||
"movedHostTo": "Μετακίνηση του {{host}} στον «{{folder}}»",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Διαγραφή του \"{{name}}\" και των {{count}} hosts του; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
|
||||
"deleteFolderConfirm_other": "Διαγραφή του \"{{name}}\" και των {{count}} hosts του; Αυτή η ενέργεια δεν μπορεί να αναιρεθεί.",
|
||||
"failedToMoveHosts": "Αποτυχία μετακίνησης hosts",
|
||||
"managedBanner": "Αυτός ο host διαχειρίζεται από το {{plugin}}. Κάντε αλλαγές εκεί. Μπορείτε ακόμα να τον προσαρτήσετε και να αλλάξετε τη σειρά του.",
|
||||
"managedTooltip": "Διαχειρίζεται από το {{plugin}}",
|
||||
"addBlocked": "Οι hosts διαχειρίζονται από το {{plugin}}, οπότε δεν μπορούν να προστεθούν νέοι hosts εδώ.",
|
||||
"failedToReorder": "Αποτυχία αναδιάταξης",
|
||||
"expandAll": "Ανάπτυξη όλων των φακέλων",
|
||||
"collapseAll": "Σύμπτυξη όλων των φακέλων",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Προσθήκη Διαπιστευτηρίου",
|
||||
"checkingHostStatuses": "Έλεγχος καταστάσεων hosts...",
|
||||
"pinnedSection": "Στερεωμένα",
|
||||
"hostsExported": "Οι hosts εξάχθηκαν επιτυχώς",
|
||||
"export": {
|
||||
"menuItem": "Εξαγωγή...",
|
||||
"title": "Εξαγωγή hosts",
|
||||
"scope": "Εμβέλεια",
|
||||
"scopeAll": "Όλα",
|
||||
"scopeSelected": "Επιλεγμένα",
|
||||
"searchHosts": "Αναζήτηση hosts...",
|
||||
"include": "Συμπερίληψη",
|
||||
"groupConnection": "Σύνδεση",
|
||||
"groupCredentials": "Στοιχεία σύνδεσης",
|
||||
"groupNotes": "Σημειώσεις",
|
||||
"groupTags": "Ετικέτες & στέρευση",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump hosts",
|
||||
"groupFeatureFlags": "Ρυθμίσεις plugins",
|
||||
"groupAdvanced": "Προχωρημένη ρύθμιση",
|
||||
"preview": "Προεπισκόπηση",
|
||||
"moreHosts_one": "... {{count}} ακόμη host",
|
||||
"moreHosts_other": "... {{count}} ακόμη hosts",
|
||||
"summary": "{{selected}} από {{total}} hosts",
|
||||
"credentialsIncluded": "τα στοιχεία σύνδεσης συμπεριλήφθηκαν",
|
||||
"credentialsExcluded": "τα στοιχεία σύνδεσης αποκλείστηκαν",
|
||||
"noneSelected": "Δεν έχουν επιλεγεί hosts",
|
||||
"cancel": "Ακύρωση",
|
||||
"confirm": "Εξαγωγή",
|
||||
"fetchFailed": "Αποτυχία φόρτωσης hosts για εξαγωγή",
|
||||
"bulkButton": "Εξαγωγή"
|
||||
},
|
||||
"sampleDownloaded": "Το αρχείο δείγματος κατεβάστηκε",
|
||||
"failedToDeleteCredential2": "Αποτυχία διαγραφής στοιχείου σύνδεσης",
|
||||
"noFolderOption": "(Χωρίς φάκελο)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Ενημέρωση Υπολογιστή",
|
||||
"editorAdd": "Προσθήκη Υπολογιστή",
|
||||
"speedSearch": "Αναζήτηση υπολογιστών. Πλήκτρα βέλγους για επιλογή, Enter για σύνδεση, Esc για κλείσιμο",
|
||||
"speedSearchList": "Λίστα υπολογιστών. Πληκτρολογήστε ή πατήστε / για αναζήτηση.",
|
||||
"importNoHosts": "Δεν βρέθηκαν υπολογιστές στο αρχείο",
|
||||
"importTooMany": "Μπορείτε να εισάγετε έως {{max}} υπολογιστές ταυτόχρονα",
|
||||
"importSummary": "Η εισαγωγή ολοκληρώθηκε: {{imported}} εισήχθησαν, {{updated}} ενημερώθηκαν, {{failed}} απέτυχαν",
|
||||
"importHostsFailed": "Αποτυχία εισαγωγής υπολογιστών"
|
||||
"speedSearchList": "Λίστα υπολογιστών. Πληκτρολογήστε ή πατήστε / για αναζήτηση."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Διαίρεση οθόνης",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Άνοιγμα επιλογέα χρώματος",
|
||||
"themeSystem": "Σύστημα",
|
||||
"themeLight": "Φωτεινό",
|
||||
"themeDark": "Σκοτεινό",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Σκοτεινό"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Πώς είναι διατεταγμένη η εφαρμογή συνολικά. Τα θέματα και τα layouts προέρχονται από plugins.",
|
||||
"defaultsLabel": "Προεπιλογή για όλους",
|
||||
"defaultsHint": "Αυτό που βλέπουν οι χρήστες μέχρι να επιλέξουν το δικό τους layout ή θέμα.",
|
||||
"followDefault": "Χρήση της προεπιλογής",
|
||||
"defaultSaved": "Η προεπιλεγμένη εμφάνιση αποθηκεύτηκε",
|
||||
"saveFailed": "Δεν ήταν δυνατή η αποθήκευση της εμφάνισης",
|
||||
"repair": {
|
||||
"title": "Αυτό το layout δεν μπόρεσε να εμφανιστεί",
|
||||
"safeTitle": "Ασφαλής λειτουργία",
|
||||
"layout": "Layout",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Λόγος",
|
||||
"error": "Σφάλμα",
|
||||
"noError": "Κανένα μήνυμα σφάλματος.",
|
||||
"copy": "Αντιγραφή",
|
||||
"copied": "Αντιγράφηκε",
|
||||
"copyFailed": "Δεν ήταν δυνατή η αντιγραφή των λεπτομερειών",
|
||||
"retry": "Δοκιμή ξανά",
|
||||
"reset": "Επαναφορά στην προεπιλεγμένη εμφάνιση",
|
||||
"resetEveryone": "Επαναφορά της προεπιλογής για όλους",
|
||||
"update": "Ενημέρωση του {{name}} στην έκδοση {{version}}",
|
||||
"disable": "Απενεργοποίηση του {{name}}",
|
||||
"enable": "Ενεργοποίηση {{name}}",
|
||||
"startAgain": "Εκκίνηση {{name}} ξανά",
|
||||
"install": "Εύρεση layouts και θεμάτων",
|
||||
"installTitle": "Layouts και θέματα",
|
||||
"installButton": "Εγκατάσταση",
|
||||
"nothingToInstall": "Δεν υπάρχουν άλλα layouts ή θέματα διαθέσιμα αυτή τη στιγμή.",
|
||||
"registryUnreachable": "Δεν ήταν δυνατή η πρόσβαση στο μητρώο plugins.",
|
||||
"askAdmin": "Ζητήστε από έναν διαχειριστή να ενημερώσει ή να διορθώσει αυτό το layout. Μπορείτε να αλλάξετε σε άλλο layout ή θέμα για τον εαυτό σας παρακάτω.",
|
||||
"switchLayout": "Αλλαγή layout",
|
||||
"switchTheme": "Αλλαγή θέματος",
|
||||
"saveFailed": "Δεν ήταν δυνατή η αποθήκευση της επιλογής σας",
|
||||
"reasons": {
|
||||
"safe-url": "Η διεύθυνση ζήτησε ασφαλή λειτουργία. Επιλέξτε ένα layout παρακάτω, ή αφαιρέστε το ?safe-layout=1 από τη διεύθυνση.",
|
||||
"safe-env": "Ο server ξεκίνησε με το TERMIX_SAFE_LAYOUT, οπότε όλοι βλέπουν αυτή την οθόνη μέχρι να αφαιρεθεί.",
|
||||
"missing": "Κανένα εγκατεστημένο plugin δεν παρέχει αυτό το layout.",
|
||||
"disabled": "Το plugin που παρέχει αυτό το layout είναι απενεργοποιημένο.",
|
||||
"blocked": "Το plugin που παρέχει αυτό το layout περιμένει κάτι που χρειάζεται.",
|
||||
"incompatible": "Το plugin που παρέχει αυτό το layout δεν λειτουργεί με αυτή την έκδοση του Termix.",
|
||||
"failed": "Το layout απέτυχε να ξεκινήσει.",
|
||||
"crashed": "Το layout κατέρρευσε δύο φορές κατά την απόδοση της εφαρμογής."
|
||||
},
|
||||
"noLayout": "Δεν έχει οριστεί layout",
|
||||
"restore": "Επαναφορά του ενσωματωμένου {{name}}",
|
||||
"restoreFailed": "Δεν ήταν δυνατή η επαναφορά του ενσωματωμένου αντιγράφου"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Διαχείριση σύνδεσης",
|
||||
"consequence": "Μπορεί να προσθέσει μέθοδο σύνδεσης, δεύτερο παράγοντα ή τύπο σύνδεσης SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Ορισμός κανόνων σύνδεσης",
|
||||
"consequence": "Μπορεί να αποσυνδέει χρήστες όταν είναι ανενεργοί, να περιορίζει τη διάρκεια της συνεδρίας, να απενεργοποιεί τη λειτουργία «Θυμήσου με» και να απαιτεί δεύτερο παράγοντα."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Επιλογή τρόπου πρόσβασης στους hosts",
|
||||
"consequence": "Μπορεί να μεταφέρει τη σύνδεση SSH σε έναν host μέσω της δικής του διαδρομής, οπότε βλέπει τα πάντα που στέλνονται και λαμβάνονται από αυτούς τους hosts, συμπεριλαμβανομένων των κωδικών πρόσβασης."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Εκτέλεση συγχρονισμού",
|
||||
"consequence": "Μπορεί να απαντά σε όλα τα αιτήματα συγχρονισμού, οπότε βλέπει τα δεδομένα που συγχρονίζουν οι συσκευές και οι servers."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Διαχείριση πιστοποιητικών",
|
||||
"consequence": "Μπορεί να αντικαταστήσει το πιστοποιητικό που εξυπηρετεί το Termix μέσω HTTPS και να απαντά σε ελέγχους τομέα από αρχές πιστοποίησης."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Πρόσβαση σε σειριακές και USB συσκευές",
|
||||
"consequence": "Μπορεί να ανοίξει μια φυσική σειριακή θύρα στη συσκευή που τρέχει το Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Εξαγωγή hosts με τα μυστικά τους",
|
||||
"consequence": "Μπορεί να διαβάζει τους hosts σας πλήρως, συμπεριλαμβανομένων των αποθηκευμένων κωδικών πρόσβασης και κλειδιών, και να τα παρέχει. Κάθε εξαγωγή καταγράφεται στο αρχείο ελέγχου."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Δημιουργία και αλλαγή διακομιστών",
|
||||
"consequence": "Μπορεί να προσθέτει διακομιστές και να επεξεργάζεται αυτούς που έχετε ήδη."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Ανάγνωση αρχείου ελέγχου",
|
||||
"consequence": "Μπορεί να δει ποιος έκανε τι και πότε."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Έλεγχος αν οι θύρες απαντούν",
|
||||
"consequence": "Μπορεί να ανοίξει μια απλή σύνδεση σε οποιαδήποτε διεύθυνση από τον server, για να δει αν είναι προσβάσιμη."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Παροχή κατάστασης host",
|
||||
"consequence": "Γίνεται η πηγή των σημείων online και offline για κάθε host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Αποθήκευση πρόσφατης δραστηριότητας",
|
||||
"consequence": "Γίνεται το αποθετήριο για τη λίστα πρόσφατης δραστηριότητας κάθε χρήστη."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Διαχείριση hosts ως μόνο για ανάγνωση",
|
||||
"consequence": "Οι hosts που διαχειρίζεται δεν μπορούν να επεξεργαστούν, να διαγραφούν ή να κοινοποιηθούν ξανά από κανέναν άλλον."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Άνοιγμα παραθύρων επιφάνειας εργασίας",
|
||||
"consequence": "Μόνο στην εφαρμογή επιφάνειας εργασίας Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Χρήση αυτού του υπολογιστή",
|
||||
"consequence": "Μπορεί να διαβάζει και να αλλάζει αρχεία, να εκτελεί shell και να ανοίγει τοπικές θύρες σε αυτόν τον υπολογιστή. Μόνο στην εφαρμογή Termix για επιφάνεια εργασίας."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Δράση ως άλλοι χρήστες",
|
||||
"consequence": "Εκτελεί εργασίες υποβάθρου με την πρόσβαση άλλου χρήστη, όπως προγραμματισμένες εργασίες. Κάθε χρήση καταγράφεται στο αρχείο ελέγχου."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Προσθήκη των δικών του οθονών",
|
||||
"consequence": "Καρτέλες, πάνελ και ρυθμίσεις που μπορείτε να κρύψετε αργότερα."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Αντικατάσταση ολόκληρης της διάταξης της εφαρμογής",
|
||||
"consequence": "Όταν επιλεγεί, ο κώδικάς του σχεδιάζει κάθε οθόνη, συμπεριλαμβανομένων των τερματικών και των ρυθμίσεών σας."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Προσθήκη χρωματικών θεμάτων",
|
||||
"consequence": "Μόνο χρώματα και στυλ. Δεν εκτελείται κώδικας για ένα θέμα."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Απενεργοποιημένο",
|
||||
"failed": "Διακόπηκε απροσδόκητα",
|
||||
"blocked": "Περιμένει άλλο plugin",
|
||||
"server": "Τρέχει στον διακομιστή σας"
|
||||
"server": "Τρέχει στον διακομιστή σας",
|
||||
"safeMode": "Ανενεργό στη λειτουργία ασφαλείας"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Εν ενεργεία",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Πρόσφατα ενημερωμένα",
|
||||
"category": "Κατηγορία"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Στήλες",
|
||||
"auto": "Αυτόματο",
|
||||
"count": "{{count}} στήλες"
|
||||
},
|
||||
"table": {
|
||||
"name": "Όνομα",
|
||||
"description": "Περιγραφή",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Αδυναμία αποθήκευσης των επιλογών για το {{name}}: {{error}}",
|
||||
"deleteData": "Αδυναμία διαγραφής των δεδομένων για το {{name}}: {{error}}",
|
||||
"managedByServer": "Αυτή η επιφάνεια εργασίας συνδέεται με έναν διακομιστή, ο οποίος καθορίζει τα πρόσθετά της.",
|
||||
"defaultLook": "Το {{name}} είναι η προεπιλεγμένη εμφάνιση, οπότε μπορεί να απενεργοποιηθεί ή να αντικατασταθεί αλλά όχι να αποεγκατασταθεί.",
|
||||
"hasDependents": "Το {{name}} απαιτείται από το {{list}}. Απενεργοποιήστε ή απεγκαταστήστε πρώτα αυτά.",
|
||||
"missingDependencies": "Το {{name}} χρειάζεται το {{list}}, το οποίο δεν είναι εγκατεστημένο.",
|
||||
"consentChanged": "Αυτό που ζητάει αυτό το πρόσθετο άλλαξε από τότε που το κοιτάξατε. Ελέγξτε ξανά τη λίστα.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Χωρίς πρόσβαση στους διακομιστές σας",
|
||||
"searchInstalled": "Αναζήτηση εγκατεστημένων",
|
||||
"searchPlugins": "Αναζήτηση προσθέτων",
|
||||
"allCategories": "Όλα",
|
||||
"nothingMatches": "Τίποτα δεν ταιριάζει.",
|
||||
"noneInstalled": "Δεν έχουν εγκατασταθεί προσθέματα ακόμη. Περιηγηθείτε για να προσθέσετε μερικά.",
|
||||
"nothingHere": "Τίποτα εδώ.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Τεκμηρίωση",
|
||||
"envVars": "Μεταβλητές περιβάλλοντος",
|
||||
"envRequired": "Απαιτούμενο",
|
||||
"envDefault": "Προεπιλογή: {{value}}"
|
||||
"envDefault": "Προεπιλογή: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Διάταξεις",
|
||||
"themes": "Θέματα",
|
||||
"tabs": "Καρτέλες",
|
||||
"panels": "Πίνακες πλαϊνής μπάρας",
|
||||
"dashboardCards": "Κάρτες πίνακα ελέγχου",
|
||||
"protocols": "Τύποι σύνδεσης",
|
||||
"auth": "Μέθοδοι σύνδεσης",
|
||||
"actions": "Ενέργειες",
|
||||
"hostCapability": "Ρυθμίσεις host"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Τύπος",
|
||||
"allTypes": "Όλοι οι τύποι",
|
||||
"category": "Κατηγορία",
|
||||
"allCategories": "Όλες οι κατηγορίες",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_other": "{{count}} plugins",
|
||||
"remove": "Αφαίρεση φίλτρου {{name}}",
|
||||
"clear": "Εκκαθάριση φίλτρων",
|
||||
"button": "Φίλτρα",
|
||||
"buttonCount": "Φίλτρα ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} από {{total}}",
|
||||
"page": "Σελίδα {{page}} από {{pages}}",
|
||||
"previous": "Προηγούμενη σελίδα",
|
||||
"next": "Επόμενη σελίδα",
|
||||
"perPage": "{{count}} ανά σελίδα",
|
||||
"perPageLabel": "Plugins ανά σελίδα"
|
||||
},
|
||||
"showUnsupportedHint": "Αυτά αναφέρονται αλλά κανένα release δεν εκτελείται ακόμη σε αυτή την έκδοση. Ενημερώστε το Termix για να τα εγκαταστήσετε.",
|
||||
"unsupported": "Απαιτεί νεότερο Termix",
|
||||
"unsupportedHint": "Κανένα release αυτού του plugin δεν εκτελείται σε αυτή την έκδοση του Termix. Ενημερώστε το Termix για να το εγκαταστήσετε.",
|
||||
"needsTermix": "Απαιτεί Termix {{range}}",
|
||||
"showUnsupported": "Εμφάνιση μη υποστηριζόμενων ({{count}})",
|
||||
"showMore": "Εμφάνιση {{count}} περισσότερων ({{total}} απομένουν)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Χωρίς δεδομένα",
|
||||
"filter": "Φίλτρο..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} λεπτό πριν",
|
||||
"minutesAgo_other": "{{count}} λεπτά πριν",
|
||||
"hoursAgo_one": "{{count}} ώρα πριν",
|
||||
"hoursAgo_other": "{{count}} ώρες πριν",
|
||||
"pending_one": "{{count}} αλλαγή σε αναμονή για συγχρονισμό",
|
||||
"pending_other": "{{count}} αλλαγές σε αναμονή για συγχρονισμό",
|
||||
"proxy": {
|
||||
"headersTitle": "Επιπλέον κεφαλίδες",
|
||||
"headersHint": "Αποστέλλονται με κάθε αίτημα στον διακομιστή, για παράδειγμα ένα token υπηρεσίας Cloudflare Access.",
|
||||
"headerName": "Όνομα κεφαλίδας",
|
||||
"headerValue": "Τιμή",
|
||||
"savedValue": "Αποθηκεύτηκε, πληκτρολογήστε για αλλαγή",
|
||||
"addHeader": "Προσθήκη κεφαλίδας",
|
||||
"removeHeader": "Αφαίρεση κεφαλίδας",
|
||||
"basicAuthTitle": "Όνομα χρήστη και κωδικός πρόσβασης",
|
||||
"basicAuthHint": "Για έναν διαμεσολαβητή που ζητά όνομα χρήστη και κωδικό πρόσβασης πριν από το Termix.",
|
||||
"username": "Όνομα χρήστη",
|
||||
"password": "Κωδικός πρόσβασης",
|
||||
"allowInvalidCertificate": "Εμπιστοσύνη σε αυτουπογεγραμμένο πιστοποιητικό",
|
||||
"allowInvalidCertificateHint": "Μόνο για τον δικό σας διακομιστή, όταν το πιστοποιητικό του δεν προέρχεται από γνωστή αρχή."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Αυτό δεν μοιάζει με διεύθυνση ιστού.",
|
||||
"unreachable": "Αδυναμία επικοινωνίας με τον διακομιστή. Ελέγξτε τη διεύθυνση και ότι ο διακομιστής λειτουργεί.",
|
||||
"unreachableWithReason": "Αδυναμία επικοινωνίας με τον διακομιστή: {{reason}}",
|
||||
"tlsUntrusted": "Το πιστοποιητικό του διακομιστή δεν εμπιστεύεται. Αν αυτός είναι ο δικός σας διακομιστής με αυτουπογεγραμμένο πιστοποιητικό, ενεργοποιήστε την επιλογή παρακάτω.",
|
||||
"basicAuthRequired": "Κάτι πριν από τον διακομιστή ζητά όνομα χρήστη και κωδικό. Εισάγετέ τα παρακάτω.",
|
||||
"proxyLogin": "Μια σελίδα εισόδου ή proxy απάντησε αντί για το Termix. Προσθέστε τα headers που χρειάζεται παρακάτω, ή ελέγξτε τη διεύθυνση.",
|
||||
"notTermix": "Δεν υπάρχει διακομιστής Termix σε αυτή τη διεύθυνση. Αν τρέχει σε μια διαδρομή, συμπεριλάβετε τη, όπως https://example.com/termix.",
|
||||
"versionMismatch": "Αυτός ο διακομιστής τρέχει παλαιότερη έκδοση του Termix. Αναβαθμίστε το στην 2.9 ή νεότερη για σύνδεση.",
|
||||
"differentAccount": "Συνδεθήκατε σε διαφορετικό λογαριασμό. Συνδεθείτε στον λογαριασμό με τον οποίο είναι συνδεδεμένη αυτή η συσκευή, ή αποσυνδέστε πρώτα."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Σύνδεση με διακομιστή Termix",
|
||||
"reloginTitle": "Σύνδεση ξανά",
|
||||
"savedServers": "Πρόσφατοι διακομιστές",
|
||||
"removeServer": "Αφαίρεση από τη λίστα",
|
||||
"serverDescription": "Εισάγετε τη διεύθυνση που χρησιμοποιείτε για να ανοίξετε το Termix στον browser σας.",
|
||||
"signinDescription": "Συνδεθείτε στο {{url}}",
|
||||
"chooseDescription": "Αυτή η συσκευή έχει ήδη δεδομένα. Τι πρέπει να συμβεί;",
|
||||
"finishingDescription": "Σύνδεση αυτής της συσκευής.",
|
||||
"serverUrl": "Διεύθυνση διακομιστή",
|
||||
"serverUrlHint": "Για παράδειγμα https://termix.example.com",
|
||||
"showProxySettings": "Ρυθμίσεις reverse proxy",
|
||||
"hideProxySettings": "Απόκρυψη ρυθμίσεων reverse proxy",
|
||||
"continue": "Συνέχεια",
|
||||
"back": "Πίσω",
|
||||
"mergeTitle": "Προσθήκη στον λογαριασμό μου",
|
||||
"mergeBody_one": "Το στοιχείο σε αυτή τη συσκευή προστίθεται στον λογαριασμό σας. Τα στοιχεία που έχει ήδη ο λογαριασμός σας παραμένουν ως έχουν στον διακομιστή.",
|
||||
"mergeBody_other": "Τα {{count}} στοιχεία σε αυτή τη συσκευή προστίθενται στον λογαριασμό σας. Τα στοιχεία που έχει ήδη ο λογαριασμός σας παραμένουν ως έχουν στον διακομιστή.",
|
||||
"replaceTitle": "Αντικατάσταση με τον λογαριασμό μου",
|
||||
"replaceBody_one": "Το στοιχείο σε αυτή τη συσκευή αφαιρείται, και αυτή η συσκευή παίρνει τα πάντα από τον λογαριασμό σας. Οι hosts που διατηρούνται μόνο σε αυτή τη συσκευή παραμένουν.",
|
||||
"replaceBody_other": "Τα {{count}} στοιχεία σε αυτή τη συσκευή αφαιρούνται, και αυτή η συσκευή παίρνει τα πάντα από τον λογαριασμό σας. Οι hosts που διατηρούνται μόνο σε αυτή τη συσκευή παραμένουν.",
|
||||
"link": "Σύνδεση",
|
||||
"linking": "Σύνδεση και εκτέλεση του πρώτου sync...",
|
||||
"linked": "Συνδεδεμένο. Τα δεδομένα σας συγχρονίζονται τώρα.",
|
||||
"signedInAgain": "Συνδεθήκατε. Ο sync εκτελείται ξανά."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Διακομιστές",
|
||||
"sshCredentials": "Διαπιστευτήρια",
|
||||
"sshFolders": "Φάκελοι",
|
||||
"userPreferences": "Προτιμήσεις",
|
||||
"pluginUserSettings": "Ρυθμίσεις πρόσθετων",
|
||||
"sharedHosts": "Διακομιστές που μοιράστηκαν μαζί σας",
|
||||
"sharedCredentials": "Διαπιστευτήρια που μοιράστηκαν μαζί σας",
|
||||
"vaultProfiles": "Προφίλ Vault",
|
||||
"snippetFolders": "Φάκελοι αποσπασμάτων",
|
||||
"snippets": "Αποσπάσματα",
|
||||
"dashboardServiceLinks": "Σύνδεσμοι υπηρεσιών",
|
||||
"homepageItems": "Στοιχεία αρχικής σελίδας",
|
||||
"networkTopology": "Χάρτης δικτύου",
|
||||
"workspaces": "Χώροι εργασίας",
|
||||
"hostDefaults": "Προεπιλογές διακομιστών",
|
||||
"hostDefaultsAdmin": "Προεπιλογές διακομιστών διακομιστή",
|
||||
"aiProviders": "Πάροχοι AI",
|
||||
"homepageLayouts": "Διατάξεις αρχικής σελίδας",
|
||||
"accountProfile": "Προφίλ λογαριασμού"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Φάκελος {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Πλέγμα",
|
||||
"listView": "Λίστα",
|
||||
"compactRows": "Συμπαγείς γραμμές",
|
||||
"comfortableRows": "Άνετες γραμμές"
|
||||
"comfortableRows": "Άνετες γραμμές",
|
||||
"columns": {
|
||||
"title": "Στήλες",
|
||||
"auto": "Αυτόματο",
|
||||
"count": "Πλάτος {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Αποθηκεύτηκε. Πληκτρολογήστε για να το αντικαταστήσετε."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "No se pudieron cambiar algunos complementos. Puedes solucionarlo más tarde desde la pestaña Complementos. Pulsa Siguiente para continuar.",
|
||||
"pluginsApplyFailed": "No se pudieron guardar tus selecciones. Inténtalo de nuevo o continúa y cámbialos más tarde desde la pestaña Complementos.",
|
||||
"pluginsLoadFailed": "No se pudo cargar la lista de complementos. Puedes elegir complementos más tarde desde la pestaña Complementos.",
|
||||
"presetTitle": "¿Cuánta información quieres ver en pantalla?",
|
||||
"presetIntro": "Elige cuánto se muestra en pantalla.",
|
||||
"presetChangeLater": "Puedes cambiar los ajustes predefinidos o modificar cualquier configuración individual más tarde en Configuración, bajo Interfaz.",
|
||||
"appearanceTitle": "Hazlo tuyo",
|
||||
"appearanceIntro": "Elige un tema, un color de acento, una fuente y tu idioma. Los cambios se aplican al instante y puedes modificarlos más tarde en Configuración.",
|
||||
"securityTitle": "Protege tu cuenta",
|
||||
"securityIntro": "Añade una clave de acceso o una aplicación de autenticación a tu cuenta. También puedes hacerlo más tarde en Configuración, bajo Seguridad.",
|
||||
"desktopTitle": "¿Cómo quieres usar Termix?",
|
||||
"desktopBody": "Puedes cambiar esto en cualquier momento desde Sincronización en la barra lateral.",
|
||||
"desktopLocalTitle": "Solo en este dispositivo",
|
||||
"desktopLocalBody": "Todo se almacena aquí. No hay nada que configurar.",
|
||||
"desktopLinkTitle": "Con mi servidor de Termix",
|
||||
"desktopLinkBody": "Inicia sesión en tu servidor para usar los mismos hosts y configuraciones en todos los dispositivos.",
|
||||
"desktopLinked": "Vinculado a {{server}}",
|
||||
"pluginsDocsLink": "Lee sobre cada uno"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} está listo para instalar",
|
||||
"readyHint": "Se instalará la próxima vez que reinicies Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Modo seguro",
|
||||
"description": "Solo se están ejecutando los complementos de diseño y tema. Reinicia el servidor sin TERMIX_SAFE_MODE para volver a activar el resto."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Cerrar panel",
|
||||
"moveSide": "Mover panel",
|
||||
"resize": "Redimensionar panel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Inicio",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Credenciales",
|
||||
"connections": "Conexiones",
|
||||
"sync": "Sincronizar",
|
||||
"reconnectDisconnectedTerminals": "Reconectar todos los terminales desconectados",
|
||||
"reconnectingTerminals_one": "Reconectando {{count}} terminal",
|
||||
"reconnectingTerminals_many": "Reconectando {{count}} terminales",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Reintentar",
|
||||
"refresh": "Actualizar",
|
||||
"optional": "Opcional",
|
||||
"downloadSample": "Descargar ejemplo",
|
||||
"failedToDeleteHost": "Error al eliminar {{name}}",
|
||||
"importSkipExisting": "Importar (omitir existentes)",
|
||||
"importSSHConfig": "Importar desde configuración SSH",
|
||||
"connectionDetails": "Detalles de conexión",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Sin carpeta)",
|
||||
"deleteSelected": "Eliminar",
|
||||
"exitSelection": "Salir de la selección",
|
||||
"importSkip": "Importar (omitir existentes)",
|
||||
"importOverwrite": "Importar (sustituir)",
|
||||
"collapseBtn": "Contraer",
|
||||
"importExportBtn": "Importar / Exportar",
|
||||
"hostStatusesRefreshed": "Estados de los hosts actualizados",
|
||||
"failedToRefreshHosts": "Error al actualizar los hosts",
|
||||
"movedHostTo": "Se ha movido {{host}} a \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_many": "¿Eliminar \"{{name}}\" y sus {{count}} hosts? Esta acción no se puede deshacer.",
|
||||
"deleteFolderConfirm_other": "¿Eliminar \"{{name}}\" y su {{count}} host? Esta acción no se puede deshacer.",
|
||||
"failedToMoveHosts": "Error al mover los hosts",
|
||||
"managedBanner": "Este host está gestionado por {{plugin}}. Modifícalo allí. Puedes seguir fijándolo y reordenándolo.",
|
||||
"managedTooltip": "Gestionado por {{plugin}}",
|
||||
"addBlocked": "Los hosts están gestionados por {{plugin}}, por lo que no se pueden añadir nuevos aquí.",
|
||||
"failedToReorder": "Error al reordenar",
|
||||
"expandAll": "Expandir todas las carpetas",
|
||||
"collapseAll": "Contraer todas las carpetas",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Añadir credencial",
|
||||
"checkingHostStatuses": "Comprobando el estado de los hosts...",
|
||||
"pinnedSection": "Fijados",
|
||||
"hostsExported": "Hosts exportados correctamente",
|
||||
"export": {
|
||||
"menuItem": "Exportar...",
|
||||
"title": "Exportar hosts",
|
||||
"scope": "Ámbito",
|
||||
"scopeAll": "Todos",
|
||||
"scopeSelected": "Seleccionados",
|
||||
"searchHosts": "Buscar hosts...",
|
||||
"include": "Incluir",
|
||||
"groupConnection": "Conexión",
|
||||
"groupCredentials": "Credenciales",
|
||||
"groupNotes": "Notas",
|
||||
"groupTags": "Etiquetas y fijado",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Hosts de salto",
|
||||
"groupFeatureFlags": "Configuración de complementos",
|
||||
"groupAdvanced": "Configuración avanzada",
|
||||
"preview": "Vista previa",
|
||||
"moreHosts_one": "... {{count}} host más",
|
||||
"moreHosts_many": "... {{count}} hosts más",
|
||||
"moreHosts_other": "... {{count}} host más",
|
||||
"summary": "{{selected}} de {{total}} hosts",
|
||||
"credentialsIncluded": "credenciales incluidas",
|
||||
"credentialsExcluded": "credenciales excluidas",
|
||||
"noneSelected": "Ningún host seleccionado",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Exportar",
|
||||
"fetchFailed": "Error al cargar los hosts para exportar",
|
||||
"bulkButton": "Exportar"
|
||||
},
|
||||
"sampleDownloaded": "Archivo de ejemplo descargado",
|
||||
"failedToDeleteCredential2": "Error al eliminar la credencial",
|
||||
"noFolderOption": "(Sin carpeta)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Actualizar host",
|
||||
"editorAdd": "Añadir host",
|
||||
"speedSearch": "Buscar hosts. Flechas para seleccionar, Intro para conectar, Esc para cerrar",
|
||||
"speedSearchList": "Lista de hosts. Escribe o pulsa / para buscar.",
|
||||
"importNoHosts": "No se han encontrado hosts en el archivo",
|
||||
"importTooMany": "Puedes importar hasta {{max}} hosts a la vez",
|
||||
"importSummary": "Importación completada: {{imported}} importados, {{updated}} actualizados, {{failed}} fallidos",
|
||||
"importHostsFailed": "No se han podido importar los hosts"
|
||||
"speedSearchList": "Lista de hosts. Escribe o pulsa / para buscar."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Pantalla dividida",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} usuario",
|
||||
"usersCount_many": "{{count}} usuarios",
|
||||
"rolesCount_one": "{{count}} rol",
|
||||
"rolesCount_many": "{{count}} roles",
|
||||
"apiKeysCount_one": "{{count}} clave",
|
||||
"apiKeysCount_many": "{{count}} claves",
|
||||
"sessionsActive_one": "{{count}} activa",
|
||||
"sessionsActive_many": "{{count}} activas",
|
||||
"hostsCount_one": "{{count}} host",
|
||||
"hostsCount_many": "{{count}} hosts",
|
||||
"hostsCount_other": "{{count}} host",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} credencial",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} permiso",
|
||||
"count_many": "{{count}} permisos",
|
||||
"groups": {
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Credenciales",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Cambia la fuente de la interfaz de la aplicación. Los perfiles de terminal mantienen sus propias configuraciones de fuente.",
|
||||
"accentColorLabel": "Color de acento",
|
||||
"apiKeyCount_one": "{{count}} clave",
|
||||
"apiKeyCount_many": "{{count}} claves",
|
||||
"colorPickerTooltip": "Abrir selector de color",
|
||||
"themeSystem": "Sistema",
|
||||
"themeLight": "Claro",
|
||||
"themeDark": "Oscuro",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Oscuro"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Cómo se organiza toda la aplicación. Los temas y diseños provienen de los complementos.",
|
||||
"defaultsLabel": "Predeterminado para todos",
|
||||
"defaultsHint": "Lo que ven los usuarios hasta que elijan su propio diseño o tema.",
|
||||
"followDefault": "Usar el predeterminado",
|
||||
"defaultSaved": "Apariencia predeterminada guardada",
|
||||
"saveFailed": "No se ha podido guardar la apariencia",
|
||||
"repair": {
|
||||
"title": "No se ha podido mostrar este diseño",
|
||||
"safeTitle": "Modo seguro",
|
||||
"layout": "Diseño",
|
||||
"plugin": "Complemento",
|
||||
"reason": "Motivo",
|
||||
"error": "Error",
|
||||
"noError": "No hay mensaje de error.",
|
||||
"copy": "Copiar",
|
||||
"copied": "Copiado",
|
||||
"copyFailed": "No se han podido copiar los detalles",
|
||||
"retry": "Intentar de nuevo",
|
||||
"reset": "Restablecer a la apariencia predeterminada",
|
||||
"resetEveryone": "Restablecer el valor predeterminado para todos",
|
||||
"update": "Actualizar {{name}} a {{version}}",
|
||||
"disable": "Desactivar {{name}}",
|
||||
"enable": "Activar {{name}}",
|
||||
"startAgain": "Reiniciar {{name}}",
|
||||
"install": "Buscar diseños y temas",
|
||||
"installTitle": "Diseños y temas",
|
||||
"installButton": "Instalar",
|
||||
"nothingToInstall": "No hay otros diseños o temas disponibles en este momento.",
|
||||
"registryUnreachable": "No se ha podido acceder al registro de complementos.",
|
||||
"askAdmin": "Pide a un administrador que actualice o corrija este diseño. Puedes cambiar a otro diseño o tema para ti mismo a continuación.",
|
||||
"switchLayout": "Cambiar diseño",
|
||||
"switchTheme": "Cambiar tema",
|
||||
"saveFailed": "No se ha podido guardar tu elección",
|
||||
"reasons": {
|
||||
"safe-url": "La dirección solicitó el modo seguro. Elige un diseño a continuación o elimina ?safe-layout=1 de la dirección.",
|
||||
"safe-env": "El servidor se ha iniciado con TERMIX_SAFE_LAYOUT, por lo que todos verán esta pantalla hasta que se elimine.",
|
||||
"missing": "Ningún complemento instalado proporciona este diseño.",
|
||||
"disabled": "El complemento que proporciona este diseño está desactivado.",
|
||||
"blocked": "El complemento que proporciona este diseño está esperando algo que necesita.",
|
||||
"incompatible": "El complemento que proporciona este diseño no es compatible con esta versión de Termix.",
|
||||
"failed": "El diseño no se ha podido iniciar.",
|
||||
"crashed": "El diseño se ha bloqueado dos veces mientras dibujaba la aplicación."
|
||||
},
|
||||
"noLayout": "No hay ningún diseño configurado",
|
||||
"restore": "Restaurar {{name}} incluido",
|
||||
"restoreFailed": "No se ha podido restaurar la copia incluida"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Gestionar el inicio de sesión",
|
||||
"consequence": "Puede añadir un método de inicio de sesión, un segundo factor o un tipo de inicio de sesión SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Establecer reglas de inicio de sesión",
|
||||
"consequence": "Puede cerrar la sesión de los usuarios cuando están inactivos, limitar la duración de la sesión, desactivar «Recordarme» y exigir un segundo factor."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Elegir cómo se accede a los hosts",
|
||||
"consequence": "Puede transportar la conexión SSH a un host a través de su propia ruta, por lo que ve todo lo enviado y recibido por esos hosts, incluidas las contraseñas."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Ejecutar sincronización",
|
||||
"consequence": "Puede responder a todas las solicitudes de sincronización, por lo que ve los datos que sincronizan los dispositivos y servidores."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Gestionar certificados",
|
||||
"consequence": "Puede reemplazar el certificado que Termix sirve a través de HTTPS y responder a las verificaciones de dominio de las autoridades de certificación."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Acceder a dispositivos serie y USB",
|
||||
"consequence": "Puede abrir un puerto serie físico en la máquina que ejecuta Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Exportar hosts con sus secretos",
|
||||
"consequence": "Puede leer tus hosts por completo, incluidas las contraseñas y claves guardadas, y distribuirlas. Cada exportación se registra en el registro de auditoría."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Crear y modificar hosts",
|
||||
"consequence": "Puede añadir hosts y editar los que ya tienes."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Leer el registro de auditoría",
|
||||
"consequence": "Puede ver quién hizo qué y cuándo."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Comprobar si los puertos responden",
|
||||
"consequence": "Puede abrir una conexión sin cifrar a cualquier dirección desde el servidor para ver si es accesible."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Proporcionar estado del host",
|
||||
"consequence": "Se convierte en la fuente de los puntos de conexión y desconexión para cada host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Almacenar actividad reciente",
|
||||
"consequence": "Se convierte en el almacén de la lista de actividad reciente de cada usuario."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Gestionar hosts como de solo lectura",
|
||||
"consequence": "Los hosts que gestiona no pueden ser editados, eliminados ni compartidos por nadie más."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Abrir ventanas de escritorio",
|
||||
"consequence": "Solo en la aplicación de escritorio de Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Usar este equipo",
|
||||
"consequence": "Puede leer y modificar archivos, ejecutar una shell y abrir puertos locales en este equipo. Solo en la aplicación de escritorio de Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Actuar como otros usuarios",
|
||||
"consequence": "Ejecuta tareas en segundo plano con el acceso de otro usuario, como trabajos programados. Cada uso se registra en el registro de auditoría."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Añadir sus propias pantallas",
|
||||
"consequence": "Pestañas, paneles y configuración que puedes ocultar después."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Reemplazar todo el diseño de la aplicación",
|
||||
"consequence": "Cuando se selecciona, su código dibuja cada pantalla, incluidos tus terminales y la configuración."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Añadir temas de color",
|
||||
"consequence": "Solo colores y estilos. No se ejecuta código para un tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Desactivado",
|
||||
"failed": "Detenido inesperadamente",
|
||||
"blocked": "Esperando a otro complemento",
|
||||
"server": "Se ejecuta en tu servidor"
|
||||
"server": "Se ejecuta en tu servidor",
|
||||
"safeMode": "Desactivado en modo seguro"
|
||||
},
|
||||
"groups": {
|
||||
"running": "En ejecución",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Actualizados recientemente",
|
||||
"category": "Categoría"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Columnas",
|
||||
"auto": "Automático",
|
||||
"count": "{{count}} de ancho"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nombre",
|
||||
"description": "Descripción",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "No se pudieron guardar las opciones de {{name}}: {{error}}",
|
||||
"deleteData": "No se pudieron eliminar los datos de {{name}}: {{error}}",
|
||||
"managedByServer": "Este escritorio está vinculado a un servidor, que decide sus complementos.",
|
||||
"defaultLook": "{{name}} es el diseño predeterminado, por lo que se puede desactivar o cambiar, pero no desinstalar.",
|
||||
"hasDependents": "{{name}} es necesario para {{list}}. Desactívalos o desinstálalos primero.",
|
||||
"missingDependencies": "{{name}} necesita {{list}}, que no está instalado.",
|
||||
"consentChanged": "Lo que solicita este complemento ha cambiado desde que lo revisaste. Comprueba la lista de nuevo.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Sin acceso a tus servidores",
|
||||
"searchInstalled": "Buscar en instalados",
|
||||
"searchPlugins": "Buscar complementos",
|
||||
"allCategories": "Todos",
|
||||
"nothingMatches": "Nada coincide con eso.",
|
||||
"noneInstalled": "Aún no hay complementos instalados. Explora para añadir algunos.",
|
||||
"nothingHere": "No hay nada aquí.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Documentación",
|
||||
"envVars": "Variables de entorno",
|
||||
"envRequired": "Obligatorio",
|
||||
"envDefault": "Predeterminado: {{value}}"
|
||||
"envDefault": "Predeterminado: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Diseños",
|
||||
"themes": "Temas",
|
||||
"tabs": "Pestañas",
|
||||
"panels": "Paneles de la barra lateral",
|
||||
"dashboardCards": "Tarjetas del panel de control",
|
||||
"protocols": "Tipos de conexión",
|
||||
"auth": "Métodos de inicio de sesión",
|
||||
"actions": "Acciones",
|
||||
"hostCapability": "Configuración de hosts"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tipo",
|
||||
"allTypes": "Todos los tipos",
|
||||
"category": "Categoría",
|
||||
"allCategories": "Todas las categorías",
|
||||
"results_one": "{{count}} complemento",
|
||||
"results_many": "{{count}} complementos",
|
||||
"results_other": "{{count}} complementos",
|
||||
"remove": "Quitar filtro {{name}}",
|
||||
"clear": "Borrar filtros",
|
||||
"button": "Filtros",
|
||||
"buttonCount": "Filtros ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} de {{total}}",
|
||||
"page": "Página {{page}} de {{pages}}",
|
||||
"previous": "Página anterior",
|
||||
"next": "Página siguiente",
|
||||
"perPage": "{{count}} por página",
|
||||
"perPageLabel": "Complementos por página"
|
||||
},
|
||||
"showUnsupportedHint": "Estos aparecen en la lista, pero aún no hay ninguna versión compatible con esta versión. Actualiza Termix para instalarlos.",
|
||||
"unsupported": "Requiere una versión más reciente de Termix",
|
||||
"unsupportedHint": "No hay ninguna versión de este complemento compatible con esta versión de Termix. Actualiza Termix para instalarlo.",
|
||||
"needsTermix": "Requiere Termix {{range}}",
|
||||
"showUnsupported": "Mostrar no compatibles ({{count}})",
|
||||
"showMore": "Mostrar {{count}} más (quedan {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Sin datos",
|
||||
"filter": "Filtrar..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "hace {{count}} minuto",
|
||||
"minutesAgo_many": "hace {{count}} minutos",
|
||||
"minutesAgo_other": "hace {{count}} minutos",
|
||||
"hoursAgo_one": "hace {{count}} hora",
|
||||
"hoursAgo_many": "hace {{count}} horas",
|
||||
"hoursAgo_other": "hace {{count}} horas",
|
||||
"pending_one": "{{count}} cambio pendiente de sincronizar",
|
||||
"pending_many": "{{count}} cambios pendientes de sincronizar",
|
||||
"pending_other": "{{count}} cambios pendientes de sincronizar",
|
||||
"proxy": {
|
||||
"headersTitle": "Encabezados adicionales",
|
||||
"headersHint": "Se envían con cada solicitud al servidor, por ejemplo, un token de servicio de Cloudflare Access.",
|
||||
"headerName": "Nombre del encabezado",
|
||||
"headerValue": "Valor",
|
||||
"savedValue": "Guardado, escribe para cambiar",
|
||||
"addHeader": "Añadir encabezado",
|
||||
"removeHeader": "Eliminar encabezado",
|
||||
"basicAuthTitle": "Nombre de usuario y contraseña",
|
||||
"basicAuthHint": "Para un proxy que solicita un nombre de usuario y contraseña antes que Termix.",
|
||||
"username": "Nombre de usuario",
|
||||
"password": "Contraseña",
|
||||
"allowInvalidCertificate": "Confiar en un certificado autofirmado",
|
||||
"allowInvalidCertificateHint": "Solo para tu propio servidor, cuando su certificado no proviene de una autoridad conocida."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Eso no parece una dirección web.",
|
||||
"unreachable": "No se ha podido conectar con el servidor. Comprueba la dirección y que el servidor esté en ejecución.",
|
||||
"unreachableWithReason": "No se ha podido conectar con el servidor: {{reason}}",
|
||||
"tlsUntrusted": "El certificado del servidor no es de confianza. Si es tu propio servidor con un certificado autofirmado, activa la opción de abajo.",
|
||||
"basicAuthRequired": "Algo delante del servidor solicita un nombre de usuario y una contraseña. Introdúcelos a continuación.",
|
||||
"proxyLogin": "Una página de inicio de sesión o un proxy ha respondido en lugar de Termix. Añade los encabezados que necesita a continuación o comprueba la dirección.",
|
||||
"notTermix": "No hay un servidor Termix en esa dirección. Si se ejecuta en una ruta, inclúyela, como https://example.com/termix.",
|
||||
"versionMismatch": "Ese servidor ejecuta una versión antigua de Termix. Actualízalo a la 2.9 o superior para vincularlo.",
|
||||
"differentAccount": "Has iniciado sesión en una cuenta diferente. Inicia sesión en la cuenta a la que está vinculado este dispositivo o desvincúlalo primero."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Vincular a un servidor Termix",
|
||||
"reloginTitle": "Iniciar sesión de nuevo",
|
||||
"savedServers": "Servidores recientes",
|
||||
"removeServer": "Eliminar de la lista",
|
||||
"serverDescription": "Introduce la dirección que usas para abrir Termix en tu navegador.",
|
||||
"signinDescription": "Iniciar sesión en {{url}}",
|
||||
"chooseDescription": "Este dispositivo ya tiene datos. ¿Qué debería ocurrir con ellos?",
|
||||
"finishingDescription": "Vinculando este dispositivo.",
|
||||
"serverUrl": "Dirección del servidor",
|
||||
"serverUrlHint": "Por ejemplo, https://termix.example.com",
|
||||
"showProxySettings": "Configuración del proxy inverso",
|
||||
"hideProxySettings": "Ocultar configuración del proxy inverso",
|
||||
"continue": "Continuar",
|
||||
"back": "Atrás",
|
||||
"mergeTitle": "Añadirlo a mi cuenta",
|
||||
"mergeBody_one": "El elemento de este dispositivo se añade a tu cuenta. Los elementos que tu cuenta ya tiene se mantienen igual en el servidor.",
|
||||
"mergeBody_many": "Los {{count}} elementos de este dispositivo se añaden a tu cuenta. Los elementos que tu cuenta ya tiene se mantienen igual en el servidor.",
|
||||
"mergeBody_other": "Los {{count}} elementos de este dispositivo se añaden a tu cuenta. Los elementos que tu cuenta ya tiene se mantienen igual en el servidor.",
|
||||
"replaceTitle": "Reemplazarlo con mi cuenta",
|
||||
"replaceBody_one": "El elemento de este dispositivo se elimina y este dispositivo toma todo de tu cuenta. Los hosts que se mantienen solo en este dispositivo se conservan.",
|
||||
"replaceBody_many": "Los {{count}} elementos de este dispositivo se eliminan y este dispositivo toma todo de tu cuenta. Los hosts que se mantienen solo en este dispositivo se conservan.",
|
||||
"replaceBody_other": "Los {{count}} elementos de este dispositivo se eliminan y este dispositivo toma todo de tu cuenta. Los hosts que se mantienen solo en este dispositivo se conservan.",
|
||||
"link": "Vincular",
|
||||
"linking": "Vinculando y ejecutando la primera sincronización...",
|
||||
"linked": "Vinculado. Tus datos se están sincronizando ahora.",
|
||||
"signedInAgain": "Sesión iniciada. La sincronización se está ejecutando de nuevo."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hosts",
|
||||
"sshCredentials": "Credenciales",
|
||||
"sshFolders": "Carpetas",
|
||||
"userPreferences": "Preferencias",
|
||||
"pluginUserSettings": "Configuración de complementos",
|
||||
"sharedHosts": "Hosts compartidos contigo",
|
||||
"sharedCredentials": "Credenciales compartidas contigo",
|
||||
"vaultProfiles": "Perfiles de Vault",
|
||||
"snippetFolders": "Carpetas de fragmentos",
|
||||
"snippets": "Fragmentos",
|
||||
"dashboardServiceLinks": "Enlaces de servicios",
|
||||
"homepageItems": "Elementos de la página de inicio",
|
||||
"networkTopology": "Mapa de red",
|
||||
"workspaces": "Espacios de trabajo",
|
||||
"hostDefaults": "Valores predeterminados de host",
|
||||
"hostDefaultsAdmin": "Valores predeterminados de host del servidor",
|
||||
"aiProviders": "Proveedores de IA",
|
||||
"homepageLayouts": "Diseños de la página de inicio",
|
||||
"accountProfile": "Perfil de la cuenta"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Carpeta {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Cuadrícula",
|
||||
"listView": "Lista",
|
||||
"compactRows": "Filas compactas",
|
||||
"comfortableRows": "Filas cómodas"
|
||||
"comfortableRows": "Filas cómodas",
|
||||
"columns": {
|
||||
"title": "Columnas",
|
||||
"auto": "Automático",
|
||||
"count": "{{count}} de ancho"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Guardado. Escribe para reemplazarlo."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Mõnda lisamoodulit ei õnnestunud muuta. Saad neid hiljem lisamoodulite vahelehelt parandada. Vajuta Edasi, et jätkata.",
|
||||
"pluginsApplyFailed": "Sinu valikuid ei õnnestunud salvestada. Proovi uuesti või jätkake ja muuda neid hiljem lisamoodulite vahelehelt.",
|
||||
"pluginsLoadFailed": "Lisamoodulite nimekirja ei õnnestunud laadida. Saad lisamooduleid hiljem valida lisamoodulite vahelehelt.",
|
||||
"presetTitle": "Kui palju soovid ekraanil näha?",
|
||||
"presetIntro": "Vali, kui palju ekraanil näidatakse.",
|
||||
"presetChangeLater": "Saad vahetada eelseadistusi või muuta üksikuid seadeid hiljem Seadistustes, jaotises Liides.",
|
||||
"appearanceTitle": "Tee see omaks",
|
||||
"appearanceIntro": "Vali teema, aktsendivärv, font ja keel. Muudatused näitavad kohe ja saad neid hiljem Seadistustes muuta.",
|
||||
"securityTitle": "Turusta oma konto",
|
||||
"securityIntro": "Lisa oma kontole passkey või autentimise rakendus. Saad seda teha ka hiljem Seadistustes, jaotises Turvalisus.",
|
||||
"desktopTitle": "Kuidas soovid Termixit kasutada?",
|
||||
"desktopBody": "Saad seda igal ajal külgriba Sync menüüst muuta.",
|
||||
"desktopLocalTitle": "Ainult sellel seadmel",
|
||||
"desktopLocalBody": "Kõik salvestatakse siia. Midagi seadistada ei ole.",
|
||||
"desktopLinkTitle": "Minu Termixi serveriga",
|
||||
"desktopLinkBody": "Logi oma serverisse sisse, et kasutada igal seadmel samu hoste ja seadeid.",
|
||||
"desktopLinked": "Seotud {{server}}-iga",
|
||||
"pluginsDocsLink": "Loe igaühe kohta"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} on paigaldamiseks valmis",
|
||||
"readyHint": "See paigaldatakse järgmisel Termixi taaskäivitamisel."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Turvarežiim",
|
||||
"description": "Töötavad ainult paigutuse ja teema lisad. Taaskäivitage server ilma TERMIX_SAFE_MODE määramata, et ülejäänud lisad uuesti lubada."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Sulge paneel",
|
||||
"moveSide": "Liiguta paneeli",
|
||||
"resize": "Muuda paneeli suurust"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Avaleht",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hostid",
|
||||
"credentials": "Tunnused",
|
||||
"connections": "Ühendused",
|
||||
"sync": "Sünkrooni",
|
||||
"reconnectDisconnectedTerminals": "Ühenda kõik katkenud terminalid uuesti",
|
||||
"reconnectingTerminals_one": "Ühendan {{count}} terminali uuesti",
|
||||
"reconnectingTerminals_other": "Ühendan {{count}} terminali uuesti",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Proovi uuesti",
|
||||
"refresh": "Värskenda",
|
||||
"optional": "Valikuline",
|
||||
"downloadSample": "Laadi näidis alla",
|
||||
"failedToDeleteHost": "{{name}} kustutamine ei õnnestunud",
|
||||
"importSkipExisting": "Impordi (jätka olemasolevad vahele)",
|
||||
"importSSHConfig": "Impordi SSH konfiguratsioonist",
|
||||
"connectionDetails": "Ühenduse üksikasjad",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Puudub kaust)",
|
||||
"deleteSelected": "Kustuta",
|
||||
"exitSelection": "Lõpeta valik",
|
||||
"importSkip": "Impordi (jätka olemasolevad vahele)",
|
||||
"importOverwrite": "Impordi (kirjuta üle)",
|
||||
"collapseBtn": "Ahenda",
|
||||
"importExportBtn": "Impordi / Ekspordi",
|
||||
"hostStatusesRefreshed": "Hostide olekud värskendatud",
|
||||
"failedToRefreshHosts": "Hostide värskendamine ebaõnnestus",
|
||||
"movedHostTo": "Liigutati {{host}} kausta \"{{folder}}\"",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Kas kustutada \"{{name}}\" ja selle {{count}} host? Seda ei saa tagasi pöörata.",
|
||||
"deleteFolderConfirm_other": "Kas kustutada \"{{name}}\" ja selle {{count}} hosti? Seda ei saa tagasi pöörata.",
|
||||
"failedToMoveHosts": "Hostide liigutamine ebaõnnestus",
|
||||
"managedBanner": "Seda peremeesarvutit haldab {{plugin}}. Muuda seda seal. Saad selle ikka kinnitada ja järjestust muuta.",
|
||||
"managedTooltip": "Haldab {{plugin}}",
|
||||
"addBlocked": "Peremeesarvuteid haldab {{plugin}}, seega uusi peremeasi siia ei saa lisada.",
|
||||
"failedToReorder": "Järjestamine ebaõnnestus",
|
||||
"expandAll": "Ava kõik kaustad",
|
||||
"collapseAll": "Kokku kõik kaustad",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Lisa usaldusandmed",
|
||||
"checkingHostStatuses": "Kontin peremeesmasinate olekuid...",
|
||||
"pinnedSection": "Kinnitatud",
|
||||
"hostsExported": "Peremeesmasinad eksporditi edukalt",
|
||||
"export": {
|
||||
"menuItem": "Ekspordi...",
|
||||
"title": "Ekspordi peremeesmasinad",
|
||||
"scope": "Hõlmatus",
|
||||
"scopeAll": "Kõik",
|
||||
"scopeSelected": "Valitud",
|
||||
"searchHosts": "Otsi peremeesmasinaid...",
|
||||
"include": "Kaasa",
|
||||
"groupConnection": "Ühendus",
|
||||
"groupCredentials": "Logimisandmed",
|
||||
"groupNotes": "Märkmed",
|
||||
"groupTags": "Sildid ja kinnitamine",
|
||||
"groupProxy": "Proksy",
|
||||
"groupJumpHosts": "Hüppemasinad",
|
||||
"groupFeatureFlags": "Pistikprogrammide seaded",
|
||||
"groupAdvanced": "Täpsemad seaded",
|
||||
"preview": "Eelvaade",
|
||||
"moreHosts_one": "... veel {{count}} host",
|
||||
"moreHosts_other": "... veel {{count}} hosti",
|
||||
"summary": "{{selected}} / {{total}} peremeesmasinat",
|
||||
"credentialsIncluded": "logimisandmed kaasatud",
|
||||
"credentialsExcluded": "logimisandmed välja jäetud",
|
||||
"noneSelected": "Ühtegi peremeesmasinat pole valitud",
|
||||
"cancel": "Tühista",
|
||||
"confirm": "Ekspordi",
|
||||
"fetchFailed": "Eksportimiseks peremeesmasinate laadimine ebaõnnestus",
|
||||
"bulkButton": "Ekspordi"
|
||||
},
|
||||
"sampleDownloaded": "Näidisleht alla laaditud",
|
||||
"failedToDeleteCredential2": "Logimisandmete kustutamine ebaõnnestus",
|
||||
"noFolderOption": "(Ilma kaustata)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Uuenda hosti",
|
||||
"editorAdd": "Lisa host",
|
||||
"speedSearch": "Otsi hoste. Nooleklahvid valimiseks, Enter ühendamiseks, Esc sulgemiseks",
|
||||
"speedSearchList": "Hostide loend. Tüüpi või vajuta / otsimiseks.",
|
||||
"importNoHosts": "Failist ei leitud ühtegi hosti",
|
||||
"importTooMany": "Saad korraga importida kuni {{max}} hosti",
|
||||
"importSummary": "Importimine lõpetatud: {{imported}} imporditud, {{updated}} uuendatud, {{failed}} ebaõnnestunud",
|
||||
"importHostsFailed": "Hostide importimine ebaõnnestus"
|
||||
"speedSearchList": "Hostide loend. Tüüpi või vajuta / otsimiseks."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Jagatud ekraan",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Ava värvivalija",
|
||||
"themeSystem": "Süsteem",
|
||||
"themeLight": "Hele",
|
||||
"themeDark": "Tume",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Tume"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Kuidas kogu rakendus on paigutatud. Teemad ja paigutused tulevad pistikprogrammide kaudu.",
|
||||
"defaultsLabel": "Vaikimisi kõigile",
|
||||
"defaultsHint": "Mida inimesed näevad, enne kui valivad oma paigutuse või teema.",
|
||||
"followDefault": "Kasuta vaikimisi",
|
||||
"defaultSaved": "Vaikimisi välimus salvestatud",
|
||||
"saveFailed": "Välimust ei õnnestunud salvestada",
|
||||
"repair": {
|
||||
"title": "Seda paigutust ei õnnestunud kuvada",
|
||||
"safeTitle": "Turvarežiim",
|
||||
"layout": "Paigutus",
|
||||
"plugin": "Pistikprogramm",
|
||||
"reason": "Põhjus",
|
||||
"error": "Viga",
|
||||
"noError": "Vigateadet ei ole.",
|
||||
"copy": "Kopeeri",
|
||||
"copied": "Kopeeritud",
|
||||
"copyFailed": "Üksikasju ei õnnestunud kopeerida",
|
||||
"retry": "Proovi uuesti",
|
||||
"reset": "Taasta vaikimisi välimus",
|
||||
"resetEveryone": "Taasta vaikimisi seadistus kõigile",
|
||||
"update": "Uuenda {{name}} versioonile {{version}}",
|
||||
"disable": "Lülita {{name}} välja",
|
||||
"enable": "Lülita {{name}} sisse",
|
||||
"startAgain": "Käivita {{name}} uuesti",
|
||||
"install": "Otsi paigutusi ja teemasid",
|
||||
"installTitle": "Paigutused ja teemad",
|
||||
"installButton": "Paigalda",
|
||||
"nothingToInstall": "Praegu ei ole teisi paigutusi ega teemasid saadaval.",
|
||||
"registryUnreachable": "Pistikprogrammide registriga ei õnnestunud ühendust saada.",
|
||||
"askAdmin": "Palu administraatoril see paigutus uuendada või parandada. Saad allpool valida endale teise paigutuse või teema.",
|
||||
"switchLayout": "Vaheta paigutust",
|
||||
"switchTheme": "Vaheta teemat",
|
||||
"saveFailed": "Sinu valikut ei õnnestunud salvestada",
|
||||
"reasons": {
|
||||
"safe-url": "Aadress küsis turvarežiimi. Vali allpool paigutus või eemalda aadressist ?safe-layout=1.",
|
||||
"safe-env": "Server käivitati TERMIX_SAFE_LAYOUT-ga, seega näevad kõik seda ekraani, kuni see eemaldatakse.",
|
||||
"missing": "Ükski paigaldatud pistikprogramm ei paku seda paigutust.",
|
||||
"disabled": "Pistikprogramm, mis seda paigutust pakub, on välja lülitatud.",
|
||||
"blocked": "Pistikprogramm, mis seda paigutust pakub, ootab midagi, mida ta vajab.",
|
||||
"incompatible": "Pistikprogramm, mis seda paigutust pakub, ei tööta selle Termixi versiooniga.",
|
||||
"failed": "Paigutus ei suutnud käivituda.",
|
||||
"crashed": "Paigutus kukkus kokku kaks korda rakenduse joonistamisel."
|
||||
},
|
||||
"noLayout": "Paigutust ei ole määratud",
|
||||
"restore": "Taasta kaasasolev {{name}}",
|
||||
"restoreFailed": "Kaasasolevat koopiat ei õnnestunud taastada"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Sisselogimise haldamine",
|
||||
"consequence": "See saab lisada sisselogimismeetodi, teise autentimisetapi või SSH sisselogimistüübi."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Määra sisselogimise reeglid",
|
||||
"consequence": "See võib inimesed puhkeolekul välja logida, piirada sessiooni pikkust, keelata mälestusfunktsiooni ja nõuda teist autentimisetappi."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Vali, kuidas peremeasarvutiteni jõutakse",
|
||||
"consequence": "See võib viia SSH-ühenduse peremeasarvutini oma marsruudi kaudu, nii et ta näeb kõike, mis nendele peremeasarvutitele saadetakse ja sealt tuleb, sh paroolid."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Juhenda sünkroonimist",
|
||||
"consequence": "See võib vastata kõigile sünkroonimispäringutele, nii et ta näeb andmeid, mida seadmed ja serverid sünkroonivad."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Sertifikaatide haldamine",
|
||||
"consequence": "See saab asendada Termixi HTTPS-i kaudu teenindatavat sertifikaati ja vastata sertifikaadi väljastajate domeenikontrollidele."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Jada- ja USB-seadmete kasutamine",
|
||||
"consequence": "See saab avada füüsilise jadasideme Termixi käitavas masinas."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Ekspordi peremeasarvutid koos nende saladustega",
|
||||
"consequence": "Võib lugeda sinu peremeasarvuteid täielikult, sealhulgas salvestatud paroolid ja võtmed, ning anda need edasi. Iga eksport kirjutatakse auditilogi."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Hostide loomine ja muutmine",
|
||||
"consequence": "See saab lisada hoste ja muuta sinu olemasolevaid hoste."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Auditilogi lugemine",
|
||||
"consequence": "See näeb, kes mida ja millal tegi."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Kontrolli, kas pordid vastavad",
|
||||
"consequence": "Võib avada serverist tavalise ühenduse suvalise aadressiga, et näha, kas see on saadaval."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Paku peremeasarvuti olekut",
|
||||
"consequence": "Saab igale peremeasarvutile online- ja offline-punktide allikaks."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Salvesta hiljutine tegevus",
|
||||
"consequence": "See kasutajate hiljutise tegevuse loomise hoidla."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Hostide haldamine kirjutuskaitstult",
|
||||
"consequence": "Ülejäänud kasutajad ei saa selle haldatavaid hoste muuta, kustutada ega uuesti jagada."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Töölaua akende avamine",
|
||||
"consequence": "Ainult Termixi töölauarakenduses."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Kasuta seda arvutit",
|
||||
"consequence": "Sellel arvutil saab lugeda ja muuta faile, käivitada käsurea ning avada kohalikke porte. Ainult Termixi lauaarvuti rakenduses."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Teiste kasutajate nimel tegutsemine",
|
||||
"consequence": "Taustatööde käivitamine teise kasutaja õigustega, näiteks ajastatud ülesanded. Iga kasutus kantakse auditiloki."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Lisa oma ekraane",
|
||||
"consequence": "Vahekaardid, paneelid ja seaded, mida sa hiljem peita saad."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Asenda kogu rakenduse paigutus",
|
||||
"consequence": "Valimisel joonistab selle kood kõik ekraanid, sealhulgas terminalid ja seaded."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Lisa värviteemad",
|
||||
"consequence": "Ainult värvid ja stiilid. Teema jaoks ei käivitata koodi."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Keelatud",
|
||||
"failed": "Peatati ootamatult",
|
||||
"blocked": "Ootab teist pistikprogrammi",
|
||||
"server": "Töötab sinu serveris"
|
||||
"server": "Töötab sinu serveris",
|
||||
"safeMode": "Turvarežiimis välja lülitatud"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Käimas",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Hiljuti uuendatud",
|
||||
"category": "Kategooria"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Veerud",
|
||||
"auto": "Automaatne",
|
||||
"count": "{{count}} lai"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nimi",
|
||||
"description": "Kirjeldus",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "{{name}} valikute salvestamine ebaõnnestus: {{error}}",
|
||||
"deleteData": "{{name}} andmete kustutamine ebaõnnestus: {{error}}",
|
||||
"managedByServer": "See töölaua on seotud serveriga, mis otsustab selle pistikprogrammid.",
|
||||
"defaultLook": "{{name}} on vaikimisi välimus, seega saab selle välja lülitada või asendada, kuid mitte desinstallida.",
|
||||
"hasDependents": "{{name}} on vajalik {{list}} jaoks. Lülita need välja või eemalda need enne.",
|
||||
"missingDependencies": "{{name}} vajab {{list}}, mida ei ole paigaldatud.",
|
||||
"consentChanged": "Mida see pistikprogramm küsib, on muutunud alates viimasest vaatamisest. Vaata nimekirja uuesti.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Puudub ligipääs teie serveritele",
|
||||
"searchInstalled": "Otsi paigaldatud",
|
||||
"searchPlugins": "Otsi pistikmooduleid",
|
||||
"allCategories": "Kõik",
|
||||
"nothingMatches": "Ükski tulemus ei vasta sellele.",
|
||||
"noneInstalled": "Pistikmooduleid pole veel paigaldatud. Sirvige, et lisada mõned.",
|
||||
"nothingHere": "Siin pole midagi.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Dokumentatsioon",
|
||||
"envVars": "Keskkonnamuutujad",
|
||||
"envRequired": "Nõutud",
|
||||
"envDefault": "Vaikimisi: {{value}}"
|
||||
"envDefault": "Vaikimisi: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Paigutused",
|
||||
"themes": "Teemad",
|
||||
"tabs": "Vahekaardid",
|
||||
"panels": "Külgriba paneelid",
|
||||
"dashboardCards": "Juhtpaneeli kaardid",
|
||||
"protocols": "Ühenduse tüübid",
|
||||
"auth": "Sisselogimismeetodid",
|
||||
"actions": "Tegevused",
|
||||
"hostCapability": "Hosti seaded"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tüüp",
|
||||
"allTypes": "Kõik tüübid",
|
||||
"category": "Kategooria",
|
||||
"allCategories": "Kõik kategooriad",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_other": "{{count}} pluginat",
|
||||
"remove": "Eemalda filter {{name}}",
|
||||
"clear": "Kustuta filtrid",
|
||||
"button": "Filtrid",
|
||||
"buttonCount": "Filtrid ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}–{{to}} kokku {{total}}",
|
||||
"page": "Lehekülg {{page}} / {{pages}}",
|
||||
"previous": "Eelmine lehekülg",
|
||||
"next": "Järgmine lehekülg",
|
||||
"perPage": "{{count}} leheküljel",
|
||||
"perPageLabel": "Pluginaid leheküljel"
|
||||
},
|
||||
"showUnsupportedHint": "Need on loetletud, kuid sellel versioonil ei tööta veel ühtegi väljaannet. Uuenda Termixit, et need installida.",
|
||||
"unsupported": "Nõuab uuemat Termixit",
|
||||
"unsupportedHint": "Sellel Termixi versioonil ei tööta selle plugina ühtegi väljaannet. Uuenda Termixit, et see installida.",
|
||||
"needsTermix": "Nõuab Termixit {{range}}",
|
||||
"showUnsupported": "Kuva mittetoetatud ({{count}})",
|
||||
"showMore": "Kuva {{count}} rohkem (jäänud {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Andmed puuduvad",
|
||||
"filter": "Filtreeri..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minut tagasi",
|
||||
"minutesAgo_other": "{{count}} minutit tagasi",
|
||||
"hoursAgo_one": "{{count}} tund tagasi",
|
||||
"hoursAgo_other": "{{count}} tundi tagasi",
|
||||
"pending_one": "{{count}} muudatus ootab sünkroonimist",
|
||||
"pending_other": "{{count}} muudatust ootavad sünkroonimist",
|
||||
"proxy": {
|
||||
"headersTitle": "Lisapealised",
|
||||
"headersHint": "Saadetakse koos igaga serveri poole suunatud päringuga, näiteks Cloudflare Accessi teenuse token.",
|
||||
"headerName": "Pealise nimi",
|
||||
"headerValue": "Väärtus",
|
||||
"savedValue": "Salvestatud, muutmiseks kirjuta",
|
||||
"addHeader": "Lisa pealis",
|
||||
"removeHeader": "Eemalda pealis",
|
||||
"basicAuthTitle": "Kasutajanimi ja parool",
|
||||
"basicAuthHint": "Proksü jaoks, mis küsib kasutajat ja parooli enne Termixi.",
|
||||
"username": "Kasutajanimi",
|
||||
"password": "Parool",
|
||||
"allowInvalidCertificate": "Usalda iseallkirjastatud sertifikaat",
|
||||
"allowInvalidCertificateHint": "Ainult oma serveri jaoks, kui selle sertifikaat ei ole tuntud sertifitseerimisasutuselt."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "See ei tundu olevat veebiaadress.",
|
||||
"unreachable": "Serverit ei õnnestunud saavutada. Kontrolli aadressi ja veendu, et server töötab.",
|
||||
"unreachableWithReason": "Serverit ei õnnestunud saavutada: {{reason}}",
|
||||
"tlsUntrusted": "Serveri sertifikaati ei usaldata. Kui see on sinu enda server isesertifitseeritud sertifikaadiga, lülita allolev valik sisse.",
|
||||
"basicAuthRequired": "Serveri ees asuv komponent küsib kasutajat ja parooli. Sisesta need allolevasse väljasse.",
|
||||
"proxyLogin": "Termixi asemel vastas sisselogimisleht või proksy. Lisa allolevasse vajalikud päised või kontrolli aadressi.",
|
||||
"notTermix": "Sellel aadressil ei asu Termixi serverit. Kui see töötab teatud teel, sisalda see aadressi, näiteks https://example.com/termix.",
|
||||
"versionMismatch": "See server töötab vanema Termixi versiooniga. Uuenda see versioonile 2.9 või uuemale, et seadmed siduda.",
|
||||
"differentAccount": "Sa oled sisse loginud teise kontole. Logi sisse kontole, millega see seade on seotud, või eemenda seos enne."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Seo Termixi serveriga",
|
||||
"reloginTitle": "Logi uuesti sisse",
|
||||
"savedServers": "Viimased serverid",
|
||||
"removeServer": "Eemalda nimekirjast",
|
||||
"serverDescription": "Sisesta aadress, mida kasutad Termixi avamiseks brauseris.",
|
||||
"signinDescription": "Logi sisse aadressile {{url}}",
|
||||
"chooseDescription": "Selles seadmes on juba andmeid. Mis peaks nendega juhtuma?",
|
||||
"finishingDescription": "Seose loomine selle seadmega.",
|
||||
"serverUrl": "Serveri aadress",
|
||||
"serverUrlHint": "Näiteks https://termix.example.com",
|
||||
"showProxySettings": "Pöördproksy seaded",
|
||||
"hideProxySettings": "Peida pöördproksy seaded",
|
||||
"continue": "Jätka",
|
||||
"back": "Tagasi",
|
||||
"mergeTitle": "Lisa minu kontole",
|
||||
"mergeBody_one": "Selle seadme üksus lisatakse sinu kontole. Sinu konto juba olemasolevad üksused jäävad serveris samaks.",
|
||||
"mergeBody_other": "Selle seadme {{count}} üksust lisatakse sinu kontole. Sinu konto juba olemasolevad üksused jäävad serveris samaks.",
|
||||
"replaceTitle": "Asenda see minu kontoga",
|
||||
"replaceBody_one": "Selle seadme üksus eemaldatakse ja see seade võtab kõik sinu kontolt. Ainult sellel seadmel hoitud pered jäävad alles.",
|
||||
"replaceBody_other": "Selle seadme {{count}} üksust eemaldatakse ja see seade võtab kõik sinu kontolt. Ainult sellel seadmel hoitud pered jäävad alles.",
|
||||
"link": "Seo",
|
||||
"linking": "Seose loomine ja esimese sünkroonimise käivitamine...",
|
||||
"linked": "Seotud. Sinu andmeid sünkroonitakse.",
|
||||
"signedInAgain": "Sisse loginud. Sünkroonimine käivitati uuesti."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hostid",
|
||||
"sshCredentials": "Sisselogimisandmed",
|
||||
"sshFolders": "Kaustad",
|
||||
"userPreferences": "Eelistused",
|
||||
"pluginUserSettings": "Pistikprogrammide seaded",
|
||||
"sharedHosts": "Sinuga jagatud hostid",
|
||||
"sharedCredentials": "Sinuga jagatud sisselogimisandmed",
|
||||
"vaultProfiles": "Vaulti profiilid",
|
||||
"snippetFolders": "Koodilõikude kaustad",
|
||||
"snippets": "Koodilõigud",
|
||||
"dashboardServiceLinks": "Teenuste lingid",
|
||||
"homepageItems": "Avalehe elemendid",
|
||||
"networkTopology": "Võrgukaart",
|
||||
"workspaces": "Tööruumid",
|
||||
"hostDefaults": "Hostide vaikimisi väärtused",
|
||||
"hostDefaultsAdmin": "Serveri hostide vaikimisi väärtused",
|
||||
"aiProviders": "AI pakkujad",
|
||||
"homepageLayouts": "Avalehe paigutused",
|
||||
"accountProfile": "Konto profiil"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Kaust {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Ruudustik",
|
||||
"listView": "Loend",
|
||||
"compactRows": "Kompaktsead read",
|
||||
"comfortableRows": "Mugavad read"
|
||||
"comfortableRows": "Mugavad read",
|
||||
"columns": {
|
||||
"title": "Veerud",
|
||||
"auto": "Automaatne",
|
||||
"count": "{{count}} veeru laiune"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Salvestatud. Tüüpi, et asendada."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Joitakin lisäosia ei voitu muuttaa. Voit korjata ne myöhemmin Lisäosat-välilehdeltä. Paina Seuraava jatkaaksesi.",
|
||||
"pluginsApplyFailed": "Valintojasi ei voitu tallentaa. Yritä uudelleen tai jatka ja muokkaa niitä myöhemmin Lisäosat-välilehdeltä.",
|
||||
"pluginsLoadFailed": "Lisäosien listaa ei voitu ladata. Voit valita lisäosat myöhemmin Lisäosat-välilehdeltä.",
|
||||
"presetTitle": "Paljonko haluat näytöllä?",
|
||||
"presetIntro": "Valitse, kuinka paljon näytetään ruudulla.",
|
||||
"presetChangeLater": "Voit vaihtaa esiasetuksia tai muuttaa yksittäisiä asetuksia myöhemmin Asetukset-kohtaan, kohdassa Käyttöliittymä.",
|
||||
"appearanceTitle": "Tee siitä omaasi",
|
||||
"appearanceIntro": "Valitse teema, korostusväri, fontti ja kieli. Muutokset näkyvät välittömästi, ja voit muuttaa niitä myöhemmin Asetukset-kohtaan.",
|
||||
"securityTitle": "Turvaa tilisi",
|
||||
"securityIntro": "Lisää passkey tai todennussovellus tilillesi. Voit tehdä tämän myös myöhemmin Asetukset-kohtaan, kohdassa Turvallisuus.",
|
||||
"desktopTitle": "Miten haluat käyttää Termixiä?",
|
||||
"desktopBody": "Voit muuttaa tätä milloin tahansa Synkronointi-valikosta sivupalkissa.",
|
||||
"desktopLocalTitle": "Vain tällä laitteella",
|
||||
"desktopLocalBody": "Kaikki tallennetaan tähän. Ei mitään määritettävää.",
|
||||
"desktopLinkTitle": "Termix-palvelimen kanssa",
|
||||
"desktopLinkBody": "Kirjaudu palvelimeesi käyttääksesi samoja isäntiä ja asetuksia kaikilla laitteilla.",
|
||||
"desktopLinked": "Linkitetty palvelimeen {{server}}",
|
||||
"pluginsDocsLink": "Lue lisää jokaisesta"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} on valmis asennettavaksi",
|
||||
"readyHint": "Se asennetaan seuraavan kerran, kun Termix käynnistetään uudelleen."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Turvatoiminto",
|
||||
"description": "Vain asettelun ja teeman lisäosat ovat käytössä. Käynnistä palvelin uudelleen ilman TERMIX_SAFE_MODE-muuttujaa ottaaksesi muut lisäosat takaisin käyttöön."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Sulje paneeli",
|
||||
"moveSide": "Siirrä paneeli",
|
||||
"resize": "Muuta paneelin kokoa"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Koti",
|
||||
"terminal": "Pääte",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Isännät",
|
||||
"credentials": "Tunnukset",
|
||||
"connections": "Yhteydet",
|
||||
"sync": "Synkronoi",
|
||||
"reconnectDisconnectedTerminals": "Yhdistä kaikki katkenneet terminaaliyhteydet",
|
||||
"reconnectingTerminals_one": "Yhdistetään {{count}} terminaali",
|
||||
"reconnectingTerminals_other": "Yhdistetään {{count}} terminaalia",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Yritä uudelleen",
|
||||
"refresh": "Päivitä",
|
||||
"optional": "Valinnainen",
|
||||
"downloadSample": "Lataa esimerkki",
|
||||
"failedToDeleteHost": "{{name}}:n poisto epäonnistui",
|
||||
"importSkipExisting": "Tuo (ohita olemassa olevat)",
|
||||
"importSSHConfig": "Tuo SSH-määrityksestä",
|
||||
"connectionDetails": "Yhteystiedot",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Ei kansiota)",
|
||||
"deleteSelected": "Poista",
|
||||
"exitSelection": "Poistu valinnasta",
|
||||
"importSkip": "Tuo (ohita olemassa olevat)",
|
||||
"importOverwrite": "Tuo (kirjoita päälle)",
|
||||
"collapseBtn": "Kutista",
|
||||
"importExportBtn": "Tuo / Vie",
|
||||
"hostStatusesRefreshed": "Isäntäpalvelimien tilat päivitetty",
|
||||
"failedToRefreshHosts": "Isäntäpalvelimien päivitys epäonnistui",
|
||||
"movedHostTo": "Siirretty {{host}} kansioon \"{{folder}}\"",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Haluatko poistaa kohteen \"{{name}}\" ja sen {{count}} isännän? Toimintoa ei voi peruuttaa.",
|
||||
"deleteFolderConfirm_other": "Haluatko poistaa kohteen \"{{name}}\" ja sen {{count}} isännän? Toimintoa ei voi peruuttaa.",
|
||||
"failedToMoveHosts": "Isäntien siirto epäonnistui",
|
||||
"managedBanner": "Tätä isäntää hallinnoi {{plugin}}. Muokkaa sitä sieltä. Voit edelleen kiinnittää ja järjestää sen uudelleen.",
|
||||
"managedTooltip": "Hallinnoi {{plugin}}",
|
||||
"addBlocked": "Isäntiä hallinnoi {{plugin}}, joten uusia isäntiä ei voi lisätä tähän.",
|
||||
"failedToReorder": "Järjestysmuutos epäonnistui",
|
||||
"expandAll": "Laajenna kaikki kansiot",
|
||||
"collapseAll": "Tiivistä kaikki kansiot",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Lisää tunnistetiedot",
|
||||
"checkingHostStatuses": "Tarkistetaan isäntien tiloja...",
|
||||
"pinnedSection": "Kiinnitetyt",
|
||||
"hostsExported": "Isännät vietyjä onnistuneesti",
|
||||
"export": {
|
||||
"menuItem": "Vie...",
|
||||
"title": "Vie isännät",
|
||||
"scope": "Kohde",
|
||||
"scopeAll": "Kaikki",
|
||||
"scopeSelected": "Valitut",
|
||||
"searchHosts": "Hae isäntiä...",
|
||||
"include": "Sisällytä",
|
||||
"groupConnection": "Yhteys",
|
||||
"groupCredentials": "Kirjautumistiedot",
|
||||
"groupNotes": "Muistiinpanot",
|
||||
"groupTags": "Tunnisteet ja kiinnitys",
|
||||
"groupProxy": "Välityspalvelin",
|
||||
"groupJumpHosts": "Hyppysisännät",
|
||||
"groupFeatureFlags": "Liitännäisasennukset",
|
||||
"groupAdvanced": "Edistynyt konfiguraatio",
|
||||
"preview": "Esikatselu",
|
||||
"moreHosts_one": "... {{count}} muu isäntä",
|
||||
"moreHosts_other": "... {{count}} muuta isäntää",
|
||||
"summary": "{{selected}} / {{total}} isäntää",
|
||||
"credentialsIncluded": "kirjautumistiedot sisällytetty",
|
||||
"credentialsExcluded": "kirjautumistiedot jätetty pois",
|
||||
"noneSelected": "Isäntiä ei ole valittu",
|
||||
"cancel": "Peruuta",
|
||||
"confirm": "Vie",
|
||||
"fetchFailed": "Isäntien lataus vientiä varten epäonnistui",
|
||||
"bulkButton": "Vie"
|
||||
},
|
||||
"sampleDownloaded": "Esimerkkitiedosto ladattu",
|
||||
"failedToDeleteCredential2": "Kirjautumistietojen poisto epäonnistui",
|
||||
"noFolderOption": "(Ei kansiota)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Päivitä isäntäkone",
|
||||
"editorAdd": "Lisää isäntäkone",
|
||||
"speedSearch": "Hae isäntäkoneita. Nuolinäppäimet valintaan, Enter yhteyteen, Esc sulkemiseen",
|
||||
"speedSearchList": "Isäntäkoneiden lista. Kirjoita tai paina / hakuun.",
|
||||
"importNoHosts": "Tiedostosta ei löytynyt isäntäkoneita",
|
||||
"importTooMany": "Voit tuoda kerralla enintään {{max}} isäntäkoneetta",
|
||||
"importSummary": "Tuonti valmis: {{imported}} tuotu, {{updated}} päivitetty, {{failed}} epäonnistui",
|
||||
"importHostsFailed": "Isäntäkoneiden tuonti epäonnistui"
|
||||
"speedSearchList": "Isäntäkoneiden lista. Kirjoita tai paina / hakuun."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Jaettu näyttö",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Avaa värivalitsin",
|
||||
"themeSystem": "Järjestelmä",
|
||||
"themeLight": "Vaalea",
|
||||
"themeDark": "Tumma",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Tumma"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Koko sovelluksen asettelu. Teemat ja asettelut tulevat lisäosista.",
|
||||
"defaultsLabel": "Oletus kaikille",
|
||||
"defaultsHint": "Mitä ihmiset näkevät, ennen kuin valitsevat oman asettelun tai teeman.",
|
||||
"followDefault": "Käytä oletusta",
|
||||
"defaultSaved": "Oletusnäkö tallennettu",
|
||||
"saveFailed": "Näköä ei voitu tallentaa",
|
||||
"repair": {
|
||||
"title": "Tätä asettelua ei voitu näyttää",
|
||||
"safeTitle": "Turvatoiminto",
|
||||
"layout": "Asettelu",
|
||||
"plugin": "Lisäosa",
|
||||
"reason": "Syy",
|
||||
"error": "Virhe",
|
||||
"noError": "Ei virheilmoitusta.",
|
||||
"copy": "Kopioi",
|
||||
"copied": "Kopioitu",
|
||||
"copyFailed": "Yksityiskohtia ei voitu kopioida",
|
||||
"retry": "Yritä uudelleen",
|
||||
"reset": "Palauta oletusnäkö",
|
||||
"resetEveryone": "Palauta oletus kaikille",
|
||||
"update": "Päivitä {{name}} versioon {{version}}",
|
||||
"disable": "Sammuta {{name}}",
|
||||
"enable": "Ota {{name}} käyttöön",
|
||||
"startAgain": "Käynnistä {{name}} uudelleen",
|
||||
"install": "Etsi asetteluja ja teemoja",
|
||||
"installTitle": "Asettelut ja teemat",
|
||||
"installButton": "Asenna",
|
||||
"nothingToInstall": "Muuta asetteluja tai teemoja ei ole tällä hetkellä saatavilla.",
|
||||
"registryUnreachable": "Lisäosarekisteriä ei voitu tavoittaa.",
|
||||
"askAdmin": "Pyydä ylläpitäjää päivittämään tai korjaamaan tämä asettelu. Voit vaihtaa toiseen asetteluun tai teemaan itsellesi alla.",
|
||||
"switchLayout": "Vaihda asettelua",
|
||||
"switchTheme": "Vaihda teemaa",
|
||||
"saveFailed": "Valintaa ei voitu tallentaa",
|
||||
"reasons": {
|
||||
"safe-url": "Osoite pyysi turvatoimintoa. Valitse asettelu alla tai poista ?safe-layout=1 osoitteesta.",
|
||||
"safe-env": "Palvelin on käynnistetty TERMIX_SAFE_LAYOUT-muuttujalla, joten kaikki näkevät tämän näytteen, kunnes se poistetaan.",
|
||||
"missing": "Yksikään asennettu lisäosa ei tarjoa tätä asettelua.",
|
||||
"disabled": "Tätä asettelua tarjoava lisäosa on sammutettu.",
|
||||
"blocked": "Tätä asettelua tarjoava lisäosa odottaa jotain, mitä se tarvitsee.",
|
||||
"incompatible": "Tätä asettelua tarjoava lisäosa ei toimi tämän Termix-version kanssa.",
|
||||
"failed": "Asettelun käynnistyminen epäonnistui.",
|
||||
"crashed": "Asettelo kaatui kaksi kertaa sovellusta piirtäessä."
|
||||
},
|
||||
"noLayout": "Asettelua ei ole määritetty",
|
||||
"restore": "Palauta mukana tuleva {{name}}",
|
||||
"restoreFailed": "Mukana tulevaa kopiota ei voitu palauttaa"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Hallita kirjautumista",
|
||||
"consequence": "Se voi lisätä kirjautumistavan, toisen todennustekijän tai SSH-kirjautumistyyppin."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Aseta kirjautumissäännöt",
|
||||
"consequence": "Se voi kirjata ihmiset ulos, kun he ovat toimettomia, rajoittaa istunnon kestoa, sammutaa muista minut -toiminnon ja vaatia toisen tekijän."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Valitse, miten isäntiin yhdistetään",
|
||||
"consequence": "Se voi kuljettaa SSH-yhteyden isäntään omalla reitillään, joten se näkee kaiken, mikä lähetetään näihin isäntiin ja niistä, salasanat mukaan lukien."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Suorita synkronointi",
|
||||
"consequence": "Se voi vastata kaikkiin synkronointipyyntöihin, joten se näkee tiedot, jotka laitteet ja palvelimet synkronoivat."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Hallita sertifikaatteja",
|
||||
"consequence": "Se voi korvata Termixin HTTPS-yhteyksissä käyttämän sertifikaatin ja vastata sertifikaattiviranomaisten verkkotunnustarkistuksiin."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Päästä käsiksi sarja- ja USB-laitteisiin",
|
||||
"consequence": "Se voi avata fyysisen sarjaportin Termixin suorittavassa laitteessa."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Vie isännät niiden salaisuuksineen",
|
||||
"consequence": "Voi lukea isäntiäsi täysin, mukaan lukien tallennetut salasanat ja avaimet, ja jakaa niitä. Jokainen vienti kirjataan tarkastuslokissa."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Luoda ja muuttaa isäntäpalvelimia",
|
||||
"consequence": "Se voi lisätä isäntäpalvelimia ja muokata jo olemassa olevia."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Lukea tarkastusloki",
|
||||
"consequence": "Se voi nähdä, kuka teki mitä ja milloin."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Tarkista, vastaavatko portit",
|
||||
"consequence": "Voi avata pelkän yhteyden mihin tahansa osoitteeseen palvelimelta, nähdäkseen, onko se tavoitettavissa."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Tarjoa isännän tila",
|
||||
"consequence": "Tulee lähteeksi online- ja offline-pisteille jokaiselle isännälle."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Tallenna viimeisin toiminta",
|
||||
"consequence": "Toimii kaikkien käyttäjien viimeisimmän toiminnan listan tallennustilana."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Hallinnoi isäntiä vain lukuoikeudella",
|
||||
"consequence": "Sen hallinnoimia isäntiä ei voi muokata, poistaa tai jakaa uudelleen kenenkään toisen toimesta."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Avata työpöytäikkunoita",
|
||||
"consequence": "Vain Termix-työpöytäsovelluksessa."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Käytä tätä tietokonetta",
|
||||
"consequence": "Voi lukea ja muuttaa tiedostoja, suorittaa komentoriviä ja avata paikallisia portteja tässä tietokoneessa. Vain Termix-työpöytäsovelluksessa."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Toimia muiden käyttäjien puolesta",
|
||||
"consequence": "Suorittaa taustatyötä toisen käyttäjän oikeuksilla, kuten ajoitettuja tehtäviä. Jokainen käyttö kirjataan tarkastuslokiin."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Lisätä omat näkymänsä",
|
||||
"consequence": "Välilehtiä, paneelia ja asetuksia, jotka voit piilottaa myöhemmin."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Korvaa koko sovelluksen asettelu",
|
||||
"consequence": "Kun valittu, sen koodi piirtää jokaisen näytön, mukaan lukien terminaalisin ja asetukset."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Lisää väriteemoja",
|
||||
"consequence": "Vain värejä ja tyylejä. Teema ei suorita koodia."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Poistettu käytöstä",
|
||||
"failed": "Pysähtyi odottamatta",
|
||||
"blocked": "Odottaa toista lisäosaa",
|
||||
"server": "Käynnistyy palvelimellasi"
|
||||
"server": "Käynnistyy palvelimellasi",
|
||||
"safeMode": "Pois käytöstä turvatoiminnossa"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Käynnissä",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Viimeksi päivitetty",
|
||||
"category": "Kategoria"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Sarakkeet",
|
||||
"auto": "Automaattinen",
|
||||
"count": "{{count}} saraketta leveä"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nimi",
|
||||
"description": "Kuvaus",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "{{name}} -lisäosan asetuksia ei voitu tallentaa: {{error}}",
|
||||
"deleteData": "{{name}} -lisäosan tietoja ei voitu poistaa: {{error}}",
|
||||
"managedByServer": "Tämä työpöytä on linkitetty palvelimeen, joka päättää sen lisäosista.",
|
||||
"defaultLook": "{{name}} on oletusnäkö, joten se voidaan poistaa käytöstä tai vaihtaa, mutta sitä ei voi poistaa asennuksesta.",
|
||||
"hasDependents": "{{name}} on tarpeen lisäosille {{list}}. Kytke ne pois päältä tai poista ne ensin.",
|
||||
"missingDependencies": "{{name}} tarvitsee {{list}}:ää, jota ei ole asennettu.",
|
||||
"consentChanged": "Tämän lisäosan pyytämät oikeudet ovat muuttuneet siitä lähtien, kun tarkastelit niitä. Tarkista lista uudelleen.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Ei pääsyä palvelimiisi",
|
||||
"searchInstalled": "Hae asennetuista",
|
||||
"searchPlugins": "Hae lisäosia",
|
||||
"allCategories": "Kaikki",
|
||||
"nothingMatches": "Ei vastaavia tuloksia.",
|
||||
"noneInstalled": "Lisäosia ei ole vielä asennettu. Selaa ja lisää joitakin.",
|
||||
"nothingHere": "Täällä ei ole mitään.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Dokumentaatio",
|
||||
"envVars": "Ympäristömuuttujat",
|
||||
"envRequired": "Vaadittu",
|
||||
"envDefault": "Oletus: {{value}}"
|
||||
"envDefault": "Oletus: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Asettelut",
|
||||
"themes": "Teemat",
|
||||
"tabs": "Välilehdet",
|
||||
"panels": "Sivupaneelit",
|
||||
"dashboardCards": "Kojelaudan kortit",
|
||||
"protocols": "Yhteydentyypit",
|
||||
"auth": "Kirjautumistavat",
|
||||
"actions": "Toiminnot",
|
||||
"hostCapability": "Isäntäasetukset"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tyyppi",
|
||||
"allTypes": "Kaikki tyypit",
|
||||
"category": "Kategoria",
|
||||
"allCategories": "Kaikki kategoriat",
|
||||
"results_one": "{{count}} lisäosa",
|
||||
"results_other": "{{count}} lisäosaa",
|
||||
"remove": "Poista suodatin {{name}}",
|
||||
"clear": "Tyhjennä suodattimet",
|
||||
"button": "Suodattimet",
|
||||
"buttonCount": "Suodattimet ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}–{{to}} / {{total}}",
|
||||
"page": "Sivu {{page}} / {{pages}}",
|
||||
"previous": "Edellinen sivu",
|
||||
"next": "Seuraava sivu",
|
||||
"perPage": "{{count}} per sivu",
|
||||
"perPageLabel": "Lisäosia per sivu"
|
||||
},
|
||||
"showUnsupportedHint": "Nämä on listattu, mutta mikään julkaisu ei vielä toimi tässä versiossa. Päivitä Termix asentamaan ne.",
|
||||
"unsupported": "Vaatii uudemman Termixin",
|
||||
"unsupportedHint": "Tämän lisäosan mikään julkaisu ei toimi tässä Termix-versiossa. Päivitä Termix asentamaan se.",
|
||||
"needsTermix": "Vaatii Termix {{range}}",
|
||||
"showUnsupported": "Näytä tukevat ({{count}})",
|
||||
"showMore": "Näytä {{count}} lisää ({{total}} jäljellä)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Ei dataa",
|
||||
"filter": "Suodata..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minuutti sitten",
|
||||
"minutesAgo_other": "{{count}} minuuttia sitten",
|
||||
"hoursAgo_one": "{{count}} tunti sitten",
|
||||
"hoursAgo_other": "{{count}} tuntia sitten",
|
||||
"pending_one": "{{count}} muutos odottaa synkronointia",
|
||||
"pending_other": "{{count}} muutosta odottaa synkronointia",
|
||||
"proxy": {
|
||||
"headersTitle": "Lisäotsakkeet",
|
||||
"headersHint": "Lähetetään jokaisen palvelimelle lähetetyn pyynnön mukana, esimerkiksi Cloudflare Access -palvelun tunnus.",
|
||||
"headerName": "Otsikon nimi",
|
||||
"headerValue": "Arvo",
|
||||
"savedValue": "Tallennettu, kirjoita muuttaaksesi",
|
||||
"addHeader": "Lisää otsake",
|
||||
"removeHeader": "Poista otsake",
|
||||
"basicAuthTitle": "Käyttäjänimi ja salasana",
|
||||
"basicAuthHint": "Proxyä varten, joka kysyy käyttäjänimeä ja salasanaa ennen Termixiä.",
|
||||
"username": "Käyttäjänimi",
|
||||
"password": "Salasana",
|
||||
"allowInvalidCertificate": "Luota itse allekirjoitettuun sertifikaattiin",
|
||||
"allowInvalidCertificateHint": "Vain omaa palvelinta varten, kun sen sertifikaatti ei ole tunnetulta viranomaiselta."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Tuo ei näytä verkkosoitteelta.",
|
||||
"unreachable": "Palvelimeen ei saatu yhteyttä. Tarkista osoite ja että palvelin on käynnissä.",
|
||||
"unreachableWithReason": "Palvelimeen ei saatu yhteyttä: {{reason}}",
|
||||
"tlsUntrusted": "Palvelimen sertifikaattia ei luoteta. Jos tämä on oma palvelimesi, jossa on itseallekirjoitettu sertifikaatti, ota alla oleva vaihtoehto käyttöön.",
|
||||
"basicAuthRequired": "Palvelimen edessä oleva komponentti pyytää käyttäjätunnusta ja salasanaa. Syötä ne alla.",
|
||||
"proxyLogin": "Kirjautumissivu tai välityspalvelin vastasi Termixin sijaan. Lisää tarvittavat otsikot alla tai tarkista osoite.",
|
||||
"notTermix": "Termix-palvelinta ei löydy kyseisestä osoitteesta. Jos se toimii polun takana, sisällytä se osoitteeseen, kuten https://example.com/termix.",
|
||||
"versionMismatch": "Palvelimella on vanhempi Termix-versio. Päivitä se versioon 2.9 tai uudempi yhdistääksesi.",
|
||||
"differentAccount": "Olet kirjautunut eri tiliin. Kirjaudu tiliin, johon tämä laite on linkitetty, tai irrota linkitys ensin."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Linkitä Termix-palvelimeen",
|
||||
"reloginTitle": "Kirjaudu sisään uudelleen",
|
||||
"savedServers": "Viimeisimmät palvelimet",
|
||||
"removeServer": "Poista listalta",
|
||||
"serverDescription": "Syötä osoite, jota käytät Termixin avaamiseen selaimessasi.",
|
||||
"signinDescription": "Kirjaudu sisään osoitteeseen {{url}}",
|
||||
"chooseDescription": "Tässä laitteessa on jo dataa. Mitä sille pitäisi tehdä?",
|
||||
"finishingDescription": "Linkitetään laitetta.",
|
||||
"serverUrl": "Palvelimen osoite",
|
||||
"serverUrlHint": "Esimerkiksi https://termix.example.com",
|
||||
"showProxySettings": "Käänteisen välityspalvelimen asetukset",
|
||||
"hideProxySettings": "Piilota käänteisen välityspalvelimen asetukset",
|
||||
"continue": "Jatka",
|
||||
"back": "Takaisin",
|
||||
"mergeTitle": "Lisää se tililleni",
|
||||
"mergeBody_one": "Tämän laitteen kohde lisätään tilillesi. Tililläsi jo olevat kohteet pysyvät ennallaan palvelimella.",
|
||||
"mergeBody_other": "Tämän laitteen {{count}} kohdetta lisätään tilillesi. Tililläsi jo olevat kohteet pysyvät ennallaan palvelimella.",
|
||||
"replaceTitle": "Korvaa se tililläni",
|
||||
"replaceBody_one": "Tämän laitteen kohde poistetaan, ja laite ottaa kaiken tililtäsi. Vain tähän laitteeseen tallennetut isäntäkohteet säilyvät.",
|
||||
"replaceBody_other": "Tämän laitteen {{count}} kohdetta poistetaan, ja laite ottaa kaiken tililtäsi. Vain tähän laitteeseen tallennetut isäntäkohteet säilyvät.",
|
||||
"link": "Linkitä",
|
||||
"linking": "Linkitetään ja suoritetaan ensimmäinen synkronointi...",
|
||||
"linked": "Linkitetty. Dataasi synkronoidaan nyt.",
|
||||
"signedInAgain": "Kirjauduttu sisään. Synkronointi jatkuu."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Isäntäpalvelimet",
|
||||
"sshCredentials": "Tunnukset",
|
||||
"sshFolders": "Kansiot",
|
||||
"userPreferences": "Asetukset",
|
||||
"pluginUserSettings": "Liitännäisasetykset",
|
||||
"sharedHosts": "Sinulle jaetut isäntäpalvelimet",
|
||||
"sharedCredentials": "Sinulle jaetut tunnukset",
|
||||
"vaultProfiles": "Vault-profiilit",
|
||||
"snippetFolders": "Koodinpätkien kansiot",
|
||||
"snippets": "Koodinpätkät",
|
||||
"dashboardServiceLinks": "Palvelulinkit",
|
||||
"homepageItems": "Kotisivun kohteet",
|
||||
"networkTopology": "Verkkokartta",
|
||||
"workspaces": "Työtilat",
|
||||
"hostDefaults": "Isäntäpalvelimen oletukset",
|
||||
"hostDefaultsAdmin": "Palvelimen isäntäpalvelimen oletukset",
|
||||
"aiProviders": "Te keinotekoinen älykkyyden tarjoajat",
|
||||
"homepageLayouts": "Kotisivun asettelut",
|
||||
"accountProfile": "Tilin profiili"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Kansio {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Ruudukko",
|
||||
"listView": "Lista",
|
||||
"compactRows": "Tiiviit rivit",
|
||||
"comfortableRows": "Mukavat rivit"
|
||||
"comfortableRows": "Mukavat rivit",
|
||||
"columns": {
|
||||
"title": "Sarakkeet",
|
||||
"auto": "Automaattinen",
|
||||
"count": "{{count}} saraketta leveä"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Tallennettu. Kirjoita korvataksesi sen."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Certains plugins n'ont pas pu être modifiés. Vous pouvez les corriger plus tard depuis l'onglet Plugins. Appuyez sur Suivant pour continuer.",
|
||||
"pluginsApplyFailed": "Vos choix n'ont pas pu être enregistrés. Réessayez, ou continuez et modifiez-les plus tard depuis l'onglet Plugins.",
|
||||
"pluginsLoadFailed": "La liste des plugins n'a pas pu être chargée. Vous pouvez choisir des plugins plus tard depuis l'onglet Plugins.",
|
||||
"presetTitle": "Combien d'éléments souhaitez-vous afficher ?",
|
||||
"presetIntro": "Choisissez la quantité d'informations affichées à l'écran.",
|
||||
"presetChangeLater": "Vous pouvez changer de preset ou modifier n'importe quel paramètre plus tard dans Paramètres, sous Interface.",
|
||||
"appearanceTitle": "Personnalisez-le",
|
||||
"appearanceIntro": "Choisissez un thème, une couleur d'accentuation, une police et votre langue. Les modifications s'affichent immédiatement et vous pouvez les modifier plus tard dans Paramètres.",
|
||||
"securityTitle": "Sécurisez votre compte",
|
||||
"securityIntro": "Ajoutez une clé de sécurité ou une application d'authentification à votre compte. Vous pouvez également le faire plus tard dans Paramètres, sous Sécurité.",
|
||||
"desktopTitle": "Comment souhaitez-vous utiliser Termix ?",
|
||||
"desktopBody": "Vous pouvez modifier cela à tout moment depuis Synchronisation dans la barre latérale.",
|
||||
"desktopLocalTitle": "Sur cet appareil uniquement",
|
||||
"desktopLocalBody": "Tout est stocké ici. Rien à configurer.",
|
||||
"desktopLinkTitle": "Avec mon serveur Termix",
|
||||
"desktopLinkBody": "Connectez-vous à votre serveur pour utiliser les mêmes hôtes et paramètres sur tous vos appareils.",
|
||||
"desktopLinked": "Lié à {{server}}",
|
||||
"pluginsDocsLink": "En savoir plus sur chacun"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} est prêt à être installé",
|
||||
"readyHint": "Il sera installé au prochain redémarrage de Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Mode sans échec",
|
||||
"description": "Seuls les plugins de mise en page et de thème sont actifs. Redémarrez le serveur sans la variable TERMIX_SAFE_MODE pour réactiver les autres."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Fermer le panneau",
|
||||
"moveSide": "Déplacer le panneau",
|
||||
"resize": "Redimensionner le panneau"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Accueil",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hôtes",
|
||||
"credentials": "Identifiants",
|
||||
"connections": "Connexions",
|
||||
"sync": "Synchroniser",
|
||||
"reconnectDisconnectedTerminals": "Reconnecter tous les terminaux déconnectés",
|
||||
"reconnectingTerminals_one": "Reconnexion du terminal {{count}}",
|
||||
"reconnectingTerminals_many": "Reconnexion des {{count}} terminaux",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Réessayer",
|
||||
"refresh": "Actualiser",
|
||||
"optional": "Facultatif",
|
||||
"downloadSample": "Télécharger l'exemple",
|
||||
"failedToDeleteHost": "Échec de la suppression de {{name}}",
|
||||
"importSkipExisting": "Importer (ignorer les existants)",
|
||||
"importSSHConfig": "Importer depuis la configuration SSH",
|
||||
"connectionDetails": "Détails de la connexion",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Aucun dossier)",
|
||||
"deleteSelected": "Supprimer",
|
||||
"exitSelection": "Quitter la sélection",
|
||||
"importSkip": "Importer (ignorer les existants)",
|
||||
"importOverwrite": "Importer (écraser)",
|
||||
"collapseBtn": "Réduire",
|
||||
"importExportBtn": "Importer / Exporter",
|
||||
"hostStatusesRefreshed": "Statuts des hôtes actualisés",
|
||||
"failedToRefreshHosts": "Échec de l'actualisation des hôtes",
|
||||
"movedHostTo": "{{host}} déplacé vers \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_many": "Supprimer « {{name}} » et ses {{count}} hôtes ? Cette action est irréversible.",
|
||||
"deleteFolderConfirm_other": "Supprimer « {{name}} » et ses {{count}} hôtes ? Cette action est irréversible.",
|
||||
"failedToMoveHosts": "Échec du déplacement des hôtes",
|
||||
"managedBanner": "Cet hôte est géré par {{plugin}}. Modifiez-le là-bas. Vous pouvez toujours l'épingler et le réorganiser.",
|
||||
"managedTooltip": "Géré par {{plugin}}",
|
||||
"addBlocked": "Les hôtes sont gérés par {{plugin}}, il est donc impossible d'ajouter de nouveaux hôtes ici.",
|
||||
"failedToReorder": "Échec du réordonnancement",
|
||||
"expandAll": "Développer tous les dossiers",
|
||||
"collapseAll": "Réduire tous les dossiers",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Ajouter un identifiant",
|
||||
"checkingHostStatuses": "Vérification des états des hôtes...",
|
||||
"pinnedSection": "Épinglés",
|
||||
"hostsExported": "Hôtes exportés avec succès",
|
||||
"export": {
|
||||
"menuItem": "Exporter...",
|
||||
"title": "Exporter les hôtes",
|
||||
"scope": "Portée",
|
||||
"scopeAll": "Tous",
|
||||
"scopeSelected": "Sélectionnés",
|
||||
"searchHosts": "Rechercher des hôtes...",
|
||||
"include": "Inclure",
|
||||
"groupConnection": "Connexion",
|
||||
"groupCredentials": "Identifiants",
|
||||
"groupNotes": "Notes",
|
||||
"groupTags": "Étiquettes et épinglage",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Hôtes de saut",
|
||||
"groupFeatureFlags": "Paramètres des plugins",
|
||||
"groupAdvanced": "Configuration avancée",
|
||||
"preview": "Aperçu",
|
||||
"moreHosts_one": "... {{count}} hôte supplémentaire",
|
||||
"moreHosts_many": "... {{count}} hôtes supplémentaires",
|
||||
"moreHosts_other": "... {{count}} hôtes supplémentaires",
|
||||
"summary": "{{selected}} sur {{total}} hôtes",
|
||||
"credentialsIncluded": "identifiants inclus",
|
||||
"credentialsExcluded": "identifiants exclus",
|
||||
"noneSelected": "Aucun hôte sélectionné",
|
||||
"cancel": "Annuler",
|
||||
"confirm": "Exporter",
|
||||
"fetchFailed": "Échec du chargement des hôtes pour l'exportation",
|
||||
"bulkButton": "Exporter"
|
||||
},
|
||||
"sampleDownloaded": "Fichier exemple téléchargé",
|
||||
"failedToDeleteCredential2": "Échec de la suppression de l'identifiant",
|
||||
"noFolderOption": "(Aucun dossier)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Mettre à jour l'hôte",
|
||||
"editorAdd": "Ajouter un hôte",
|
||||
"speedSearch": "Rechercher des hôtes. Touches fléchées pour sélectionner, Entrée pour se connecter, Échap pour fermer",
|
||||
"speedSearchList": "Liste des hôtes. Tapez ou appuyez sur / pour rechercher.",
|
||||
"importNoHosts": "Aucun hôte trouvé dans le fichier",
|
||||
"importTooMany": "Vous pouvez importer jusqu'à {{max}} hôtes à la fois",
|
||||
"importSummary": "Importation terminée : {{imported}} importés, {{updated}} mis à jour, {{failed}} échoués",
|
||||
"importHostsFailed": "Échec de l'importation des hôtes"
|
||||
"speedSearchList": "Liste des hôtes. Tapez ou appuyez sur / pour rechercher."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Écran partagé",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} utilisateur",
|
||||
"usersCount_many": "{{count}} utilisateurs",
|
||||
"rolesCount_one": "{{count}} rôle",
|
||||
"rolesCount_many": "{{count}} rôles",
|
||||
"apiKeysCount_one": "{{count}} clé",
|
||||
"apiKeysCount_many": "{{count}} clés",
|
||||
"sessionsActive_one": "{{count}} actif",
|
||||
"sessionsActive_many": "{{count}} actifs",
|
||||
"hostsCount_one": "{{count}} hôte",
|
||||
"hostsCount_many": "{{count}} hôtes",
|
||||
"hostsCount_other": "{{count}} hôtes",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} identifiants",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} autorisation",
|
||||
"count_many": "{{count}} autorisations",
|
||||
"groups": {
|
||||
"hosts": "Hôtes",
|
||||
"credentials": "Identifiants",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Modifie la police de l'interface de l'application. Les profils de terminal conservent leurs propres paramètres de police.",
|
||||
"accentColorLabel": "Couleur d'accentuation",
|
||||
"apiKeyCount_one": "{{count}} clé",
|
||||
"apiKeyCount_many": "{{count}} clés",
|
||||
"colorPickerTooltip": "Ouvrir le sélecteur de couleurs",
|
||||
"themeSystem": "Système",
|
||||
"themeLight": "Clair",
|
||||
"themeDark": "Sombre",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Sombre"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "La disposition générale de l'application. Les thèmes et les dispositions proviennent des plugins.",
|
||||
"defaultsLabel": "Par défaut pour tout le monde",
|
||||
"defaultsHint": "Ce que les utilisateurs voient jusqu'à ce qu'ils choisissent leur propre disposition ou thème.",
|
||||
"followDefault": "Utiliser la valeur par défaut",
|
||||
"defaultSaved": "Apparence par défaut enregistrée",
|
||||
"saveFailed": "Impossible d'enregistrer l'apparence",
|
||||
"repair": {
|
||||
"title": "Cette disposition ne peut pas être affichée",
|
||||
"safeTitle": "Mode sans échec",
|
||||
"layout": "Disposition",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Raison",
|
||||
"error": "Erreur",
|
||||
"noError": "Aucun message d'erreur.",
|
||||
"copy": "Copier",
|
||||
"copied": "Copié",
|
||||
"copyFailed": "Impossible de copier les détails",
|
||||
"retry": "Réessayer",
|
||||
"reset": "Réinitialiser l'apparence par défaut",
|
||||
"resetEveryone": "Réinitialiser la valeur par défaut pour tout le monde",
|
||||
"update": "Mettre à jour {{name}} vers {{version}}",
|
||||
"disable": "Désactiver {{name}}",
|
||||
"enable": "Activer {{name}}",
|
||||
"startAgain": "Relancer {{name}}",
|
||||
"install": "Trouver des dispositions et des thèmes",
|
||||
"installTitle": "Dispositions et thèmes",
|
||||
"installButton": "Installer",
|
||||
"nothingToInstall": "Aucune autre disposition ou thème n'est disponible pour le moment.",
|
||||
"registryUnreachable": "Le registre des plugins est inaccessible.",
|
||||
"askAdmin": "Demandez à un administrateur de mettre à jour ou de corriger cette disposition. Vous pouvez passer à une autre disposition ou un autre thème ci-dessous.",
|
||||
"switchLayout": "Changer de disposition",
|
||||
"switchTheme": "Changer de thème",
|
||||
"saveFailed": "Impossible d'enregistrer votre choix",
|
||||
"reasons": {
|
||||
"safe-url": "L'adresse a demandé le mode sans échec. Choisissez une disposition ci-dessous, ou supprimez ?safe-layout=1 de l'adresse.",
|
||||
"safe-env": "Le serveur a été démarré avec TERMIX_SAFE_LAYOUT, donc tout le monde voit cet écran jusqu'à ce qu'il soit supprimé.",
|
||||
"missing": "Aucun plugin installé ne fournit cette disposition.",
|
||||
"disabled": "Le plugin qui fournit cette disposition est désactivé.",
|
||||
"blocked": "Le plugin qui fournit cette disposition attend quelque chose dont il a besoin.",
|
||||
"incompatible": "Le plugin qui fournit cette disposition n'est pas compatible avec cette version de Termix.",
|
||||
"failed": "La disposition n'a pas pu démarrer.",
|
||||
"crashed": "La disposition a planté deux fois lors du rendu de l'application."
|
||||
},
|
||||
"noLayout": "Aucune disposition n'est définie",
|
||||
"restore": "Restaurer {{name}} inclus",
|
||||
"restoreFailed": "Impossible de restaurer la copie incluse"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Gérer la connexion",
|
||||
"consequence": "Il peut ajouter une méthode de connexion, un deuxième facteur ou un type de connexion SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Définir les règles de connexion",
|
||||
"consequence": "Il peut déconnecter les utilisateurs en cas d'inactivité, limiter la durée de session, désactiver la fonction « Se souvenir de moi » et exiger un deuxième facteur."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Choisir comment atteindre les hôtes",
|
||||
"consequence": "Il peut transporter la connexion SSH vers un hôte via sa propre route, ce qui lui permet de voir tout ce qui est envoyé à et depuis ces hôtes, y compris les mots de passe."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Exécuter la synchronisation",
|
||||
"consequence": "Il peut répondre à toutes les demandes de synchronisation, ce qui lui permet de voir les données synchronisées par les appareils et les serveurs."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Gérer les certificats",
|
||||
"consequence": "Il peut remplacer le certificat que Termix sert via HTTPS et répondre aux vérifications de domaine des autorités de certification."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Accéder aux périphériques série et USB",
|
||||
"consequence": "Il peut ouvrir un port série physique sur la machine exécutant Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Exporter les hôtes avec leurs secrets",
|
||||
"consequence": "Peut lire vos hôtes en entier, y compris les mots de passe et les clés enregistrés, et les transmettre. Chaque exportation est consignée dans le journal d'audit."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Créer et modifier des hôtes",
|
||||
"consequence": "Il peut ajouter des hôtes et modifier ceux que vous avez déjà."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Lire le journal d'audit",
|
||||
"consequence": "Il peut voir qui a fait quoi et quand."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Vérifier si les ports répondent",
|
||||
"consequence": "Peut ouvrir une connexion simple vers n'importe quelle adresse depuis le serveur, pour vérifier si elle est accessible."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Fournir l'état des hôtes",
|
||||
"consequence": "Devient la source des points en ligne et hors ligne pour chaque hôte."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Stocker l'activité récente",
|
||||
"consequence": "Deviendra le stockage de la liste d'activité récente de chaque utilisateur."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Gérer les hôtes en lecture seule",
|
||||
"consequence": "Les hôtes qu'il gère ne peuvent pas être modifiés, supprimés ou partagés à nouveau par quiconque."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Ouvrir des fenêtres de bureau",
|
||||
"consequence": "Uniquement dans l'application de bureau Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Utiliser cet ordinateur",
|
||||
"consequence": "Peut lire et modifier des fichiers, exécuter un shell et ouvrir des ports locaux sur cet ordinateur. Uniquement dans l'application de bureau Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Agir au nom d'autres utilisateurs",
|
||||
"consequence": "Exécute des tâches en arrière-plan avec les accès d'un autre utilisateur, comme les tâches planifiées. Chaque utilisation est enregistrée dans le journal d'audit."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Ajouter ses propres écrans",
|
||||
"consequence": "Onglets, panneaux et paramètres que vous pourrez masquer plus tard."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Remplacer la mise en page de l'application entière",
|
||||
"consequence": "Lorsqu'il est sélectionné, son code dessine chaque écran, y compris vos terminaux et paramètres."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Ajouter des thèmes de couleurs",
|
||||
"consequence": "Uniquement des couleurs et des styles. Aucun code n'est exécuté pour un thème."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Désactivé",
|
||||
"failed": "Arrêt inattendu",
|
||||
"blocked": "En attente d'un autre plugin",
|
||||
"server": "Exécute sur votre serveur"
|
||||
"server": "Exécute sur votre serveur",
|
||||
"safeMode": "Désactivé en mode sans échec"
|
||||
},
|
||||
"groups": {
|
||||
"running": "En cours d'exécution",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Récemment mis à jour",
|
||||
"category": "Catégorie"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Colonnes",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} de large"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nom",
|
||||
"description": "Description",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "Impossible de sauvegarder les options de {{name}} : {{error}}",
|
||||
"deleteData": "Impossible de supprimer les données de {{name}} : {{error}}",
|
||||
"managedByServer": "Ce bureau est lié à un serveur, qui détermine ses plugins.",
|
||||
"defaultLook": "{{name}} est l'apparence par défaut, il peut donc être désactivé ou remplacé, mais pas désinstallé.",
|
||||
"hasDependents": "{{name}} est requis par {{list}}. Désactivez-les ou désinstallez-les d'abord.",
|
||||
"missingDependencies": "{{name}} nécessite {{list}}, qui n'est pas installé.",
|
||||
"consentChanged": "Les permissions demandées par ce plugin ont changé depuis votre dernière consultation. Vérifiez à nouveau la liste.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Aucun accès à vos serveurs",
|
||||
"searchInstalled": "Rechercher parmi les installés",
|
||||
"searchPlugins": "Rechercher des plugins",
|
||||
"allCategories": "Tous",
|
||||
"nothingMatches": "Rien ne correspond.",
|
||||
"noneInstalled": "Aucun plugin n'est installé. Parcourez la liste pour en ajouter.",
|
||||
"nothingHere": "Rien ici.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Documentation",
|
||||
"envVars": "Variables d'environnement",
|
||||
"envRequired": "Requis",
|
||||
"envDefault": "Par défaut : {{value}}"
|
||||
"envDefault": "Par défaut : {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Mises en page",
|
||||
"themes": "Thèmes",
|
||||
"tabs": "Onglets",
|
||||
"panels": "Panneaux de la barre latérale",
|
||||
"dashboardCards": "Cartes du tableau de bord",
|
||||
"protocols": "Types de connexion",
|
||||
"auth": "Méthodes de connexion",
|
||||
"actions": "Actions",
|
||||
"hostCapability": "Paramètres des hôtes"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Type",
|
||||
"allTypes": "Tous les types",
|
||||
"category": "Catégorie",
|
||||
"allCategories": "Toutes les catégories",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_many": "{{count}} plugins",
|
||||
"results_other": "{{count}} plugins",
|
||||
"remove": "Supprimer le filtre {{name}}",
|
||||
"clear": "Effacer les filtres",
|
||||
"button": "Filtres",
|
||||
"buttonCount": "Filtres ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} sur {{total}}",
|
||||
"page": "Page {{page}} sur {{pages}}",
|
||||
"previous": "Page précédente",
|
||||
"next": "Page suivante",
|
||||
"perPage": "{{count}} par page",
|
||||
"perPageLabel": "Plugins par page"
|
||||
},
|
||||
"showUnsupportedHint": "Ceux-ci sont répertoriés, mais aucune version n'est encore compatible avec cette version. Mettez à jour Termix pour les installer.",
|
||||
"unsupported": "Nécessite une version plus récente de Termix",
|
||||
"unsupportedHint": "Aucune version de ce plugin n'est compatible avec cette version de Termix. Mettez à jour Termix pour l'installer.",
|
||||
"needsTermix": "Nécessite Termix {{range}}",
|
||||
"showUnsupported": "Afficher les non pris en charge ({{count}})",
|
||||
"showMore": "Afficher {{count}} de plus ({{total}} restants)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Aucune donnée",
|
||||
"filter": "Filtrer..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "il y a {{count}} minute",
|
||||
"minutesAgo_many": "il y a {{count}} minutes",
|
||||
"minutesAgo_other": "il y a {{count}} minutes",
|
||||
"hoursAgo_one": "il y a {{count}} heure",
|
||||
"hoursAgo_many": "il y a {{count}} heures",
|
||||
"hoursAgo_other": "il y a {{count}} heures",
|
||||
"pending_one": "{{count}} modification en attente de synchronisation",
|
||||
"pending_many": "{{count}} modifications en attente de synchronisation",
|
||||
"pending_other": "{{count}} modifications en attente de synchronisation",
|
||||
"proxy": {
|
||||
"headersTitle": "En-têtes supplémentaires",
|
||||
"headersHint": "Envoyés avec chaque requête au serveur, par exemple un jeton de service Cloudflare Access.",
|
||||
"headerName": "Nom de l'en-tête",
|
||||
"headerValue": "Valeur",
|
||||
"savedValue": "Enregistré, tapez pour modifier",
|
||||
"addHeader": "Ajouter un en-tête",
|
||||
"removeHeader": "Supprimer l'en-tête",
|
||||
"basicAuthTitle": "Nom d'utilisateur et mot de passe",
|
||||
"basicAuthHint": "Pour un proxy qui demande un nom d'utilisateur et un mot de passe avant Termix.",
|
||||
"username": "Nom d'utilisateur",
|
||||
"password": "Mot de passe",
|
||||
"allowInvalidCertificate": "Faire confiance à un certificat autosigné",
|
||||
"allowInvalidCertificateHint": "Uniquement pour votre propre serveur, lorsque son certificat ne provient pas d'une autorité de confiance reconnue."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Cela ne ressemble pas à une adresse web.",
|
||||
"unreachable": "Impossible d'atteindre le serveur. Vérifiez l'adresse et que le serveur est en cours d'exécution.",
|
||||
"unreachableWithReason": "Impossible d'atteindre le serveur : {{reason}}",
|
||||
"tlsUntrusted": "Le certificat du serveur n'est pas fiable. S'il s'agit de votre propre serveur avec un certificat autosigné, activez l'option ci-dessous.",
|
||||
"basicAuthRequired": "Un élément situé devant le serveur demande un nom d'utilisateur et un mot de passe. Saisissez-les ci-dessous.",
|
||||
"proxyLogin": "Une page de connexion ou un proxy a répondu à la place de Termix. Ajoutez les en-têtes requis ci-dessous, ou vérifiez l'adresse.",
|
||||
"notTermix": "Aucun serveur Termix n'est présent à cette adresse. S'il fonctionne sous un chemin, incluez-le, par exemple https://example.com/termix.",
|
||||
"versionMismatch": "Ce serveur exécute une ancienne version de Termix. Mettez-le à jour vers la version 2.9 ou ultérieure pour l'associer.",
|
||||
"differentAccount": "Vous êtes connecté à un autre compte. Connectez-vous au compte auquel cet appareil est associé, ou dissociez-le d'abord."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Associer à un serveur Termix",
|
||||
"reloginTitle": "Se reconnecter",
|
||||
"savedServers": "Serveurs récents",
|
||||
"removeServer": "Supprimer de la liste",
|
||||
"serverDescription": "Saisissez l'adresse que vous utilisez pour ouvrir Termix dans votre navigateur.",
|
||||
"signinDescription": "Se connecter à {{url}}",
|
||||
"chooseDescription": "Cet appareil contient déjà des données. Que souhaitez-vous en faire ?",
|
||||
"finishingDescription": "Association de cet appareil en cours.",
|
||||
"serverUrl": "Adresse du serveur",
|
||||
"serverUrlHint": "Par exemple https://termix.example.com",
|
||||
"showProxySettings": "Paramètres du proxy inverse",
|
||||
"hideProxySettings": "Masquer les paramètres du proxy inverse",
|
||||
"continue": "Continuer",
|
||||
"back": "Retour",
|
||||
"mergeTitle": "L'ajouter à mon compte",
|
||||
"mergeBody_one": "L'élément sur cet appareil est ajouté à votre compte. Les éléments déjà présents dans votre compte restent inchangés sur le serveur.",
|
||||
"mergeBody_many": "Les {{count}} éléments sur cet appareil sont ajoutés à votre compte. Les éléments déjà présents dans votre compte restent inchangés sur le serveur.",
|
||||
"mergeBody_other": "Les {{count}} éléments sur cet appareil sont ajoutés à votre compte. Les éléments déjà présents dans votre compte restent inchangés sur le serveur.",
|
||||
"replaceTitle": "Le remplacer par mon compte",
|
||||
"replaceBody_one": "L'élément sur cet appareil est supprimé, et cet appareil récupère tout depuis votre compte. Les hôtes conservés uniquement sur cet appareil restent.",
|
||||
"replaceBody_many": "Les {{count}} éléments sur cet appareil sont supprimés, et cet appareil récupère tout depuis votre compte. Les hôtes conservés uniquement sur cet appareil restent.",
|
||||
"replaceBody_other": "Les {{count}} éléments sur cet appareil sont supprimés, et cet appareil récupère tout depuis votre compte. Les hôtes conservés uniquement sur cet appareil restent.",
|
||||
"link": "Associer",
|
||||
"linking": "Association et première synchronisation en cours...",
|
||||
"linked": "Associé. Vos données sont en cours de synchronisation.",
|
||||
"signedInAgain": "Connecté. La synchronisation est de nouveau en cours."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hôtes",
|
||||
"sshCredentials": "Identifiants",
|
||||
"sshFolders": "Dossiers",
|
||||
"userPreferences": "Préférences",
|
||||
"pluginUserSettings": "Paramètres des plugins",
|
||||
"sharedHosts": "Hôtes partagés avec vous",
|
||||
"sharedCredentials": "Identifiants partagés avec vous",
|
||||
"vaultProfiles": "Profils Vault",
|
||||
"snippetFolders": "Dossiers de snippets",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Liens de service",
|
||||
"homepageItems": "Éléments de la page d'accueil",
|
||||
"networkTopology": "Carte réseau",
|
||||
"workspaces": "Espaces de travail",
|
||||
"hostDefaults": "Paramètres par défaut des hôtes",
|
||||
"hostDefaultsAdmin": "Paramètres par défaut des hôtes du serveur",
|
||||
"aiProviders": "Fournisseurs d'IA",
|
||||
"homepageLayouts": "Mises en page de la page d'accueil",
|
||||
"accountProfile": "Profil du compte"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Dossier {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Grille",
|
||||
"listView": "Liste",
|
||||
"compactRows": "Lignes compactes",
|
||||
"comfortableRows": "Lignes confortables"
|
||||
"comfortableRows": "Lignes confortables",
|
||||
"columns": {
|
||||
"title": "Colonnes",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} de large"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Enregistré. Tapez pour le remplacer."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "לא ניתן היה לשנות חלק מהתוספים. תוכל לתקן אותם מאוחר יותר מהלשונית תוספים. לחץ על הבא כדי להמשיך.",
|
||||
"pluginsApplyFailed": "לא ניתן היה לשמור את הבחירות שלך. נסה שוב, או המשך ושנה אותם מאוחר יותר מהלשונית תוספים.",
|
||||
"pluginsLoadFailed": "לא ניתן היה לטעון את רשימת התוספים. תוכל לבחור תוספים מאוחר יותר מהלשונית תוספים.",
|
||||
"presetTitle": "כמה פרטים אתה רוצה על המסך?",
|
||||
"presetIntro": "בחר כמה יופיע על המסך.",
|
||||
"presetChangeLater": "תוכל להחליף תבניות או לשנות כל הגדרה בודדת מאוחר יותר בהגדרות, תחת ממשק.",
|
||||
"appearanceTitle": "הפוך אותו לשלך",
|
||||
"appearanceIntro": "בחר ערכת נושא, צבע הדגשה, גופן ושפה. השינויים מופיעים מיד, ותוכל לשנות אותם מאוחר יותר בהגדרות.",
|
||||
"securityTitle": "אבטח את החשבון שלך",
|
||||
"securityIntro": "הוסף מפתח כניסה או אפליקציית אימות לחשבון שלך. תוכל גם לעשות זאת מאוחר יותר בהגדרות, תחת אבטחה.",
|
||||
"desktopTitle": "איך אתה רוצה להשתמש ב-Termix?",
|
||||
"desktopBody": "תוכל לשנות זאת בכל עת מ-סנכרון בסרגל הצד.",
|
||||
"desktopLocalTitle": "על מכשיר זה בלבד",
|
||||
"desktopLocalBody": "הכל מאוחסן כאן. אין מה להגדיר.",
|
||||
"desktopLinkTitle": "עם שרת Termix שלי",
|
||||
"desktopLinkBody": "התחבר לשרת שלך כדי להשתמש באותם מארחים והגדרות בכל מכשיר.",
|
||||
"desktopLinked": "מקושר ל-{{server}}",
|
||||
"pluginsDocsLink": "קרא על כל אחד מהם"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} מוכן להתקנה",
|
||||
"readyHint": "הוא מותקן בפעם הבאה ש-Termix מופעל מחדש."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "מצב בטוח",
|
||||
"description": "רק תוספי פריסה ועיצוב פועלים. הפעל מחדש את השרת ללא המשתנה TERMIX_SAFE_MODE כדי להפעיל מחדש את שאר התוספים."
|
||||
},
|
||||
"companion": {
|
||||
"close": "סגור לוח",
|
||||
"moveSide": "הזז לוח",
|
||||
"resize": "שנה גודל לוח"
|
||||
},
|
||||
"nav": {
|
||||
"home": "דף הבית",
|
||||
"terminal": "טרמינל",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "מארחים",
|
||||
"credentials": "אישורי גישה",
|
||||
"connections": "חיבורים",
|
||||
"sync": "סנכרון",
|
||||
"reconnectDisconnectedTerminals": "חבר מחדש את כל המסופים המנותקים",
|
||||
"reconnectingTerminals_one": "מחבר מחדש מסוף אחד",
|
||||
"reconnectingTerminals_two": "מחבר מחדש שני מסופים",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "נסה שוב",
|
||||
"refresh": "רענן",
|
||||
"optional": "אופציונלי",
|
||||
"downloadSample": "הורד דוגמה",
|
||||
"failedToDeleteHost": "מחיקת {{name}} נכשלה",
|
||||
"importSkipExisting": "ייבוא (דלג על קיימים)",
|
||||
"importSSHConfig": "ייבוא מקובץ תצורת SSH",
|
||||
"connectionDetails": "פרטי חיבור",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(ללא תיקייה)",
|
||||
"deleteSelected": "מחק",
|
||||
"exitSelection": "צא ממצב בחירה",
|
||||
"importSkip": "ייבוא (דלג על קיימים)",
|
||||
"importOverwrite": "ייבוא (דכא)",
|
||||
"collapseBtn": "כווץ",
|
||||
"importExportBtn": "ייבוא / ייצוא",
|
||||
"hostStatusesRefreshed": "מצבי המארחים עודכנו",
|
||||
"failedToRefreshHosts": "הרענון של המארחים נכשל",
|
||||
"movedHostTo": "הועבר {{host}} ל\"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_two": "למחוק את \"{{name}}\" ואת ה-{{count}} מארחים שלו? פעולה זו אינה ניתנת לביטול.",
|
||||
"deleteFolderConfirm_other": "למחוק את \"{{name}}\" ואת ה-{{count}} מארחים שלו? פעולה זו אינה ניתנת לביטול.",
|
||||
"failedToMoveHosts": "העברת המארחים נכשלה",
|
||||
"managedBanner": "מארח זה מנוהל על ידי {{plugin}}. שנה אותו שם. עדיין ניתן להצמיד אותו ולסדר מחדש.",
|
||||
"managedTooltip": "מנוהל על ידי {{plugin}}",
|
||||
"addBlocked": "מארחים מנוהלים על ידי {{plugin}}, ולכן לא ניתן להוסיף מארחים חדשים כאן.",
|
||||
"failedToReorder": "מיוען מחדש נכשל",
|
||||
"expandAll": "הרחב את כל התיקיות",
|
||||
"collapseAll": "כווץ את כל התיקיות",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "הוסף אישור",
|
||||
"checkingHostStatuses": "בודק סטטוס מארחים...",
|
||||
"pinnedSection": "מוצמד",
|
||||
"hostsExported": "המארחים יוצאו בהצלחה",
|
||||
"export": {
|
||||
"menuItem": "ייצוא...",
|
||||
"title": "ייצוא מארחים",
|
||||
"scope": "טווח",
|
||||
"scopeAll": "הכל",
|
||||
"scopeSelected": "נבחר",
|
||||
"searchHosts": "חיפוש מארחים...",
|
||||
"include": "הכלל",
|
||||
"groupConnection": "חיבור",
|
||||
"groupCredentials": "פרטי כניסה",
|
||||
"groupNotes": "הערות",
|
||||
"groupTags": "תגיות וצמידה",
|
||||
"groupProxy": "פרוקסי",
|
||||
"groupJumpHosts": "מארחי קפיצה",
|
||||
"groupFeatureFlags": "הגדרות תוספים",
|
||||
"groupAdvanced": "תצורה מתקדמת",
|
||||
"preview": "תצוגה מקדימה",
|
||||
"moreHosts_one": "... ועוד {{count}} מארח",
|
||||
"moreHosts_two": "... ועוד {{count}} מארחים",
|
||||
"moreHosts_other": "... ועוד {{count}} מארחים",
|
||||
"summary": "{{selected}} מתוך {{total}} מארחים",
|
||||
"credentialsIncluded": "פרטי כניסה כלולים",
|
||||
"credentialsExcluded": "פרטי כניסה לא כלולים",
|
||||
"noneSelected": "לא נבחרו מארחים",
|
||||
"cancel": "ביטול",
|
||||
"confirm": "ייצוא",
|
||||
"fetchFailed": "טעינת המארחים לייצוא נכשלה",
|
||||
"bulkButton": "ייצוא"
|
||||
},
|
||||
"sampleDownloaded": "קובץ לדוגמה הורד",
|
||||
"failedToDeleteCredential2": "מחיקת פרטי הכניסה נכשלה",
|
||||
"noFolderOption": "(ללא תיקייה)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "עדכן מארח",
|
||||
"editorAdd": "הוסף מארח",
|
||||
"speedSearch": "חפש מארחים. מקשי חץ לבחירה, Enter לחיבור, Esc לסגירה",
|
||||
"speedSearchList": "רשימת מארחים. הקלד או לחץ על / לחיפוש.",
|
||||
"importNoHosts": "לא נמצאו מארחים בקובץ",
|
||||
"importTooMany": "אתה יכול לייבא עד {{max}} מארחים בבת אחת",
|
||||
"importSummary": "ייבוא הושלם: {{imported}} יובאו, {{updated}} עודכנו, {{failed}} נכשלו",
|
||||
"importHostsFailed": "ייבוא המארחים נכשל"
|
||||
"speedSearchList": "רשימת מארחים. הקלד או לחץ על / לחיפוש."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "מסך מפוצל",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} משתמש",
|
||||
"usersCount_two": "{{count}} משתמשים",
|
||||
"rolesCount_one": "{{count}} תפקיד",
|
||||
"rolesCount_two": "{{count}} תפקידים",
|
||||
"apiKeysCount_one": "{{count}} מפתח",
|
||||
"apiKeysCount_two": "{{count}} מפתחות",
|
||||
"sessionsActive_one": "{{count}} פעיל",
|
||||
"sessionsActive_two": "{{count}} פעילים",
|
||||
"hostsCount_one": "{{count}} מארח",
|
||||
"hostsCount_two": "{{count}} מארחים",
|
||||
"hostsCount_other": "{{count}} מארחים",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} פרטי התחברות",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} הרשאה",
|
||||
"count_two": "{{count}} הרשאות",
|
||||
"groups": {
|
||||
"hosts": "מארחים",
|
||||
"credentials": "אישורים",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "משנה את גופן ממשק היישום. פרופילי מסוף שומרים על הגדרות הגופן שלהם.",
|
||||
"accentColorLabel": "צבע הדגשה",
|
||||
"apiKeyCount_one": "{{count}} מפתח",
|
||||
"apiKeyCount_two": "{{count}} מפתחות",
|
||||
"colorPickerTooltip": "פתח בוחר צבעים",
|
||||
"themeSystem": "מערכת",
|
||||
"themeLight": "בהיר",
|
||||
"themeDark": "כהה",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "כהה"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "כיצד האפליקציה כולה מסודרת. ערכות נושא ופריסות מגיעות מתוספים.",
|
||||
"defaultsLabel": "ברירת מחדל לכולם",
|
||||
"defaultsHint": "מה שאנשים רואים עד שיבחרו פריסה או ערכת נושא משלהם.",
|
||||
"followDefault": "השתמש בברירת המחדל",
|
||||
"defaultSaved": "מראה ברירת המחדל נשמר",
|
||||
"saveFailed": "לא ניתן לשמור את המראה",
|
||||
"repair": {
|
||||
"title": "לא ניתן להציג את הפריסה הזו",
|
||||
"safeTitle": "מצב בטוח",
|
||||
"layout": "פריסה",
|
||||
"plugin": "תוסף",
|
||||
"reason": "סיבה",
|
||||
"error": "שגיאה",
|
||||
"noError": "אין הודעת שגיאה.",
|
||||
"copy": "העתק",
|
||||
"copied": "הועתק",
|
||||
"copyFailed": "לא ניתן להעתיק את הפרטים",
|
||||
"retry": "נסה שוב",
|
||||
"reset": "אפס למראה ברירת המחדל",
|
||||
"resetEveryone": "אפס את ברירת המחדל לכולם",
|
||||
"update": "עדכן את {{name}} ל-{{version}}",
|
||||
"disable": "כבה את {{name}}",
|
||||
"enable": "הפעל את {{name}}",
|
||||
"startAgain": "הפעל מחדש את {{name}}",
|
||||
"install": "חפש פריסות וערכות נושא",
|
||||
"installTitle": "פריסות וערכות נושא",
|
||||
"installButton": "התקן",
|
||||
"nothingToInstall": "אין פריסות או ערכות נושא אחרות זמינות כרגע.",
|
||||
"registryUnreachable": "לא ניתן להגיע למאגר התוספים.",
|
||||
"askAdmin": "בקש ממנהל לעדכן או לתקן את הפריסה הזו. ניתן לעבור לפריסה או ערכת נושא אחרת עבורך למטה.",
|
||||
"switchLayout": "החלף פריסה",
|
||||
"switchTheme": "החלף ערכת נושא",
|
||||
"saveFailed": "לא ניתן לשמור את הבחירה שלך",
|
||||
"reasons": {
|
||||
"safe-url": "הכתובת ביקשה מצב בטוח. בחר פריסה למטה, או הסר את ?safe-layout=1 מהכתובת.",
|
||||
"safe-env": "השרת הופעל עם TERMIX_SAFE_LAYOUT, ולכן כולם רואים מסך זה עד להסרתו.",
|
||||
"missing": "אף תוסף מותקן לא מספק את הפריסה הזו.",
|
||||
"disabled": "התוסף שמספק את הפריסה הזו כבוי.",
|
||||
"blocked": "התוסף שמספק את הפריסה הזו מחכה למשהו שהוא צריך.",
|
||||
"incompatible": "התוסף שמספק את הפריסה הזו לא עובד עם הגרסה הזו של Termix.",
|
||||
"failed": "הפריסה נכשלה בהפעלה.",
|
||||
"crashed": "הפריסה קרסה פעמיים בזמן ציור האפליקציה."
|
||||
},
|
||||
"noLayout": "לא הוגדרה פריסה",
|
||||
"restore": "שחזר את {{name}} המובנה",
|
||||
"restoreFailed": "לא ניתן לשחזר את העותק המובנה"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "ניהול התחברות",
|
||||
"consequence": "התוסף יכול להוסיף שיטת התחברות, גורם אימות שני או סוג התחברות SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "הגדר חוקי התחברות",
|
||||
"consequence": "הוא יכול להפריד אנשים כשהם לא פעילים, להגביל אורך הפעלה, לכבות את 'זכור אותי' ולדרוש גורם אימות שני."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "בחר כיצד מגיעים למארחים",
|
||||
"consequence": "הוא יכול לשאת את חיבור ה-SSH למארח דרך מסלול משלו, כך שהוא רואה הכל שנשלח אל וממארחים אלה, כולל סיסמאות."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "הפעל סנכרון",
|
||||
"consequence": "הוא יכול לענות על כל בקשות הסנכרון, כך שהוא רואה את הנתונים שמכשירים ושרתים מסנכרנים."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "ניהול תעודות",
|
||||
"consequence": "התוסף יכול להחליף את התעודה ש-HTTPS של Termix משתמש בה, ולענות על בדיקות דומיין מרשויות תעודה."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "גישה למכשירים סריאליים ו-USB",
|
||||
"consequence": "התוסף יכול לפתוח פורט סריאלי פיזי במכשיר שרץ עליו Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "ייצא מארחים עם הסודות שלהם",
|
||||
"consequence": "יכול לקרוא את המארחים שלך במלואם, כולל סיסמאות ומפתחות שמורים, ולהפיץ אותם. כל ייצוא נכתב ליומן ביקורת."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "יצירה ושינוי של שרתים",
|
||||
"consequence": "התוסף יכול להוסיף שרתים ולערוך את אלו שכבר יש לך."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "קריאת יומן הרישום (Audit Log)",
|
||||
"consequence": "התוסף יכול לראות מי עשה מה ומתי."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "בדוק אם פורטים עונים",
|
||||
"consequence": "יכול לפתוח חיבור פשוט לכל כתובת מהשרת, כדי לראות אם היא נגישה."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "ספק סטטוס מארח",
|
||||
"consequence": "הופך למקור של הנקודות המקוונות והלא מקוונות לכל מארח."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "אחסן פעילות אחרונה",
|
||||
"consequence": "הופך למאגר של רשימת הפעילויות האחרונות של כל משתמש."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "ניהול מארחים כקריאה בלבד",
|
||||
"consequence": "המארחים שבהם הוא מנהל לא יכולים לערוך, למחוק או לשתף מחדש על ידי אף אחד אחר."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "פתיחת חלונות שולחן עבודה",
|
||||
"consequence": "רק באפליקציית שולחן העבודה של Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "השתמש במחשב הזה",
|
||||
"consequence": "יכול לקרוא ולשנות קבצים, להפעיל שרשרת ולפתוח פורטים מקומיים במחשב הזה. רק באפליקציית Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "פעולה כמשתמשים אחרים",
|
||||
"consequence": "מבצע עבודה ברקע עם הרשאות של משתמש אחר, כמו משימות מתוזמנות. כל שימוש נרשם ביומן הרישום."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "להוסיף מסכים משלו",
|
||||
"consequence": "לשוניות, פאנלים והגדרות שתוכל להסתיר מאוחר יותר."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "החלף את כל פריסת האפליקציה",
|
||||
"consequence": "כאשר נבחר, הקוד שלו מצייר כל מסך, כולל המסופים וההגדרות שלך."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "הוסף ערכות נושא",
|
||||
"consequence": "רק צבעים וסגנונות. אין קוד שרץ עבור ערכת נושא."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "מושבת",
|
||||
"failed": "הופסק ללא ציפייה",
|
||||
"blocked": "ממתין לתוסף אחר",
|
||||
"server": "רץ על השרת שלך"
|
||||
"server": "רץ על השרת שלך",
|
||||
"safeMode": "כבוי במצב בטוח"
|
||||
},
|
||||
"groups": {
|
||||
"running": "פעילים",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "עודכן לאחרונה",
|
||||
"category": "קטגוריה"
|
||||
},
|
||||
"columns": {
|
||||
"title": "עמודות",
|
||||
"auto": "אוטומטי",
|
||||
"count": "רוחב של {{count}}"
|
||||
},
|
||||
"table": {
|
||||
"name": "שם",
|
||||
"description": "תיאור",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "לא ניתן לשמור אפשרויות עבור {{name}}: {{error}}",
|
||||
"deleteData": "לא ניתן למחוק נתונים עבור {{name}}: {{error}}",
|
||||
"managedByServer": "שולחן העבודה הזה מקושר לשרת, שקובע את התוספים שלו.",
|
||||
"defaultLook": "{{name}} הוא המראה המוגדר כברירת מחדל, כך שהוא יכול להיכבה או להחליף אך לא להסיר.",
|
||||
"hasDependents": "{{name}} נדרש על ידי {{list}}. כבה אותם או הסר אותם קודם.",
|
||||
"missingDependencies": "{{name}} זקוק ל-{{list}}, שלא מותקן.",
|
||||
"consentChanged": "מה שהתוסף הזה מבקש השתנה מאז שביצעת בדיקה. בדוק את הרשימה שוב.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "אין גישה לשרתים שלך",
|
||||
"searchInstalled": "חפש בהתקנים",
|
||||
"searchPlugins": "חפש תוספים",
|
||||
"allCategories": "הכל",
|
||||
"nothingMatches": "אין תוצאות תואמות.",
|
||||
"noneInstalled": "אין תוספים מותקנים עדיין. דפדף כדי להוסיף כמה.",
|
||||
"nothingHere": "אין כאן כלום.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "תיעוד",
|
||||
"envVars": "משתני סביבה",
|
||||
"envRequired": "נדרש",
|
||||
"envDefault": "ברירת מחדל: {{value}}"
|
||||
"envDefault": "ברירת מחדל: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "פריסות",
|
||||
"themes": "ערכות נושא",
|
||||
"tabs": "לשוניות",
|
||||
"panels": "לוחות צד",
|
||||
"dashboardCards": "כרטיסי לוח בקרה",
|
||||
"protocols": "סוגי חיבור",
|
||||
"auth": "שיטות כניסה",
|
||||
"actions": "פעולות",
|
||||
"hostCapability": "הגדרות מארח"
|
||||
},
|
||||
"filters": {
|
||||
"type": "סוג",
|
||||
"allTypes": "כל הסוגים",
|
||||
"category": "קטגוריה",
|
||||
"allCategories": "כל הקטגוריות",
|
||||
"results_one": "{{count}} תוסף",
|
||||
"results_two": "{{count}} תוספים",
|
||||
"results_other": "{{count}} תוספים",
|
||||
"remove": "הסר מסנן {{name}}",
|
||||
"clear": "נקה מסננים",
|
||||
"button": "מסננים",
|
||||
"buttonCount": "מסננים ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} מתוך {{total}}",
|
||||
"page": "עמוד {{page}} מתוך {{pages}}",
|
||||
"previous": "עמוד קודם",
|
||||
"next": "עמוד הבא",
|
||||
"perPage": "{{count}} בעמוד",
|
||||
"perPageLabel": "תוספים בעמוד"
|
||||
},
|
||||
"showUnsupportedHint": "אלה מופיעים אך אין גרסה שרצה על גרסה זו עדיין. עדכן את Termix כדי להתקין אותם.",
|
||||
"unsupported": "דורש Termix חדש יותר",
|
||||
"unsupportedHint": "אין גרסה של תוסף זה שרצה על גרסה זו של Termix. עדכן את Termix כדי להתקין אותו.",
|
||||
"needsTermix": "דורש Termix {{range}}",
|
||||
"showUnsupported": "הצג לא נתמך ({{count}})",
|
||||
"showMore": "הצג עוד {{count}} (נשארו {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "אין נתונים",
|
||||
"filter": "סנן..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "לפני {{count}} דקה",
|
||||
"minutesAgo_two": "לפני {{count}} דקות",
|
||||
"minutesAgo_other": "לפני {{count}} דקות",
|
||||
"hoursAgo_one": "לפני {{count}} שעה",
|
||||
"hoursAgo_two": "לפני {{count}} שעות",
|
||||
"hoursAgo_other": "לפני {{count}} שעות",
|
||||
"pending_one": "שינוי אחד ממתין לסנכרון",
|
||||
"pending_two": "{{count}} שינויים ממתינים לסנכרון",
|
||||
"pending_other": "{{count}} שינויים ממתינים לסנכרון",
|
||||
"proxy": {
|
||||
"headersTitle": "כותרות נוספות",
|
||||
"headersHint": "נשלח עם כל בקשה לשרת, למשל אסימון שירות של Cloudflare Access.",
|
||||
"headerName": "שם כותרת",
|
||||
"headerValue": "ערך",
|
||||
"savedValue": "נשמר, הקלד כדי לשנות",
|
||||
"addHeader": "הוסף כותרת",
|
||||
"removeHeader": "הסר כותרת",
|
||||
"basicAuthTitle": "שם משתמש וסיסמה",
|
||||
"basicAuthHint": "לפרוקסי ששואל שם משתמש וסיסמה לפני Termix.",
|
||||
"username": "שם משתמש",
|
||||
"password": "סיסמה",
|
||||
"allowInvalidCertificate": "לסמוך על תעודה עצמית",
|
||||
"allowInvalidCertificateHint": "רק לשרת שלך, כשהתעודה שלו לא מגיעה מרשות מוכרת."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "זה לא נראה כמו כתובת אינטרנט.",
|
||||
"unreachable": "לא ניתן להגיע לשרת. בדוק את הכתובת וודא שהשרת פועל.",
|
||||
"unreachableWithReason": "לא ניתן להגיע לשרת: {{reason}}",
|
||||
"tlsUntrusted": "תעודת השרת אינה מאומתת. אם זה שרת שלך עם תעודה עצמאית, הפעל את האפשרות למטה.",
|
||||
"basicAuthRequired": "משהו לפני השרת מבקש שם משתמש וסיסמה. הזן אותם למטה.",
|
||||
"proxyLogin": "דף התחברות או פרוקסי ענו במקום Termix. הוסף את הכותרות הנדרשות למטה, או בדוק את הכתובת.",
|
||||
"notTermix": "אין שרת Termix בכתובת זו. אם הוא פועל תחת נתיב, כלול אותו, כמו https://example.com/termix.",
|
||||
"versionMismatch": "השרת הזה מפעיל גרסה ישנה יותר של Termix. עדכן אותו ל-2.9 או חדש יותר כדי לקשר.",
|
||||
"differentAccount": "התחברת לחשבון אחר. התחבר לחשבון שמכשיר זה מקושר אליו, או נתק קודם."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "קשר לשרת Termix",
|
||||
"reloginTitle": "התחבר שוב",
|
||||
"savedServers": "שרתים אחרונים",
|
||||
"removeServer": "הסר מהרשימה",
|
||||
"serverDescription": "הזן את הכתובת שבה אתה משתמש לפתיחת Termix בדפדפן שלך.",
|
||||
"signinDescription": "התחבר ל-{{url}}",
|
||||
"chooseDescription": "למכשיר הזה כבר יש נתונים. מה צריך לקרות להם?",
|
||||
"finishingDescription": "מקשר את המכשיר הזה.",
|
||||
"serverUrl": "כתובת שרת",
|
||||
"serverUrlHint": "למשל https://termix.example.com",
|
||||
"showProxySettings": "הגדרות פרוקסי הפוך",
|
||||
"hideProxySettings": "הסתר הגדרות פרוקסי הפוך",
|
||||
"continue": "המשך",
|
||||
"back": "חזור",
|
||||
"mergeTitle": "הוסף לחשבון שלי",
|
||||
"mergeBody_one": "הפריט במכשיר הזה יתווסף לחשבון שלך. פריטים שכבר יש לחשבון שלך יישארו כמו שהם בשרת.",
|
||||
"mergeBody_two": "שני הפריטים במכשיר הזה יתווספו לחשבון שלך. פריטים שכבר יש לחשבון שלך יישארו כמו שהם בשרת.",
|
||||
"mergeBody_other": "ה-{{count}} פריטים במכשיר הזה יתווספו לחשבון שלך. פריטים שכבר יש לחשבון שלך יישארו כמו שהם בשרת.",
|
||||
"replaceTitle": "החלף עם החשבון שלי",
|
||||
"replaceBody_one": "הפריט במכשיר הזה יוסר, והמכשיר הזה ייקח הכל מהחשבון שלך. מארחים שנשמרו רק במכשיר הזה יישארו.",
|
||||
"replaceBody_two": "שני הפריטים במכשיר הזה יוסרו, והמכשיר הזה ייקח הכל מהחשבון שלך. מארחים שנשמרו רק במכשיר הזה יישארו.",
|
||||
"replaceBody_other": "ה-{{count}} פריטים במכשיר הזה יוסרו, והמכשיר הזה ייקח הכל מהחשבון שלך. מארחים שנשמרו רק במכשיר הזה יישארו.",
|
||||
"link": "קשר",
|
||||
"linking": "מקשר ומבצע את הסנכרון הראשון...",
|
||||
"linked": "מקושר. הנתונים שלך מסונכרנים כעת.",
|
||||
"signedInAgain": "התחבר. הסנכרון פועל שוב."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "מארחים",
|
||||
"sshCredentials": "פרטי התחברות",
|
||||
"sshFolders": "תיקיות",
|
||||
"userPreferences": "העדפות",
|
||||
"pluginUserSettings": "הגדרות תוספים",
|
||||
"sharedHosts": "מארחים ששיתפו איתך",
|
||||
"sharedCredentials": "פרטי התחברות ששיתפו איתך",
|
||||
"vaultProfiles": "פרופילי Vault",
|
||||
"snippetFolders": "תיקיות קטעי קוד",
|
||||
"snippets": "קטעי קוד",
|
||||
"dashboardServiceLinks": "קישורי שירותים",
|
||||
"homepageItems": "פריטי דף הבית",
|
||||
"networkTopology": "מפת רשת",
|
||||
"workspaces": "מרחבי עבודה",
|
||||
"hostDefaults": "הגדרות ברירת מחדל למארחים",
|
||||
"hostDefaultsAdmin": "הגדרות ברירת מחדל למארחים בשרת",
|
||||
"aiProviders": "ספקי AI",
|
||||
"homepageLayouts": "פריסות דף הבית",
|
||||
"accountProfile": "פרופיל חשבון"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "תיקייה {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "רשת",
|
||||
"listView": "רשימה",
|
||||
"compactRows": "שורות צפופות",
|
||||
"comfortableRows": "שורות נוחות"
|
||||
"comfortableRows": "שורות נוחות",
|
||||
"columns": {
|
||||
"title": "עמודות",
|
||||
"auto": "אוטומטי",
|
||||
"count": "רוחב של {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "נשמר. הקלד כדי להחליף אותו."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "कुछ प्लगइन नहीं बदले जा सके। आप बाद में प्लगइन टैब से उन्हें ठीक कर सकते हैं। जारी रखने के लिए आगे दबाएं।",
|
||||
"pluginsApplyFailed": "आपके विकल्प सहेजे नहीं जा सके। पुनः प्रयास करें, या जारी रखें और बाद में प्लगइन टैब से उन्हें बदलें।",
|
||||
"pluginsLoadFailed": "प्लगइन सूची लोड नहीं की जा सकी। आप बाद में प्लगइन टैब से प्लगइन चुन सकते हैं।",
|
||||
"presetTitle": "आप स्क्रीन पर कितना दिखाना चाहते हैं?",
|
||||
"presetIntro": "चुनें कि स्क्रीन पर कितना दिखे।",
|
||||
"presetChangeLater": "आप बाद में सेटिंग्स में इंटरफ़ेस के तहत प्रीसेट बदल या किसी भी एक सेटिंग बदल सकते हैं।",
|
||||
"appearanceTitle": "इसे अपना बनाएं",
|
||||
"appearanceIntro": "एक थीम, एक एक्सेंट रंग, एक फ़ॉन्ट और अपनी भाषा चुनें। बदलाव तुरंत दिखेंगे, और आप बाद में सेटिंग्स में उन्हें बदल सकते हैं।",
|
||||
"securityTitle": "अपने खाते को सुरक्षित करें",
|
||||
"securityIntro": "अपने खाते में एक पासकी या ऑथेंटिकेटर ऐप जोड़ें। आप यह बाद में सेटिंग्स में सुरक्षा के तहत भी कर सकते हैं।",
|
||||
"desktopTitle": "आप Termix का उपयोग कैसे करना चाहते हैं?",
|
||||
"desktopBody": "आप साइडबार में सिंक से इसे किसी भी समय बदल सकते हैं।",
|
||||
"desktopLocalTitle": "केवल इस डिवाइस पर",
|
||||
"desktopLocalBody": "सब कुछ यहाँ संग्रहीत है। सेट करने के लिए कुछ नहीं।",
|
||||
"desktopLinkTitle": "मेरे Termix सर्वर के साथ",
|
||||
"desktopLinkBody": "हर डिवाइस पर एक ही होस्ट और सेटिंग्स का उपयोग करने के लिए अपने सर्वर में साइन इन करें।",
|
||||
"desktopLinked": "{{server}} से लिंक किया गया",
|
||||
"pluginsDocsLink": "प्रत्येक के बारे में पढ़ें"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} इंस्टॉल करने के लिए तैयार है",
|
||||
"readyHint": "यह अगली बार जब Termix पुनरारंभ होगा तब इंस्टॉल होगा।"
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "सुरक्षित मोड",
|
||||
"description": "केवल लेआउट और थीम प्लगइन चल रहे हैं। बाकी सब कुछ वापस चालू करने के लिए TERMIX_SAFE_MODE के बिना सर्वर को पुनः आरंभ करें।"
|
||||
},
|
||||
"companion": {
|
||||
"close": "पैनल बंद करें",
|
||||
"moveSide": "पैनल स्थानांतरित करें",
|
||||
"resize": "पैनल का आकार बदलें"
|
||||
},
|
||||
"nav": {
|
||||
"home": "होम",
|
||||
"terminal": "टर्मिनल",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "होस्ट",
|
||||
"credentials": "प्रमाणपत्र",
|
||||
"connections": "कनेक्शन",
|
||||
"sync": "सिंक",
|
||||
"reconnectDisconnectedTerminals": "सभी डिस्कनेक्टेड टर्मिनल पुनः कनेक्ट करें",
|
||||
"reconnectingTerminals_one": "{{count}} टर्मिनल पुनः कनेक्ट हो रहा है",
|
||||
"reconnectingTerminals_other": "{{count}} टर्मिनल पुनः कनेक्ट हो रहे हैं",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "पुनः प्रयास करें",
|
||||
"refresh": "रिफ्रेश करें",
|
||||
"optional": "वैकल्पिक",
|
||||
"downloadSample": "नमूना डाउनलोड करें",
|
||||
"failedToDeleteHost": "{{name}} को हटाने में विफल",
|
||||
"importSkipExisting": "आयात करें (मौजूदा को छोड़ें)",
|
||||
"importSSHConfig": "SSH कॉन्फ़िग से आयात करें",
|
||||
"connectionDetails": "कनेक्शन विवरण",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(कोई फ़ोल्डर नहीं)",
|
||||
"deleteSelected": "हटाएं",
|
||||
"exitSelection": "चयन से बाहर निकलें",
|
||||
"importSkip": "आयात करें (मौजूदा को छोड़ें)",
|
||||
"importOverwrite": "आयात करें (ओवरराइट करें)",
|
||||
"collapseBtn": "संक्षिप्त करें",
|
||||
"importExportBtn": "आयात / निर्यात",
|
||||
"hostStatusesRefreshed": "होस्ट स्थितियां ताज़ा की गईं",
|
||||
"failedToRefreshHosts": "होस्ट्स ताज़ा करने में विफल",
|
||||
"movedHostTo": "{{host}} को \"{{folder}}\" में स्थानांतरित किया गया",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "\"{{name}}\" और इसके {{count}} होस्ट को हटाएं? इसे पूर्ववत नहीं किया जा सकता।",
|
||||
"deleteFolderConfirm_other": "\"{{name}}\" और इसके {{count}} होस्ट को हटाएं? इसे पूर्ववत नहीं किया जा सकता।",
|
||||
"failedToMoveHosts": "होस्ट स्थानांतरित करने में विफल",
|
||||
"managedBanner": "यह होस्ट {{plugin}} द्वारा प्रबंधित है। उसे वहां से बदलें। आप इसे अभी भी पिन और पुनः क्रमबद्ध कर सकते हैं।",
|
||||
"managedTooltip": "{{plugin}} द्वारा प्रबंधित",
|
||||
"addBlocked": "होस्ट्स {{plugin}} द्वारा प्रबंधित हैं, इसलिए यहाँ नए होस्ट नहीं जोड़े जा सकते।",
|
||||
"failedToReorder": "पुनः क्रमबद्ध करने में विफल",
|
||||
"expandAll": "सभी फ़ोल्डर विस्तारित करें",
|
||||
"collapseAll": "सभी फ़ोल्डर संक्षिप्त करें",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "क्रेडेंशियल जोड़ें",
|
||||
"checkingHostStatuses": "होस्ट स्थितियाँ जाँच रही हैं...",
|
||||
"pinnedSection": "पिन किए गए",
|
||||
"hostsExported": "होस्ट सफलतापूर्वक निर्यात किए गए",
|
||||
"export": {
|
||||
"menuItem": "निर्यात करें...",
|
||||
"title": "होस्ट निर्यात करें",
|
||||
"scope": "क्षेत्र",
|
||||
"scopeAll": "सभी",
|
||||
"scopeSelected": "चयनित",
|
||||
"searchHosts": "होस्ट खोजें...",
|
||||
"include": "शामिल करें",
|
||||
"groupConnection": "कनेक्शन",
|
||||
"groupCredentials": "प्रमाणपत्र",
|
||||
"groupNotes": "नोट्स",
|
||||
"groupTags": "टैग और पिन",
|
||||
"groupProxy": "प्रॉक्सी",
|
||||
"groupJumpHosts": "जंप होस्ट",
|
||||
"groupFeatureFlags": "प्लगइन सेटिंग्स",
|
||||
"groupAdvanced": "उन्नत कॉन्फ़िगरेशन",
|
||||
"preview": "पूर्वावलोकन",
|
||||
"moreHosts_one": "... {{count}} और होस्ट",
|
||||
"moreHosts_other": "... {{count}} और होस्ट",
|
||||
"summary": "{{total}} में से {{selected}} होस्ट",
|
||||
"credentialsIncluded": "प्रमाणपत्र शामिल हैं",
|
||||
"credentialsExcluded": "प्रमाणपत्र बाहर हैं",
|
||||
"noneSelected": "कोई होस्ट चयनित नहीं",
|
||||
"cancel": "रद्द करें",
|
||||
"confirm": "निर्यात करें",
|
||||
"fetchFailed": "निर्यात के लिए होस्ट लोड करने में विफल",
|
||||
"bulkButton": "निर्यात करें"
|
||||
},
|
||||
"sampleDownloaded": "नमूना फ़ाइल डाउनलोड की गई",
|
||||
"failedToDeleteCredential2": "प्रमाणपत्र हटाने में विफल",
|
||||
"noFolderOption": "(कोई फ़ोल्डर नहीं)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "होस्ट अपडेट करें",
|
||||
"editorAdd": "होस्ट जोड़ें",
|
||||
"speedSearch": "होस्ट खोजें। चयन करने के लिए एरो कीज़, कनेक्ट करने के लिए Enter, बंद करने के लिए Esc",
|
||||
"speedSearchList": "होस्ट सूची। खोजने के लिए टाइप करें या / दबाएं।",
|
||||
"importNoHosts": "फ़ाइल में कोई होस्ट नहीं मिला",
|
||||
"importTooMany": "आप एक साथ अधिकतम {{max}} होस्ट आयात कर सकते हैं",
|
||||
"importSummary": "आयात पूरा: {{imported}} आयातित, {{updated}} अपडेट किए गए, {{failed}} विफल",
|
||||
"importHostsFailed": "होस्ट आयात करने में विफल"
|
||||
"speedSearchList": "होस्ट सूची। खोजने के लिए टाइप करें या / दबाएं।"
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "स्प्लिट स्क्रीन",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "रंग चयन खोलें",
|
||||
"themeSystem": "सिस्टम",
|
||||
"themeLight": "लाइट",
|
||||
"themeDark": "डार्क",
|
||||
"themeDracula": "ड्रैकुला",
|
||||
"themeCatppuccin": "कैटपुसिन",
|
||||
"themeNord": "नॉर्ड",
|
||||
"themeSolarized": "सोलराइज्ड",
|
||||
"themeTokyoNight": "टोक्यो नाइट",
|
||||
"themeOneDark": "वन डार्क",
|
||||
"themeGruvbox": "ग्रुवबॉक्स"
|
||||
"themeDark": "डार्क"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "पूरी एप्लिकेशन कैसे व्यवस्थित है। थीम और लेआउट प्लगइन से आते हैं।",
|
||||
"defaultsLabel": "सभी के लिए डिफ़ॉल्ट",
|
||||
"defaultsHint": "जब तक लोग अपना खुद का लेआउट या थीम नहीं चुनते, तब तक उन्हें क्या दिखता है।",
|
||||
"followDefault": "डिफ़ॉल्ट का उपयोग करें",
|
||||
"defaultSaved": "डिफ़ॉल्ट लुक सेव हो गया",
|
||||
"saveFailed": "लुक सेव नहीं हो सका",
|
||||
"repair": {
|
||||
"title": "इस लेआउट को प्रदर्शित नहीं किया जा सका",
|
||||
"safeTitle": "सुरक्षित मोड",
|
||||
"layout": "लेआउट",
|
||||
"plugin": "प्लगइन",
|
||||
"reason": "कारण",
|
||||
"error": "त्रुटि",
|
||||
"noError": "कोई त्रुटि संदेश नहीं।",
|
||||
"copy": "कॉपी करें",
|
||||
"copied": "कॉपी हो गया",
|
||||
"copyFailed": "विवरण कॉपी नहीं हो सके",
|
||||
"retry": "पुनः प्रयास करें",
|
||||
"reset": "डिफ़ॉल्ट लुक पर रीसेट करें",
|
||||
"resetEveryone": "सभी के लिए डिफ़ॉल्ट रीसेट करें",
|
||||
"update": "{{name}} को {{version}} पर अपडेट करें",
|
||||
"disable": "{{name}} बंद करें",
|
||||
"enable": "{{name}} चालू करें",
|
||||
"startAgain": "{{name}} को फिर से शुरू करें",
|
||||
"install": "लेआउट और थीम खोजें",
|
||||
"installTitle": "लेआउट और थीम",
|
||||
"installButton": "इंस्टॉल करें",
|
||||
"nothingToInstall": "अभी कोई अन्य लेआउट या थीम उपलब्ध नहीं है।",
|
||||
"registryUnreachable": "प्लगइन रजिस्ट्री तक पहुँचा नहीं जा सका।",
|
||||
"askAdmin": "इस लेआउट को अपडेट या ठीक करने के लिए किसी एडमिन से कहें। आप नीचे अपने लिए किसी अन्य लेआउट या थीम पर स्विच कर सकते हैं।",
|
||||
"switchLayout": "लेआउट बदलें",
|
||||
"switchTheme": "थीम बदलें",
|
||||
"saveFailed": "आपका चयन सेव नहीं हो सका",
|
||||
"reasons": {
|
||||
"safe-url": "पता ने सुरक्षित मोड माँगा है। नीचे एक लेआउट चुनें, या पते से ?safe-layout=1 हटा दें।",
|
||||
"safe-env": "सर्वर TERMIX_SAFE_LAYOUT के साथ शुरू किया गया है, इसलिए इसे हटाए जाने तक सभी को यह स्क्रीन दिखेगी।",
|
||||
"missing": "कोई इंस्टॉल किया गया प्लगइन इस लेआउट को प्रदान नहीं करता है।",
|
||||
"disabled": "जो प्लगइन इस लेआउट को प्रदान करता है, वह बंद है।",
|
||||
"blocked": "जो प्लगइन इस लेआउट को प्रदान करता है, वह उस चीज़ का इंतज़ार कर रहा है जिसकी उसे आवश्यकता है।",
|
||||
"incompatible": "जो प्लगइन इस लेआउट को प्रदान करता है, वह Termix के इस संस्करण के साथ काम नहीं करता।",
|
||||
"failed": "लेआउट शुरू नहीं हो सका।",
|
||||
"crashed": "एप्लिकेशन को ड्रा करते समय लेआउट दो बार क्रैश हो गया।"
|
||||
},
|
||||
"noLayout": "कोई लेआउट सेट नहीं है",
|
||||
"restore": "बंडल किया गया {{name}} पुनर्स्थापित करें",
|
||||
"restoreFailed": "बंडल की गई कॉपी पुनर्स्थापित नहीं हो सकी"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "सिंग इन संभालें",
|
||||
"consequence": "यह एक लॉगिन विधि, दूसरा कारक या एक SSH साइन-इन प्रकार जोड़ सकता है।"
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "साइन इन नियम सेट करें",
|
||||
"consequence": "यह आइडल होने पर लोगों को साइन आउट कर सकता है, सत्र की लंबाई सीमित कर सकता है, 'मुझे याद रखें' बंद कर सकता है और दूसरा कारक माँग सकता है।"
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "होस्ट्स तक कैसे पहुँचा जाए, यह चुनें",
|
||||
"consequence": "यह होस्ट पर SSH कनेक्शन को अपने रास्ते से ले जा सकता है, इसलिए यह उन होस्ट्स को और उनसे भेजे जाने वाले सब कुछ देखता है, पासवर्ड सहित।"
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "सिंक चलाएं",
|
||||
"consequence": "यह सभी सिंक अनुरोधों का उत्तर दे सकता है, इसलिए यह उस डेटा को देखता है जिसे डिवाइस और सर्वर सिंक करते हैं।"
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "प्रमाणपत्र प्रबंधित करें",
|
||||
"consequence": "यह HTTPS के माध्यम से Termix द्वारा सर्व किया जाने वाला प्रमाणपत्र बदल सकता है और प्रमाणपत्र प्राधिकारियों से डोमेन जांच का उत्तर दे सकता है।"
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "सीरियल और USB डिवाइस तक पहुंचें",
|
||||
"consequence": "यह Termix चलाने वाली मशीन पर एक भौतिक सीरियल पोर्ट खोल सकता है।"
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "अपने रहस्यों के साथ होस्ट्स निर्यात करें",
|
||||
"consequence": "सेव किए गए पासवर्ड और कुंजियों सहित आपके होस्ट्स को पूरी तरह से पढ़ सकता है और उन्हें बाँट सकता है। हर निर्यात ऑडिट लॉग में लिखा जाता है।"
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "होस्ट बनाएं और बदलें",
|
||||
"consequence": "यह होस्ट जोड़ सकता है और आपके मौजूदा होस्ट को संपादित कर सकता है।"
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "ऑडिट लॉग पढ़ें",
|
||||
"consequence": "यह देख सकता है कि किसने क्या किया और कब।"
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "जाँचें कि पोर्ट्स जवाब देते हैं या नहीं",
|
||||
"consequence": "सर्वर से किसी भी पते पर साधारण कनेक्शन खोल सकता है, यह देखने के लिए कि क्या वह पहुँच योग्य है।"
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "होस्ट स्थिति प्रदान करें",
|
||||
"consequence": "हर होस्ट के लिए ऑनलाइन और ऑफ़लाइन डॉट्स का स्रोत बन जाता है।"
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "हाल की गतिविधि संग्रहीत करें",
|
||||
"consequence": "यह हर उपयोगकर्ता की हालिया गतिविधि सूची के लिए स्टोर बन जाता है।"
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "होस्ट्स को केवल-पठनीय (read-only) के रूप में प्रबंधित करें",
|
||||
"consequence": "इसके द्वारा प्रबंधित होस्ट्स को कोई अन्य व्यक्ति संपादित, हटा या पुनः साझा नहीं कर सकता।"
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "डेस्कटॉप विंडो खोलें",
|
||||
"consequence": "केवल Termix डेस्कटॉप ऐप में।"
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "इस कंप्यूटर का उपयोग करें",
|
||||
"consequence": "इस कंप्यूटर पर फ़ाइलों को पढ़ और बदल सकता है, शेल चला सकता है और स्थानीय पोर्ट खोल सकता है। केवल Termix डेस्कटॉप ऐप में।"
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "अन्य उपयोगकर्ताओं के रूप में कार्य करें",
|
||||
"consequence": "दूसरे उपयोगकर्ता के एक्सेस के साथ बैकग्राउंड कार्य चलाता है, जैसे शेड्यूल किए गए जॉब। हर उपयोग को ऑडिट लॉग में लिखा जाता है।"
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "अपने स्क्रीन जोड़ें",
|
||||
"consequence": "टैब, पैनल और सेटिंग्स जिन्हें आप बाद में छिपा सकते हैं।"
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "पूरे ऐप लेआउट को बदलें",
|
||||
"consequence": "चयन करने पर, इसका कोड आपके टर्मिनल और सेटिंग्स सहित हर स्क्रीन को ड्रा करता है।"
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "रंग थीम जोड़ें",
|
||||
"consequence": "केवल रंग और शैलियाँ। थीम के लिए कोई कोड नहीं चलता।"
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "अक्षम",
|
||||
"failed": "अप्रत्याशित रूप से रुका",
|
||||
"blocked": "दूसरे प्लगइन का इंतज़ार कर रहा है",
|
||||
"server": "आपके सर्वर पर चलता है"
|
||||
"server": "आपके सर्वर पर चलता है",
|
||||
"safeMode": "सुरक्षित मोड में बंद"
|
||||
},
|
||||
"groups": {
|
||||
"running": "चल रहे",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "हाल ही में अपडेट किया गया",
|
||||
"category": "श्रेणी"
|
||||
},
|
||||
"columns": {
|
||||
"title": "कॉलम",
|
||||
"auto": "स्वचालित",
|
||||
"count": "{{count}} चौड़ा"
|
||||
},
|
||||
"table": {
|
||||
"name": "नाम",
|
||||
"description": "विवरण",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "{{name}} के लिए विकल्प सेव नहीं किए जा सके: {{error}}",
|
||||
"deleteData": "{{name}} का डेटा डिलीट नहीं किया जा सका: {{error}}",
|
||||
"managedByServer": "यह डेस्कटॉप एक सर्वर से लिंक है, जो इसके प्लगइन्स तय करता है।",
|
||||
"defaultLook": "{{name}} डिफ़ॉल्ट लुक है, इसलिए इसे बंद या बदला जा सकता है लेकिन अनइंस्टॉल नहीं किया जा सकता।",
|
||||
"hasDependents": "{{name}} की {{list}} को आवश्यकता है। पहले उन्हें बंद करें या अनइंस्टॉल करें।",
|
||||
"missingDependencies": "{{name}} को {{list}} की आवश्यकता है, जो इंस्टॉल नहीं है।",
|
||||
"consentChanged": "आपने देखा था तब से इस प्लगइन द्वारा मांगी गई चीज़ें बदल गई हैं। सूची फिर से जांचें।",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "आपके सर्वर तक कोई पहुंच नहीं",
|
||||
"searchInstalled": "इंस्टॉल किए गए में खोजें",
|
||||
"searchPlugins": "प्लगइन खोजें",
|
||||
"allCategories": "सभी",
|
||||
"nothingMatches": "कुछ भी मेल नहीं खाता।",
|
||||
"noneInstalled": "अभी तक कोई प्लगइन इंस्टॉल नहीं है। कुछ जोड़ने के लिए ब्राउज़ करें।",
|
||||
"nothingHere": "यहाँ कुछ नहीं है।",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "प्रलेखन",
|
||||
"envVars": "पर्यावरण चर",
|
||||
"envRequired": "आवश्यक",
|
||||
"envDefault": "डिफ़ॉल्ट: {{value}}"
|
||||
"envDefault": "डिफ़ॉल्ट: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "लेआउट",
|
||||
"themes": "थीम",
|
||||
"tabs": "टैब",
|
||||
"panels": "साइडबार पैनल",
|
||||
"dashboardCards": "डैशबोर्ड कार्ड",
|
||||
"protocols": "कनेक्शन प्रकार",
|
||||
"auth": "साइन इन विधियाँ",
|
||||
"actions": "कार्रवाई",
|
||||
"hostCapability": "होस्ट सेटिंग्स"
|
||||
},
|
||||
"filters": {
|
||||
"type": "प्रकार",
|
||||
"allTypes": "सभी प्रकार",
|
||||
"category": "श्रेणी",
|
||||
"allCategories": "सभी श्रेणियाँ",
|
||||
"results_one": "{{count}} प्लगइन",
|
||||
"results_other": "{{count}} प्लगइन",
|
||||
"remove": "फ़िल्टर {{name}} हटाएँ",
|
||||
"clear": "फ़िल्टर साफ़ करें",
|
||||
"button": "फ़िल्टर",
|
||||
"buttonCount": "फ़िल्टर ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} of {{total}}",
|
||||
"page": "{{pages}} में से पृष्ठ {{page}}",
|
||||
"previous": "पिछला पृष्ठ",
|
||||
"next": "अगला पृष्ठ",
|
||||
"perPage": "प्रति पृष्ठ {{count}}",
|
||||
"perPageLabel": "प्रति पृष्ठ प्लगइन"
|
||||
},
|
||||
"showUnsupportedHint": "ये सूचीबद्ध हैं लेकिन इस संस्करण पर अभी तक कोई रिलीज़ नहीं चलती। इन्हें इंस्टॉल करने के लिए Termix अपडेट करें।",
|
||||
"unsupported": "नए Termix की आवश्यकता है",
|
||||
"unsupportedHint": "इस प्लगइन की कोई रिलीज़ इस Termix संस्करण पर नहीं चलती। इसे इंस्टॉल करने के लिए Termix अपडेट करें।",
|
||||
"needsTermix": "Termix {{range}} की आवश्यकता है",
|
||||
"showUnsupported": "असमर्थित दिखाएँ ({{count}})",
|
||||
"showMore": "{{count}} और दिखाएँ ({{total}} शेष)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "कोई डेटा नहीं",
|
||||
"filter": "फ़िल्टर करें..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} मिनट पहले",
|
||||
"minutesAgo_other": "{{count}} मिनट पहले",
|
||||
"hoursAgo_one": "{{count}} घंटा पहले",
|
||||
"hoursAgo_other": "{{count}} घंटे पहले",
|
||||
"pending_one": "{{count}} बदलाव सिंक होने की प्रतीक्षा कर रहा है",
|
||||
"pending_other": "{{count}} बदलाव सिंक होने की प्रतीक्षा कर रहे हैं",
|
||||
"proxy": {
|
||||
"headersTitle": "अतिरिक्त हेडर्स",
|
||||
"headersHint": "सर्वर के साथ हर अनुरोध के साथ भेजा जाता है, उदाहरण के लिए Cloudflare Access सर्विस टोकन।",
|
||||
"headerName": "हेडर नाम",
|
||||
"headerValue": "मान",
|
||||
"savedValue": "सहेजा गया, बदलने के लिए टाइप करें",
|
||||
"addHeader": "हेडर जोड़ें",
|
||||
"removeHeader": "हेडर हटाएं",
|
||||
"basicAuthTitle": "यूज़रनेम और पासवर्ड",
|
||||
"basicAuthHint": "एक प्रॉक्सी के लिए जो Termix से पहले यूज़रनेम और पासवर्ड मांगता है।",
|
||||
"username": "यूज़रनेम",
|
||||
"password": "पासवर्ड",
|
||||
"allowInvalidCertificate": "सेल्फ-साइनड सर्टिफिकेट पर भरोसा करें",
|
||||
"allowInvalidCertificateHint": "केवल आपके अपने सर्वर के लिए, जब उसका सर्टिफिकेट किसी ज्ञात प्राधिकरण से न हो।"
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "यह वेब पते जैसा नहीं लगता।",
|
||||
"unreachable": "सर्वर तक नहीं पहुँचा जा सका। पता और यह कि सर्वर चल रहा है, इसकी जाँच करें।",
|
||||
"unreachableWithReason": "सर्वर तक नहीं पहुँचा जा सका: {{reason}}",
|
||||
"tlsUntrusted": "सर्वर प्रमाणपत्र विश्वसनीय नहीं है। यदि यह आपका अपना सर्वर है जिसका स्व-हस्ताक्षरित प्रमाणपत्र है, तो नीचे दिए गए विकल्प को चालू करें।",
|
||||
"basicAuthRequired": "सर्वर के सामने कुछ उपयोगकर्ता नाम और पासवर्ड माँग रहा है। उन्हें नीचे दर्ज करें।",
|
||||
"proxyLogin": "Termix के बजाय एक लॉगिन पेज या प्रॉक्सी ने जवाब दिया। नीचे उसके लिए आवश्यक हेडर जोड़ें, या पता जाँचें।",
|
||||
"notTermix": "उस पते पर कोई Termix सर्वर नहीं है। यदि यह किसी पथ के तहत चल रहा है, तो उसे शामिल करें, जैसे https://example.com/termix।",
|
||||
"versionMismatch": "उस सर्वर पर पुराना Termix चल रहा है। लिंक करने के लिए इसे 2.9 या नए संस्करण पर अपडेट करें।",
|
||||
"differentAccount": "आपने एक अलग खाते में साइन इन किया है। उस खाते में साइन इन करें जिससे यह डिवाइस लिंक है, या पहले अनलिंक करें।"
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Termix सर्वर से लिंक करें",
|
||||
"reloginTitle": "फिर से साइन इन करें",
|
||||
"savedServers": "हाल के सर्वर",
|
||||
"removeServer": "सूची से हटाएँ",
|
||||
"serverDescription": "वह पता दर्ज करें जो आप ब्राउज़र में Termix खोलने के लिए उपयोग करते हैं।",
|
||||
"signinDescription": "{{url}} में साइन इन करें",
|
||||
"chooseDescription": "इस डिवाइस पर पहले से डेटा है। इसका क्या होना चाहिए?",
|
||||
"finishingDescription": "इस डिवाइस को लिंक किया जा रहा है।",
|
||||
"serverUrl": "सर्वर पता",
|
||||
"serverUrlHint": "उदाहरण के लिए https://termix.example.com",
|
||||
"showProxySettings": "रिवर्स प्रॉक्सी सेटिंग्स",
|
||||
"hideProxySettings": "रिवर्स प्रॉक्सी सेटिंग्स छिपाएँ",
|
||||
"continue": "जारी रखें",
|
||||
"back": "वापस",
|
||||
"mergeTitle": "इसे मेरे खाते में जोड़ें",
|
||||
"mergeBody_one": "इस डिवाइस पर आइटम आपके खाते में जोड़ा जाएगा। आपके खाते में पहले से मौजूद आइटम सर्वर पर वैसा ही रहेंगे।",
|
||||
"mergeBody_other": "इस डिवाइस पर {{count}} आइटम आपके खाते में जोड़े जाएंगे। आपके खाते में पहले से मौजूद आइटम सर्वर पर वैसा ही रहेंगे।",
|
||||
"replaceTitle": "इसे अपने खाते से बदलें",
|
||||
"replaceBody_one": "इस डिवाइस पर आइटम हटा दिया जाएगा, और यह डिवाइस आपके खाते से सब कुछ ले लेगा। केवल इस डिवाइस पर रखे गए होस्ट ही रहेंगे।",
|
||||
"replaceBody_other": "इस डिवाइस पर {{count}} आइटम हटा दिए जाएंगे, और यह डिवाइस आपके खाते से सब कुछ ले लेगा। केवल इस डिवाइस पर रखे गए होस्ट ही रहेंगे।",
|
||||
"link": "लिंक करें",
|
||||
"linking": "लिंक किया जा रहा है और पहला सिंक चलाया जा रहा है...",
|
||||
"linked": "लिंक हो गया। आपका डेटा अब सिंक हो रहा है।",
|
||||
"signedInAgain": "साइन इन हो गया। सिंक फिर से चल रहा है।"
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "होस्ट",
|
||||
"sshCredentials": "क्रेडेंशियल्स",
|
||||
"sshFolders": "फोल्डर्स",
|
||||
"userPreferences": "प्राथमिकताएँ",
|
||||
"pluginUserSettings": "प्लगइन सेटिंग्स",
|
||||
"sharedHosts": "आपके साथ साझा किए गए होस्ट",
|
||||
"sharedCredentials": "आपके साथ साझा किए गए क्रेडेंशियल्स",
|
||||
"vaultProfiles": "Vault प्रोफ़ाइलें",
|
||||
"snippetFolders": "स्निपेट फोल्डर्स",
|
||||
"snippets": "स्निपेट्स",
|
||||
"dashboardServiceLinks": "सर्विस लिंक्स",
|
||||
"homepageItems": "होमपेज आइटम",
|
||||
"networkTopology": "नेटवर्क मैप",
|
||||
"workspaces": "वर्कस्पेस",
|
||||
"hostDefaults": "होस्ट डिफ़ॉल्ट्स",
|
||||
"hostDefaultsAdmin": "सर्वर होस्ट डिफ़ॉल्ट्स",
|
||||
"aiProviders": "AI प्रदाता",
|
||||
"homepageLayouts": "होमपेज लेआउट",
|
||||
"accountProfile": "खाता प्रोफ़ाइल"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "फ़ोल्डर {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "ग्रिड",
|
||||
"listView": "सूची",
|
||||
"compactRows": "संक्षिप्त पंक्तियाँ",
|
||||
"comfortableRows": "आरामदायक पंक्तियाँ"
|
||||
"comfortableRows": "आरामदायक पंक्तियाँ",
|
||||
"columns": {
|
||||
"title": "कॉलम",
|
||||
"auto": "स्वचालित",
|
||||
"count": "{{count}} चौड़ा"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "सहेजा गया। इसे बदलने के लिए टाइप करें।"
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Neki se dodatci nisu mogli promijeniti. Možete ih popraviti kasnije s kartice Dodaci. Pritisnite Dalje za nastavak.",
|
||||
"pluginsApplyFailed": "Vaši odabiri se nisu mogli spremiti. Pokušajte ponovno ili nastavite i promijenite ih kasnije s kartice Dodaci.",
|
||||
"pluginsLoadFailed": "Popis dodataka se nije mogao učitati. Dodatke možete odabrati kasnije s kartice Dodaci.",
|
||||
"presetTitle": "Koliko želite na zaslonu?",
|
||||
"presetIntro": "Odaberite koliko će se prikazivati na zaslonu.",
|
||||
"presetChangeLater": "Možete prebaciti predloške ili promijeniti bilo koju pojedinačnu postavku kasnije u Postavkama, pod sučeljem.",
|
||||
"appearanceTitle": "Prilagodite ga sebi",
|
||||
"appearanceIntro": "Odaberite temu, naglašenu boju, font i jezik. Promjene se odmah prikazuju, a možete ih promijeniti kasnije u Postavkama.",
|
||||
"securityTitle": "Zaštitite svoj račun",
|
||||
"securityIntro": "Dodajte ključ za prijavu ili aplikaciju za provjeru autentičnosti svom računu. To možete učiniti i kasnije u Postavkama, pod Sigurnošću.",
|
||||
"desktopTitle": "Kako želite koristiti Termix?",
|
||||
"desktopBody": "Ovo možete promijeniti u bilo kojem trenutku iz Sinkronizacije u bočnoj traci.",
|
||||
"desktopLocalTitle": "Samo na ovom uređaju",
|
||||
"desktopLocalBody": "Sve se pohranjuje ovdje. Ništa za postavljati.",
|
||||
"desktopLinkTitle": "S mojim Termix poslužiteljem",
|
||||
"desktopLinkBody": "Prijavite se na svoj poslužitelj kako biste koristili iste domaćine i postavke na svakom uređaju.",
|
||||
"desktopLinked": "Povezano s {{server}}",
|
||||
"pluginsDocsLink": "Pročitajte o svakom od njih"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} je spreman za instalaciju",
|
||||
"readyHint": "Instalirat će se sljedeći put kada se Termix ponovno pokrene."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Sigurni način rada",
|
||||
"description": "Pokreću se samo dodaci za raspored i temu. Ponovno pokrenite poslužitelj bez postavke TERMIX_SAFE_MODE da biste ponovno omogućili ostale dodatke."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Zatvori panel",
|
||||
"moveSide": "Pomakni panel",
|
||||
"resize": "Promijeni veličinu panela"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Početna",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Domaćini",
|
||||
"credentials": "Povjerenja",
|
||||
"connections": "Veze",
|
||||
"sync": "Sinkronizacija",
|
||||
"reconnectDisconnectedTerminals": "Ponovno poveži sve prekinute terminale",
|
||||
"reconnectingTerminals_one": "Ponovno povezivanje {{count}} terminala",
|
||||
"reconnectingTerminals_few": "Ponovno povezivanje {{count}} terminala",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Pokušaj ponovno",
|
||||
"refresh": "Osvježi",
|
||||
"optional": "Opcionalno",
|
||||
"downloadSample": "Preuzmi primjer",
|
||||
"failedToDeleteHost": "Brisanje {{name}} nije uspjelo",
|
||||
"importSkipExisting": "Uvezi (preskoči postojeće)",
|
||||
"importSSHConfig": "Uvezi iz SSH konfiguracije",
|
||||
"connectionDetails": "Detalji veze",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Bez mape)",
|
||||
"deleteSelected": "Izbriši",
|
||||
"exitSelection": "Izađi iz odabira",
|
||||
"importSkip": "Uvezi (preskoči postojeće)",
|
||||
"importOverwrite": "Uvezi (prepiši)",
|
||||
"collapseBtn": "Sažmi",
|
||||
"importExportBtn": "Uvoz / Izvoz",
|
||||
"hostStatusesRefreshed": "Statusi hostova osvježeni",
|
||||
"failedToRefreshHosts": "Neuspjelo osvježavanje hostova",
|
||||
"movedHostTo": "Premješteno {{host}} u \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_few": "Izbrisati \"{{name}}\" i njegovih {{count}} hostova? Ovo se ne može poništiti.",
|
||||
"deleteFolderConfirm_other": "Izbrisati \"{{name}}\" i njegovih {{count}} hostova? Ovo se ne može poništiti.",
|
||||
"failedToMoveHosts": "Neuspješno premještanje hostova",
|
||||
"managedBanner": "Ovaj host upravlja {{plugin}}. Promijenite ga tamo. I dalje ga možete pričvrstiti i preurediti.",
|
||||
"managedTooltip": "Upravlja {{plugin}}",
|
||||
"addBlocked": "Hostove upravlja {{plugin}}, pa se ovdje ne mogu dodavati novi hostovi.",
|
||||
"failedToReorder": "Neuspješno ponovno poredavanje",
|
||||
"expandAll": "Proširi sve mape",
|
||||
"collapseAll": "Sažmi sve mape",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Dodaj vjerodajnice",
|
||||
"checkingHostStatuses": "Provjeravanje statusa hostova...",
|
||||
"pinnedSection": "Prikvačeno",
|
||||
"hostsExported": "Hostovi su uspješno izvezeni",
|
||||
"export": {
|
||||
"menuItem": "Izvoz...",
|
||||
"title": "Izvoz hostova",
|
||||
"scope": "Opseg",
|
||||
"scopeAll": "Svi",
|
||||
"scopeSelected": "Odabrani",
|
||||
"searchHosts": "Pretraživanje hostova...",
|
||||
"include": "Uključi",
|
||||
"groupConnection": "Povezivanje",
|
||||
"groupCredentials": "Prijavni podaci",
|
||||
"groupNotes": "Bilješke",
|
||||
"groupTags": "Oznake i prikvačivanje",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Posrednički hostovi",
|
||||
"groupFeatureFlags": "Postavke dodataka",
|
||||
"groupAdvanced": "Napredna konfiguracija",
|
||||
"preview": "Pregled",
|
||||
"moreHosts_one": "... još {{count}} host",
|
||||
"moreHosts_few": "... još {{count}} hostova",
|
||||
"moreHosts_other": "... još {{count}} hostova",
|
||||
"summary": "{{selected}} od {{total}} hostova",
|
||||
"credentialsIncluded": "prijavni podaci uključeni",
|
||||
"credentialsExcluded": "prijavni podaci isključeni",
|
||||
"noneSelected": "Nijedan host nije odabran",
|
||||
"cancel": "Odustani",
|
||||
"confirm": "Izvoz",
|
||||
"fetchFailed": "Neuspjelo učitavanje hostova za izvoz",
|
||||
"bulkButton": "Izvoz"
|
||||
},
|
||||
"sampleDownloaded": "Primjer datoteke preuzet",
|
||||
"failedToDeleteCredential2": "Neuspjelo brisanje prijavnih podataka",
|
||||
"noFolderOption": "(Bez mape)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Ažuriraj host",
|
||||
"editorAdd": "Dodaj host",
|
||||
"speedSearch": "Pretraži hostove. Strelice za odabir, Enter za povezivanje, Esc za zatvaranje",
|
||||
"speedSearchList": "Popis hostova. Upišite ili pritisnite / za pretraživanje.",
|
||||
"importNoHosts": "Nema pronađenih hostova u datoteci",
|
||||
"importTooMany": "Možete uvesti najviše {{max}} hostova odjednom",
|
||||
"importSummary": "Uvoz završen: {{imported}} uvezeno, {{updated}} ažurirano, {{failed}} neuspješno",
|
||||
"importHostsFailed": "Neuspjelo uvoz hostova"
|
||||
"speedSearchList": "Popis hostova. Upišite ili pritisnite / za pretraživanje."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Podijeljeni zaslon",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} korisnik",
|
||||
"usersCount_few": "{{count}} korisnika",
|
||||
"rolesCount_one": "{{count}} uloga",
|
||||
"rolesCount_few": "{{count}} uloga",
|
||||
"apiKeysCount_one": "{{count}} ključ",
|
||||
"apiKeysCount_few": "{{count}} ključeva",
|
||||
"sessionsActive_one": "{{count}} aktivno",
|
||||
"sessionsActive_few": "{{count}} aktivna",
|
||||
"hostsCount_one": "{{count}} host",
|
||||
"hostsCount_few": "{{count}} hostova",
|
||||
"hostsCount_other": "{{count}} hostova",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} vjerodajnica",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} dozvola",
|
||||
"count_few": "{{count}} dozvola",
|
||||
"groups": {
|
||||
"hosts": "Hostovi",
|
||||
"credentials": "Vjerodajnice",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Mijenja font sučelja aplikacije. Profilni terminali zadržavaju vlastite postavke fonta.",
|
||||
"accentColorLabel": "Naglašena boja",
|
||||
"apiKeyCount_one": "{{count}} ključ",
|
||||
"apiKeyCount_few": "{{count}} ključeva",
|
||||
"colorPickerTooltip": "Otvori odabir boja",
|
||||
"themeSystem": "Sustav",
|
||||
"themeLight": "Svijetla",
|
||||
"themeDark": "Tamna",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Tamna"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Kako je cijela aplikacija raspoređena. Teme i rasporedi dolaze iz dodataka.",
|
||||
"defaultsLabel": "Zadano za sve",
|
||||
"defaultsHint": "Što ljudi vide dok ne odaberu vlastiti raspored ili temu.",
|
||||
"followDefault": "Koristi zadano",
|
||||
"defaultSaved": "Zadan izgled spremljen",
|
||||
"saveFailed": "Izgled se nije mogao spremiti",
|
||||
"repair": {
|
||||
"title": "Ovaj raspored se nije mogao prikazati",
|
||||
"safeTitle": "Sigurni način rada",
|
||||
"layout": "Raspored",
|
||||
"plugin": "Dodatak",
|
||||
"reason": "Razlog",
|
||||
"error": "Greška",
|
||||
"noError": "Nema poruke o grešci.",
|
||||
"copy": "Kopiraj",
|
||||
"copied": "Kopirano",
|
||||
"copyFailed": "Detalji se nisu mogli kopirati",
|
||||
"retry": "Pokušaj ponovno",
|
||||
"reset": "Vrati na zadani izgled",
|
||||
"resetEveryone": "Vrati zadano za sve",
|
||||
"update": "Ažuriraj {{name}} na {{version}}",
|
||||
"disable": "Isključi {{name}}",
|
||||
"enable": "Uključi {{name}}",
|
||||
"startAgain": "Ponovno pokreni {{name}}",
|
||||
"install": "Pronađi rasporede i teme",
|
||||
"installTitle": "Rasporedi i teme",
|
||||
"installButton": "Instaliraj",
|
||||
"nothingToInstall": "Trenutno nema drugih dostupnih rasporeda ili tema.",
|
||||
"registryUnreachable": "Registar dodataka nije dostupan.",
|
||||
"askAdmin": "Zatražite od administratora da ažurira ili popravi ovaj raspored. Ispod možete prebaciti na drugi raspored ili temu za sebe.",
|
||||
"switchLayout": "Promijeni raspored",
|
||||
"switchTheme": "Promijeni temu",
|
||||
"saveFailed": "Vaš izbor se nije mogao spremiti",
|
||||
"reasons": {
|
||||
"safe-url": "Adresa je zatražila sigurni način rada. Odaberite raspored ispod ili uklonite ?safe-layout=1 iz adrese.",
|
||||
"safe-env": "Poslužitelj je pokrenut s TERMIX_SAFE_LAYOUT, pa svi vide ovaj zaslon dok se ne ukloni.",
|
||||
"missing": "Nijedan instalirani dodatak ne pruža ovaj raspored.",
|
||||
"disabled": "Dodatak koji pruža ovaj raspored je isključen.",
|
||||
"blocked": "Dodatak koji pruža ovaj raspored čeka nešto što mu treba.",
|
||||
"incompatible": "Dodatak koji pruža ovaj raspored ne radi s ovom verzijom Termixa.",
|
||||
"failed": "Raspored se nije mogao pokrenuti.",
|
||||
"crashed": "Raspored se dvaput srušio tijekom crtanja aplikacije."
|
||||
},
|
||||
"noLayout": "Nema postavljenog rasporeda",
|
||||
"restore": "Vrati priloženi {{name}}",
|
||||
"restoreFailed": "Priložena kopija se nije mogla vratiti"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Upravljanje prijavom",
|
||||
"consequence": "Može dodati metodu prijave, drugi faktor ili vrstu SSH prijave."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Postavi pravila za prijavu",
|
||||
"consequence": "Može odjaviti korisnike kada su neaktivni, ograničiti duljinu sesije, isključiti opciju „Zapamti me“ i zahtijevati drugi faktor."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Odaberi kako se hostovi dosežu",
|
||||
"consequence": "Može prenijeti SSH vezu do hosta putem vlastite rute, pa vidi sve što se šalje do i od tih hostova, uključujući lozinke."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Pokreni sinkronizaciju",
|
||||
"consequence": "Može odgovoriti na sve zahtjeve za sinkronizaciju, pa vidi podatke koje uređaji i poslužitelji sinkroniziraju."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Upravljanje certifikatima",
|
||||
"consequence": "Može zamijeniti certifikat koji Termix koristi za HTTPS i odgovoriti na provjere domena od strane izdavatelja certifikata."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Pristup serijskim i USB uređajima",
|
||||
"consequence": "Može otvoriti fizički serijski port na uređaju na kojem radi Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Izvezi hostove s njihovim tajnama",
|
||||
"consequence": "Može pročitati vaše hostove u cijelosti, uključujući spremljene lozinke i ključeve, te ih predati. Svaki izvoz se bilježi u revizijski dnevnik."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Izrada i izmjena poslužitelja",
|
||||
"consequence": "Može dodavati poslužitelje i uređivati one koje već imate."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Čitanje dnevnika revizije",
|
||||
"consequence": "Može vidjeti tko je što i kada učinio."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Provjeri odgovaraju li portovi",
|
||||
"consequence": "Može otvoriti običnu vezu na bilo koju adresu s poslužitelja, kako bi provjerio je li dostupna."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Pruži status hosta",
|
||||
"consequence": "Postaje izvor točaka za online i offline status svakog hosta."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Spremi nedavnu aktivnost",
|
||||
"consequence": "Postaje spremište za popis nedavnih aktivnosti svakog korisnika."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Upravljanje domaćinima kao samo za čitanje",
|
||||
"consequence": "Domaćine koje upravlja ne mogu uređivati, brisati niti dijeliti drugi korisnici."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Otvaranje prozora radne površine",
|
||||
"consequence": "Samo u Termix aplikaciji za radnu površinu."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Koristi ovaj računal",
|
||||
"consequence": "Može čitati i mijenjati datoteke, pokretati shell i otvarati lokalne portove na ovom računalu. Samo u Termix desktop aplikaciji."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Djelovanje u ime drugih korisnika",
|
||||
"consequence": "Pokreće pozadinske zadatke s pristupom drugog korisnika, poput planiranih poslova. Svaka upotreba bilježi se u dnevniku revizije."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Dodaje vlastite ekrane",
|
||||
"consequence": "Kartice, panele i postavke koje kasnije možete sakriti."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Zamijeni cijeli raspored aplikacije",
|
||||
"consequence": "Kada se odabere, njegov kod crta svaki zaslon, uključujući vaše terminale i postavke."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Dodaj teme boja",
|
||||
"consequence": "Samo boje i stilovi. Za temu se ne pokreće nijedan kod."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Onemogućeno",
|
||||
"failed": "Neočekivano zaustavljeno",
|
||||
"blocked": "Čeka drugi dodatak",
|
||||
"server": "Radi na vašem poslužitelju"
|
||||
"server": "Radi na vašem poslužitelju",
|
||||
"safeMode": "Isključeno u sigurnom načinu rada"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Pokrenuto",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Nedavno ažurirano",
|
||||
"category": "Kategorija"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Stupci",
|
||||
"auto": "Automatski",
|
||||
"count": "{{count}} široko"
|
||||
},
|
||||
"table": {
|
||||
"name": "Naziv",
|
||||
"description": "Opis",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "Nije moguće spremiti opcije za {{name}}: {{error}}",
|
||||
"deleteData": "Nije moguće izbrisati podatke za {{name}}: {{error}}",
|
||||
"managedByServer": "Ova radna površina povezana je s poslužiteljem koji određuje njezine dodatke.",
|
||||
"defaultLook": "{{name}} je zadani izgled, pa se može isključiti ili zamijeniti, ali ne i deinstalirati.",
|
||||
"hasDependents": "{{name}} potreban je za {{list}}. Prvo isključite ili deinstalirajte te dodatke.",
|
||||
"missingDependencies": "{{name}} treba {{list}}, koji nije instaliran.",
|
||||
"consentChanged": "Što ovaj dodatak traži promijenilo se od kada ste ga zadnji put pregledali. Provjerite popis ponovno.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Nema pristupa vašim poslužiteljima",
|
||||
"searchInstalled": "Pretraži instalirane",
|
||||
"searchPlugins": "Pretraži dodatke",
|
||||
"allCategories": "Sve",
|
||||
"nothingMatches": "Ništa se ne podudara s tim.",
|
||||
"noneInstalled": "Još nema instaliranih dodataka. Pregledajte ih kako biste dodali neke.",
|
||||
"nothingHere": "Ovdje nema ništa.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Dokumentacija",
|
||||
"envVars": "Okolišne varijable",
|
||||
"envRequired": "Obavezno",
|
||||
"envDefault": "Zadano: {{value}}"
|
||||
"envDefault": "Zadano: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Rasporedi",
|
||||
"themes": "Teme",
|
||||
"tabs": "Kartice",
|
||||
"panels": "Paneli bočne trake",
|
||||
"dashboardCards": "Kartice nadzorne ploče",
|
||||
"protocols": "Vrste veza",
|
||||
"auth": "Metode prijave",
|
||||
"actions": "Radnje",
|
||||
"hostCapability": "Postavke domaćina"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Vrsta",
|
||||
"allTypes": "Sve vrste",
|
||||
"category": "Kategorija",
|
||||
"allCategories": "Sve kategorije",
|
||||
"results_one": "{{count}} dodatak",
|
||||
"results_few": "{{count}} dodatka",
|
||||
"results_other": "{{count}} dodataka",
|
||||
"remove": "Ukloni filter {{name}}",
|
||||
"clear": "Obriši filtere",
|
||||
"button": "Filteri",
|
||||
"buttonCount": "Filteri ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} od {{total}}",
|
||||
"page": "Stranica {{page}} od {{pages}}",
|
||||
"previous": "Prethodna stranica",
|
||||
"next": "Sljedeća stranica",
|
||||
"perPage": "{{count}} po stranici",
|
||||
"perPageLabel": "Dodaci po stranici"
|
||||
},
|
||||
"showUnsupportedHint": "Ovi su navedeni, ali još nema izdanja koje radi na ovoj verziji. Ažurirajte Termix da biste ih instalirali.",
|
||||
"unsupported": "Zahtijeva noviji Termix",
|
||||
"unsupportedHint": "Nijedno izdanje ovog dodatka ne radi na ovoj verziji Termixa. Ažurirajte Termix da biste ga instalirali.",
|
||||
"needsTermix": "Zahtijeva Termix {{range}}",
|
||||
"showUnsupported": "Prikaži nepodržane ({{count}})",
|
||||
"showMore": "Prikaži još {{count}} (ostalo: {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Nema podataka",
|
||||
"filter": "Filtriraj..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "prije {{count}} minute",
|
||||
"minutesAgo_few": "prije {{count}} minute",
|
||||
"minutesAgo_other": "prije {{count}} minuta",
|
||||
"hoursAgo_one": "prije {{count}} sat",
|
||||
"hoursAgo_few": "prije {{count}} sata",
|
||||
"hoursAgo_other": "prije {{count}} sati",
|
||||
"pending_one": "{{count}} promjena čeka usklađivanje",
|
||||
"pending_few": "{{count}} promjene čekaju usklađivanje",
|
||||
"pending_other": "{{count}} promjena čeka usklađivanje",
|
||||
"proxy": {
|
||||
"headersTitle": "Dodatne zaglavlja",
|
||||
"headersHint": "Šalju se s svakim zahtjevom poslužitelju, na primjer token usluge Cloudflare Access.",
|
||||
"headerName": "Naziv zaglavlja",
|
||||
"headerValue": "Vrijednost",
|
||||
"savedValue": "Spremljeno, upišite za promjenu",
|
||||
"addHeader": "Dodaj zaglavlje",
|
||||
"removeHeader": "Ukloni zaglavlje",
|
||||
"basicAuthTitle": "Korisničko ime i lozinka",
|
||||
"basicAuthHint": "Za proxy koji traži korisničko ime i lozinku prije Termixa.",
|
||||
"username": "Korisničko ime",
|
||||
"password": "Lozinka",
|
||||
"allowInvalidCertificate": "Povjeri samopotpisanom certifikatu",
|
||||
"allowInvalidCertificateHint": "Samo za vlastiti poslužitelj, kada njegov certifikat nije izdan od poznatog izdavača."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "To ne izgleda kao web adresa.",
|
||||
"unreachable": "Nije moguće doseći poslužitelj. Provjerite adresu i je li poslužitelj pokrenut.",
|
||||
"unreachableWithReason": "Nije moguće doseći poslužitelj: {{reason}}",
|
||||
"tlsUntrusted": "Certifikat poslužitelja nije pouzdan. Ako je ovo vaš vlastiti poslužitelj s samopotpisanim certifikatom, uključite opciju ispod.",
|
||||
"basicAuthRequired": "Nešto ispred poslužitelja traži korisničko ime i lozinku. Unesite ih ispod.",
|
||||
"proxyLogin": "Umjesto Termixa odgovorila je prijavna stranica ili proxy. Ispod dodajte zaglavlja koja su mu potrebna ili provjerite adresu.",
|
||||
"notTermix": "Na toj adresi nema Termix poslužitelja. Ako se pokreće pod putanjom, uključite je, npr. https://primjer.com/termix.",
|
||||
"versionMismatch": "Taj poslužitelj pokreće stariju verziju Termixa. Ažurirajte ga na verziju 2.9 ili noviju za povezivanje.",
|
||||
"differentAccount": "Prijavili ste se na drugi račun. Prijavite se na račun s kojim je ovaj uređaj povezan ili ga prvo odspojite."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Poveži s Termix poslužiteljem",
|
||||
"reloginTitle": "Ponovna prijava",
|
||||
"savedServers": "Nedavni poslužitelji",
|
||||
"removeServer": "Ukloni s popisa",
|
||||
"serverDescription": "Unesite adresu koju koristite za otvaranje Termixa u pregledniku.",
|
||||
"signinDescription": "Prijavite se na {{url}}",
|
||||
"chooseDescription": "Ovaj uređaj već ima podatke. Što bi se s njima trebalo dogoditi?",
|
||||
"finishingDescription": "Povezivanje ovog uređaja.",
|
||||
"serverUrl": "Adresa poslužitelja",
|
||||
"serverUrlHint": "Na primjer https://termix.primjer.com",
|
||||
"showProxySettings": "Postavke obrnutog proxyja",
|
||||
"hideProxySettings": "Sakrij postavke obrnutog proxyja",
|
||||
"continue": "Nastavi",
|
||||
"back": "Natrag",
|
||||
"mergeTitle": "Dodaj u moj račun",
|
||||
"mergeBody_one": "Stavka na ovom uređaju dodaje se u vaš račun. Stavke koje vaš račun već ima ostaju nepromijenjene na poslužitelju.",
|
||||
"mergeBody_few": "{{count}} stavke na ovom uređaju dodaju se u vaš račun. Stavke koje vaš račun već ima ostaju nepromijenjene na poslužitelju.",
|
||||
"mergeBody_other": "{{count}} stavki na ovom uređaju dodaje se u vaš račun. Stavke koje vaš račun već ima ostaju nepromijenjene na poslužitelju.",
|
||||
"replaceTitle": "Zamijeni svojim računom",
|
||||
"replaceBody_one": "Stavka na ovom uređaju uklanja se, a ovaj uređaj preuzima sve iz vašeg računa. Hostovi koji su zadržani samo na ovom uređaju ostaju.",
|
||||
"replaceBody_few": "{{count}} stavke na ovom uređaju uklanjaju se, a ovaj uređaj preuzima sve iz vašeg računa. Hostovi koji su zadržani samo na ovom uređaju ostaju.",
|
||||
"replaceBody_other": "{{count}} stavki na ovom uređaju uklanja se, a ovaj uređaj preuzima sve iz vašeg računa. Hostovi koji su zadržani samo na ovom uređaju ostaju.",
|
||||
"link": "Poveži",
|
||||
"linking": "Povezivanje i pokretanje prvog sinkroniziranja...",
|
||||
"linked": "Povezano. Vaši se podaci sada sinkroniziraju.",
|
||||
"signedInAgain": "Prijavljeno. Sinkronizacija se ponovno pokreće."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Poslužitelji",
|
||||
"sshCredentials": "Vjerodajnice",
|
||||
"sshFolders": "Mape",
|
||||
"userPreferences": "Postavke",
|
||||
"pluginUserSettings": "Postavke dodataka",
|
||||
"sharedHosts": "Poslužitelji dijeljeni s vama",
|
||||
"sharedCredentials": "Vjerodajnice dijeljene s vama",
|
||||
"vaultProfiles": "Vault profili",
|
||||
"snippetFolders": "Mape isječaka",
|
||||
"snippets": "Isječci",
|
||||
"dashboardServiceLinks": "Veze usluga",
|
||||
"homepageItems": "Stavke početne stranice",
|
||||
"networkTopology": "Mrežna mapa",
|
||||
"workspaces": "Radne površine",
|
||||
"hostDefaults": "Zadane postavke poslužitelja",
|
||||
"hostDefaultsAdmin": "Zadane postavke poslužitelja na serveru",
|
||||
"aiProviders": "AI pružatelji",
|
||||
"homepageLayouts": "Rasporedi početne stranice",
|
||||
"accountProfile": "Profil računa"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Mapa {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Mreža",
|
||||
"listView": "Popis",
|
||||
"compactRows": "Kompaktni redovi",
|
||||
"comfortableRows": "Prostrani redovi"
|
||||
"comfortableRows": "Prostrani redovi",
|
||||
"columns": {
|
||||
"title": "Stupci",
|
||||
"auto": "Automatski",
|
||||
"count": "Širina: {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Spremljeno. Upišite za zamjenu."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Néhány bővítmény nem módosítható. Ezeket később javíthatja a Bővítmények fülön. Nyomja meg a Tovább gombot a folytatáshoz.",
|
||||
"pluginsApplyFailed": "Választásai nem menthetők. Próbálja újra, vagy folytassa, és módosítsa őket később a Bővítmények fülön.",
|
||||
"pluginsLoadFailed": "A bővítménylista nem tölthető be. Később választhat bővítményeket a Bővítmények fülön.",
|
||||
"presetTitle": "Mennyit szeretne látni a képernyőn?",
|
||||
"presetIntro": "Válassza ki, mennyi jelenjen meg a képernyőn.",
|
||||
"presetChangeLater": "Később váltogathat elrendezéseket vagy módosíthat bármelyik beállítást a Beállítások > Felület menüpontban.",
|
||||
"appearanceTitle": "Tegye személyessé",
|
||||
"appearanceIntro": "Válasszon témát, kiemelő színt, betűtípust és nyelvet. A változtatások azonnal megjelennek, és később módosíthatja őket a Beállításokban.",
|
||||
"securityTitle": "Fiókja biztonsága",
|
||||
"securityIntro": "Adjon hozzá passkey-t vagy hitelesítő alkalmazást a fiókjához. Ezt később is megteheti a Beállítások > Biztonság menüpontban.",
|
||||
"desktopTitle": "Hogyan szeretné használni a Termixet?",
|
||||
"desktopBody": "Ezt bármikor módosíthatja az oldalsáv Szinkronizálás menüpontjából.",
|
||||
"desktopLocalTitle": "Csak ezen az eszközön",
|
||||
"desktopLocalBody": "Minden itt tárolódik. Nincs mit beállítani.",
|
||||
"desktopLinkTitle": "A Termix szerveremmel",
|
||||
"desktopLinkBody": "Jelentkezzen be a szerverére, hogy ugyanazokat a hosztokat és beállításokat használja minden eszközön.",
|
||||
"desktopLinked": "Csatolva a(z) {{server}} szerverhez",
|
||||
"pluginsDocsLink": "Olvasson el többet mindegyikről"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "A Termix {{version}} verziója készen áll a telepítésre",
|
||||
"readyHint": "A következő újraindításkor települ."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Biztonságos mód",
|
||||
"description": "Csak a elrendezés- és témabővítmények futnak. Indítsa újra a szervert a TERMIX_SAFE_MODE nélkül, hogy a többit is újra bekapcsolja."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Panel bezárása",
|
||||
"moveSide": "Panel áthelyezése",
|
||||
"resize": "Panel átméretezése"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Főoldal",
|
||||
"terminal": "Terminál",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosztok",
|
||||
"credentials": "Hitelek",
|
||||
"connections": "Kapcsolatok",
|
||||
"sync": "Szinkronizálás",
|
||||
"reconnectDisconnectedTerminals": "Minden levált terminál újracsatlakoztatása",
|
||||
"reconnectingTerminals_one": "{{count}} terminál újracsatlakoztatása",
|
||||
"reconnectingTerminals_other": "{{count}} terminál újracsatlakoztatása",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Újrapróbálkozás",
|
||||
"refresh": "Frissítés",
|
||||
"optional": "Opcionális",
|
||||
"downloadSample": "Minta letöltése",
|
||||
"failedToDeleteHost": "Nem sikerült törölni: {{name}}",
|
||||
"importSkipExisting": "Importálás (létezők kihagyása)",
|
||||
"importSSHConfig": "Importálás SSH konfigurációból",
|
||||
"connectionDetails": "Kapcsolati adatok",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Nincs mappa)",
|
||||
"deleteSelected": "Törlés",
|
||||
"exitSelection": "Kijelölés megszüntése",
|
||||
"importSkip": "Importálás (létezők kihagyása)",
|
||||
"importOverwrite": "Importálás (felülírás)",
|
||||
"collapseBtn": "Összecsukás",
|
||||
"importExportBtn": "Importálás / Exportálás",
|
||||
"hostStatusesRefreshed": "A gazdagépek státuszai frissítve",
|
||||
"failedToRefreshHosts": "Nem sikerült frissíteni a gazdagépeket",
|
||||
"movedHostTo": "{{host}} áthelyezve a \"{{folder}}\" mappába",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "A(z) \"{{name}}\" és annak {{count}} hostjának törlése? Ez a művelet nem vonható vissza.",
|
||||
"deleteFolderConfirm_other": "A(z) \"{{name}}\" és annak {{count}} hostjának törlése? Ez a művelet nem vonható vissza.",
|
||||
"failedToMoveHosts": "A kiszolgálók áthelyezése sikertelen",
|
||||
"managedBanner": "Ezt a hosztot a {{plugin}} kezeli. A módosítást ott végezze el. Rögzítheti és átrendezheti.",
|
||||
"managedTooltip": "Kezelő: {{plugin}}",
|
||||
"addBlocked": "A hosztokat a {{plugin}} kezeli, így itt nem adhat hozzá újakat.",
|
||||
"failedToReorder": "Az átrendezés sikertelen",
|
||||
"expandAll": "Összes mappa kibontása",
|
||||
"collapseAll": "Összes mappa összecsukása",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Hitelesítő adat hozzáadása",
|
||||
"checkingHostStatuses": "Host állapotok ellenőrzése...",
|
||||
"pinnedSection": "Kitűzve",
|
||||
"hostsExported": "A hostok sikeresen exportálva",
|
||||
"export": {
|
||||
"menuItem": "Exportálás...",
|
||||
"title": "Hostok exportálása",
|
||||
"scope": "Tartomány",
|
||||
"scopeAll": "Összes",
|
||||
"scopeSelected": "Kijelöltek",
|
||||
"searchHosts": "Hostok keresése...",
|
||||
"include": "Befoglalás",
|
||||
"groupConnection": "Csatlakozás",
|
||||
"groupCredentials": "Hitelesítő adatok",
|
||||
"groupNotes": "Jegyzetek",
|
||||
"groupTags": "Címkék és kitűzés",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Átjáró hostok",
|
||||
"groupFeatureFlags": "Bővítménybeállítások",
|
||||
"groupAdvanced": "Haladó konfiguráció",
|
||||
"preview": "Előnézet",
|
||||
"moreHosts_one": "... még {{count}} host",
|
||||
"moreHosts_other": "... még {{count}} host",
|
||||
"summary": "{{selected}} / {{total}} host",
|
||||
"credentialsIncluded": "hitelesítő adatok beletartoznak",
|
||||
"credentialsExcluded": "hitelesítő adatok kizárva",
|
||||
"noneSelected": "Nincs kijelölt host",
|
||||
"cancel": "Mégse",
|
||||
"confirm": "Exportálás",
|
||||
"fetchFailed": "Nem sikerült betölteni a hostokat az exportáláshoz",
|
||||
"bulkButton": "Exportálás"
|
||||
},
|
||||
"sampleDownloaded": "Mintafile letöltve",
|
||||
"failedToDeleteCredential2": "Nem sikerült törölni a hitelesítő adatot",
|
||||
"noFolderOption": "(Nincs mappa)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Hoszt frissítése",
|
||||
"editorAdd": "Hoszt hozzáadása",
|
||||
"speedSearch": "Hosztok keresése. Nyilak a kiválasztáshoz, Enter a kapcsolódáshoz, Esc a bezáráshoz",
|
||||
"speedSearchList": "Hosztlista. Írj be valamit, vagy nyomj /-t a kereséshez.",
|
||||
"importNoHosts": "Nem találtam hosztokat a fájlban",
|
||||
"importTooMany": "Egyszerre legfeljebb {{max}} hosztot importálhatsz",
|
||||
"importSummary": "Importálás kész: {{imported}} importálva, {{updated}} frissítve, {{failed}} sikertelen",
|
||||
"importHostsFailed": "Nem sikerült importálni a hosztokat"
|
||||
"speedSearchList": "Hosztlista. Írj be valamit, vagy nyomj /-t a kereséshez."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Osztott képernyő",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Színválasztó megnyitása",
|
||||
"themeSystem": "Rendszer",
|
||||
"themeLight": "Világos",
|
||||
"themeDark": "Sötét",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Sötét"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Az alkalmazás teljes elrendezése. A témák és elrendezések bővítményekből származnak.",
|
||||
"defaultsLabel": "Alapértelmezett mindenkinek",
|
||||
"defaultsHint": "Amit a felhasználók látnak, amíg saját elrendezést vagy témát nem választanak.",
|
||||
"followDefault": "Alapértelmezett használata",
|
||||
"defaultSaved": "Alapértelmezett megjelenés mentve",
|
||||
"saveFailed": "A megjelenés nem menthető",
|
||||
"repair": {
|
||||
"title": "Ez az elrendezés nem jeleníthető meg",
|
||||
"safeTitle": "Biztonságos mód",
|
||||
"layout": "Elrendezés",
|
||||
"plugin": "Bővítmény",
|
||||
"reason": "Ok",
|
||||
"error": "Hiba",
|
||||
"noError": "Nincs hibaüzenet.",
|
||||
"copy": "Másolás",
|
||||
"copied": "Másolva",
|
||||
"copyFailed": "A részletek nem másolhatók",
|
||||
"retry": "Újrapróbál",
|
||||
"reset": "Visszaállítás az alapértelmezett megjelenésre",
|
||||
"resetEveryone": "Az alapértelmezett visszaállítása mindenkinek",
|
||||
"update": "{{name}} frissítése a {{version}} verzióra",
|
||||
"disable": "{{name}} kikapcsolása",
|
||||
"enable": "{{name}} bekapcsolása",
|
||||
"startAgain": "{{name}} újraindítása",
|
||||
"install": "Elrendezések és témák keresése",
|
||||
"installTitle": "Elrendezések és témák",
|
||||
"installButton": "Telepítés",
|
||||
"nothingToInstall": "Jelenleg nincs más elérhető elrendezés vagy téma.",
|
||||
"registryUnreachable": "A bővítményregiszter nem érhető el.",
|
||||
"askAdmin": "Kérjen meg egy rendszergazdát, hogy frissítse vagy javítsa ezt az elrendezést. Lent átállhat egy másik elrendezésre vagy témára saját magának.",
|
||||
"switchLayout": "Elrendezés váltása",
|
||||
"switchTheme": "Téma váltása",
|
||||
"saveFailed": "A választás nem menthető",
|
||||
"reasons": {
|
||||
"safe-url": "A cím biztonságos módot kért. Válasszon elrendezést lent, vagy távolítsa el a ?safe-layout=1 paramétert a címből.",
|
||||
"safe-env": "A szerver a TERMIX_SAFE_LAYOUT környezeti változóval indult, így mindenki ezt a képernyőt látja, amíg ezt el nem távolítják.",
|
||||
"missing": "Nincs telepített bővítmény, amely ezt az elrendezést biztosítaná.",
|
||||
"disabled": "A bővítmény, amely ezt az elrendezést biztosítja, kikapcsolva van.",
|
||||
"blocked": "A bővítmény, amely ezt az elrendezést biztosítja, valami szükséges dologra vár.",
|
||||
"incompatible": "A bővítmény, amely ezt az elrendezést biztosítja, nem működik ezzel a Termix-verzióval.",
|
||||
"failed": "Az elrendezés indítása sikertelen volt.",
|
||||
"crashed": "Az elrendezés kétszer összeomlott az alkalmazás rajzolása közben."
|
||||
},
|
||||
"noLayout": "Nincs beállított elrendezés",
|
||||
"restore": "A csomagolt {{name}} visszaállítása",
|
||||
"restoreFailed": "A csomagolt másolat nem állítható vissza"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Bejelentkezés kezelése",
|
||||
"consequence": "Bejelentkezési módszert, második hitelesítési tényezőt vagy SSH bejelentkezési típust adhat hozzá."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Bejelentkezési szabályok beállítása",
|
||||
"consequence": "Kijelentkezhet az inaktív felhasználókat, korlátozhatja a munkamenet hosszát, letilthatja az \"Emlékezz rám\" funkciót, és megkövetelhet egy második hitelesítési tényezőt."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "A hosztok elérési módjának kiválasztása",
|
||||
"consequence": "Az SSH-kapcsolatot a hoszthoz saját útvonalon keresztül viheti, így látja az összes oda-vissza küldött adatot, a jelszavakat is beleértve."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Szinkronizálás futtatása",
|
||||
"consequence": "Megválaszolhatja az összes szinkronizálási kérést, így látja azokat az adatokat, amelyeket az eszközök és szerverek szinkronizálnak."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Tanúsítványok kezelése",
|
||||
"consequence": "Cserélheti a Termix által HTTPS-en keresztül szolgáltatott tanúsítványt, és válaszolhat a tanúsítványkiadók domain ellenőrzéseire."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Soros és USB eszközök hozzáférése",
|
||||
"consequence": "Megnyithat egy fizikai soros portot azon a gépen, amelyen a Termix fut."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Hosztok exportálása titkaikkal együtt",
|
||||
"consequence": "Olvashatja a hosztokat teljes körűen, beleértve a mentett jelszavakat és kulcsokat, és továbbíthatja azokat. Minden exportálás felkerül az ellenőrzési naplóba."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Hosztok létrehozása és módosítása",
|
||||
"consequence": "Hosztokat adhat hozzá, és szerkesztheti a már meglévőket."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Ellenőrzési napló olvasása",
|
||||
"consequence": "Láthatja, ki mit és mikor csinált."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Portok válaszának ellenőrzése",
|
||||
"consequence": "Nyithat egy sima kapcsolatot bármely címre a szerverről, hogy ellenőrizze, elérhető-e."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Hoszt állapotának biztosítása",
|
||||
"consequence": "Minden hoszt online és offline pontjainak forrása lesz."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Legutóbbi tevékenység tárolása",
|
||||
"consequence": "Minden felhasználó legutóbbi tevékenységi listájának tárolója lesz."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Hostok kezelése csak olvashatóként",
|
||||
"consequence": "A kezelt hostokat senki más nem szerkesztheti, törölheti vagy újra megoszthatja."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Asztali ablakok megnyitása",
|
||||
"consequence": "Csak a Termix asztali alkalmazásban."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Ezen számítógép használata",
|
||||
"consequence": "Fájlokat olvashat és módosíthat, shellt futtathat és helyi portokat nyithat meg ezen a számítógépen. Csak a Termix asztali alkalmazásban."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Más felhasználók nevének használata",
|
||||
"consequence": "Háttérfolyamatokat futtathat egy másik felhasználó hozzáférésével, például ütemezett feladatokat. Minden használatot rögzít az ellenőrzési napló."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Saját képernyők hozzáadása",
|
||||
"consequence": "Fülek, panelek és beállítások, amelyeket később elrejthetsz."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Az egész alkalmazás elrendezésének felülírása",
|
||||
"consequence": "Ha kiválasztják, a kódja minden képernyőt kirajzol, beleértve a terminálokat és a beállításokat is."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Színtémák hozzáadása",
|
||||
"consequence": "Csak színek és stílusok. Egy téma nem futtat kódot."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Letiltva",
|
||||
"failed": "Váratlanul leállt",
|
||||
"blocked": "Várakozás egy másik bővítményre",
|
||||
"server": "A szerverén fut"
|
||||
"server": "A szerverén fut",
|
||||
"safeMode": "Kikapcsolva biztonságos módban"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Fut",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Legutóbb frissítve",
|
||||
"category": "Kategória"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Oszlopok",
|
||||
"auto": "Automatikus",
|
||||
"count": "{{count}} oszlop széles"
|
||||
},
|
||||
"table": {
|
||||
"name": "Név",
|
||||
"description": "Leírás",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Nem sikerült menteni a(z) {{name}} beállításait: {{error}}",
|
||||
"deleteData": "Nem sikerült törölni a(z) {{name}} adatait: {{error}}",
|
||||
"managedByServer": "Ez az asztali felület egy szerverhez van kapcsolva, amely meghatározza a bővítményeket.",
|
||||
"defaultLook": "A(z) {{name}} az alapértelmezett megjelenés, ezért kikapcsolható vagy cserélhető, de nem távolítható el.",
|
||||
"hasDependents": "A(z) {{name}} bővítményre szükség van a(z) {{list}} működéséhez. Először kapcsolja ki vagy távolítsa el azokat.",
|
||||
"missingDependencies": "A(z) {{name}} bővítménynek szüksége van a(z) {{list}} bővítményre, amely nincs telepítve.",
|
||||
"consentChanged": "Mióta megnézte, megváltozott, amit ez a bővítmény kér. Ellenőrizze újra a listát.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Nincs hozzáférése a szervereihez",
|
||||
"searchInstalled": "Telepítettek keresése",
|
||||
"searchPlugins": "Bővítmények keresése",
|
||||
"allCategories": "Összes",
|
||||
"nothingMatches": "Nincs találat.",
|
||||
"noneInstalled": "Még nincsenek telepített bővítmények. Böngésszen, és adjon hozzá néhányat.",
|
||||
"nothingHere": "Itt nincs semmi.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Dokumentáció",
|
||||
"envVars": "Környezeti változók",
|
||||
"envRequired": "Kötelező",
|
||||
"envDefault": "Alapértelmezett: {{value}}"
|
||||
"envDefault": "Alapértelmezett: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Elrendezések",
|
||||
"themes": "Témák",
|
||||
"tabs": "Fülek",
|
||||
"panels": "Oldalsáv paneljei",
|
||||
"dashboardCards": "Vezérlőpult kártyák",
|
||||
"protocols": "Csatlakozási típusok",
|
||||
"auth": "Bejelentkezési módszerek",
|
||||
"actions": "Műveletek",
|
||||
"hostCapability": "Host beállítások"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Típus",
|
||||
"allTypes": "Minden típus",
|
||||
"category": "Kategória",
|
||||
"allCategories": "Minden kategória",
|
||||
"results_one": "{{count}} bővítmény",
|
||||
"results_other": "{{count}} bővítmény",
|
||||
"remove": "Szűrő eltávolítása: {{name}}",
|
||||
"clear": "Szűrők törlése",
|
||||
"button": "Szűrők",
|
||||
"buttonCount": "Szűrők ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} / {{total}}",
|
||||
"page": "{{page}}. oldal / {{pages}} összesen",
|
||||
"previous": "Előző oldal",
|
||||
"next": "Következő oldal",
|
||||
"perPage": "{{count}} oldalanként",
|
||||
"perPageLabel": "Bővítmények oldalanként"
|
||||
},
|
||||
"showUnsupportedHint": "Ezek szerepelnek a listában, de még nincs kiadás, amely ezen a verzión futna. Frissítse a Termixet a telepítéshez.",
|
||||
"unsupported": "Újabb Termix verzió szükséges",
|
||||
"unsupportedHint": "Nincs olyan kiadása ennek a bővítménynek, amely ezen a Termix verzión futna. Frissítse a Termixet a telepítéshez.",
|
||||
"needsTermix": "Termix {{range}} szükséges",
|
||||
"showUnsupported": "Nem támogatottak megjelenítése ({{count}})",
|
||||
"showMore": "Még {{count}} megjelenítése ({{total}} hátralévő)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Nincs adat",
|
||||
"filter": "Szűrés..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} perce",
|
||||
"minutesAgo_other": "{{count}} perce",
|
||||
"hoursAgo_one": "{{count}} órája",
|
||||
"hoursAgo_other": "{{count}} órája",
|
||||
"pending_one": "{{count}} változás vár a szinkronizálásra",
|
||||
"pending_other": "{{count}} változás vár a szinkronizálásra",
|
||||
"proxy": {
|
||||
"headersTitle": "További fejlécek",
|
||||
"headersHint": "Minden kérésnél elküldésre kerül a szerver felé, például egy Cloudflare Access szolgáltatási token.",
|
||||
"headerName": "Fejléc neve",
|
||||
"headerValue": "Érték",
|
||||
"savedValue": "Mentve, gépeljen a módosításhoz",
|
||||
"addHeader": "Fejléc hozzáadása",
|
||||
"removeHeader": "Fejléc eltávolítása",
|
||||
"basicAuthTitle": "Felhasználónév és jelszó",
|
||||
"basicAuthHint": "Olyan proxyhoz, amely a Termix előtt kér felhasználónevet és jelszót.",
|
||||
"username": "Felhasználónév",
|
||||
"password": "Jelszó",
|
||||
"allowInvalidCertificate": "Önaláírt tanúsítvány megbízása",
|
||||
"allowInvalidCertificateHint": "Csak saját szerver esetén, ha annak tanúsítványa nem ismert hatóságtól származik."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Ez nem úgy néz ki, mint egy webcím.",
|
||||
"unreachable": "Nem sikerült elérni a szervert. Ellenőrizze a címet, és hogy a szerver fut-e.",
|
||||
"unreachableWithReason": "Nem sikerült elérni a szervert: {{reason}}",
|
||||
"tlsUntrusted": "A szerver tanúsítványa nem megbízható. Ha ez a saját szervert, amelyik saját aláírással rendelkezik, kapcsolja be az alábbi lehetőséget.",
|
||||
"basicAuthRequired": "A szerver előtt található valami felhasználónevet és jelszót kér. Adja meg az alábbiakban.",
|
||||
"proxyLogin": "Bejelentkezési oldal vagy proxy válaszolt a Termix helyett. Adja meg az alábbiakban a szükséges fejléceket, vagy ellenőrizze a címet.",
|
||||
"notTermix": "Nincs Termix szerver ezen a címen. Ha egy útvonal alatt fut, adja meg azt is, például https://example.com/termix.",
|
||||
"versionMismatch": "Ez a szerver egy régebbi Termix verziót futtat. Frissítse 2.9 vagy újabb verzióra a kapcsolathoz.",
|
||||
"differentAccount": "Egy másik fiókba jelentkezett be. Jelentkezzen be abba a fiókba, amelyikhez ez az eszköz van kapcsolva, vagy először bontsa a kapcsolatot."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Kapcsolódás egy Termix szerverhez",
|
||||
"reloginTitle": "Újra bejelentkezés",
|
||||
"savedServers": "Legutóbbi szerverek",
|
||||
"removeServer": "Eltávolítás a listából",
|
||||
"serverDescription": "Adja meg azt a címet, amelyet a böngészőben a Termix megnyitásához használ.",
|
||||
"signinDescription": "Bejelentkezés ide: {{url}}",
|
||||
"chooseDescription": "Ezen az eszközön már vannak adatok. Mit tegyünk velük?",
|
||||
"finishingDescription": "Az eszköz összekapcsolása folyamatban.",
|
||||
"serverUrl": "Szervercím",
|
||||
"serverUrlHint": "Például: https://termix.example.com",
|
||||
"showProxySettings": "Fordított proxy beállításai",
|
||||
"hideProxySettings": "Fordított proxy beállításainak elrejtése",
|
||||
"continue": "Tovább",
|
||||
"back": "Vissza",
|
||||
"mergeTitle": "Hozzáadása a fiókhoz",
|
||||
"mergeBody_one": "Az eszközön lévő elem hozzáadásra kerül a fiókhoz. A fiókban már meglévő elemek változatlanul maradnak a szerveren.",
|
||||
"mergeBody_other": "Az eszközön lévő {{count}} elem hozzáadásra kerül a fiókhoz. A fiókban már meglévő elemek változatlanul maradnak a szerveren.",
|
||||
"replaceTitle": "Csere a fiókból származóval",
|
||||
"replaceBody_one": "Az eszközön lévő elem törlésre kerül, és az eszköz átvállalja a fiók összes adatát. Azok a hostok, amelyeket csak ezen az eszközön tartottál meg, megmaradnak.",
|
||||
"replaceBody_other": "Az eszközön lévő {{count}} elem törlésre kerül, és az eszköz átvállalja a fiók összes adatát. Azok a hostok, amelyeket csak ezen az eszközön tartottál meg, megmaradnak.",
|
||||
"link": "Összekötés",
|
||||
"linking": "Összekötés és az első szinkronizálás futtatása...",
|
||||
"linked": "Összekötve. Az adataid szinkronizálódnak.",
|
||||
"signedInAgain": "Bejelentkezve. A szinkronizálás újra fut."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Gazdagépek",
|
||||
"sshCredentials": "Hitelesítő adatok",
|
||||
"sshFolders": "Mappák",
|
||||
"userPreferences": "Beállítások",
|
||||
"pluginUserSettings": "Bővítménybeállítások",
|
||||
"sharedHosts": "Önnel megosztott gazdagépek",
|
||||
"sharedCredentials": "Önnel megosztott hitelesítő adatok",
|
||||
"vaultProfiles": "Vault-profilok",
|
||||
"snippetFolders": "Kódrészlet-mappák",
|
||||
"snippets": "Kódrészletek",
|
||||
"dashboardServiceLinks": "Szolgáltatás-hivatkozások",
|
||||
"homepageItems": "Főoldal-elemek",
|
||||
"networkTopology": "Hálózati térkép",
|
||||
"workspaces": "Munkaterületek",
|
||||
"hostDefaults": "Gazdagép alapértelmezései",
|
||||
"hostDefaultsAdmin": "Szerveri gazdagép-alapértelmezések",
|
||||
"aiProviders": "AI-szolgáltatók",
|
||||
"homepageLayouts": "Főoldal-elrendezések",
|
||||
"accountProfile": "Fiókprofil"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Mappa: {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Rács",
|
||||
"listView": "Lista",
|
||||
"compactRows": "Kompakt sorok",
|
||||
"comfortableRows": "Kényelmes sorok"
|
||||
"comfortableRows": "Kényelmes sorok",
|
||||
"columns": {
|
||||
"title": "Oszlopok",
|
||||
"auto": "Automatikus",
|
||||
"count": "{{count}} oszlop széles"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Mentve. Írjon be új értéket a helyettesítéshez."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Beberapa plugin tidak dapat diubah. Anda dapat memperbaikinya nanti dari tab Plugin. Tekan Lanjut untuk melanjutkan.",
|
||||
"pluginsApplyFailed": "Pilihan Anda tidak dapat disimpan. Coba lagi, atau lanjutkan dan ubah nanti dari tab Plugin.",
|
||||
"pluginsLoadFailed": "Daftar plugin tidak dapat dimuat. Anda dapat memilih plugin nanti dari tab Plugin.",
|
||||
"presetTitle": "Seberapa banyak yang ingin Anda tampilkan di layar?",
|
||||
"presetIntro": "Pilih seberapa banyak yang ditampilkan di layar.",
|
||||
"presetChangeLater": "Anda dapat mengganti preset atau mengubah pengaturan individual kapan saja di Pengaturan, di bawah Antarmuka.",
|
||||
"appearanceTitle": "Sesuaikan dengan gaya Anda",
|
||||
"appearanceIntro": "Pilih tema, warna aksen, font, dan bahasa Anda. Perubahan akan langsung terlihat, dan Anda dapat mengubahnya nanti di Pengaturan.",
|
||||
"securityTitle": "Amankan akun Anda",
|
||||
"securityIntro": "Tambahkan passkey atau aplikasi autentikator ke akun Anda. Anda juga dapat melakukan ini nanti di Pengaturan, di bawah Keamanan.",
|
||||
"desktopTitle": "Bagaimana Anda ingin menggunakan Termix?",
|
||||
"desktopBody": "Anda dapat mengubah ini kapan saja dari Sinkronisasi di sidebar.",
|
||||
"desktopLocalTitle": "Hanya di perangkat ini",
|
||||
"desktopLocalBody": "Semuanya disimpan di sini. Tidak perlu pengaturan.",
|
||||
"desktopLinkTitle": "Dengan server Termix saya",
|
||||
"desktopLinkBody": "Masuk ke server Anda untuk menggunakan host dan pengaturan yang sama di setiap perangkat.",
|
||||
"desktopLinked": "Terhubung ke {{server}}",
|
||||
"pluginsDocsLink": "Baca tentang masing-masing"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} siap untuk diinstal",
|
||||
"readyHint": "Ini akan diinstal saat Termix dimulai ulang berikutnya."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Mode aman",
|
||||
"description": "Hanya plugin tata letak dan tema yang berjalan. Mulai ulang server tanpa TERMIX_SAFE_MODE untuk mengaktifkan kembali yang lainnya."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Tutup panel",
|
||||
"moveSide": "Pindahkan panel",
|
||||
"resize": "Ubah ukuran panel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Beranda",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Host",
|
||||
"credentials": "Kredensial",
|
||||
"connections": "Koneksi",
|
||||
"sync": "Sinkronisasi",
|
||||
"reconnectDisconnectedTerminals": "Hubungkan ulang semua terminal yang terputus",
|
||||
"reconnectingTerminals_other": "Menghubungkan ulang {{count}} terminal",
|
||||
"noDisconnectedTerminals": "Tidak ada terminal yang terputus dan siap untuk dihubungkan ulang",
|
||||
@@ -276,10 +272,7 @@
|
||||
"retry": "Coba Lagi",
|
||||
"refresh": "Segarkan",
|
||||
"optional": "Opsional",
|
||||
"downloadSample": "Unduh Contoh",
|
||||
"failedToDeleteHost": "Gagal menghapus {{name}}",
|
||||
"importSkipExisting": "Impor (lewatkan yang sudah ada)",
|
||||
"importSSHConfig": "Impor dari konfigurasi SSH",
|
||||
"connectionDetails": "Detail Koneksi",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -497,10 +490,7 @@
|
||||
"noFolder": "(Tidak ada folder)",
|
||||
"deleteSelected": "Hapus",
|
||||
"exitSelection": "Keluar dari pemilihan",
|
||||
"importSkip": "Impor (lewatkan yang sudah ada)",
|
||||
"importOverwrite": "Impor (timpa)",
|
||||
"collapseBtn": "Ciutkan",
|
||||
"importExportBtn": "Impor / Ekspor",
|
||||
"hostStatusesRefreshed": "Status host diperbarui",
|
||||
"failedToRefreshHosts": "Gagal memperbarui host",
|
||||
"movedHostTo": "Memindahkan {{host}} ke \"{{folder}}\"",
|
||||
@@ -553,6 +543,9 @@
|
||||
"folderDeleted": "Folder \"{{name}}\" dihapus",
|
||||
"deleteFolderConfirm_other": "Hapus \"{{name}}\" dan {{count}} host di dalamnya? Tindakan ini tidak dapat dibatalkan.",
|
||||
"failedToMoveHosts": "Gagal memindahkan host",
|
||||
"managedBanner": "Host ini dikelola oleh {{plugin}}. Ubah pengaturan di sana. Anda masih bisa menancapkan dan mengubah urutannya.",
|
||||
"managedTooltip": "Dikelola oleh {{plugin}}",
|
||||
"addBlocked": "Host dikelola oleh {{plugin}}, jadi host baru tidak dapat ditambahkan di sini.",
|
||||
"failedToReorder": "Gagal mengurutkan ulang",
|
||||
"expandAll": "Bentangkan semua folder",
|
||||
"collapseAll": "Ciutkan semua folder",
|
||||
@@ -662,34 +655,6 @@
|
||||
"addCredentialBtn2": "Tambah Kredensial",
|
||||
"checkingHostStatuses": "Memeriksa status host...",
|
||||
"pinnedSection": "Disematkan",
|
||||
"hostsExported": "Host berhasil diekspor",
|
||||
"export": {
|
||||
"menuItem": "Ekspor...",
|
||||
"title": "Ekspor host",
|
||||
"scope": "Lingkup",
|
||||
"scopeAll": "Semua",
|
||||
"scopeSelected": "Dipilih",
|
||||
"searchHosts": "Cari host...",
|
||||
"include": "Sertakan",
|
||||
"groupConnection": "Koneksi",
|
||||
"groupCredentials": "Kredensial",
|
||||
"groupNotes": "Catatan",
|
||||
"groupTags": "Tag & sematan",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump host",
|
||||
"groupFeatureFlags": "Pengaturan plugin",
|
||||
"groupAdvanced": "Konfigurasi lanjutan",
|
||||
"preview": "Pratinjau",
|
||||
"moreHosts_other": "... {{count}} host lainnya",
|
||||
"summary": "{{selected}} dari {{total}} host",
|
||||
"credentialsIncluded": "kredensial disertakan",
|
||||
"credentialsExcluded": "kredensial tidak disertakan",
|
||||
"noneSelected": "Tidak ada host yang dipilih",
|
||||
"cancel": "Batal",
|
||||
"confirm": "Ekspor",
|
||||
"fetchFailed": "Gagal memuat host untuk diekspor",
|
||||
"bulkButton": "Ekspor"
|
||||
},
|
||||
"sampleDownloaded": "File contoh berhasil diunduh",
|
||||
"failedToDeleteCredential2": "Gagal menghapus kredensial",
|
||||
"noFolderOption": "(Tidak ada folder)",
|
||||
@@ -847,11 +812,7 @@
|
||||
"editorUpdate": "Perbarui Host",
|
||||
"editorAdd": "Tambah Host",
|
||||
"speedSearch": "Cari host. Tombol panah untuk memilih, Enter untuk terhubung, Esc untuk menutup",
|
||||
"speedSearchList": "Daftar host. Ketik atau tekan / untuk mencari.",
|
||||
"importNoHosts": "Tidak ada host ditemukan di file",
|
||||
"importTooMany": "Anda dapat mengimpor hingga {{max}} host sekaligus",
|
||||
"importSummary": "Impor selesai: {{imported}} diimpor, {{updated}} diperbarui, {{failed}} gagal",
|
||||
"importHostsFailed": "Gagal mengimpor host"
|
||||
"speedSearchList": "Daftar host. Ketik atau tekan / untuk mencari."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Layar terbagi",
|
||||
@@ -1046,9 +1007,14 @@
|
||||
"hostCount_other": "{{count}} host"
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} pengguna",
|
||||
"rolesCount_one": "{{count}} peran",
|
||||
"apiKeysCount_one": "{{count}} kunci",
|
||||
"sessionsActive_one": "{{count}} aktif",
|
||||
"hostsCount_other": "{{count}} host",
|
||||
"credentialsCount_other": "{{count}} kredensial",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} izin",
|
||||
"groups": {
|
||||
"hosts": "Host",
|
||||
"credentials": "Kredensial",
|
||||
@@ -1088,20 +1054,63 @@
|
||||
"interfaceFontLabel": "Font Antarmuka",
|
||||
"interfaceFontDescription": "Mengubah font antarmuka aplikasi. Profil terminal tetap menggunakan pengaturan font masing-masing.",
|
||||
"accentColorLabel": "Warna Aksen",
|
||||
"apiKeyCount_one": "{{count}} kunci",
|
||||
"colorPickerTooltip": "Buka pemilih warna",
|
||||
"themeSystem": "Sistem",
|
||||
"themeLight": "Terang",
|
||||
"themeDark": "Gelap",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Gelap"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Cara tata letak seluruh aplikasi. Tema dan tata letak berasal dari plugin.",
|
||||
"defaultsLabel": "Default untuk semua orang",
|
||||
"defaultsHint": "Apa yang dilihat pengguna hingga mereka memilih tata letak atau tema sendiri.",
|
||||
"followDefault": "Gunakan default",
|
||||
"defaultSaved": "Tampilan default disimpan",
|
||||
"saveFailed": "Gagal menyimpan tampilan",
|
||||
"repair": {
|
||||
"title": "Tata letak ini tidak dapat ditampilkan",
|
||||
"safeTitle": "Mode aman",
|
||||
"layout": "Tata letak",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Alasan",
|
||||
"error": "Kesalahan",
|
||||
"noError": "Tidak ada pesan kesalahan.",
|
||||
"copy": "Salin",
|
||||
"copied": "Disalin",
|
||||
"copyFailed": "Gagal menyalin detail",
|
||||
"retry": "Coba lagi",
|
||||
"reset": "Atur ulang ke tampilan default",
|
||||
"resetEveryone": "Atur ulang default untuk semua orang",
|
||||
"update": "Perbarui {{name}} ke {{version}}",
|
||||
"disable": "Matikan {{name}}",
|
||||
"enable": "Aktifkan {{name}}",
|
||||
"startAgain": "Mulai ulang {{name}}",
|
||||
"install": "Cari tata letak dan tema",
|
||||
"installTitle": "Tata letak dan tema",
|
||||
"installButton": "Instal",
|
||||
"nothingToInstall": "Tidak ada tata letak atau tema lain yang tersedia saat ini.",
|
||||
"registryUnreachable": "Daftar plugin tidak dapat dijangkau.",
|
||||
"askAdmin": "Minta admin untuk memperbarui atau memperbaiki tata letak ini. Anda dapat beralih ke tata letak atau tema lain untuk diri Anda sendiri di bawah ini.",
|
||||
"switchLayout": "Beralih tata letak",
|
||||
"switchTheme": "Beralih tema",
|
||||
"saveFailed": "Gagal menyimpan pilihan Anda",
|
||||
"reasons": {
|
||||
"safe-url": "Alamat meminta mode aman. Pilih tata letak di bawah, atau hapus ?safe-layout=1 dari alamat.",
|
||||
"safe-env": "Server dimulai dengan TERMIX_SAFE_LAYOUT, jadi semua orang melihat layar ini hingga dihapus.",
|
||||
"missing": "Tidak ada plugin terinstal yang menyediakan tata letak ini.",
|
||||
"disabled": "Plugin yang menyediakan tata letak ini dimatikan.",
|
||||
"blocked": "Plugin yang menyediakan tata letak ini sedang menunggu sesuatu yang dibutuhkannya.",
|
||||
"incompatible": "Plugin yang menyediakan tata letak ini tidak kompatibel dengan versi Termix ini.",
|
||||
"failed": "Tata letak gagal dimulai.",
|
||||
"crashed": "Tata letak mengalami crash dua kali saat merender aplikasi."
|
||||
},
|
||||
"noLayout": "Tidak ada tata letak yang diatur",
|
||||
"restore": "Pulihkan {{name}} bawaan",
|
||||
"restoreFailed": "Gagal memulihkan salinan bawaan"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1124,6 +1133,18 @@
|
||||
"title": "Menangani masuk",
|
||||
"consequence": "Plugin ini dapat menambahkan metode login, faktor kedua, atau jenis masuk SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Atur aturan masuk",
|
||||
"consequence": "Plugin ini dapat mengeluarkan pengguna saat tidak aktif, membatasi durasi sesi, menonaktifkan fitur 'ingat saya', dan memerlukan faktor kedua."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Pilih cara host dijangkau",
|
||||
"consequence": "Plugin ini dapat membawa koneksi SSH ke host melalui rute sendiri, sehingga dapat melihat semua data yang dikirim ke dan dari host tersebut, termasuk kata sandi."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Jalankan sinkronisasi",
|
||||
"consequence": "Plugin ini dapat menjawab semua permintaan sinkronisasi, sehingga dapat melihat data yang disinkronkan oleh perangkat dan server."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Mengelola sertifikat",
|
||||
"consequence": "Plugin ini dapat mengganti sertifikat yang disajikan Termix melalui HTTPS dan menjawab pemeriksaan domain dari otoritas sertifikat."
|
||||
@@ -1132,6 +1153,10 @@
|
||||
"title": "Mengakses perangkat serial dan USB",
|
||||
"consequence": "Plugin ini dapat membuka port serial fisik di mesin yang menjalankan Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Ekspor host beserta rahasia mereka",
|
||||
"consequence": "Dapat membaca semua host Anda secara lengkap, termasuk kata sandi dan kunci yang disimpan, serta membagikannya. Setiap ekspor dicatat dalam log audit."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Membuat dan mengubah host",
|
||||
"consequence": "Plugin ini dapat menambahkan host dan mengedit host yang sudah Anda miliki."
|
||||
@@ -1176,10 +1201,30 @@
|
||||
"title": "Membaca log audit",
|
||||
"consequence": "Plugin ini dapat melihat siapa yang melakukan apa dan kapan."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Periksa respons port",
|
||||
"consequence": "Dapat membuka koneksi biasa ke alamat apa pun dari server, untuk melihat apakah alamat tersebut dapat dijangkau."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Sediakan status host",
|
||||
"consequence": "Menjadi sumber titik online dan offline untuk setiap host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Simpan aktivitas terbaru",
|
||||
"consequence": "Menjadi penyimpanan untuk daftar aktivitas terbaru setiap pengguna."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Kelola host sebagai baca saja",
|
||||
"consequence": "Host yang dikelolanya tidak dapat diedit, dihapus, atau dibagikan ulang oleh siapa pun."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Membuka jendela desktop",
|
||||
"consequence": "Hanya di aplikasi desktop Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Gunakan komputer ini",
|
||||
"consequence": "Dapat membaca dan mengubah file, menjalankan shell, dan membuka port lokal di komputer ini. Hanya di aplikasi desktop Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Bertindak sebagai pengguna lain",
|
||||
"consequence": "Menjalankan pekerjaan latar belakang dengan akses pengguna lain, seperti pekerjaan terjadwal. Setiap penggunaan dicatat di log audit."
|
||||
@@ -1219,6 +1264,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Menambahkan layar miliknya sendiri",
|
||||
"consequence": "Tab, panel, dan pengaturan yang dapat disembunyikan nanti."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Ganti seluruh tata letak aplikasi",
|
||||
"consequence": "Ketika dipilih, kodenya menggambar setiap layar, termasuk terminal dan pengaturan Anda."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Tambahkan tema warna",
|
||||
"consequence": "Hanya warna dan gaya. Tidak ada kode yang dijalankan untuk tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1245,7 +1298,8 @@
|
||||
"disabled": "Dinonaktifkan",
|
||||
"failed": "Berhenti secara tak terduga",
|
||||
"blocked": "Menunggu plugin lain",
|
||||
"server": "Berjalan di server Anda"
|
||||
"server": "Berjalan di server Anda",
|
||||
"safeMode": "Nonaktif di mode aman"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Berjalan",
|
||||
@@ -1259,11 +1313,6 @@
|
||||
"updated": "Baru diperbarui",
|
||||
"category": "Kategori"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Kolom",
|
||||
"auto": "Otomatis",
|
||||
"count": "Lebar {{count}}"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nama",
|
||||
"description": "Deskripsi",
|
||||
@@ -1336,6 +1385,7 @@
|
||||
"options": "Tidak dapat menyimpan opsi untuk {{name}}: {{error}}",
|
||||
"deleteData": "Tidak dapat menghapus data untuk {{name}}: {{error}}",
|
||||
"managedByServer": "Desktop ini terhubung ke server, yang menentukan pluginnya.",
|
||||
"defaultLook": "{{name}} adalah tampilan default, sehingga dapat dimatikan atau diganti tetapi tidak dapat dihapus.",
|
||||
"hasDependents": "{{name}} dibutuhkan oleh {{list}}. Matikan atau hapus instalasi mereka terlebih dahulu.",
|
||||
"missingDependencies": "{{name}} membutuhkan {{list}}, yang belum terinstal.",
|
||||
"consentChanged": "Apa yang diminta plugin ini telah berubah sejak Anda terakhir melihat. Periksa daftar lagi.",
|
||||
@@ -1401,7 +1451,6 @@
|
||||
"noServerAccess": "Tidak ada akses ke server Anda",
|
||||
"searchInstalled": "Cari yang terpasang",
|
||||
"searchPlugins": "Cari plugin",
|
||||
"allCategories": "Semua",
|
||||
"nothingMatches": "Tidak ada yang cocok.",
|
||||
"noneInstalled": "Belum ada plugin terpasang. Jelajahi untuk menambahkan beberapa.",
|
||||
"nothingHere": "Tidak ada di sini.",
|
||||
@@ -1487,7 +1536,43 @@
|
||||
"documentation": "Dokumentasi",
|
||||
"envVars": "Variabel lingkungan",
|
||||
"envRequired": "Wajib",
|
||||
"envDefault": "Bawaan: {{value}}"
|
||||
"envDefault": "Bawaan: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Tata letak",
|
||||
"themes": "Tema",
|
||||
"tabs": "Tab",
|
||||
"panels": "Panel bilah sisi",
|
||||
"dashboardCards": "Kartu dasbor",
|
||||
"protocols": "Jenis koneksi",
|
||||
"auth": "Metode masuk",
|
||||
"actions": "Tindakan",
|
||||
"hostCapability": "Pengaturan host"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Jenis",
|
||||
"allTypes": "Semua jenis",
|
||||
"category": "Kategori",
|
||||
"allCategories": "Semua kategori",
|
||||
"results_other": "{{count}} plugin",
|
||||
"remove": "Hapus filter {{name}}",
|
||||
"clear": "Hapus filter",
|
||||
"button": "Filter",
|
||||
"buttonCount": "Filter ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} dari {{total}}",
|
||||
"page": "Halaman {{page}} dari {{pages}}",
|
||||
"previous": "Halaman sebelumnya",
|
||||
"next": "Halaman berikutnya",
|
||||
"perPage": "{{count}} per halaman",
|
||||
"perPageLabel": "Plugin per halaman"
|
||||
},
|
||||
"showUnsupportedHint": "Ini terdaftar tetapi belum ada rilis yang berjalan di versi ini. Perbarui Termix untuk menginstalnya.",
|
||||
"unsupported": "Membutuhkan Termix yang lebih baru",
|
||||
"unsupportedHint": "Tidak ada rilis plugin ini yang berjalan di versi Termix ini. Perbarui Termix untuk menginstalnya.",
|
||||
"needsTermix": "Membutuhkan Termix {{range}}",
|
||||
"showUnsupported": "Tampilkan yang tidak didukung ({{count}})",
|
||||
"showMore": "Tampilkan {{count}} lagi ({{total}} tersisa)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1503,82 +1588,6 @@
|
||||
"noData": "Tidak ada data",
|
||||
"filter": "Filter..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_other": "{{count}} menit yang lalu",
|
||||
"hoursAgo_other": "{{count}} jam yang lalu",
|
||||
"pending_other": "{{count}} perubahan menunggu sinkronisasi",
|
||||
"proxy": {
|
||||
"headersTitle": "Header tambahan",
|
||||
"headersHint": "Dikirim dengan setiap permintaan ke server, misalnya token layanan Cloudflare Access.",
|
||||
"headerName": "Nama header",
|
||||
"headerValue": "Nilai",
|
||||
"savedValue": "Tersimpan, ketik untuk mengubah",
|
||||
"addHeader": "Tambahkan header",
|
||||
"removeHeader": "Hapus header",
|
||||
"basicAuthTitle": "Nama pengguna dan kata sandi",
|
||||
"basicAuthHint": "Untuk proxy yang meminta nama pengguna dan kata sandi sebelum Termix.",
|
||||
"username": "Nama pengguna",
|
||||
"password": "Kata sandi",
|
||||
"allowInvalidCertificate": "Percayai sertifikat yang ditandatangani sendiri",
|
||||
"allowInvalidCertificateHint": "Hanya untuk server Anda sendiri, ketika sertifikatnya tidak berasal dari otoritas yang dikenal."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Itu tidak terlihat seperti alamat web.",
|
||||
"unreachable": "Tidak dapat menghubungi server. Periksa alamat dan pastikan server sedang berjalan.",
|
||||
"unreachableWithReason": "Tidak dapat menghubungi server: {{reason}}",
|
||||
"tlsUntrusted": "Sertifikat server tidak dipercaya. Jika ini adalah server Anda sendiri dengan sertifikat yang ditandatangani sendiri, aktifkan opsi di bawah.",
|
||||
"basicAuthRequired": "Ada sesuatu di depan server yang meminta nama pengguna dan kata sandi. Masukkan di bawah.",
|
||||
"proxyLogin": "Halaman login atau proxy menjawab alih-alih Termix. Tambahkan header yang diperlukan di bawah, atau periksa alamatnya.",
|
||||
"notTermix": "Tidak ada server Termix di alamat tersebut. Jika berjalan di bawah jalur tertentu, sertakan jalur tersebut, seperti https://example.com/termix.",
|
||||
"versionMismatch": "Server tersebut menjalankan Termix versi lama. Perbarui ke versi 2.9 atau lebih baru untuk terhubung.",
|
||||
"differentAccount": "Anda masuk ke akun yang berbeda. Masuk ke akun yang terhubung dengan perangkat ini, atau putuskan hubungan terlebih dahulu."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Hubungkan ke server Termix",
|
||||
"reloginTitle": "Masuk kembali",
|
||||
"savedServers": "Server terbaru",
|
||||
"removeServer": "Hapus dari daftar",
|
||||
"serverDescription": "Masukkan alamat yang Anda gunakan untuk membuka Termix di browser Anda.",
|
||||
"signinDescription": "Masuk ke {{url}}",
|
||||
"chooseDescription": "Perangkat ini sudah memiliki data. Apa yang harus dilakukan dengannya?",
|
||||
"finishingDescription": "Menghubungkan perangkat ini.",
|
||||
"serverUrl": "Alamat server",
|
||||
"serverUrlHint": "Misalnya https://termix.example.com",
|
||||
"showProxySettings": "Pengaturan reverse proxy",
|
||||
"hideProxySettings": "Sembunyikan pengaturan reverse proxy",
|
||||
"continue": "Lanjutkan",
|
||||
"back": "Kembali",
|
||||
"mergeTitle": "Tambahkan ke akun saya",
|
||||
"mergeBody_other": "{{count}} item di perangkat ini ditambahkan ke akun Anda. Item yang sudah ada di akun Anda tetap seperti semula di server.",
|
||||
"replaceTitle": "Ganti dengan akun saya",
|
||||
"replaceBody_other": "{{count}} item di perangkat ini dihapus, dan perangkat ini mengambil semua dari akun Anda. Host yang hanya disimpan di perangkat ini tetap ada.",
|
||||
"link": "Hubungkan",
|
||||
"linking": "Menghubungkan dan menjalankan sinkronisasi pertama...",
|
||||
"linked": "Terhubung. Data Anda sedang disinkronkan.",
|
||||
"signedInAgain": "Berhasil masuk. Sinkronisasi berjalan kembali."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Host",
|
||||
"sshCredentials": "Kredensial",
|
||||
"sshFolders": "Folder",
|
||||
"userPreferences": "Preferensi",
|
||||
"pluginUserSettings": "Pengaturan plugin",
|
||||
"sharedHosts": "Host yang dibagikan kepada Anda",
|
||||
"sharedCredentials": "Kredensial yang dibagikan kepada Anda",
|
||||
"vaultProfiles": "Profil Vault",
|
||||
"snippetFolders": "Folder snippet",
|
||||
"snippets": "Snippet",
|
||||
"dashboardServiceLinks": "Tautan layanan",
|
||||
"homepageItems": "Item beranda",
|
||||
"networkTopology": "Peta jaringan",
|
||||
"workspaces": "Ruang kerja",
|
||||
"hostDefaults": "Pengaturan default host",
|
||||
"hostDefaultsAdmin": "Pengaturan default host server",
|
||||
"aiProviders": "Penyedia AI",
|
||||
"homepageLayouts": "Tata letak beranda",
|
||||
"accountProfile": "Profil akun"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Folder {{name}}",
|
||||
@@ -1603,7 +1612,12 @@
|
||||
"gridView": "Grid",
|
||||
"listView": "Daftar",
|
||||
"compactRows": "Baris ringkas",
|
||||
"comfortableRows": "Baris nyaman"
|
||||
"comfortableRows": "Baris nyaman",
|
||||
"columns": {
|
||||
"title": "Kolom",
|
||||
"auto": "Otomatis",
|
||||
"count": "Lebar {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Tersimpan. Ketik untuk menggantinya."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Alcuni plugin non possono essere modificati. Puoi correggerli più tardi dalla scheda Plugin. Premi Avanti per continuare.",
|
||||
"pluginsApplyFailed": "Le tue scelte non possono essere salvate. Riprova o continua e modificali più tardi dalla scheda Plugin.",
|
||||
"pluginsLoadFailed": "L'elenco dei plugin non può essere caricato. Puoi scegliere i plugin più tardi dalla scheda Plugin.",
|
||||
"presetTitle": "Quanto vuoi vedere a schermo?",
|
||||
"presetIntro": "Scegli quanto mostrare a schermo.",
|
||||
"presetChangeLater": "Puoi cambiare preset o modificare qualsiasi impostazione singola in seguito in Impostazioni, sotto Interfaccia.",
|
||||
"appearanceTitle": "Personalizzalo",
|
||||
"appearanceIntro": "Scegli un tema, un colore di accento, un font e la tua lingua. Le modifiche sono immediate e puoi modificarle in seguito in Impostazioni.",
|
||||
"securityTitle": "Proteggi il tuo account",
|
||||
"securityIntro": "Aggiungi una passkey o un'app di autenticazione al tuo account. Puoi farlo anche in seguito in Impostazioni, sotto Sicurezza.",
|
||||
"desktopTitle": "Come vuoi usare Termix?",
|
||||
"desktopBody": "Puoi modificare questa impostazione in qualsiasi momento da Sync nella barra laterale.",
|
||||
"desktopLocalTitle": "Solo su questo dispositivo",
|
||||
"desktopLocalBody": "Tutto è memorizzato qui. Niente da configurare.",
|
||||
"desktopLinkTitle": "Con il mio server Termix",
|
||||
"desktopLinkBody": "Accedi al tuo server per usare gli stessi host e le stesse impostazioni su ogni dispositivo.",
|
||||
"desktopLinked": "Collegato a {{server}}",
|
||||
"pluginsDocsLink": "Leggi la descrizione di ciascuno"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} è pronto per l'installazione",
|
||||
"readyHint": "Verrà installato al prossimo riavvio di Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Modalità sicura",
|
||||
"description": "Sono attivi solo i plugin per layout e temi. Riavvia il server senza TERMIX_SAFE_MODE per riattivare gli altri."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Chiudi pannello",
|
||||
"moveSide": "Sposta pannello",
|
||||
"resize": "Ridimensiona pannello"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Home",
|
||||
"terminal": "Terminale",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Host",
|
||||
"credentials": "Credenziali",
|
||||
"connections": "Connessioni",
|
||||
"sync": "Sincronizza",
|
||||
"reconnectDisconnectedTerminals": "Riconnetti tutti i terminali disconnessi",
|
||||
"reconnectingTerminals_one": "Riconnessione di {{count}} terminale",
|
||||
"reconnectingTerminals_many": "Riconnessione di {{count}} terminali",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Riprova",
|
||||
"refresh": "Aggiorna",
|
||||
"optional": "Opzionale",
|
||||
"downloadSample": "Scarica esempio",
|
||||
"failedToDeleteHost": "Eliminazione di {{name}} non riuscita",
|
||||
"importSkipExisting": "Importa (salta quelli esistenti)",
|
||||
"importSSHConfig": "Importa dalla configurazione SSH",
|
||||
"connectionDetails": "Dettagli connessione",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Nessuna cartella)",
|
||||
"deleteSelected": "Elimina",
|
||||
"exitSelection": "Esci dalla selezione",
|
||||
"importSkip": "Importa (salta esistenti)",
|
||||
"importOverwrite": "Importa (sovrascrivi)",
|
||||
"collapseBtn": "Comprimi",
|
||||
"importExportBtn": "Importa / Esporta",
|
||||
"hostStatusesRefreshed": "Stati degli host aggiornati",
|
||||
"failedToRefreshHosts": "Impossibile aggiornare gli host",
|
||||
"movedHostTo": "Spostato {{host}} in \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_many": "Eliminare \"{{name}}\" e i suoi {{count}} host? Questa azione non può essere annullata.",
|
||||
"deleteFolderConfirm_other": "Eliminare \"{{name}}\" e i suoi {{count}} host? Questa azione non può essere annullata.",
|
||||
"failedToMoveHosts": "Impossibile spostare gli host",
|
||||
"managedBanner": "Questo host è gestito da {{plugin}}. Modificalo lì. Puoi comunque fissarlo e riordinarlo.",
|
||||
"managedTooltip": "Gestito da {{plugin}}",
|
||||
"addBlocked": "Gli host sono gestiti da {{plugin}}, quindi non è possibile aggiungerne di nuovi qui.",
|
||||
"failedToReorder": "Impossibile riordinare",
|
||||
"expandAll": "Espandi tutte le cartelle",
|
||||
"collapseAll": "Comprimi tutte le cartelle",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Aggiungi credenziali",
|
||||
"checkingHostStatuses": "Verifica degli stati degli host in corso...",
|
||||
"pinnedSection": "Fissati",
|
||||
"hostsExported": "Host esportati con successo",
|
||||
"export": {
|
||||
"menuItem": "Esporta...",
|
||||
"title": "Esporta host",
|
||||
"scope": "Ambito",
|
||||
"scopeAll": "Tutti",
|
||||
"scopeSelected": "Selezionati",
|
||||
"searchHosts": "Cerca host...",
|
||||
"include": "Includi",
|
||||
"groupConnection": "Connessione",
|
||||
"groupCredentials": "Credenziali",
|
||||
"groupNotes": "Note",
|
||||
"groupTags": "Tag e fissaggio",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump host",
|
||||
"groupFeatureFlags": "Impostazioni plugin",
|
||||
"groupAdvanced": "Configurazione avanzata",
|
||||
"preview": "Anteprima",
|
||||
"moreHosts_one": "... {{count}} altro host",
|
||||
"moreHosts_many": "... {{count}} altri host",
|
||||
"moreHosts_other": "... {{count}} altri host",
|
||||
"summary": "{{selected}} di {{total}} host",
|
||||
"credentialsIncluded": "credenziali incluse",
|
||||
"credentialsExcluded": "credenziali escluse",
|
||||
"noneSelected": "Nessun host selezionato",
|
||||
"cancel": "Annulla",
|
||||
"confirm": "Esporta",
|
||||
"fetchFailed": "Impossibile caricare gli host per l'esportazione",
|
||||
"bulkButton": "Esporta"
|
||||
},
|
||||
"sampleDownloaded": "File di esempio scaricato",
|
||||
"failedToDeleteCredential2": "Impossibile eliminare la credenziale",
|
||||
"noFolderOption": "(Nessuna cartella)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Aggiorna Host",
|
||||
"editorAdd": "Aggiungi Host",
|
||||
"speedSearch": "Cerca host. Tasti freccia per selezionare, Invio per connettere, Esc per chiudere",
|
||||
"speedSearchList": "Elenco host. Digita o premi / per cercare.",
|
||||
"importNoHosts": "Nessun host trovato nel file",
|
||||
"importTooMany": "Puoi importare fino a {{max}} host alla volta",
|
||||
"importSummary": "Importazione completata: {{imported}} importati, {{updated}} aggiornati, {{failed}} falliti",
|
||||
"importHostsFailed": "Impossibile importare gli host"
|
||||
"speedSearchList": "Elenco host. Digita o premi / per cercare."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Schermo diviso",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} utente",
|
||||
"usersCount_many": "{{count}} utenti",
|
||||
"rolesCount_one": "{{count}} ruolo",
|
||||
"rolesCount_many": "{{count}} ruoli",
|
||||
"apiKeysCount_one": "{{count}} chiave",
|
||||
"apiKeysCount_many": "{{count}} chiavi",
|
||||
"sessionsActive_one": "{{count}} attiva",
|
||||
"sessionsActive_many": "{{count}} attive",
|
||||
"hostsCount_one": "{{count}} host",
|
||||
"hostsCount_many": "{{count}} host",
|
||||
"hostsCount_other": "{{count}} host",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} credenziali",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} autorizzazione",
|
||||
"count_many": "{{count}} autorizzazioni",
|
||||
"groups": {
|
||||
"hosts": "Host",
|
||||
"credentials": "Credenziali",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Modifica il carattere dell'interfaccia dell'applicazione. I profili del terminale mantengono le proprie impostazioni del carattere.",
|
||||
"accentColorLabel": "Colore di accento",
|
||||
"apiKeyCount_one": "{{count}} chiave",
|
||||
"apiKeyCount_many": "{{count}} chiavi",
|
||||
"colorPickerTooltip": "Apri selettore colore",
|
||||
"themeSystem": "Sistema",
|
||||
"themeLight": "Chiaro",
|
||||
"themeDark": "Scuro",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Scuro"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Come è strutturata l'intera app. I temi e i layout provengono dai plugin.",
|
||||
"defaultsLabel": "Predefinito per tutti",
|
||||
"defaultsHint": "Ciò che gli utenti vedono finché non scelgono il proprio layout o tema.",
|
||||
"followDefault": "Usa il predefinito",
|
||||
"defaultSaved": "Aspetto predefinito salvato",
|
||||
"saveFailed": "Impossibile salvare l'aspetto",
|
||||
"repair": {
|
||||
"title": "Impossibile visualizzare questo layout",
|
||||
"safeTitle": "Modalità sicura",
|
||||
"layout": "Layout",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Motivo",
|
||||
"error": "Errore",
|
||||
"noError": "Nessun messaggio di errore.",
|
||||
"copy": "Copia",
|
||||
"copied": "Copiato",
|
||||
"copyFailed": "Impossibile copiare i dettagli",
|
||||
"retry": "Riprova",
|
||||
"reset": "Ripristina l'aspetto predefinito",
|
||||
"resetEveryone": "Reimposta il predefinito per tutti",
|
||||
"update": "Aggiorna {{name}} a {{version}}",
|
||||
"disable": "Disattiva {{name}}",
|
||||
"enable": "Attiva {{name}}",
|
||||
"startAgain": "Riavvia {{name}}",
|
||||
"install": "Trova layout e temi",
|
||||
"installTitle": "Layout e temi",
|
||||
"installButton": "Installa",
|
||||
"nothingToInstall": "Altri layout o temi non sono attualmente disponibili.",
|
||||
"registryUnreachable": "Impossibile raggiungere il registro dei plugin.",
|
||||
"askAdmin": "Chiedi a un amministratore di aggiornare o correggere questo layout. Di seguito puoi passare a un altro layout o tema per te stesso.",
|
||||
"switchLayout": "Cambia layout",
|
||||
"switchTheme": "Cambia tema",
|
||||
"saveFailed": "Impossibile salvare la tua scelta",
|
||||
"reasons": {
|
||||
"safe-url": "L'indirizzo ha richiesto la modalità sicura. Scegli un layout di seguito, oppure rimuovi ?safe-layout=1 dall'indirizzo.",
|
||||
"safe-env": "Il server è stato avviato con TERMIX_SAFE_LAYOUT, quindi tutti vedranno questa schermata finché non verrà rimosso.",
|
||||
"missing": "Nessun plugin installato fornisce questo layout.",
|
||||
"disabled": "Il plugin che fornisce questo layout è disattivato.",
|
||||
"blocked": "Il plugin che fornisce questo layout è in attesa di una dipendenza necessaria.",
|
||||
"incompatible": "Il plugin che fornisce questo layout non è compatibile con questa versione di Termix.",
|
||||
"failed": "Il layout non è riuscito ad avviarsi.",
|
||||
"crashed": "Il layout si è bloccato due volte durante il rendering dell'app."
|
||||
},
|
||||
"noLayout": "Nessun layout impostato",
|
||||
"restore": "Ripristina {{name}} incluso",
|
||||
"restoreFailed": "Impossibile ripristinare la copia inclusa"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Gestisci l'accesso",
|
||||
"consequence": "Può aggiungere un metodo di accesso, un secondo fattore o un tipo di accesso SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Imposta regole di accesso",
|
||||
"consequence": "Può disconnettere gli utenti dopo un periodo di inattività, limitare la durata della sessione, disattivare la funzione \"Ricordami\" e richiedere un secondo fattore."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Scegli come raggiungere gli host",
|
||||
"consequence": "Può instradare la connessione SSH a un host attraverso il proprio percorso, quindi visualizza tutto ciò che viene inviato e ricevuto da quegli host, incluse le password."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Esegui sincronizzazione",
|
||||
"consequence": "Può rispondere a tutte le richieste di sincronizzazione, quindi visualizza i dati sincronizzati tra dispositivi e server."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Gestisci certificati",
|
||||
"consequence": "Può sostituire il certificato che Termix serve tramite HTTPS e rispondere alle verifiche di dominio da parte delle autorità di certificazione."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Accedi a dispositivi seriali e USB",
|
||||
"consequence": "Può aprire una porta seriale fisica sulla macchina che esegue Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Esporta host con i relativi segreti",
|
||||
"consequence": "Può leggere tutti i tuoi host, incluse le password e le chiavi salvate, e condividerli. Ogni esportazione viene registrata nel log di audit."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Crea e modifica host",
|
||||
"consequence": "Può aggiungere host e modificare quelli che hai già."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Leggi il registro di controllo",
|
||||
"consequence": "Può vedere chi ha fatto cosa e quando."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Verifica se le porte rispondono",
|
||||
"consequence": "Può aprire una connessione non crittografata a qualsiasi indirizzo dal server, per verificare se è raggiungibile."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Fornisci stato degli host",
|
||||
"consequence": "Diventa la fonte dei punti online e offline per ogni host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Archivia attività recenti",
|
||||
"consequence": "Diventa il repository per l'elenco delle attività recenti di ogni utente."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Gestisci gli host in sola lettura",
|
||||
"consequence": "Gli host gestiti non possono essere modificati, eliminati o condivisi nuovamente da nessun altro."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Apri finestre desktop",
|
||||
"consequence": "Solo nell'app desktop di Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Usa questo computer",
|
||||
"consequence": "Può leggere e modificare file, eseguire una shell e aprire porte locali su questo computer. Solo nell'app desktop di Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Agisci come altri utenti",
|
||||
"consequence": "Esegue attività in background con l'accesso di un altro utente, come i lavori pianificati. Ogni utilizzo viene registrato nel registro di controllo."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Aggiungi le proprie schermate",
|
||||
"consequence": "Schede, pannelli e impostazioni che puoi nascondere in seguito."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Sostituisci l'intero layout dell'app",
|
||||
"consequence": "Quando selezionato, il suo codice disegna ogni schermata, inclusi i terminali e le impostazioni."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Aggiungi temi di colore",
|
||||
"consequence": "Solo colori e stili. Nessun codice viene eseguito per un tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Disabilitato",
|
||||
"failed": "Arrestato inaspettatamente",
|
||||
"blocked": "In attesa di un altro plugin",
|
||||
"server": "Eseguito sul tuo server"
|
||||
"server": "Eseguito sul tuo server",
|
||||
"safeMode": "Disattivato in modalità sicura"
|
||||
},
|
||||
"groups": {
|
||||
"running": "In esecuzione",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Aggiornati di recente",
|
||||
"category": "Categoria"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Colonne",
|
||||
"auto": "Automatico",
|
||||
"count": "Larghezza {{count}}"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nome",
|
||||
"description": "Descrizione",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "Impossibile salvare le opzioni per {{name}}: {{error}}",
|
||||
"deleteData": "Impossibile eliminare i dati di {{name}}: {{error}}",
|
||||
"managedByServer": "Questo desktop è collegato a un server, che decide i suoi plugin.",
|
||||
"defaultLook": "{{name}} è l'aspetto predefinito, quindi può essere disattivato o sostituito ma non disinstallato.",
|
||||
"hasDependents": "{{name}} è necessario per {{list}}. Disattivali o disinstallali prima.",
|
||||
"missingDependencies": "{{name}} ha bisogno di {{list}}, che non è installato.",
|
||||
"consentChanged": "Le richieste di questo plugin sono cambiate dall'ultima volta che le hai controllate. Controlla di nuovo l'elenco.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Nessun accesso ai tuoi server",
|
||||
"searchInstalled": "Cerca tra gli installati",
|
||||
"searchPlugins": "Cerca plugin",
|
||||
"allCategories": "Tutti",
|
||||
"nothingMatches": "Nessun risultato trovato.",
|
||||
"noneInstalled": "Nessun plugin installato. Esplora per aggiungerne alcuni.",
|
||||
"nothingHere": "Nessun elemento qui.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Documentazione",
|
||||
"envVars": "Variabili d'ambiente",
|
||||
"envRequired": "Obbligatorio",
|
||||
"envDefault": "Predefinito: {{value}}"
|
||||
"envDefault": "Predefinito: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Layout",
|
||||
"themes": "Temi",
|
||||
"tabs": "Schede",
|
||||
"panels": "Pannelli laterali",
|
||||
"dashboardCards": "Schede della dashboard",
|
||||
"protocols": "Tipi di connessione",
|
||||
"auth": "Metodi di accesso",
|
||||
"actions": "Azioni",
|
||||
"hostCapability": "Impostazioni host"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tipo",
|
||||
"allTypes": "Tutti i tipi",
|
||||
"category": "Categoria",
|
||||
"allCategories": "Tutte le categorie",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_many": "{{count}} plugin",
|
||||
"results_other": "{{count}} plugin",
|
||||
"remove": "Rimuovi filtro {{name}}",
|
||||
"clear": "Cancella filtri",
|
||||
"button": "Filtri",
|
||||
"buttonCount": "Filtri ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} di {{total}}",
|
||||
"page": "Pagina {{page}} di {{pages}}",
|
||||
"previous": "Pagina precedente",
|
||||
"next": "Pagina successiva",
|
||||
"perPage": "{{count}} per pagina",
|
||||
"perPageLabel": "Plugin per pagina"
|
||||
},
|
||||
"showUnsupportedHint": "Questi sono elencati ma nessuna versione è ancora disponibile per questa versione. Aggiorna Termix per installarli.",
|
||||
"unsupported": "Richiede una versione più recente di Termix",
|
||||
"unsupportedHint": "Nessuna versione di questo plugin è compatibile con questa versione di Termix. Aggiorna Termix per installarlo.",
|
||||
"needsTermix": "Richiede Termix {{range}}",
|
||||
"showUnsupported": "Mostra non supportati ({{count}})",
|
||||
"showMore": "Mostra altri {{count}} ({{total}} rimanenti)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Nessun dato",
|
||||
"filter": "Filtra..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minuto fa",
|
||||
"minutesAgo_many": "{{count}} minuti fa",
|
||||
"minutesAgo_other": "{{count}} minuti fa",
|
||||
"hoursAgo_one": "{{count}} ora fa",
|
||||
"hoursAgo_many": "{{count}} ore fa",
|
||||
"hoursAgo_other": "{{count}} ore fa",
|
||||
"pending_one": "{{count}} modifica in attesa di sincronizzazione",
|
||||
"pending_many": "{{count}} modifiche in attesa di sincronizzazione",
|
||||
"pending_other": "{{count}} modifiche in attesa di sincronizzazione",
|
||||
"proxy": {
|
||||
"headersTitle": "Intestazioni aggiuntive",
|
||||
"headersHint": "Inviati con ogni richiesta al server, ad esempio un token di servizio Cloudflare Access.",
|
||||
"headerName": "Nome intestazione",
|
||||
"headerValue": "Valore",
|
||||
"savedValue": "Salvato, digita per modificare",
|
||||
"addHeader": "Aggiungi intestazione",
|
||||
"removeHeader": "Rimuovi intestazione",
|
||||
"basicAuthTitle": "Nome utente e password",
|
||||
"basicAuthHint": "Per un proxy che richiede nome utente e password prima di Termix.",
|
||||
"username": "Nome utente",
|
||||
"password": "Password",
|
||||
"allowInvalidCertificate": "Fidati di un certificato autofirmato",
|
||||
"allowInvalidCertificateHint": "Solo per il tuo server, quando il suo certificato non proviene da un'autorità nota."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Questo non sembra un indirizzo web valido.",
|
||||
"unreachable": "Impossibile raggiungere il server. Controlla l'indirizzo e che il server sia in esecuzione.",
|
||||
"unreachableWithReason": "Impossibile raggiungere il server: {{reason}}",
|
||||
"tlsUntrusted": "Il certificato del server non è attendibile. Se si tratta del tuo server con un certificato autofirmato, attiva l'opzione qui sotto.",
|
||||
"basicAuthRequired": "Qualcosa davanti al server richiede un nome utente e una password. Inseriscili qui sotto.",
|
||||
"proxyLogin": "Una pagina di accesso o un proxy ha risposto invece di Termix. Aggiungi le intestazioni necessarie qui sotto, oppure controlla l'indirizzo.",
|
||||
"notTermix": "Non è presente un server Termix a quell'indirizzo. Se è in esecuzione su un percorso, includilo, ad esempio https://example.com/termix.",
|
||||
"versionMismatch": "Quel server esegue una versione precedente di Termix. Aggiornalo alla versione 2.9 o successiva per collegarlo.",
|
||||
"differentAccount": "Ti sei connesso a un account diverso. Accedi all'account a cui questo dispositivo è collegato, oppure scollegalo prima."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Collega a un server Termix",
|
||||
"reloginTitle": "Accedi di nuovo",
|
||||
"savedServers": "Server recenti",
|
||||
"removeServer": "Rimuovi dall'elenco",
|
||||
"serverDescription": "Inserisci l'indirizzo che usi per aprire Termix nel browser.",
|
||||
"signinDescription": "Accedi a {{url}}",
|
||||
"chooseDescription": "Questo dispositivo ha già dei dati. Cosa dovrebbe succedere?",
|
||||
"finishingDescription": "Collegamento di questo dispositivo.",
|
||||
"serverUrl": "Indirizzo del server",
|
||||
"serverUrlHint": "Ad esempio https://termix.example.com",
|
||||
"showProxySettings": "Impostazioni proxy inverso",
|
||||
"hideProxySettings": "Nascondi impostazioni proxy inverso",
|
||||
"continue": "Continua",
|
||||
"back": "Indietro",
|
||||
"mergeTitle": "Aggiungilo al mio account",
|
||||
"mergeBody_one": "L'elemento su questo dispositivo viene aggiunto al tuo account. Gli elementi già presenti nel tuo account rimangono invariati sul server.",
|
||||
"mergeBody_many": "Gli {{count}} elementi su questo dispositivo vengono aggiunti al tuo account. Gli elementi già presenti nel tuo account rimangono invariati sul server.",
|
||||
"mergeBody_other": "Gli {{count}} elementi su questo dispositivo vengono aggiunti al tuo account. Gli elementi già presenti nel tuo account rimangono invariati sul server.",
|
||||
"replaceTitle": "Sostituiscilo con il mio account",
|
||||
"replaceBody_one": "L'elemento su questo dispositivo viene rimosso e questo dispositivo prende tutto dal tuo account. Rimangono solo gli host mantenuti su questo dispositivo.",
|
||||
"replaceBody_many": "Gli {{count}} elementi su questo dispositivo vengono rimossi e questo dispositivo prende tutto dal tuo account. Rimangono solo gli host mantenuti su questo dispositivo.",
|
||||
"replaceBody_other": "Gli {{count}} elementi su questo dispositivo vengono rimossi e questo dispositivo prende tutto dal tuo account. Rimangono solo gli host mantenuti su questo dispositivo.",
|
||||
"link": "Collega",
|
||||
"linking": "Collegamento ed esecuzione della prima sincronizzazione...",
|
||||
"linked": "Collegato. I tuoi dati sono ora in sincronizzazione.",
|
||||
"signedInAgain": "Accesso effettuato. La sincronizzazione è ripresa."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Host",
|
||||
"sshCredentials": "Credenziali",
|
||||
"sshFolders": "Cartelle",
|
||||
"userPreferences": "Preferenze",
|
||||
"pluginUserSettings": "Impostazioni plugin",
|
||||
"sharedHosts": "Host condivisi con te",
|
||||
"sharedCredentials": "Credenziali condivise con te",
|
||||
"vaultProfiles": "Profili Vault",
|
||||
"snippetFolders": "Cartelle snippet",
|
||||
"snippets": "Snippet",
|
||||
"dashboardServiceLinks": "Link ai servizi",
|
||||
"homepageItems": "Elementi homepage",
|
||||
"networkTopology": "Mappa di rete",
|
||||
"workspaces": "Spazi di lavoro",
|
||||
"hostDefaults": "Valori predefiniti host",
|
||||
"hostDefaultsAdmin": "Valori predefiniti host del server",
|
||||
"aiProviders": "Provider AI",
|
||||
"homepageLayouts": "Layout homepage",
|
||||
"accountProfile": "Profilo account"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Cartella {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Griglia",
|
||||
"listView": "Elenco",
|
||||
"compactRows": "Righe compatte",
|
||||
"comfortableRows": "Righe spaziose"
|
||||
"comfortableRows": "Righe spaziose",
|
||||
"columns": {
|
||||
"title": "Colonne",
|
||||
"auto": "Automatico",
|
||||
"count": "{{count}} colonne"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Salvato. Digita per sostituirlo."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "一部のプラグインの変更ができませんでした。後でプラグインタブから修正できます。続行するには「次へ」を押してください。",
|
||||
"pluginsApplyFailed": "選択が保存できませんでした。再試行するか、続行して後でプラグインタブから変更してください。",
|
||||
"pluginsLoadFailed": "プラグインリストを読み込めませんでした。後でプラグインタブからプラグインを選択できます。",
|
||||
"presetTitle": "画面にどれくらい表示させますか?",
|
||||
"presetIntro": "画面に表示する量を選択してください。",
|
||||
"presetChangeLater": "プリセットの切り替えや個々の設定の変更は、後で「設定」の「インターフェース」から行うことができます。",
|
||||
"appearanceTitle": "自分好みにカスタマイズ",
|
||||
"appearanceIntro": "テーマ、アクセントカラー、フォント、言語を選択してください。変更はすぐに反映され、後で「設定」から変更できます。",
|
||||
"securityTitle": "アカウントを保護",
|
||||
"securityIntro": "アカウントにパスキーまたは認証アプリを追加してください。これは後で「設定」の「セキュリティ」から行うこともできます。",
|
||||
"desktopTitle": "Termix をどのように使いますか?",
|
||||
"desktopBody": "これはサイドバーの「同期」からいつでも変更できます。",
|
||||
"desktopLocalTitle": "このデバイスでのみ",
|
||||
"desktopLocalBody": "すべてがここに保存されます。セットアップは不要です。",
|
||||
"desktopLinkTitle": "Termix サーバーと連携",
|
||||
"desktopLinkBody": "サーバーにサインインして、すべてのデバイスで同じホストと設定を使用します。",
|
||||
"desktopLinked": "{{server}} と連携済み",
|
||||
"pluginsDocsLink": "各プラグインについて読む"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} のインストール準備ができました",
|
||||
"readyHint": "Termix を再起動したときにインストールされます。"
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "セーフモード",
|
||||
"description": "レイアウトとテーマのプラグインのみが実行されています。TERMIX_SAFE_MODE を設定せずにサーバーを再起動すると、他のプラグインが再度有効になります。"
|
||||
},
|
||||
"companion": {
|
||||
"close": "パネルを閉じる",
|
||||
"moveSide": "パネルを移動",
|
||||
"resize": "パネルのサイズを変更"
|
||||
},
|
||||
"nav": {
|
||||
"home": "ホーム",
|
||||
"terminal": "ターミナル",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "ホスト",
|
||||
"credentials": "認証情報",
|
||||
"connections": "接続",
|
||||
"sync": "同期",
|
||||
"reconnectDisconnectedTerminals": "切断されたすべてのターミナルを再接続",
|
||||
"reconnectingTerminals_other": "{{count}} 個のターミナルを再接続中",
|
||||
"noDisconnectedTerminals": "再接続可能な切断されたターミナルはありません",
|
||||
@@ -276,10 +272,7 @@
|
||||
"retry": "再試行",
|
||||
"refresh": "更新",
|
||||
"optional": "オプション",
|
||||
"downloadSample": "サンプルをダウンロード",
|
||||
"failedToDeleteHost": "{{name}} の削除に失敗しました",
|
||||
"importSkipExisting": "インポート(既存の項目をスキップ)",
|
||||
"importSSHConfig": "SSH 設定からインポート",
|
||||
"connectionDetails": "接続詳細",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -497,10 +490,7 @@
|
||||
"noFolder": "(フォルダなし)",
|
||||
"deleteSelected": "削除",
|
||||
"exitSelection": "選択を解除",
|
||||
"importSkip": "インポート(既存はスキップ)",
|
||||
"importOverwrite": "インポート(上書き)",
|
||||
"collapseBtn": "折りたたむ",
|
||||
"importExportBtn": "インポート / エクスポート",
|
||||
"hostStatusesRefreshed": "ホストのステータスを更新しました",
|
||||
"failedToRefreshHosts": "ホストの更新に失敗しました",
|
||||
"movedHostTo": "{{host}} を「{{folder}}」に移動しました",
|
||||
@@ -553,6 +543,9 @@
|
||||
"folderDeleted": "フォルダ「{{name}}」を削除しました",
|
||||
"deleteFolderConfirm_other": "\"{{name}}\" とその {{count}} 台のホストを削除しますか?この操作は元に戻せません。",
|
||||
"failedToMoveHosts": "ホストの移動に失敗しました",
|
||||
"managedBanner": "このホストは {{plugin}} によって管理されています。変更はそちらで行ってください。ピン留めや順序の変更は可能です。",
|
||||
"managedTooltip": "{{plugin}} によって管理されています",
|
||||
"addBlocked": "ホストは {{plugin}} によって管理されているため、ここで新しいホストを追加することはできません。",
|
||||
"failedToReorder": "順序の並べ替えに失敗しました",
|
||||
"expandAll": "すべてのフォルダを展開",
|
||||
"collapseAll": "すべてのフォルダを折りたたむ",
|
||||
@@ -662,34 +655,6 @@
|
||||
"addCredentialBtn2": "認証情報を追加",
|
||||
"checkingHostStatuses": "ホストのステータスを確認しています...",
|
||||
"pinnedSection": "ピン留め",
|
||||
"hostsExported": "ホストのエクスポートに成功しました",
|
||||
"export": {
|
||||
"menuItem": "エクスポート...",
|
||||
"title": "ホストのエクスポート",
|
||||
"scope": "範囲",
|
||||
"scopeAll": "すべて",
|
||||
"scopeSelected": "選択済み",
|
||||
"searchHosts": "ホストを検索...",
|
||||
"include": "含める項目",
|
||||
"groupConnection": "接続",
|
||||
"groupCredentials": "認証情報",
|
||||
"groupNotes": "メモ",
|
||||
"groupTags": "タグとピン留め",
|
||||
"groupProxy": "プロキシ",
|
||||
"groupJumpHosts": "ジャンプホスト",
|
||||
"groupFeatureFlags": "プラグイン設定",
|
||||
"groupAdvanced": "詳細設定",
|
||||
"preview": "プレビュー",
|
||||
"moreHosts_other": "... さらに {{count}} 台のホスト",
|
||||
"summary": "{{total}} 件中 {{selected}} 件のホスト",
|
||||
"credentialsIncluded": "認証情報を含む",
|
||||
"credentialsExcluded": "認証情報を除く",
|
||||
"noneSelected": "ホストが選択されていません",
|
||||
"cancel": "キャンセル",
|
||||
"confirm": "エクスポート",
|
||||
"fetchFailed": "エクスポート用のホストの読み込みに失敗しました",
|
||||
"bulkButton": "エクスポート"
|
||||
},
|
||||
"sampleDownloaded": "サンプルファイルをダウンロードしました",
|
||||
"failedToDeleteCredential2": "認証情報の削除に失敗しました",
|
||||
"noFolderOption": "(フォルダなし)",
|
||||
@@ -847,11 +812,7 @@
|
||||
"editorUpdate": "ホストを更新",
|
||||
"editorAdd": "ホストを追加",
|
||||
"speedSearch": "ホストを検索。矢印キーで選択、Enter で接続、Esc で閉じる",
|
||||
"speedSearchList": "ホスト一覧。入力するか / を押して検索",
|
||||
"importNoHosts": "ファイル内にホストが見つかりませんでした",
|
||||
"importTooMany": "一度に最大 {{max}} 個のホストをインポートできます",
|
||||
"importSummary": "インポート完了: {{imported}} 個インポート、{{updated}} 個更新、{{failed}} 個失敗",
|
||||
"importHostsFailed": "ホストのインポートに失敗しました"
|
||||
"speedSearchList": "ホスト一覧。入力するか / を押して検索"
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "分割画面",
|
||||
@@ -1046,9 +1007,14 @@
|
||||
"hostCount_other": "{{count}} 台のホスト"
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "ユーザー {{count}} 人",
|
||||
"rolesCount_one": "ロール {{count}} 個",
|
||||
"apiKeysCount_one": "キー {{count}} 個",
|
||||
"sessionsActive_one": "アクティブ {{count}} 件",
|
||||
"hostsCount_other": "{{count}} 台のホスト",
|
||||
"credentialsCount_other": "{{count}} 個の認証情報",
|
||||
"rolePermissions": {
|
||||
"count_one": "権限 {{count}} 個",
|
||||
"groups": {
|
||||
"hosts": "ホスト",
|
||||
"credentials": "認証情報",
|
||||
@@ -1088,20 +1054,63 @@
|
||||
"interfaceFontLabel": "インターフェースフォント",
|
||||
"interfaceFontDescription": "アプリケーションのインターフェースフォントを変更します。ターミナルプロファイルは独自のフォント設定を保持します。",
|
||||
"accentColorLabel": "アクセントカラー",
|
||||
"apiKeyCount_one": "キー {{count}} 個",
|
||||
"colorPickerTooltip": "カラーピッカーを開く",
|
||||
"themeSystem": "システム",
|
||||
"themeLight": "ライト",
|
||||
"themeDark": "ダーク",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "ダーク"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "アプリ全体のレイアウトです。テーマとレイアウトはプラグインから提供されます。",
|
||||
"defaultsLabel": "すべてのユーザーのデフォルト",
|
||||
"defaultsHint": "ユーザーが独自のレイアウトやテーマを選択するまでに表示される内容です。",
|
||||
"followDefault": "デフォルトを使用する",
|
||||
"defaultSaved": "デフォルトの外観を保存しました",
|
||||
"saveFailed": "外観を保存できませんでした",
|
||||
"repair": {
|
||||
"title": "このレイアウトを表示できませんでした",
|
||||
"safeTitle": "セーフモード",
|
||||
"layout": "レイアウト",
|
||||
"plugin": "プラグイン",
|
||||
"reason": "理由",
|
||||
"error": "エラー",
|
||||
"noError": "エラーメッセージはありません。",
|
||||
"copy": "コピー",
|
||||
"copied": "コピーしました",
|
||||
"copyFailed": "詳細をコピーできませんでした",
|
||||
"retry": "再試行",
|
||||
"reset": "デフォルトの外観にリセット",
|
||||
"resetEveryone": "すべてのユーザーのデフォルトをリセット",
|
||||
"update": "{{name}} を {{version}} に更新",
|
||||
"disable": "{{name}} を無効にする",
|
||||
"enable": "{{name}} を有効にする",
|
||||
"startAgain": "{{name}} を再起動する",
|
||||
"install": "レイアウトとテーマを探す",
|
||||
"installTitle": "レイアウトとテーマ",
|
||||
"installButton": "インストール",
|
||||
"nothingToInstall": "現在、他のレイアウトやテーマは利用できません。",
|
||||
"registryUnreachable": "プラグインレジストリに接続できませんでした。",
|
||||
"askAdmin": "管理者にこのレイアウトの更新または修正を依頼してください。以下で別のレイアウトやテーマに切り替えることもできます。",
|
||||
"switchLayout": "レイアウトを切り替え",
|
||||
"switchTheme": "テーマを切り替え",
|
||||
"saveFailed": "選択内容を保存できませんでした",
|
||||
"reasons": {
|
||||
"safe-url": "アドレスでセーフモードが要求されました。以下からレイアウトを選択するか、アドレスから ?safe-layout=1 を削除してください。",
|
||||
"safe-env": "サーバーが TERMIX_SAFE_LAYOUT で起動されたため、それが削除されるまで全員がこの画面を表示します。",
|
||||
"missing": "このレイアウトを提供するインストール済みプラグインがありません。",
|
||||
"disabled": "このレイアウトを提供するプラグインが無効になっています。",
|
||||
"blocked": "このレイアウトを提供するプラグインが、必要なものを待機しています。",
|
||||
"incompatible": "このレイアウトを提供するプラグインは、このバージョンの Termix と互換性がありません。",
|
||||
"failed": "レイアウトの起動に失敗しました。",
|
||||
"crashed": "アプリを描画する際に、レイアウトが2回クラッシュしました。"
|
||||
},
|
||||
"noLayout": "レイアウトが設定されていません",
|
||||
"restore": "バンドル版の {{name}} を復元",
|
||||
"restoreFailed": "バンドル版のコピーを復元できませんでした"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1124,6 +1133,18 @@
|
||||
"title": "サインインの処理",
|
||||
"consequence": "ログイン方法、2要素認証、または SSH サインインタイプの追加が可能です。"
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "サインインルールを設定",
|
||||
"consequence": "アイドル時にユーザーをサインアウトさせたり、セッションの長さを制限したり、「ログイン状態を保持」を無効にしたり、2要素認証を要求したりできます。"
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "ホストへの接続方法を選択",
|
||||
"consequence": "SSH 接続を独自のルートでホストに送信できるため、それらのホストへの送受信データ(パスワードを含む)をすべて確認できます。"
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "同期を実行",
|
||||
"consequence": "すべての同期リクエストに応答できるため、デバイスとサーバーが同期するデータを確認できます。"
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "証明書の管理",
|
||||
"consequence": "Termix が HTTPS で提供する証明書の置換や、認証局からのドメイン確認への応答が可能です。"
|
||||
@@ -1132,6 +1153,10 @@
|
||||
"title": "シリアルおよび USB デバイスへのアクセス",
|
||||
"consequence": "Termix を実行しているマシンの物理シリアルポートを開くことができます。"
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "シークレットを含むホストをエクスポート",
|
||||
"consequence": "保存されたパスワードやキーを含むホストを完全に読み取り、配布できます。すべてのエクスポートは監査ログに記録されます。"
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "ホストの作成と変更",
|
||||
"consequence": "ホストの追加と既存ホストの編集が可能です。"
|
||||
@@ -1176,10 +1201,30 @@
|
||||
"title": "監査ログの閲覧",
|
||||
"consequence": "誰がいつ何をしたかを確認できます。"
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "ポートの応答を確認",
|
||||
"consequence": "サーバーから任意のアドレスへ平文接続を開き、到達可能かどうかを確認できます。"
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "ホストのステータスを提供",
|
||||
"consequence": "すべてのホストのオンライン/オフライン表示(ドット)のデータ源になります。"
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "最近のアクティビティを保存",
|
||||
"consequence": "すべてのユーザーの最近のアクティビティリストの保存先になります。"
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "ホストを読み取り専用として管理",
|
||||
"consequence": "管理対象のホストは、他のユーザーによって編集、削除、再共有できません。"
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "デスクトップウィンドウを開く",
|
||||
"consequence": "Termix デスクトップアプリでのみ可能です。"
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "このコンピューターを使用",
|
||||
"consequence": "このコンピューター上のファイルの読み書き、シェル実行、ローカルポートの開放が可能です。Termix デスクトップアプリでのみ利用できます。"
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "他のユーザーとして動作",
|
||||
"consequence": "スケジュールされたジョブなど、他のユーザーの権限でバックグラウンドタスクを実行します。すべての使用は監査ログに記録されます。"
|
||||
@@ -1219,6 +1264,14 @@
|
||||
"ui:surface": {
|
||||
"title": "独自の画面を追加",
|
||||
"consequence": "後で非表示にできるタブ、パネル、設定を追加します。"
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "アプリ全体のレイアウトを置き換え",
|
||||
"consequence": "選択されると、ターミナルや設定を含むすべての画面を描画するコードが実行されます。"
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "カラーテーマを追加",
|
||||
"consequence": "色とスタイルのみです。テーマにはコードは実行されません。"
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1245,7 +1298,8 @@
|
||||
"disabled": "無効",
|
||||
"failed": "予期せず停止",
|
||||
"blocked": "他のプラグインを待機中",
|
||||
"server": "サーバー上で実行"
|
||||
"server": "サーバー上で実行",
|
||||
"safeMode": "セーフモードで無効"
|
||||
},
|
||||
"groups": {
|
||||
"running": "実行中",
|
||||
@@ -1259,11 +1313,6 @@
|
||||
"updated": "最近更新",
|
||||
"category": "カテゴリ"
|
||||
},
|
||||
"columns": {
|
||||
"title": "列",
|
||||
"auto": "自動",
|
||||
"count": "{{count}} 列"
|
||||
},
|
||||
"table": {
|
||||
"name": "名前",
|
||||
"description": "説明",
|
||||
@@ -1336,6 +1385,7 @@
|
||||
"options": "{{name}} のオプションを保存できませんでした:{{error}}",
|
||||
"deleteData": "{{name}} のデータを削除できませんでした:{{error}}",
|
||||
"managedByServer": "このデスクトップはサーバーにリンクされており、プラグインはサーバーが決定します。",
|
||||
"defaultLook": "{{name}} はデフォルトの見た目であるため、無効化または切り替えは可能ですが、アンインストールはできません。",
|
||||
"hasDependents": "{{name}} は {{list}} によって必要とされています。まずそれらを無効にしたりアンインストールしてください。",
|
||||
"missingDependencies": "{{name}} には {{list}} が必要ですが、インストールされていません。",
|
||||
"consentChanged": "確認してからこのプラグインの要求内容が変更されました。リストをもう一度確認してください。",
|
||||
@@ -1401,7 +1451,6 @@
|
||||
"noServerAccess": "サーバーへのアクセスなし",
|
||||
"searchInstalled": "インストール済みを検索",
|
||||
"searchPlugins": "プラグインを検索",
|
||||
"allCategories": "すべて",
|
||||
"nothingMatches": "一致するものはありません。",
|
||||
"noneInstalled": "まだプラグインがインストールされていません。閲覧して追加してください。",
|
||||
"nothingHere": "ここには何もありません。",
|
||||
@@ -1487,7 +1536,43 @@
|
||||
"documentation": "ドキュメント",
|
||||
"envVars": "環境変数",
|
||||
"envRequired": "必須",
|
||||
"envDefault": "デフォルト: {{value}}"
|
||||
"envDefault": "デフォルト: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "レイアウト",
|
||||
"themes": "テーマ",
|
||||
"tabs": "タブ",
|
||||
"panels": "サイドバーパネル",
|
||||
"dashboardCards": "ダッシュボードカード",
|
||||
"protocols": "接続タイプ",
|
||||
"auth": "サインイン方法",
|
||||
"actions": "アクション",
|
||||
"hostCapability": "ホスト設定"
|
||||
},
|
||||
"filters": {
|
||||
"type": "タイプ",
|
||||
"allTypes": "すべてのタイプ",
|
||||
"category": "カテゴリ",
|
||||
"allCategories": "すべてのカテゴリ",
|
||||
"results_other": "{{count}} 個のプラグイン",
|
||||
"remove": "フィルター「{{name}}」を削除",
|
||||
"clear": "フィルターをクリア",
|
||||
"button": "フィルター",
|
||||
"buttonCount": "フィルター ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{total}} 件中 {{from}}-{{to}}",
|
||||
"page": "{{pages}} ページ中 {{page}} ページ目",
|
||||
"previous": "前のページ",
|
||||
"next": "次のページ",
|
||||
"perPage": "1ページあたり {{count}} 件",
|
||||
"perPageLabel": "1ページあたりのプラグイン数"
|
||||
},
|
||||
"showUnsupportedHint": "これらはリストされていますが、このバージョンではまだリリースが実行されません。インストールするには Termix をアップデートしてください。",
|
||||
"unsupported": "新しい Termix が必要です",
|
||||
"unsupportedHint": "このプラグインのリリースは、このバージョンの Termix では実行されません。インストールするには Termix をアップデートしてください。",
|
||||
"needsTermix": "Termix {{range}} が必要です",
|
||||
"showUnsupported": "サポートされていないものを表示 ({{count}})",
|
||||
"showMore": "さらに {{count}} 件を表示 (残り {{total}} 件)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1503,82 +1588,6 @@
|
||||
"noData": "データなし",
|
||||
"filter": "フィルター..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_other": "{{count}} 分前",
|
||||
"hoursAgo_other": "{{count}} 時間前",
|
||||
"pending_other": "{{count}} 件の変更が同期待ちです",
|
||||
"proxy": {
|
||||
"headersTitle": "追加ヘッダー",
|
||||
"headersHint": "サーバーへのすべてのリクエストに送信されます。例えば、Cloudflare Access のサービストークンなどです。",
|
||||
"headerName": "ヘッダー名",
|
||||
"headerValue": "値",
|
||||
"savedValue": "保存済み。変更するには入力してください",
|
||||
"addHeader": "ヘッダーを追加",
|
||||
"removeHeader": "ヘッダーを削除",
|
||||
"basicAuthTitle": "ユーザー名とパスワード",
|
||||
"basicAuthHint": "Termix の前にユーザー名とパスワードを要求するプロキシ用です。",
|
||||
"username": "ユーザー名",
|
||||
"password": "パスワード",
|
||||
"allowInvalidCertificate": "自己署名証明書を信頼する",
|
||||
"allowInvalidCertificateHint": "サーバーの証明書が既知の認証局から発行されていない場合のみ、自分のサーバーに対して使用してください。"
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "これはWebアドレスのように見えません。",
|
||||
"unreachable": "サーバーに接続できません。アドレスとサーバーが実行中であることを確認してください。",
|
||||
"unreachableWithReason": "サーバーに接続できません: {{reason}}",
|
||||
"tlsUntrusted": "サーバー証明書が信頼されていません。自己署名証明書を使用している自分のサーバーの場合は、以下のオプションを有効にしてください。",
|
||||
"basicAuthRequired": "サーバーの前にある何かがユーザー名とパスワードを要求しています。以下に入力してください。",
|
||||
"proxyLogin": "Termix の代わりにログインページまたはプロキシが応答しました。必要なヘッダーを以下に追加するか、アドレスを確認してください。",
|
||||
"notTermix": "そのアドレスには Termix サーバーがありません。パスの下で実行されている場合は、https://example.com/termix のように含めてください。",
|
||||
"versionMismatch": "そのサーバーは古いバージョンの Termix を実行しています。リンクするには 2.9 以降にアップデートしてください。",
|
||||
"differentAccount": "別のアカウントにサインインしました。このデバイスがリンクされているアカウントにサインインするか、まずリンクを解除してください。"
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Termix サーバーにリンク",
|
||||
"reloginTitle": "再度サインイン",
|
||||
"savedServers": "最近のサーバー",
|
||||
"removeServer": "リストから削除",
|
||||
"serverDescription": "ブラウザで Termix を開く際に使用するアドレスを入力してください。",
|
||||
"signinDescription": "{{url}} にサインイン",
|
||||
"chooseDescription": "このデバイスには既にデータがあります。どうしますか?",
|
||||
"finishingDescription": "このデバイスをリンクしています。",
|
||||
"serverUrl": "サーバーアドレス",
|
||||
"serverUrlHint": "例: https://termix.example.com",
|
||||
"showProxySettings": "リバースプロキシ設定",
|
||||
"hideProxySettings": "リバースプロキシ設定を隠す",
|
||||
"continue": "続行",
|
||||
"back": "戻る",
|
||||
"mergeTitle": "マイアカウントに追加",
|
||||
"mergeBody_other": "このデバイス上の {{count}} 個のアイテムがアカウントに追加されます。アカウントに既に存在するアイテムはサーバー上のまま変更されません。",
|
||||
"replaceTitle": "マイアカウントで上書き",
|
||||
"replaceBody_other": "このデバイス上の {{count}} 個のアイテムが削除され、このデバイスはアカウントからすべてのデータを取得します。このデバイスにのみ保持されているホストはそのまま残ります。",
|
||||
"link": "リンク",
|
||||
"linking": "リンクして最初の同期を実行しています...",
|
||||
"linked": "リンクしました。データが同期されています。",
|
||||
"signedInAgain": "サインインしました。同期が再開されました。"
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "ホスト",
|
||||
"sshCredentials": "認証情報",
|
||||
"sshFolders": "フォルダ",
|
||||
"userPreferences": "環境設定",
|
||||
"pluginUserSettings": "プラグイン設定",
|
||||
"sharedHosts": "あなたと共有されたホスト",
|
||||
"sharedCredentials": "あなたと共有された認証情報",
|
||||
"vaultProfiles": "Vault プロファイル",
|
||||
"snippetFolders": "スニペットフォルダ",
|
||||
"snippets": "スニペット",
|
||||
"dashboardServiceLinks": "サービスリンク",
|
||||
"homepageItems": "ホームページ項目",
|
||||
"networkTopology": "ネットワークマップ",
|
||||
"workspaces": "ワークスペース",
|
||||
"hostDefaults": "ホストのデフォルト設定",
|
||||
"hostDefaultsAdmin": "サーバーのホストデフォルト設定",
|
||||
"aiProviders": "AI プロバイダー",
|
||||
"homepageLayouts": "ホームページレイアウト",
|
||||
"accountProfile": "アカウントプロフィール"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "フォルダ {{name}}",
|
||||
@@ -1603,7 +1612,12 @@
|
||||
"gridView": "グリッド",
|
||||
"listView": "リスト",
|
||||
"compactRows": "コンパクトな行",
|
||||
"comfortableRows": "ゆったりした行"
|
||||
"comfortableRows": "ゆったりした行",
|
||||
"columns": {
|
||||
"title": "カラム",
|
||||
"auto": "自動",
|
||||
"count": "{{count}} カラム"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "保存しました。入力して置き換えてください。"
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "일부 플러그인을 변경할 수 없습니다. 나중에 플러그인 탭에서 수정할 수 있습니다. 계속하려면 다음을 누르세요.",
|
||||
"pluginsApplyFailed": "선택 사항을 저장할 수 없습니다. 다시 시도하거나 계속 진행한 후 플러그인 탭에서 나중에 변경하세요.",
|
||||
"pluginsLoadFailed": "플러그인 목록을 로드할 수 없습니다. 나중에 플러그인 탭에서 플러그인을 선택할 수 있습니다.",
|
||||
"presetTitle": "화면에 얼마나 많은 내용을 표시하시겠습니까?",
|
||||
"presetIntro": "화면에 표시할 내용을 선택하세요.",
|
||||
"presetChangeLater": "나중에 설정의 인터페이스에서 프리셋을 전환하거나 개별 설정을 변경할 수 있습니다.",
|
||||
"appearanceTitle": "나만의 스타일로 꾸미기",
|
||||
"appearanceIntro": "테마, 강조 색상, 글꼴 및 언어를 선택하세요. 변경 사항은 즉시 적용되며, 나중에 설정에서 변경할 수 있습니다.",
|
||||
"securityTitle": "계정 보안 강화",
|
||||
"securityIntro": "계정에 패스키 또는 인증기 앱을 추가하세요. 나중에 설정의 보안에서 이 작업을 수행할 수도 있습니다.",
|
||||
"desktopTitle": "Termix를 어떻게 사용하시겠습니까?",
|
||||
"desktopBody": "사이드바의 동기화에서 언제든지 이를 변경할 수 있습니다.",
|
||||
"desktopLocalTitle": "이 장치에서만",
|
||||
"desktopLocalBody": "모든 데이터가 여기에 저장됩니다. 설정할 필요가 없습니다.",
|
||||
"desktopLinkTitle": "내 Termix 서버와 함께",
|
||||
"desktopLinkBody": "서버에 로그인하여 모든 기기에서 동일한 호스트와 설정을 사용하세요.",
|
||||
"desktopLinked": "{{server}}(으)로 연결됨",
|
||||
"pluginsDocsLink": "각 항목에 대해 읽기"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} 설치 준비 완료",
|
||||
"readyHint": "Termix가 다음에 재시작될 때 설치됩니다."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "안전 모드",
|
||||
"description": "레이아웃 및 테마 플러그인만 실행 중입니다. TERMIX_SAFE_MODE 없이 서버를 다시 시작하여 나머지 기능을 다시 활성화하세요."
|
||||
},
|
||||
"companion": {
|
||||
"close": "패널 닫기",
|
||||
"moveSide": "패널 이동",
|
||||
"resize": "패널 크기 조정"
|
||||
},
|
||||
"nav": {
|
||||
"home": "홈",
|
||||
"terminal": "터미널",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "호스트",
|
||||
"credentials": "자격 증명",
|
||||
"connections": "연결",
|
||||
"sync": "동기화",
|
||||
"reconnectDisconnectedTerminals": "모든 연결 끊긴 터미널 재연결",
|
||||
"reconnectingTerminals_other": "{{count}}개 터미널 재연결 중",
|
||||
"noDisconnectedTerminals": "재연결할 준비가 된 연결 끊긴 터미널이 없습니다",
|
||||
@@ -276,10 +272,7 @@
|
||||
"retry": "다시 시도",
|
||||
"refresh": "새로고침",
|
||||
"optional": "선택 사항",
|
||||
"downloadSample": "샘플 다운로드",
|
||||
"failedToDeleteHost": "{{name}} 삭제에 실패했습니다",
|
||||
"importSkipExisting": "가져오기 (기존 항목 건너뛰기)",
|
||||
"importSSHConfig": "SSH 구성에서 가져오기",
|
||||
"connectionDetails": "연결 세부 정보",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -497,10 +490,7 @@
|
||||
"noFolder": "(폴더 없음)",
|
||||
"deleteSelected": "삭제",
|
||||
"exitSelection": "선택 취소",
|
||||
"importSkip": "가져오기 (기존 항목 건너뛰기)",
|
||||
"importOverwrite": "가져오기 (덮어쓰기)",
|
||||
"collapseBtn": "접기",
|
||||
"importExportBtn": "가져오기 / 내보내기",
|
||||
"hostStatusesRefreshed": "호스트 상태가 새로고침되었습니다",
|
||||
"failedToRefreshHosts": "호스트를 새로고침하지 못했습니다",
|
||||
"movedHostTo": "{{host}}(이)가 \"{{folder}}\"(으)로 이동되었습니다",
|
||||
@@ -553,6 +543,9 @@
|
||||
"folderDeleted": "\"{{name}}\" 폴더 삭제됨",
|
||||
"deleteFolderConfirm_other": "\"{{name}}\"과(와) 포함된 {{count}}개 호스트를 삭제하시겠습니까? 이 작업은 되돌릴 수 없습니다.",
|
||||
"failedToMoveHosts": "호스트 이동에 실패했습니다",
|
||||
"managedBanner": "이 호스트는 {{plugin}}에서 관리합니다. 해당 곳에서 변경하세요. 고정 및 순서 변경은 여전히 가능합니다.",
|
||||
"managedTooltip": "{{plugin}}에서 관리 중",
|
||||
"addBlocked": "호스트는 {{plugin}}에서 관리하므로 여기서 새 호스트를 추가할 수 없습니다.",
|
||||
"failedToReorder": "순서 변경에 실패했습니다",
|
||||
"expandAll": "모든 폴더 펼치기",
|
||||
"collapseAll": "모든 폴더 접기",
|
||||
@@ -662,34 +655,6 @@
|
||||
"addCredentialBtn2": "자격 증명 추가",
|
||||
"checkingHostStatuses": "호스트 상태 확인 중...",
|
||||
"pinnedSection": "고정됨",
|
||||
"hostsExported": "호스트가 성공적으로 내보내졌습니다",
|
||||
"export": {
|
||||
"menuItem": "내보내기...",
|
||||
"title": "호스트 내보내기",
|
||||
"scope": "범위",
|
||||
"scopeAll": "전체",
|
||||
"scopeSelected": "선택됨",
|
||||
"searchHosts": "호스트 검색...",
|
||||
"include": "포함 항목",
|
||||
"groupConnection": "연결",
|
||||
"groupCredentials": "자격 증명",
|
||||
"groupNotes": "메모",
|
||||
"groupTags": "태그 및 고정",
|
||||
"groupProxy": "프록시",
|
||||
"groupJumpHosts": "점프 호스트",
|
||||
"groupFeatureFlags": "플러그인 설정",
|
||||
"groupAdvanced": "고급 설정",
|
||||
"preview": "미리보기",
|
||||
"moreHosts_other": "... {{count}}개 호스트 더 보기",
|
||||
"summary": "총 {{total}}개 중 {{selected}}개 호스트",
|
||||
"credentialsIncluded": "자격 증명 포함",
|
||||
"credentialsExcluded": "자격 증명 제외",
|
||||
"noneSelected": "선택된 호스트가 없습니다",
|
||||
"cancel": "취소",
|
||||
"confirm": "내보내기",
|
||||
"fetchFailed": "내보낼 호스트를 불러오지 못했습니다",
|
||||
"bulkButton": "내보내기"
|
||||
},
|
||||
"sampleDownloaded": "샘플 파일이 다운로드되었습니다",
|
||||
"failedToDeleteCredential2": "자격 증명 삭제에 실패했습니다",
|
||||
"noFolderOption": "(폴더 없음)",
|
||||
@@ -847,11 +812,7 @@
|
||||
"editorUpdate": "호스트 업데이트",
|
||||
"editorAdd": "호스트 추가",
|
||||
"speedSearch": "호스트 검색. 화살표 키로 선택, Enter로 연결, Esc로 닫기",
|
||||
"speedSearchList": "호스트 목록. 입력하거나 /를 눌러 검색하세요.",
|
||||
"importNoHosts": "파일에서 호스트를 찾을 수 없습니다",
|
||||
"importTooMany": "한 번에 최대 {{max}}개의 호스트를 가져올 수 있습니다",
|
||||
"importSummary": "가져오기 완료: {{imported}}개 가져옴, {{updated}}개 업데이트, {{failed}}개 실패",
|
||||
"importHostsFailed": "호스트 가져오기 실패"
|
||||
"speedSearchList": "호스트 목록. 입력하거나 /를 눌러 검색하세요."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "분할 화면",
|
||||
@@ -1046,9 +1007,14 @@
|
||||
"hostCount_other": "{{count}}개 호스트"
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "사용자 {{count}}명",
|
||||
"rolesCount_one": "역할 {{count}}개",
|
||||
"apiKeysCount_one": "키 {{count}}개",
|
||||
"sessionsActive_one": "활성 세션 {{count}}개",
|
||||
"hostsCount_other": "{{count}}개 호스트",
|
||||
"credentialsCount_other": "{{count}}개 자격 증명",
|
||||
"rolePermissions": {
|
||||
"count_one": "권한 {{count}}개",
|
||||
"groups": {
|
||||
"hosts": "호스트",
|
||||
"credentials": "자격 증명",
|
||||
@@ -1088,20 +1054,63 @@
|
||||
"interfaceFontLabel": "인터페이스 글꼴",
|
||||
"interfaceFontDescription": "애플리케이션 인터페이스 글꼴을 변경합니다. 터미널 프로필은 자체 글꼴 설정을 유지합니다.",
|
||||
"accentColorLabel": "강조 색상",
|
||||
"apiKeyCount_one": "키 {{count}}개",
|
||||
"colorPickerTooltip": "색상 선택기 열기",
|
||||
"themeSystem": "시스템",
|
||||
"themeLight": "라이트",
|
||||
"themeDark": "다크",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "다크"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "앱 전체 레이아웃 방식입니다. 테마와 레이아웃은 플러그인에서 제공됩니다.",
|
||||
"defaultsLabel": "모두에게 기본값",
|
||||
"defaultsHint": "사용자가 자체 레이아웃이나 테마를 선택할 때까지 보이는 내용입니다.",
|
||||
"followDefault": "기본값 사용",
|
||||
"defaultSaved": "기본 외관 저장됨",
|
||||
"saveFailed": "외관을 저장할 수 없습니다",
|
||||
"repair": {
|
||||
"title": "이 레이아웃을 표시할 수 없습니다",
|
||||
"safeTitle": "안전 모드",
|
||||
"layout": "레이아웃",
|
||||
"plugin": "플러그인",
|
||||
"reason": "원인",
|
||||
"error": "오류",
|
||||
"noError": "오류 메시지가 없습니다.",
|
||||
"copy": "복사",
|
||||
"copied": "복사됨",
|
||||
"copyFailed": "상세 정보를 복사할 수 없습니다",
|
||||
"retry": "다시 시도",
|
||||
"reset": "기본 외관으로 초기화",
|
||||
"resetEveryone": "모두의 기본값 초기화",
|
||||
"update": "{{name}}을(를) {{version}}(으)로 업데이트",
|
||||
"disable": "{{name}} 끄기",
|
||||
"enable": "{{name}} 켜기",
|
||||
"startAgain": "{{name}} 다시 시작",
|
||||
"install": "레이아웃 및 테마 찾기",
|
||||
"installTitle": "레이아웃 및 테마",
|
||||
"installButton": "설치",
|
||||
"nothingToInstall": "현재 사용할 수 있는 다른 레이아웃이나 테마가 없습니다.",
|
||||
"registryUnreachable": "플러그인 레지스트리에 연결할 수 없습니다.",
|
||||
"askAdmin": "관리자에게 이 레이아웃을 업데이트하거나 수정해 달라고 요청하세요. 아래에서 다른 레이아웃이나 테마로 전환할 수 있습니다.",
|
||||
"switchLayout": "레이아웃 전환",
|
||||
"switchTheme": "테마 전환",
|
||||
"saveFailed": "선택 사항을 저장할 수 없습니다",
|
||||
"reasons": {
|
||||
"safe-url": "주소에서 안전 모드를 요청했습니다. 아래에서 레이아웃을 선택하거나 주소에서 ?safe-layout=1을(를) 제거하세요.",
|
||||
"safe-env": "서버가 TERMIX_SAFE_LAYOUT로 시작되었으므로, 해당 설정이 제거될 때까지 모든 사용자가 이 화면을 봅니다.",
|
||||
"missing": "이 레이아웃을 제공하는 설치된 플러그인이 없습니다.",
|
||||
"disabled": "이 레이아웃을 제공하는 플러그인이 꺼져 있습니다.",
|
||||
"blocked": "이 레이아웃을 제공하는 플러그인이 필요한 항목을 기다리고 있습니다.",
|
||||
"incompatible": "이 레이아웃을 제공하는 플러그인이 이 버전의 Termix와 호환되지 않습니다.",
|
||||
"failed": "레이아웃 시작에 실패했습니다.",
|
||||
"crashed": "앱을 렌더링하는 동안 레이아웃이 두 번 충돌했습니다."
|
||||
},
|
||||
"noLayout": "레이아웃이 설정되지 않았습니다",
|
||||
"restore": "번들된 {{name}} 복원",
|
||||
"restoreFailed": "번들된 복사본을 복원할 수 없습니다"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1124,6 +1133,18 @@
|
||||
"title": "로그인 처리",
|
||||
"consequence": "로그인 방법, 두 번째 인증 요소 또는 SSH 로그인 유형을 추가할 수 있습니다."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "로그인 규칙 설정",
|
||||
"consequence": "유휴 시 로그아웃 처리, 세션 시간 제한, '로그인 상태 유지' 기능 비활성화, 2차 인증 요구 등을 수행할 수 있습니다."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "호스트 연결 방식 선택",
|
||||
"consequence": "SSH 연결을 자체 경로를 통해 호스트로 전달할 수 있으므로, 해당 호스트로 주고받는 모든 데이터(비밀번호 포함)를 확인할 수 있습니다."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "동기화 실행",
|
||||
"consequence": "모든 동기화 요청에 응답할 수 있으므로, 장치와 서버가 동기화하는 데이터를 확인할 수 있습니다."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "인증서 관리",
|
||||
"consequence": "Termix가 HTTPS로 제공하는 인증서를 교체하고 인증 기관의 도메인 확인에 응답할 수 있습니다."
|
||||
@@ -1132,6 +1153,10 @@
|
||||
"title": "시리얼 및 USB 장치 접근",
|
||||
"consequence": "Termix가 실행되는 기계의 물리적 시리얼 포트를 열 수 있습니다."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "비밀번호 포함 호스트 내보내기",
|
||||
"consequence": "저장된 비밀번호와 키를 포함한 호스트 정보를 전체적으로 읽을 수 있으며, 이를 외부로 제공할 수 있습니다. 모든 내보내기 작업은 감사 로그에 기록됩니다."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "호스트 생성 및 변경",
|
||||
"consequence": "호스트를 추가하고 기존 호스트를 편집할 수 있습니다."
|
||||
@@ -1176,10 +1201,30 @@
|
||||
"title": "감사 로그 읽기",
|
||||
"consequence": "누가 언제 무엇을 했는지 볼 수 있습니다."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "포트 응답 확인",
|
||||
"consequence": "서버에서 모든 주소에 대한 일반 연결을 열어 도달 가능한지 확인할 수 있습니다."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "호스트 상태 제공",
|
||||
"consequence": "모든 호스트의 온라인 및 오프라인 상태 표시점의 원천이 됩니다."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "최근 활동 저장",
|
||||
"consequence": "모든 사용자의 최근 활동 목록 저장소가 됩니다."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "호스트를 읽기 전용으로 관리",
|
||||
"consequence": "관리하는 호스트는 다른 사용자가 수정, 삭제 또는 재공유할 수 없습니다."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "데스크톱 창 열기",
|
||||
"consequence": "Termix 데스크톱 앱에서만 가능합니다."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "이 컴퓨터 사용",
|
||||
"consequence": "이 컴퓨터에서 파일을 읽고 수정하고, 셸을 실행하며 로컬 포트를 열 수 있습니다. Termix 데스크톱 앱에서만 가능합니다."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "다른 사용자로 행동",
|
||||
"consequence": "예약된 작업과 같이 다른 사용자의 접근 권한으로 백그라운드 작업을 실행합니다. 모든 사용은 감사 로그에 기록됩니다."
|
||||
@@ -1219,6 +1264,14 @@
|
||||
"ui:surface": {
|
||||
"title": "자체 화면 추가",
|
||||
"consequence": "나중에 숨길 수 있는 탭, 패널 및 설정을 추가합니다."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "전체 앱 레이아웃 교체",
|
||||
"consequence": "선택 시, 터미널 및 설정을 포함한 모든 화면을 그리는 코드를 실행합니다."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "색상 테마 추가",
|
||||
"consequence": "색상과 스타일만 변경합니다. 테마에는 실행되는 코드가 없습니다."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1245,7 +1298,8 @@
|
||||
"disabled": "비활성화됨",
|
||||
"failed": "예기치 않게 중지됨",
|
||||
"blocked": "다른 플러그인 대기 중",
|
||||
"server": "서버에서 실행 중"
|
||||
"server": "서버에서 실행 중",
|
||||
"safeMode": "안전 모드에서 꺼짐"
|
||||
},
|
||||
"groups": {
|
||||
"running": "실행 중",
|
||||
@@ -1259,11 +1313,6 @@
|
||||
"updated": "최근 업데이트순",
|
||||
"category": "카테고리순"
|
||||
},
|
||||
"columns": {
|
||||
"title": "열",
|
||||
"auto": "자동",
|
||||
"count": "{{count}}열 너비"
|
||||
},
|
||||
"table": {
|
||||
"name": "이름",
|
||||
"description": "설명",
|
||||
@@ -1336,6 +1385,7 @@
|
||||
"options": "{{name}}의 옵션을 저장하지 못했습니다: {{error}}",
|
||||
"deleteData": "{{name}}의 데이터를 삭제하지 못했습니다: {{error}}",
|
||||
"managedByServer": "이 데스크톱은 서버에 연결되어 있으며, 서버가 플러그인을 결정합니다.",
|
||||
"defaultLook": "{{name}}은 기본 외관으로, 비활성화하거나 교체할 수는 있지만 제거할 수는 없습니다.",
|
||||
"hasDependents": "{{name}}은(는) {{list}}에서 필요합니다. 먼저 해당 플러그인을 끄거나 제거하세요.",
|
||||
"missingDependencies": "{{name}}은(는) 설치되지 않은 {{list}}가 필요합니다.",
|
||||
"consentChanged": "확인한 이후 이 플러그인이 요청하는 권한이 변경되었습니다. 목록을 다시 확인하세요.",
|
||||
@@ -1401,7 +1451,6 @@
|
||||
"noServerAccess": "서버에 대한 접근 권한 없음",
|
||||
"searchInstalled": "설치된 플러그인 검색",
|
||||
"searchPlugins": "플러그인 검색",
|
||||
"allCategories": "전체",
|
||||
"nothingMatches": "일치하는 항목이 없습니다.",
|
||||
"noneInstalled": "아직 플러그인이 설치되지 않았습니다. 둘러보고 추가해 보세요.",
|
||||
"nothingHere": "내용이 없습니다.",
|
||||
@@ -1487,7 +1536,43 @@
|
||||
"documentation": "문서",
|
||||
"envVars": "환경 변수",
|
||||
"envRequired": "필수",
|
||||
"envDefault": "기본값: {{value}}"
|
||||
"envDefault": "기본값: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "레이아웃",
|
||||
"themes": "테마",
|
||||
"tabs": "탭",
|
||||
"panels": "사이드바 패널",
|
||||
"dashboardCards": "대시보드 카드",
|
||||
"protocols": "연결 유형",
|
||||
"auth": "로그인 방법",
|
||||
"actions": "작업",
|
||||
"hostCapability": "호스트 설정"
|
||||
},
|
||||
"filters": {
|
||||
"type": "유형",
|
||||
"allTypes": "모든 유형",
|
||||
"category": "카테고리",
|
||||
"allCategories": "모든 카테고리",
|
||||
"results_other": "{{count}}개 플러그인",
|
||||
"remove": "필터 {{name}} 제거",
|
||||
"clear": "필터 초기화",
|
||||
"button": "필터",
|
||||
"buttonCount": "필터 ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} / 총 {{total}}",
|
||||
"page": "{{pages}}페이지 중 {{page}}페이지",
|
||||
"previous": "이전 페이지",
|
||||
"next": "다음 페이지",
|
||||
"perPage": "페이지당 {{count}}개",
|
||||
"perPageLabel": "페이지당 플러그인 수"
|
||||
},
|
||||
"showUnsupportedHint": "이 플러그인들은 목록에 있지만, 현재 버전에서는 아직 릴리스가 실행되지 않습니다. 설치하려면 Termix를 업데이트하세요.",
|
||||
"unsupported": "더 새로운 Termix 필요",
|
||||
"unsupportedHint": "이 플러그인의 릴리스는 현재 Termix 버전에서 실행되지 않습니다. 설치하려면 Termix를 업데이트하세요.",
|
||||
"needsTermix": "Termix {{range}} 필요",
|
||||
"showUnsupported": "지원되지 않는 항목 표시 ({{count}})",
|
||||
"showMore": "더 보기 {{count}}개 (남은 {{total}}개)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1503,82 +1588,6 @@
|
||||
"noData": "데이터 없음",
|
||||
"filter": "필터..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_other": "{{count}}분 전",
|
||||
"hoursAgo_other": "{{count}}시간 전",
|
||||
"pending_other": "동기화 대기 중인 변경 사항 {{count}}개",
|
||||
"proxy": {
|
||||
"headersTitle": "추가 헤더",
|
||||
"headersHint": "서버로 보내는 모든 요청에 포함됩니다. 예를 들어 Cloudflare Access 서비스 토큰입니다.",
|
||||
"headerName": "헤더 이름",
|
||||
"headerValue": "값",
|
||||
"savedValue": "저장됨, 변경하려면 입력하세요",
|
||||
"addHeader": "헤더 추가",
|
||||
"removeHeader": "헤더 제거",
|
||||
"basicAuthTitle": "사용자 이름과 비밀번호",
|
||||
"basicAuthHint": "Termix 전에 사용자 이름과 비밀번호를 묻는 프록시용입니다.",
|
||||
"username": "사용자 이름",
|
||||
"password": "비밀번호",
|
||||
"allowInvalidCertificate": "자체 서명된 인증서 신뢰",
|
||||
"allowInvalidCertificateHint": "인증서가 알려진 기관에서 발급되지 않은 경우에만 자신의 서버에 대해 사용하세요."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "웹 주소처럼 보이지 않습니다.",
|
||||
"unreachable": "서버에 연결할 수 없습니다. 주소를 확인하고 서버가 실행 중인지 확인하세요.",
|
||||
"unreachableWithReason": "서버에 연결할 수 없습니다: {{reason}}",
|
||||
"tlsUntrusted": "서버 인증서가 신뢰되지 않습니다. 자체 서명 인증서를 사용하는 자체 서버인 경우 아래 옵션을 켜세요.",
|
||||
"basicAuthRequired": "서버 앞에 있는 구성 요소에서 사용자 이름과 비밀번호를 요청합니다. 아래에 입력하세요.",
|
||||
"proxyLogin": "Termix 대신 로그인 페이지나 프록시가 응답했습니다. 필요한 헤더를 아래에 추가하거나 주소를 확인하세요.",
|
||||
"notTermix": "해당 주소에 Termix 서버가 없습니다. 경로 아래에서 실행 중이라면 https://example.com/termix 와 같이 포함하세요.",
|
||||
"versionMismatch": "해당 서버에는 구버전 Termix가 실행 중입니다. 연결하려면 2.9 이상으로 업데이트하세요.",
|
||||
"differentAccount": "다른 계정에 로그인했습니다. 이 기기와 연결된 계정에 로그인하거나 먼저 연결을 해제하세요."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Termix 서버에 연결하기",
|
||||
"reloginTitle": "다시 로그인하기",
|
||||
"savedServers": "최근 서버",
|
||||
"removeServer": "목록에서 제거",
|
||||
"serverDescription": "브라우저에서 Termix를 열 때 사용하는 주소를 입력하세요.",
|
||||
"signinDescription": "{{url}}에 로그인하기",
|
||||
"chooseDescription": "이 기기에는 이미 데이터가 있습니다. 어떻게 처리하시겠습니까?",
|
||||
"finishingDescription": "이 기기를 연결하는 중입니다.",
|
||||
"serverUrl": "서버 주소",
|
||||
"serverUrlHint": "예: https://termix.example.com",
|
||||
"showProxySettings": "리버스 프록시 설정",
|
||||
"hideProxySettings": "리버스 프록시 설정 숨기기",
|
||||
"continue": "계속",
|
||||
"back": "뒤로",
|
||||
"mergeTitle": "내 계정에 추가하기",
|
||||
"mergeBody_other": "이 기기의 {{count}}개 항목이 계정에 추가됩니다. 계정에 이미 있는 항목은 서버에서 그대로 유지됩니다.",
|
||||
"replaceTitle": "내 계정으로 대체하기",
|
||||
"replaceBody_other": "이 기기의 {{count}}개 항목이 제거되고, 이 기기는 계정에서 모든 항목을 가져옵니다. 이 기기에서만 유지된 호스트는 그대로 남습니다.",
|
||||
"link": "연결",
|
||||
"linking": "연결 중이며 첫 번째 동기화를 실행하는 중입니다...",
|
||||
"linked": "연결 완료. 데이터가 동기화되고 있습니다.",
|
||||
"signedInAgain": "로그인 완료. 동기화가 다시 실행되고 있습니다."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "호스트",
|
||||
"sshCredentials": "자격 증명",
|
||||
"sshFolders": "폴더",
|
||||
"userPreferences": "환경 설정",
|
||||
"pluginUserSettings": "플러그인 설정",
|
||||
"sharedHosts": "나와 공유된 호스트",
|
||||
"sharedCredentials": "나와 공유된 자격 증명",
|
||||
"vaultProfiles": "Vault 프로필",
|
||||
"snippetFolders": "스니펫 폴더",
|
||||
"snippets": "스니펫",
|
||||
"dashboardServiceLinks": "서비스 링크",
|
||||
"homepageItems": "홈페이지 항목",
|
||||
"networkTopology": "네트워크 맵",
|
||||
"workspaces": "작업 공간",
|
||||
"hostDefaults": "호스트 기본값",
|
||||
"hostDefaultsAdmin": "서버 호스트 기본값",
|
||||
"aiProviders": "AI 제공자",
|
||||
"homepageLayouts": "홈페이지 레이아웃",
|
||||
"accountProfile": "계정 프로필"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "폴더 {{name}}",
|
||||
@@ -1603,7 +1612,12 @@
|
||||
"gridView": "그리드",
|
||||
"listView": "목록",
|
||||
"compactRows": "간결한 행",
|
||||
"comfortableRows": "넓은 행"
|
||||
"comfortableRows": "넓은 행",
|
||||
"columns": {
|
||||
"title": "열",
|
||||
"auto": "자동",
|
||||
"count": "{{count}}열 너비"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "저장되었습니다. 입력하여 교체하세요."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Kai kurių priedų pakeisti nepavyko. Juos galite sutvarkyti vėliau iš skirtuko „Priedai“. Paspauskite „Toliau“, kad tęstumėte.",
|
||||
"pluginsApplyFailed": "Jūsų pasirinkimų išsaugoti nepavyko. Bandykite dar kartą arba tęskite ir pakeiskite juos vėliau iš skirtuko „Priedai“.",
|
||||
"pluginsLoadFailed": "Priedų sąrašo įkelti nepavyko. Priedus galite pasirinkti vėliau iš skirtuko „Priedai“.",
|
||||
"presetTitle": "Kiek norite matyti ekrane?",
|
||||
"presetIntro": "Pasirinkite, kiek bus rodoma ekrane.",
|
||||
"presetChangeLater": "Galite perjungti išankstinius nustatymus arba pakeisti bet kurį atskirą nustatymą vėliau „Nustatymuose“, skiltyje „Sąsaja“.",
|
||||
"appearanceTitle": "Pritaikykite sau",
|
||||
"appearanceIntro": "Pasirinkite temą, akcento spalvą, šriftą ir kalbą. Pakeitimai matomi iškart, o vėliau juos galite keisti „Nustatymuose“.",
|
||||
"securityTitle": "Apsaugokite savo paskyrą",
|
||||
"securityIntro": "Pridėkite prieigos raktą arba autentifikatoriaus programėlę prie savo paskyros. Tai taip pat galite padaryti vėliau „Nustatymuose“, skiltyje „Saugumas“.",
|
||||
"desktopTitle": "Kaip norite naudoti Termix?",
|
||||
"desktopBody": "Tai galite pakeisti bet kuriuo metu iš „Sinchronizavimo“ šoninėje juostoje.",
|
||||
"desktopLocalTitle": "Tik šiame įrenginyje",
|
||||
"desktopLocalBody": "Viskas saugoma čia. Nėra ko nustatyti.",
|
||||
"desktopLinkTitle": "Su mano Termix serveriu",
|
||||
"desktopLinkBody": "Prisijunkite prie savo serverio, kad naudotumėte tuos pačius hostus ir nustatymus visuose įrenginiuose.",
|
||||
"desktopLinked": "Susietas su {{server}}",
|
||||
"pluginsDocsLink": "Skaityti apie kiekvieną"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} paruošta įdiegimui",
|
||||
"readyHint": "Ji bus įdiegta kitą kartą paleidus Termix iš naujo."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Saugus režimas",
|
||||
"description": "Veikia tik išdėstymo ir temos priedai. Paleiskite serverį iš naujo be kintamojo TERMIX_SAFE_MODE, kad įjungtumėte likusius priedus."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Uždaryti skydelį",
|
||||
"moveSide": "Perkelti skydelį",
|
||||
"resize": "Keisti skydelio dydį"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Pradžia",
|
||||
"terminal": "Terminalas",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hostai",
|
||||
"credentials": "Pryminiai duomenys",
|
||||
"connections": "Ryšiai",
|
||||
"sync": "Sinchronizuoti",
|
||||
"reconnectDisconnectedTerminals": "Perjungti visus atjungtus terminalus",
|
||||
"reconnectingTerminals_one": "Perjungiamas {{count}} terminalas",
|
||||
"reconnectingTerminals_few": "Perjungiami {{count}} terminalai",
|
||||
@@ -285,10 +281,7 @@
|
||||
"retry": "Bandyti dar kartą",
|
||||
"refresh": "Atnaujinti",
|
||||
"optional": "Pasirinktinai",
|
||||
"downloadSample": "Atsisiųsti pavyzdį",
|
||||
"failedToDeleteHost": "Nepavyko ištrinti „{{name}}“",
|
||||
"importSkipExisting": "Importuoti (praleisti esamus)",
|
||||
"importSSHConfig": "Importuoti iš SSH konfigūracijos",
|
||||
"connectionDetails": "Ryšio duomenys",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -509,10 +502,7 @@
|
||||
"noFolder": "(Be aplanko)",
|
||||
"deleteSelected": "Ištrinti",
|
||||
"exitSelection": "Išeiti iš pasirinkimo",
|
||||
"importSkip": "Importuoti (praleisti esamus)",
|
||||
"importOverwrite": "Importuoti (perrašyti)",
|
||||
"collapseBtn": "Sutraukti",
|
||||
"importExportBtn": "Importuoti / Eksportuoti",
|
||||
"hostStatusesRefreshed": "Serverių būsenos atnaujintos",
|
||||
"failedToRefreshHosts": "Nepavyko atnaujinti serverių",
|
||||
"movedHostTo": "Serveris „{{host}}“ perkeltas į „{{folder}}“",
|
||||
@@ -571,6 +561,9 @@
|
||||
"deleteFolderConfirm_many": "Ištrinti „{{name}}“ ir jo {{count}} serverio? Šio veiksmo negalima atšaukti.",
|
||||
"deleteFolderConfirm_other": "Ištrinti „{{name}}“ ir jo {{count}} serverio? Šio veiksmo negalima atšaukti.",
|
||||
"failedToMoveHosts": "Nepavyko perkelti serverių",
|
||||
"managedBanner": "Šis serveris valdomas per {{plugin}}. Pakeiskite jį ten. Vis tiek galite jį prisegti ir keisti jo tvarką.",
|
||||
"managedTooltip": "Valdoma per {{plugin}}",
|
||||
"addBlocked": "Serveriai valdomi per {{plugin}}, todėl čia negalima pridėti naujų serverių.",
|
||||
"failedToReorder": "Nepavyko pakeisti tvarkos",
|
||||
"expandAll": "Išskleisti visus aplankus",
|
||||
"collapseAll": "Suskleisti visus aplankus",
|
||||
@@ -683,37 +676,6 @@
|
||||
"addCredentialBtn2": "Pridėti prisijungimo duomenis",
|
||||
"checkingHostStatuses": "Tikrinami serverių būsenos...",
|
||||
"pinnedSection": "Pritvirtinti",
|
||||
"hostsExported": "Serveriai sėkmingai eksportuoti",
|
||||
"export": {
|
||||
"menuItem": "Eksportuoti...",
|
||||
"title": "Eksportuoti serverius",
|
||||
"scope": "Apimtis",
|
||||
"scopeAll": "Visi",
|
||||
"scopeSelected": "Pasirinkti",
|
||||
"searchHosts": "Ieškoti serverių...",
|
||||
"include": "Įtraukti",
|
||||
"groupConnection": "Ryšio nustatymai",
|
||||
"groupCredentials": "Prijungimo duomenys",
|
||||
"groupNotes": "Pastabos",
|
||||
"groupTags": "Žymos ir prisegimas",
|
||||
"groupProxy": "Tarpinis serveris",
|
||||
"groupJumpHosts": "Tarpiniai serveriai",
|
||||
"groupFeatureFlags": "Priedų nustatymai",
|
||||
"groupAdvanced": "Išplėstinė konfigūracija",
|
||||
"preview": "Peržiūra",
|
||||
"moreHosts_one": "... dar {{count}} serveris",
|
||||
"moreHosts_few": "... dar {{count}} serveriai",
|
||||
"moreHosts_many": "... dar {{count}} serverio",
|
||||
"moreHosts_other": "... dar {{count}} serverio",
|
||||
"summary": "{{selected}} iš {{total}} serverių",
|
||||
"credentialsIncluded": "įtraukti prisijungimo duomenys",
|
||||
"credentialsExcluded": "neįtraukti prisijungimo duomenys",
|
||||
"noneSelected": "Nepasirinkti jokie serveriai",
|
||||
"cancel": "Atšaukti",
|
||||
"confirm": "Eksportuoti",
|
||||
"fetchFailed": "Nepavyko įkelti serverių eksportui",
|
||||
"bulkButton": "Eksportuoti"
|
||||
},
|
||||
"sampleDownloaded": "Pavyzdinis failas atsisiųstas",
|
||||
"failedToDeleteCredential2": "Nepavyko ištrinti prisijungimo duomenų",
|
||||
"noFolderOption": "(Be aplanko)",
|
||||
@@ -886,11 +848,7 @@
|
||||
"editorUpdate": "Atnaujinti serverį",
|
||||
"editorAdd": "Pridėti serverį",
|
||||
"speedSearch": "Ieškoti serverių. Rodyklės klavišai pasirinkimui, Enter prisijungimui, Esc uždarymui",
|
||||
"speedSearchList": "Serverių sąrašas. Rašykite arba paspauskite /, kad ieškotumėte.",
|
||||
"importNoHosts": "Faile nerasta jokių serverių",
|
||||
"importTooMany": "Galiite importuoti ne daugiau kaip {{max}} serverių vienu metu",
|
||||
"importSummary": "Importas baigtas: {{imported}} importuota, {{updated}} atnaujinta, {{failed}} nepavyko",
|
||||
"importHostsFailed": "Nepavyko importuoti serverių"
|
||||
"speedSearchList": "Serverių sąrašas. Rašykite arba paspauskite /, kad ieškotumėte."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Padalintas ekranas",
|
||||
@@ -1095,17 +1053,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} vartotojas",
|
||||
"usersCount_few": "{{count}} vartotojai",
|
||||
"usersCount_many": "{{count}} vartotojo",
|
||||
"rolesCount_one": "{{count}} vaidmuo",
|
||||
"rolesCount_few": "{{count}} vaidmenys",
|
||||
"rolesCount_many": "{{count}} vaidmens",
|
||||
"apiKeysCount_one": "{{count}} raktas",
|
||||
"apiKeysCount_few": "{{count}} raktai",
|
||||
"apiKeysCount_many": "{{count}} rakto",
|
||||
"sessionsActive_one": "{{count}} aktyvi",
|
||||
"sessionsActive_few": "{{count}} aktyvios",
|
||||
"sessionsActive_many": "{{count}} aktyvių",
|
||||
"hostsCount_one": "{{count}} serveris",
|
||||
"hostsCount_few": "{{count}} serveriai",
|
||||
"hostsCount_many": "{{count}} serverio",
|
||||
@@ -1116,8 +1066,6 @@
|
||||
"credentialsCount_other": "{{count}} prisijungimo duomenų rinkinio",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} leidimas",
|
||||
"count_few": "{{count}} leidimai",
|
||||
"count_many": "{{count}} leidimo",
|
||||
"groups": {
|
||||
"hosts": "Serveriai",
|
||||
"credentials": "Prisijungimo duomenys",
|
||||
@@ -1158,22 +1106,62 @@
|
||||
"interfaceFontDescription": "Keičia programos sąsajos šriftą. Terminalo profiliai išlaiko savo šrifto nustatymus.",
|
||||
"accentColorLabel": "Akcento spalva",
|
||||
"apiKeyCount_one": "{{count}} raktas",
|
||||
"apiKeyCount_few": "{{count}} raktai",
|
||||
"apiKeyCount_many": "{{count}} rakto",
|
||||
"colorPickerTooltip": "Atidaryti spalvų parinkiklį",
|
||||
"themeSystem": "Sistemos",
|
||||
"themeLight": "Šviesus",
|
||||
"themeDark": "Tamsus",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Tamsus"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Kaip išdėstyta visa programa. Temų ir išdėstymų teikia priedai.",
|
||||
"defaultsLabel": "Numatytasis visiems",
|
||||
"defaultsHint": "Ką žmonės mato, kol nepasirinks savo išdėstymo ar temos.",
|
||||
"followDefault": "Naudoti numatytąjį",
|
||||
"defaultSaved": "Numatytasis vaizdas išsaugotas",
|
||||
"saveFailed": "Nepavyko išsaugoti vaizdo",
|
||||
"repair": {
|
||||
"title": "Šio išdėstymo nepavyko parodyti",
|
||||
"safeTitle": "Saugus režimas",
|
||||
"layout": "Išdėstymas",
|
||||
"plugin": "Priedas",
|
||||
"reason": "Priežastis",
|
||||
"error": "Klaida",
|
||||
"noError": "Nėra klaidos pranešimo.",
|
||||
"copy": "Kopijuoti",
|
||||
"copied": "Nukopijuota",
|
||||
"copyFailed": "Nepavyko nukopijuoti detalių",
|
||||
"retry": "Bandyti dar kartą",
|
||||
"reset": "Atstatyti numatytąjį vaizdą",
|
||||
"resetEveryone": "Atstatyti numatytąjį visiems",
|
||||
"update": "Atnaujinti {{name}} į {{version}}",
|
||||
"disable": "Išjungti {{name}}",
|
||||
"enable": "Įjungti „{{name}}“",
|
||||
"startAgain": "Paleisti „{{name}}“ iš naujo",
|
||||
"install": "Ieškoti išdėstymų ir temų",
|
||||
"installTitle": "Išdėstymai ir temos",
|
||||
"installButton": "Įdiegti",
|
||||
"nothingToInstall": "Šiuo metu nėra kitų išdėstymų ar temų.",
|
||||
"registryUnreachable": "Nepavyko pasiekti priedų registro.",
|
||||
"askAdmin": "Paprašykite administratoriaus atnaujinti arba sutvarkyti šį išdėstymą. Žemiau galite pasirinkti kitą išdėstymą arba temą sau.",
|
||||
"switchLayout": "Keisti išdėstymą",
|
||||
"switchTheme": "Keisti temą",
|
||||
"saveFailed": "Nepavyko išsaugoti jūsų pasirinkimo",
|
||||
"reasons": {
|
||||
"safe-url": "Adresas prašė saugaus režimo. Pasirinkite išdėstymą žemiau arba pašalinkite ?safe-layout=1 iš adreso.",
|
||||
"safe-env": "Serveris paleistas su TERMIX_SAFE_LAYOUT, todėl visi mato šį ekraną, kol jis bus pašalintas.",
|
||||
"missing": "Nėra įdiegto priedo, kuris teiktų šį išdėstymą.",
|
||||
"disabled": "Priedas, teikiantis šį išdėstymą, yra išjungtas.",
|
||||
"blocked": "Priedas, teikiantis šį išdėstymą, laukia kažko, ko jam reikia.",
|
||||
"incompatible": "Priedas, teikiantis šį išdėstymą, neveikia su šia Termix versija.",
|
||||
"failed": "Išdėstymui nepavyko paleisti.",
|
||||
"crashed": "Išdėstymas sugedo du kartus piešiant programą."
|
||||
},
|
||||
"noLayout": "Nėra nustatyto išdėstymo",
|
||||
"restore": "Atkurti standartinį {{name}}",
|
||||
"restoreFailed": "Nepavyko atkurti standartinės kopijos"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1196,6 +1184,18 @@
|
||||
"title": "Tvarkyti prisijungimą",
|
||||
"consequence": "Jis gali pridėti prisijungimo būdą, antrąjį patvirtinimo veiksmą arba SSH prisijungimo tipą."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Nustatyti prisijungimo taisykles",
|
||||
"consequence": "Jis gali atjungti žmones, kai jie neveiklūs, apriboti sesijos ilgį, išjungti prisiminimą ir reikalauti antrojo patvirtinimo veiksmo."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Pasirinkti, kaip pasiekiami serveriai",
|
||||
"consequence": "Jis gali perduoti SSH ryšį su serveriu per savo maršrutą, todėl mato viską, kas siunčiama į ir iš tų serverių, įskaitant slaptažodžius."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Vykdyti sinchronizavimą",
|
||||
"consequence": "Jis gali atsakyti į visus sinchronizavimo užklausas, todėl mato duomenis, kuriuos sinchronizuoja įrenginiai ir serveriai."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Valdyti sertifikatus",
|
||||
"consequence": "Jis gali pakeisti sertifikatą, kurį Termix naudoja HTTPS ryšiams, ir atsakyti į domenų patikrinimus iš sertifikavimo institucijų."
|
||||
@@ -1204,6 +1204,10 @@
|
||||
"title": "Prieiga prie serijinių ir USB įrenginių",
|
||||
"consequence": "Jis gali atidaryti fizinį serijinį prievadą kompiuteryje, kuriame veikia Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Eksportuoti serverius su jų slaptais",
|
||||
"consequence": "Gali perskaityti visus jūsų serverius, įskaitant išsaugotus slaptažodžius ir raktus, ir juos perduoti. Kiekvienas eksportas yra įrašomas į audito žurnalą."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Kurti ir keisti serverius",
|
||||
"consequence": "Jis gali pridėti serverius ir redaguoti jau esamus."
|
||||
@@ -1248,10 +1252,30 @@
|
||||
"title": "Skaityti audito žurnalą",
|
||||
"consequence": "Jis gali matyti, kas ką ir kada atliko."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Patikrinti, ar portai atsako",
|
||||
"consequence": "Gali atidaryti paprastą ryšį su bet kokia adrese nuo serverio, kad pamatytų, ar jis pasiekiamas."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Teikti serverio būseną",
|
||||
"consequence": "Tampa šaltiniu, rodančiu, ar serveris yra prisijungęs, ar neprisijungęs."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Saugoti naujausią veiklą",
|
||||
"consequence": "Tampa vartotojų naujausių veiksmų sąrašo saugykla."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Tvarkyti serverius kaip tik skaitymo režimu",
|
||||
"consequence": "Serverių, kuriuos jis tvarko, negalima redaguoti, ištrinti ar dalintis kitais būdais."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Atidaryti darbalaukio langus",
|
||||
"consequence": "Tik Termix darbalaukio programoje."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Naudoti šį kompiuterį",
|
||||
"consequence": "Gali skaityti ir keisti failus, vykdyti komandas bei atidaryti vietinius prievadus šiame kompiuteryje. Tik Termix darbalaukio programoje."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Veikti kaip kiti vartotojai",
|
||||
"consequence": "Vykdo foninius darbus naudodamas kito vartotojo prieigos teises, pavyzdžiui, suplanuotus darbus. Kiekvienas naudojimas užrašomas audito žurnale."
|
||||
@@ -1291,6 +1315,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Pridėti savo ekranus",
|
||||
"consequence": "Kortelės, skydeliai ir nustatymai, kuriuos vėliau galėsite paslėpti."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Pakeisti visą programos išdėstymą",
|
||||
"consequence": "Pasirinkus, jo kodas nupiešia kiekvieną ekraną, įskaitant terminalus ir nustatymus."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Pridėti spalvų temas",
|
||||
"consequence": "Tik spalvos ir stiliai. Temoms joks kodas nevykdomas."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1317,7 +1349,8 @@
|
||||
"disabled": "Išjungta",
|
||||
"failed": "Nenumatomai sustabdyta",
|
||||
"blocked": "Laukiama kito priedo",
|
||||
"server": "Veikia jūsų serveryje"
|
||||
"server": "Veikia jūsų serveryje",
|
||||
"safeMode": "Išjungta saugiu režimu"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Veikia",
|
||||
@@ -1331,11 +1364,6 @@
|
||||
"updated": "Neseniai atnaujinti",
|
||||
"category": "Kategorija"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Stulpeliai",
|
||||
"auto": "Automatiškai",
|
||||
"count": "{{count}} pločio"
|
||||
},
|
||||
"table": {
|
||||
"name": "Pavadinimas",
|
||||
"description": "Aprašymas",
|
||||
@@ -1444,6 +1472,7 @@
|
||||
"options": "Nepavyko išsaugoti „{{name}}“ parinkčių: {{error}}",
|
||||
"deleteData": "Nepavyko ištrinti „{{name}}“ duomenų: {{error}}",
|
||||
"managedByServer": "Šis darbalaukis susietas su serveriu, kuris nustato jo priedus.",
|
||||
"defaultLook": "{{name}} yra numatytasis išvaizdos stilius, todėl jį galima išjungti ar pakeisti, bet ne išdiegti.",
|
||||
"hasDependents": "„{{name}}“ reikia „{{list}}“. Pirmiausia išjunkite arba pašalinkite juos.",
|
||||
"missingDependencies": "„{{name}}“ reikia „{{list}}“, kuris nėra įdiegtas.",
|
||||
"consentChanged": "Ką šis priedas prašo, pasikeitė nuo tada, kai jį peržiūrėjote. Patikrinkite sąrašą dar kartą.",
|
||||
@@ -1521,7 +1550,6 @@
|
||||
"noServerAccess": "Nėra prieigos prie jūsų serverių",
|
||||
"searchInstalled": "Ieškoti įdiegtų",
|
||||
"searchPlugins": "Ieškoti priedų",
|
||||
"allCategories": "Visi",
|
||||
"nothingMatches": "Nieko neatitinka.",
|
||||
"noneInstalled": "Dar nėra įdiegta jokių priedų. Naršykite, kad pridėtumėte.",
|
||||
"nothingHere": "Čia nieko nėra.",
|
||||
@@ -1619,7 +1647,46 @@
|
||||
"documentation": "Dokumentacija",
|
||||
"envVars": "Aplinkos kintamieji",
|
||||
"envRequired": "Būtina",
|
||||
"envDefault": "Numatyta: {{value}}"
|
||||
"envDefault": "Numatyta: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Išdėstymai",
|
||||
"themes": "Temos",
|
||||
"tabs": "Kortelės",
|
||||
"panels": "Šoninės juostos skydeliai",
|
||||
"dashboardCards": "Valdymo skydo kortelės",
|
||||
"protocols": "Jungimo tipai",
|
||||
"auth": "Prisijungimo būdai",
|
||||
"actions": "Veiksmai",
|
||||
"hostCapability": "Serverio nustatymai"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tipas",
|
||||
"allTypes": "Visi tipai",
|
||||
"category": "Kategorija",
|
||||
"allCategories": "Visos kategorijos",
|
||||
"results_one": "{{count}} priedas",
|
||||
"results_few": "{{count}} priedai",
|
||||
"results_many": "{{count}} priedų",
|
||||
"results_other": "{{count}} priedų",
|
||||
"remove": "Pašalinti filtrą {{name}}",
|
||||
"clear": "Išvalyti filtrus",
|
||||
"button": "Filtrai",
|
||||
"buttonCount": "Filtrai ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}–{{to}} iš {{total}}",
|
||||
"page": "Puslapis {{page}} iš {{pages}}",
|
||||
"previous": "Ankstesnis puslapis",
|
||||
"next": "Kitas puslapis",
|
||||
"perPage": "{{count}} puslapyje",
|
||||
"perPageLabel": "Priedų skaičius puslapyje"
|
||||
},
|
||||
"showUnsupportedHint": "Šie yra išvardyti, tačiau šiai versijai dar nėra išleista. Atnaujinkite Termix, kad galėtumėte juos įdiegti.",
|
||||
"unsupported": "Reikia naujesnės Termix versijos",
|
||||
"unsupportedHint": "Šio priedo nėra išleista šiai Termix versijai. Atnaujinkite Termix, kad galėtumėte jį įdiegti.",
|
||||
"needsTermix": "Reikia Termix {{range}}",
|
||||
"showUnsupported": "Rodyti nepalaikomus ({{count}})",
|
||||
"showMore": "Rodyti dar {{count}} (liko {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1635,97 +1702,6 @@
|
||||
"noData": "Duomenų nėra",
|
||||
"filter": "Filtruoti..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "prieš {{count}} minutę",
|
||||
"minutesAgo_few": "prieš {{count}} minutes",
|
||||
"minutesAgo_many": "prieš {{count}} minučių",
|
||||
"minutesAgo_other": "prieš {{count}} minutę",
|
||||
"hoursAgo_one": "prieš {{count}} valandą",
|
||||
"hoursAgo_few": "prieš {{count}} valandas",
|
||||
"hoursAgo_many": "prieš {{count}} valandų",
|
||||
"hoursAgo_other": "prieš {{count}} valandą",
|
||||
"pending_one": "{{count}} pakeitimas laukia sinchronizavimo",
|
||||
"pending_few": "{{count}} pakeitimai laukia sinchronizavimo",
|
||||
"pending_many": "{{count}} pakeitimų laukia sinchronizavimo",
|
||||
"pending_other": "{{count}} pakeitimas laukia sinchronizavimo",
|
||||
"proxy": {
|
||||
"headersTitle": "Papildomos antraštės",
|
||||
"headersHint": "Siunčiamos su kiekvienu užklausimu į serverį, pavyzdžiui, Cloudflare Access paslaugos žetonu.",
|
||||
"headerName": "Antraštės pavadinimas",
|
||||
"headerValue": "Reikšmė",
|
||||
"savedValue": "Išsaugota, rašykite, jei norite pakeisti",
|
||||
"addHeader": "Pridėti antraštę",
|
||||
"removeHeader": "Pašalinti antraštę",
|
||||
"basicAuthTitle": "Vartotojo vardas ir slaptažodis",
|
||||
"basicAuthHint": "Šliuzui, kuris prašo vartotojo vardo ir slaptažodžio prieš Termix.",
|
||||
"username": "Vartotojo vardas",
|
||||
"password": "Slaptažodis",
|
||||
"allowInvalidCertificate": "Pasitikėti savarankiškai pasirašytu sertifikatu",
|
||||
"allowInvalidCertificateHint": "Tik jūsų pačių serveriui, kai jo sertifikatas nėra iš žinomo centro."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Tai neatrodo kaip tinklo adresas.",
|
||||
"unreachable": "Nepavyko prisijungti prie serverio. Patikrinkite adresą ir ar serveris veikia.",
|
||||
"unreachableWithReason": "Nepavyko prisijungti prie serverio: {{reason}}",
|
||||
"tlsUntrusted": "Serverio sertifikatas nepatikimas. Jei tai jūsų serveris su savarankiškai pasirašytu sertifikatu, įjunkite žemiau esantį pasirinkimą.",
|
||||
"basicAuthRequired": "Kažkas prieš serverį prašo vartotojo vardo ir slaptažodžio. Įveskite juos žemiau.",
|
||||
"proxyLogin": "Vietoj Termix atsakė prisijungimo puslapis ar tarpinis serveris. Žemiau pridėkite reikiamus antraštes arba patikrinkite adresą.",
|
||||
"notTermix": "Pateiktame adrese nėra Termix serverio. Jei jis veikia po keliu, įtraukite jį, pvz., https://example.com/termix.",
|
||||
"versionMismatch": "Tame serveryje veikia senesnė Termix versija. Norėdami susieti, atnaujinkite ją į 2.9 arba naujesnę.",
|
||||
"differentAccount": "Prisijungėte prie kitos paskyros. Prisijunkite prie paskyros, prie kurios susietas šis įrenginys, arba pirmiausia atjunkite."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Susieti su Termix serveriu",
|
||||
"reloginTitle": "Prisijunkite iš naujo",
|
||||
"savedServers": "Naujausi serveriai",
|
||||
"removeServer": "Pašalinti iš sąrašo",
|
||||
"serverDescription": "Įveskite adresą, kurį naudojate Termix atidarymui naršyklėje.",
|
||||
"signinDescription": "Prisijunkite prie {{url}}",
|
||||
"chooseDescription": "Šiame įrenginyje jau yra duomenų. Ką su jais daryti?",
|
||||
"finishingDescription": "Susiejamas šis įrenginys.",
|
||||
"serverUrl": "Serverio adresas",
|
||||
"serverUrlHint": "Pavyzdžiui, https://termix.example.com",
|
||||
"showProxySettings": "Atvirkštinio šliuzo nustatymai",
|
||||
"hideProxySettings": "Slėpti atvirkštinio šliuzo nustatymus",
|
||||
"continue": "Tęsti",
|
||||
"back": "Atgal",
|
||||
"mergeTitle": "Pridėti prie mano paskyros",
|
||||
"mergeBody_one": "Šio įrenginio elementas bus pridėtas prie jūsų paskyros. Elementai, kuriuos jūsų paskyra jau turi, serveryje liks nepakitę.",
|
||||
"mergeBody_few": "Šio įrenginio {{count}} elementai bus pridėti prie jūsų paskyros. Elementai, kuriuos jūsų paskyra jau turi, serveryje liks nepakitę.",
|
||||
"mergeBody_many": "Šio įrenginio {{count}} elementų bus pridėta prie jūsų paskyros. Elementai, kuriuos jūsų paskyra jau turi, serveryje liks nepakitę.",
|
||||
"mergeBody_other": "Šio įrenginio {{count}} elementas bus pridėtas prie jūsų paskyros. Elementai, kuriuos jūsų paskyra jau turi, serveryje liks nepakitę.",
|
||||
"replaceTitle": "Pakeisti mano paskyros duomenimis",
|
||||
"replaceBody_one": "Šio įrenginio elementas bus pašalintas, o įrenginys perims viską iš jūsų paskyros. Liks tik tie hostai, kurie išsaugoti tik šiame įrenginyje.",
|
||||
"replaceBody_few": "Šio įrenginio {{count}} elementai bus pašalinti, o įrenginys perims viską iš jūsų paskyros. Liks tik tie hostai, kurie išsaugoti tik šiame įrenginyje.",
|
||||
"replaceBody_many": "Šio įrenginio {{count}} elementų bus pašalinta, o įrenginys perims viską iš jūsų paskyros. Liks tik tie hostai, kurie išsaugoti tik šiame įrenginyje.",
|
||||
"replaceBody_other": "Šio įrenginio {{count}} elementas bus pašalintas, o įrenginys perims viską iš jūsų paskyros. Liks tik tie hostai, kurie išsaugoti tik šiame įrenginyje.",
|
||||
"link": "Susieti",
|
||||
"linking": "Susiejama ir vykdomas pirmasis sinchronizavimas...",
|
||||
"linked": "Susieta. Jūsų duomenys dabar sinchronizuojami.",
|
||||
"signedInAgain": "Prisijungta. Sinchronizavimas vėl vykdomas."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Serveriai",
|
||||
"sshCredentials": "Prisijungimo duomenys",
|
||||
"sshFolders": "Aplankai",
|
||||
"userPreferences": "Nuostatos",
|
||||
"pluginUserSettings": "Priedų nustatymai",
|
||||
"sharedHosts": "Su jumis dalinami serveriai",
|
||||
"sharedCredentials": "Su jumis dalinami prisijungimo duomenys",
|
||||
"vaultProfiles": "Vault profiliai",
|
||||
"snippetFolders": "Kodų fragmentų aplankai",
|
||||
"snippets": "Kodų fragmentai",
|
||||
"dashboardServiceLinks": "Paslaugų nuorodos",
|
||||
"homepageItems": "Pradinio puslapio elementai",
|
||||
"networkTopology": "Tinklo schema",
|
||||
"workspaces": "Darbo aplinkos",
|
||||
"hostDefaults": "Serverio numatytieji nustatymai",
|
||||
"hostDefaultsAdmin": "Serverio serverių numatytieji nustatymai",
|
||||
"aiProviders": "AI tiekėjai",
|
||||
"homepageLayouts": "Pradinio puslapio išdėstymai",
|
||||
"accountProfile": "Paskyros profilis"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Aplankas „{{name}}“",
|
||||
@@ -1762,7 +1738,12 @@
|
||||
"gridView": "Tinklelis",
|
||||
"listView": "Sąrašas",
|
||||
"compactRows": "Kompaktiškos eilutės",
|
||||
"comfortableRows": "Patogios eilutės"
|
||||
"comfortableRows": "Patogios eilutės",
|
||||
"columns": {
|
||||
"title": "Stulpeliai",
|
||||
"auto": "Automatiškai",
|
||||
"count": "{{count}} pločio"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Išsaugota. Įveskite, kad pakeistumėte."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Dažus spraudņus neizdevās mainīt. Jūs varat tos labot vēlāk no cilnes Spraudņi. Nospiediet Tālāk, lai turpinātu.",
|
||||
"pluginsApplyFailed": "Jūsu izvēles neizdevās saglabāt. Mēģiniet vēlreiz vai turpiniet un mainiet tās vēlāk no cilnes Spraudņi.",
|
||||
"pluginsLoadFailed": "Neizdevās ielādēt spraudņu sarakstu. Jūs varat izvēlēties spraudņus vēlāk no cilnes Spraudņi.",
|
||||
"presetTitle": "Cik daudz vēlaties redzēt ekrānā?",
|
||||
"presetIntro": "Izvēlieties, cik daudz tiek parādīts ekrānā.",
|
||||
"presetChangeLater": "Jūs varat jebkurā laikā pārslēgties uz citu sagatavi vai mainīt jebkuru atsevišķu iestatījumu Iestatījumos sadaļā Interfeiss.",
|
||||
"appearanceTitle": "Padariet to par savu",
|
||||
"appearanceIntro": "Izvēlieties tēmu, akcenta krāsu, fontu un valodu. Izmaiņas tiek parādītas uzreiz, un jūs varat tās mainīt vēlāk Iestatījumos.",
|
||||
"securityTitle": "Apsargājiet savu kontu",
|
||||
"securityIntro": "Pievienojiet savam kontam pases atslēgu vai autentifikatora lietotni. Jūs varat to izdarīt arī vēlāk Iestatījumos sadaļā Drošība.",
|
||||
"desktopTitle": "Kā vēlaties izmantot Termix?",
|
||||
"desktopBody": "Jūs varat jebkurā laikā to mainīt no Sinhronizācija sānjoslā.",
|
||||
"desktopLocalTitle": "Tikai uz šīs ierīces",
|
||||
"desktopLocalBody": "Viss tiek glabāts šeit. Nekas nav jāiestata.",
|
||||
"desktopLinkTitle": "Ar manu Termix serveri",
|
||||
"desktopLinkBody": "Izrakstieties savā serverī, lai izmantotu tos pašus hostus un iestatījumus katrā ierīcē.",
|
||||
"desktopLinked": "Saitēts ar {{server}}",
|
||||
"pluginsDocsLink": "Lasiet par katru no tiem"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} ir gatavs instalēšanai",
|
||||
"readyHint": "Tas tiks instalēts nākamajā reizi, kad Termix tiks restartēts."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Drošais režīms",
|
||||
"description": "Darbojas tikai izkārtojuma un temas spraudņi. Restartējiet serveri bez TERMIX_SAFE_MODE, lai atkal ieslēgtu pārējos."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Aizvērt paneli",
|
||||
"moveSide": "Pārvietot paneli",
|
||||
"resize": "Mainīt panela izmēru"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Sākums",
|
||||
"terminal": "Terminālis",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosti",
|
||||
"credentials": "Piekļuves dati",
|
||||
"connections": "Savienojumi",
|
||||
"sync": "Sinhronizēt",
|
||||
"reconnectDisconnectedTerminals": "Atkārtoti savienot visus atvienotos termināļus",
|
||||
"reconnectingTerminals_zero": "Atkārtoti savieno {{count}} termināļus",
|
||||
"reconnectingTerminals_one": "Atkārtoti savieno {{count}} termināli",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Mēģināt vēlreiz",
|
||||
"refresh": "Atsvaidzināt",
|
||||
"optional": "Neobligāts",
|
||||
"downloadSample": "Lejupielādēt paraugu",
|
||||
"failedToDeleteHost": "Neizdevās dzēst {{name}}",
|
||||
"importSkipExisting": "Importēt (izlaist esošos)",
|
||||
"importSSHConfig": "Importēt no SSH konfigurācijas",
|
||||
"connectionDetails": "Savienojuma detaļas",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Nav mapes)",
|
||||
"deleteSelected": "Dzēst",
|
||||
"exitSelection": "Iziet no atlases",
|
||||
"importSkip": "Importēt (izlaist esošos)",
|
||||
"importOverwrite": "Importēt (pārrakstīt)",
|
||||
"collapseBtn": "Sakļaut",
|
||||
"importExportBtn": "Importēt / Eksportēt",
|
||||
"hostStatusesRefreshed": "Mezglpašnieku statusi atjaunināti",
|
||||
"failedToRefreshHosts": "Neizdevās atjaunināt mezglpašniekus",
|
||||
"movedHostTo": "Pārvietots {{host}} uz \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_one": "Dzēst \"{{name}}\" un tā {{count}} mezglu? Šo darbību nevar atsaukt.",
|
||||
"deleteFolderConfirm_other": "Dzēst \"{{name}}\" un tā {{count}} mezglus? Šo darbību nevar atsaukt.",
|
||||
"failedToMoveHosts": "Neizdevās pārvietot mezglus",
|
||||
"managedBanner": "Šo hostu pārvalda {{plugin}}. Veiciet izmaiņas tur. Jūs joprojām varat piespraust to un mainīt tās secību.",
|
||||
"managedTooltip": "Pārvalda {{plugin}}",
|
||||
"addBlocked": "Hostus pārvalda {{plugin}}, tāpēc šeit nevar pievienot jaunus hostus.",
|
||||
"failedToReorder": "Neizdevās pārkārtot",
|
||||
"expandAll": "Izvērst visas mapes",
|
||||
"collapseAll": "Sakļaut visas mapes",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Pievienot akreditācijas datus",
|
||||
"checkingHostStatuses": "Pārbauda mezglu statusus...",
|
||||
"pinnedSection": "Piesprausti",
|
||||
"hostsExported": "Mezgli eksportēti veiksmīgi",
|
||||
"export": {
|
||||
"menuItem": "Eksportēt...",
|
||||
"title": "Eksportēt mezglus",
|
||||
"scope": "Aplieci",
|
||||
"scopeAll": "Visus",
|
||||
"scopeSelected": "Atlasītos",
|
||||
"searchHosts": "Meklēt mezglus...",
|
||||
"include": "Iekļaut",
|
||||
"groupConnection": "Savienojums",
|
||||
"groupCredentials": "Piekļuves dati",
|
||||
"groupNotes": "Piezīmes",
|
||||
"groupTags": "Birkas un piesprausts",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Starpposma mezgli",
|
||||
"groupFeatureFlags": "Spraudņu iestatījumi",
|
||||
"groupAdvanced": "Paplašinātā konfigurācija",
|
||||
"preview": "Priekšskatījums",
|
||||
"moreHosts_zero": "... vēl 0 mezgli",
|
||||
"moreHosts_one": "... vēl {{count}} mezgls",
|
||||
"moreHosts_other": "... vēl {{count}} mezgli",
|
||||
"summary": "{{selected}} no {{total}} mezgliem",
|
||||
"credentialsIncluded": "iekļauti piekļuves dati",
|
||||
"credentialsExcluded": "izslēgti piekļuves dati",
|
||||
"noneSelected": "Nav atlasītu mezglu",
|
||||
"cancel": "Atcelt",
|
||||
"confirm": "Eksportēt",
|
||||
"fetchFailed": "Neizdevās ielādēt mezglus eksportēšanai",
|
||||
"bulkButton": "Eksportēt"
|
||||
},
|
||||
"sampleDownloaded": "Parauga fails lejupielādēts",
|
||||
"failedToDeleteCredential2": "Neizdevās dzēst piekļuves datus",
|
||||
"noFolderOption": "(Nav mapes)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Atjaunināt hostu",
|
||||
"editorAdd": "Pievienot hostu",
|
||||
"speedSearch": "Meklēt hostus. Bultiņu taustiņi izvēlei, Enter savienošanai, Esc aizvēršanai",
|
||||
"speedSearchList": "Hostu saraksts. Rakstiet vai nospiediet /, lai meklētu.",
|
||||
"importNoHosts": "Failā nav atrasts neviens hosts",
|
||||
"importTooMany": "Varat importēt līdz {{max}} hostiem vienlaikus",
|
||||
"importSummary": "Imports pabeigts: {{imported}} importēti, {{updated}} atjaunināti, {{failed}} neizdevās",
|
||||
"importHostsFailed": "Neizdevās importēt hostus"
|
||||
"speedSearchList": "Hostu saraksts. Rakstiet vai nospiediet /, lai meklētu."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Sadālīts ekrāns",
|
||||
@@ -1078,13 +1037,9 @@
|
||||
"hostCount_other": "{{count}} mezgli"
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_zero": "0 lietotāji",
|
||||
"usersCount_one": "{{count}} lietotājs",
|
||||
"rolesCount_zero": "0 lomas",
|
||||
"rolesCount_one": "{{count}} loma",
|
||||
"apiKeysCount_zero": "0 atslēgas",
|
||||
"apiKeysCount_one": "{{count}} atslēga",
|
||||
"sessionsActive_zero": "0 aktīvas",
|
||||
"sessionsActive_one": "{{count}} aktīva",
|
||||
"hostsCount_zero": "0 mezgli",
|
||||
"hostsCount_one": "{{count}} mezgls",
|
||||
@@ -1093,7 +1048,6 @@
|
||||
"credentialsCount_one": "{{count}} akreditācijas dati",
|
||||
"credentialsCount_other": "{{count}} akreditācijas dati",
|
||||
"rolePermissions": {
|
||||
"count_zero": "0 atļaujas",
|
||||
"count_one": "{{count}} atļauja",
|
||||
"groups": {
|
||||
"hosts": "Hosti",
|
||||
@@ -1134,22 +1088,63 @@
|
||||
"interfaceFontLabel": "Saskarnes fonts",
|
||||
"interfaceFontDescription": "Maina lietotnes saskarnes fontu. Termināļa profili saglabā savus fonta iestatījumus.",
|
||||
"accentColorLabel": "Akcenta krāsa",
|
||||
"apiKeyCount_zero": "0 atslēgas",
|
||||
"apiKeyCount_one": "{{count}} atslēga",
|
||||
"colorPickerTooltip": "Atvērt krāsu izvēlni",
|
||||
"themeSystem": "Sistēmas",
|
||||
"themeLight": "Gaišs",
|
||||
"themeDark": "Tumšs",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Tumšs"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Kāda ir visas lietotnes izkārtojuma struktūra. Tēmas un izkārtojumi ir no spraudņiem.",
|
||||
"defaultsLabel": "Noklusējums visiem",
|
||||
"defaultsHint": "Ko cilvēki redz, līdz viņi izvēlas savu izkārtojumu vai tēmu.",
|
||||
"followDefault": "Izmantot noklusējumu",
|
||||
"defaultSaved": "Noklusējuma izskats saglabāts",
|
||||
"saveFailed": "Neizdevās saglabāt izskatu",
|
||||
"repair": {
|
||||
"title": "Šo izkārtojumu nevarēja parādīt",
|
||||
"safeTitle": "Drošais režīms",
|
||||
"layout": "Izkārtojums",
|
||||
"plugin": "Spraudnis",
|
||||
"reason": "Iemesls",
|
||||
"error": "Kļūda",
|
||||
"noError": "Nav kļūdas ziņojuma.",
|
||||
"copy": "Kopēt",
|
||||
"copied": "Nokopēts",
|
||||
"copyFailed": "Neizdevās nokopēt detaļas",
|
||||
"retry": "Mēģināt vēlreiz",
|
||||
"reset": "Atiestatīt uz noklusējuma izskatu",
|
||||
"resetEveryone": "Atiestatīt noklusējumu visiem",
|
||||
"update": "Atjaunināt {{name}} uz {{version}}",
|
||||
"disable": "Izslēgt {{name}}",
|
||||
"enable": "Ieslēgt {{name}}",
|
||||
"startAgain": "Atkārtoti palaist {{name}}",
|
||||
"install": "Atrast izkārtojumus un tēmas",
|
||||
"installTitle": "Izkārtojumi un tēmas",
|
||||
"installButton": "Instalēt",
|
||||
"nothingToInstall": "Pašlaik nav pieejami citi izkārtojumi vai tēmas.",
|
||||
"registryUnreachable": "Neizdevās sasniegt spraudņu reģistru.",
|
||||
"askAdmin": "Lūdziet administratoru atjaunināt vai labot šo izkārtojumu. Zemāk varat pārslēgties uz citu izkārtojumu vai tēmu sev.",
|
||||
"switchLayout": "Pārslēgt izkārtojumu",
|
||||
"switchTheme": "Pārslēgt tēmu",
|
||||
"saveFailed": "Neizdevās saglabāt jūsu izvēli",
|
||||
"reasons": {
|
||||
"safe-url": "Adrese pieprasīja drošo režīmu. Izvēlieties izkārtojumu zemāk vai noņemiet ?safe-layout=1 no adreses.",
|
||||
"safe-env": "Serveris ir palaidts ar TERMIX_SAFE_LAYOUT, tāpēc visi redz šo ekrānu, līdz tas tiek noņemts.",
|
||||
"missing": "Neviens instalēts spraudnis nepiedāvā šo izkārtojumu.",
|
||||
"disabled": "Spraudnis, kas piedāvā šo izkārtojumu, ir izslēgts.",
|
||||
"blocked": "Spraudnis, kas piedāvā šo izkārtojumu, gaida kaut ko, kas tam nepieciešams.",
|
||||
"incompatible": "Spraudnis, kas piedāvā šo izkārtojumu, nestrādā ar šo Termix versiju.",
|
||||
"failed": "Izkārtojums neizdevās palaist.",
|
||||
"crashed": "Izkārtojums divas reizes sabruka, zīmējot lietotni."
|
||||
},
|
||||
"noLayout": "Nav iestatīts izkārtojums",
|
||||
"restore": "Atjaunot iekļauto {{name}}",
|
||||
"restoreFailed": "Neizdevās atjaunot iekļauto kopiju"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Pārvaldīt pieteikšanos",
|
||||
"consequence": "Tas var pievienot pieteikšanās metodi, otro autentifikācijas faktoru vai SSH pieteikšanās veidu."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Iestatīt pieteikšanās noteikumus",
|
||||
"consequence": "Tas var izrakstīt cilvēkus, kad tie ir neaktīvi, ierobežot sesijas ilgumu, izslēgt atcerēties mani un prasīt otro autentifikācijas faktoru."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Izvēlieties, kā tiek sasniegti hosti",
|
||||
"consequence": "Tas var pārvadāt SSH savienojumu ar hosti pa savu maršrutu, tāpēc tas redz visu, kas tiek nosūtīts uz šiem hostiem un no tiem, ieskaitot paroles."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Palaist sinhronizāciju",
|
||||
"consequence": "Tas var atbildēt uz visiem sinhronizācijas pieprasījumiem, tāpēc tas redz datus, ko ierīces un serveri sinhronizē."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Pārvaldīt sertifikātus",
|
||||
"consequence": "Tas var aizstāt sertifikātu, ko Termix izmanto HTTPS, un atbildēt uz domēna pārbaudēm no sertifikātu izsniedzējiem."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Piekļūt sērijveida un USB ierīcēm",
|
||||
"consequence": "Tas var atvērt fizisku sērijveida portu datorā, kurā darbojas Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Eksportēt hostus ar to noslēpumiem",
|
||||
"consequence": "Var lasīt jūsu hostus pilnībā, ieskaitot saglabātās paroles un atslēgas, un tos izplatīt. Katrs eksports tiek ierakstīts revīzijas žurnālā."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Izveidot un mainīt serverus",
|
||||
"consequence": "Tas var pievienot serverus un rediģēt tos, kas jums jau ir."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Lasīt revīzijas žurnālu",
|
||||
"consequence": "Tas var redzēt, kas ko un kad ir darījis."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Pārbaudīt, vai porti atbild",
|
||||
"consequence": "Var atvērt vienkāršu savienojumu ar jebkuru adresi no servera, lai redzētu, vai tā ir sasniedzama."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Nodrošināt hosta statusu",
|
||||
"consequence": "Kļūst par tiešsaistes un bezsaistes punktu avotu katram hostam."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Glabāt nesenāko aktivitāti",
|
||||
"consequence": "Kļūst par krātuvi visu lietotāju nesenās darbības sarakstam."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Pārvaldīt resursdatorus kā lasāmus",
|
||||
"consequence": "Tos pārvaldītos resursdatorus neviens cits nevar rediģēt, dzēst vai atkārtoti kopīgot."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Atvērt darbvirsmas logus",
|
||||
"consequence": "Tikai Termix darbvirsmas lietotnē."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Izmantot šo datoru",
|
||||
"consequence": "Var lasīt un mainīt failus, palaist komandrindu un atvērt lokālus portus šajā datorā. Tikai Termix darbvirsmas lietotnē."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Rīkoties kā citi lietotāji",
|
||||
"consequence": "Palaist fona darbus ar cita lietotāja piekļuves tiesībām, piemēram, plānotus uzdevumus. Katrs lietojums tiek ierakstīts revīzijas žurnālā."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Pievienot savus ekrānus",
|
||||
"consequence": "Cilnes, paneļi un iestatījumi, kurus vēlāk varat slēpt."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Aizstāt visu lietotnes izkārtojumu",
|
||||
"consequence": "Kad izvēlēts, tā kods zīmē katru ekrānu, tostarp jūsu termināļus un iestatījumus."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Pievienot krāsu tēmas",
|
||||
"consequence": "Tikai krāsas un stili. Tēmai nekāds kods netiek palaists."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Atspējots",
|
||||
"failed": "Gaidāms apstājās",
|
||||
"blocked": "Gaida citu spraudni",
|
||||
"server": "Darbojas jūsu serverī"
|
||||
"server": "Darbojas jūsu serverī",
|
||||
"safeMode": "Izslēgts drošajā režīmā"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Darbojas",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Nesen atjaunināti",
|
||||
"category": "Kategorija"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Kolonnas",
|
||||
"auto": "Automātiski",
|
||||
"count": "{{count}} kolonnu platums"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nosaukums",
|
||||
"description": "Apraksts",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "Neizdevās saglabāt {{name}} opcijas: {{error}}",
|
||||
"deleteData": "Neizdevās dzēst {{name}} datus: {{error}}",
|
||||
"managedByServer": "Šis darbvirsma ir saistīta ar serveri, kas nosaka tās spraudņus.",
|
||||
"defaultLook": "{{name}} ir noklusējuma izskats, tāpēc to var izslēgt vai aizstāt, bet neizinstalēt.",
|
||||
"hasDependents": "{{name}} ir nepieciešams {{list}}. Vispirms izslēdziet vai atinstalējiet tos.",
|
||||
"missingDependencies": "{{name}} ir nepieciešams {{list}}, kas nav instalēts.",
|
||||
"consentChanged": "Kas šis spraudnis pieprasa, ir mainījies kopš pēdējās reizes, kad to apskatījāt. Pārbaudiet sarakstu vēlreiz.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Nav piekļuves jūsu serveriem",
|
||||
"searchInstalled": "Meklēt uzstādītos",
|
||||
"searchPlugins": "Meklēt spraudņus",
|
||||
"allCategories": "Visi",
|
||||
"nothingMatches": "Nekas neatbilst.",
|
||||
"noneInstalled": "Vēl nav uzstādīti spraudņi. Pārlūkojiet, lai pievienotu.",
|
||||
"nothingHere": "Šeit nekas nav.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Dokumentācija",
|
||||
"envVars": "Vides mainīgie",
|
||||
"envRequired": "Nepieciešams",
|
||||
"envDefault": "Noklusējums: {{value}}"
|
||||
"envDefault": "Noklusējums: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Izkārtojumi",
|
||||
"themes": "Tēmas",
|
||||
"tabs": "Cilnes",
|
||||
"panels": "Sānjoslas paneļi",
|
||||
"dashboardCards": "Panela kartītes",
|
||||
"protocols": "Savienojuma veidi",
|
||||
"auth": "Pieteikšanās metodes",
|
||||
"actions": "Darbības",
|
||||
"hostCapability": "Resursdatora iestatījumi"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tips",
|
||||
"allTypes": "Visi tipi",
|
||||
"category": "Kategorija",
|
||||
"allCategories": "Visas kategorijas",
|
||||
"results_zero": "0 spraudņi",
|
||||
"results_one": "{{count}} spraudnis",
|
||||
"results_other": "{{count}} spraudņi",
|
||||
"remove": "Noņemt filtru {{name}}",
|
||||
"clear": "Notīrīt filtrus",
|
||||
"button": "Filtri",
|
||||
"buttonCount": "Filtri ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}–{{to}} no {{total}}",
|
||||
"page": "Lapa {{page}} no {{pages}}",
|
||||
"previous": "Iepriekšējā lapa",
|
||||
"next": "Nākamā lapa",
|
||||
"perPage": "{{count}} lapā",
|
||||
"perPageLabel": "Spraudņi lapā"
|
||||
},
|
||||
"showUnsupportedHint": "Šie ir uzskaitīti, bet šajā versijā vēl nav pieejams neviens izlaidums. Atjauniniet Termix, lai tos instalētu.",
|
||||
"unsupported": "Nepieciešams jaunāks Termix",
|
||||
"unsupportedHint": "Šī spraudņa izlaidums nestrādā šajā Termix versijā. Atjauniniet Termix, lai to instalētu.",
|
||||
"needsTermix": "Nepieciešams Termix {{range}}",
|
||||
"showUnsupported": "Rādīt neatbalstītos ({{count}})",
|
||||
"showMore": "Rādīt vēl {{count}} (atlicis {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Nav datu",
|
||||
"filter": "Filtrēt..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_zero": "pirms {{count}} minūtēm",
|
||||
"minutesAgo_one": "pirms {{count}} minūtes",
|
||||
"minutesAgo_other": "pirms {{count}} minūtēm",
|
||||
"hoursAgo_zero": "pirms {{count}} stundām",
|
||||
"hoursAgo_one": "pirms {{count}} stundas",
|
||||
"hoursAgo_other": "pirms {{count}} stundām",
|
||||
"pending_zero": "gaida sinhronizāciju {{count}} izmaiņas",
|
||||
"pending_one": "gaida sinhronizāciju {{count}} izmaiņa",
|
||||
"pending_other": "gaida sinhronizāciju {{count}} izmaiņas",
|
||||
"proxy": {
|
||||
"headersTitle": "Papildu virsraksti",
|
||||
"headersHint": "Nosūtīti kopā ar katru pieprasījumu serverim, piemēram, Cloudflare Access pakalpojuma marķieri.",
|
||||
"headerName": "Virsraksta nosaukums",
|
||||
"headerValue": "Vērtība",
|
||||
"savedValue": "Saglabāts, ierakstiet, lai mainītu",
|
||||
"addHeader": "Pievienot virsrakstu",
|
||||
"removeHeader": "Noņemt virsrakstu",
|
||||
"basicAuthTitle": "Lietotājvārds un parole",
|
||||
"basicAuthHint": "Starpniekserverim, kas prasa lietotājvārdu un paroli pirms Termix.",
|
||||
"username": "Lietotājvārds",
|
||||
"password": "Parole",
|
||||
"allowInvalidCertificate": "Uzticēties pašparakstītam sertifikātam",
|
||||
"allowInvalidCertificateHint": "Tikai jūsu pašu serverim, ja tā sertifikāts nav no zināmas autoritātes."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Šis neizskatās kā tīmekļa adrese.",
|
||||
"unreachable": "Nevarēja sasniegt serveri. Pārbaudiet adresi un vai servers darbojas.",
|
||||
"unreachableWithReason": "Nevarēja sasniegt serveri: {{reason}}",
|
||||
"tlsUntrusted": "Servera sertifikāts nav uzticams. Ja šis ir jūsu pats servers ar pašparakstītu sertifikātu, ieslēdziet zemāk esošo opciju.",
|
||||
"basicAuthRequired": "Kaut kas pirms servera pieprasa lietotājvārdu un paroli. Ievadiet tos zemāk.",
|
||||
"proxyLogin": "Vietā Termix atbildēja pieteikšanās lapa vai proxys. Pievienojiet zemāk nepieciešamos galvenes datus vai pārbaudiet adresi.",
|
||||
"notTermix": "Šajā adresē nav Termix servera. Ja tas darbojas zem ceļa, iekļaujiet to, piemēram, https://example.com/termix.",
|
||||
"versionMismatch": "Šis servers izmanto vecāku Termix versiju. Atjauniniet to uz 2.9 vai jaunāku, lai saistītu.",
|
||||
"differentAccount": "Jūs pieteicāties citā kontā. Piesakieties kontā, ar kuru ir saistīts šis ierīce, vai vispirms atsakaitiet saiti."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Saistīt ar Termix serveri",
|
||||
"reloginTitle": "Piesakieties vēlreiz",
|
||||
"savedServers": "Nesenie serveri",
|
||||
"removeServer": "Noņemt no saraksta",
|
||||
"serverDescription": "Ievadiet adresi, kuru izmantojat, lai atvērtu Termix pārlūkprogrammā.",
|
||||
"signinDescription": "Pieslēgties vietnē {{url}}",
|
||||
"chooseDescription": "Šajā ierīcē jau ir dati. Kā ar tiem rīkoties?",
|
||||
"finishingDescription": "Šīs ierīces saistīšana.",
|
||||
"serverUrl": "Servera adrese",
|
||||
"serverUrlHint": "Piemēram, https://termix.example.com",
|
||||
"showProxySettings": "Apgrieztā starpniekservera iestatījumi",
|
||||
"hideProxySettings": "Paslēpt apgrieztā starpniekservera iestatījumus",
|
||||
"continue": "Turpināt",
|
||||
"back": "Atpakaļ",
|
||||
"mergeTitle": "Pievienot to savam kontam",
|
||||
"mergeBody_zero": "Šī ierīce satur 0 vienumus, kas tiks pievienoti jūsu kontam. Vienumi, kas jau ir jūsu kontā, paliks serverī nemainīgi.",
|
||||
"mergeBody_one": "Šī ierīce satur 1 vienumu, kas tiks pievienots jūsu kontam. Vienumi, kas jau ir jūsu kontā, paliks serverī nemainīgi.",
|
||||
"mergeBody_other": "Šī ierīce satur {{count}} vienumus, kas tiks pievienoti jūsu kontam. Vienumi, kas jau ir jūsu kontā, paliks serverī nemainīgi.",
|
||||
"replaceTitle": "Aizstāt ar sava konta datiem",
|
||||
"replaceBody_zero": "No šīs ierīces tiks noņemti 0 vienumi, un ierīce saņems visus datus no jūsu konta. Hosti, kas saglabāti tikai šajā ierīcē, paliks.",
|
||||
"replaceBody_one": "No šīs ierīces tiks noņemts 1 vienums, un ierīce saņems visus datus no jūsu konta. Hosti, kas saglabāti tikai šajā ierīcē, paliks.",
|
||||
"replaceBody_other": "No šīs ierīces tiks noņemti {{count}} vienumi, un ierīce saņems visus datus no jūsu konta. Hosti, kas saglabāti tikai šajā ierīcē, paliks.",
|
||||
"link": "Saites izveide",
|
||||
"linking": "Notiek saites izveide un pirmā sinhronizācija...",
|
||||
"linked": "Saite izveidota. Jūsu dati tagad tiek sinhronizēti.",
|
||||
"signedInAgain": "Pieteicies. Sinhronizācija turpinās."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Mezgli",
|
||||
"sshCredentials": "Pieteikšanās dati",
|
||||
"sshFolders": "Mapes",
|
||||
"userPreferences": "Iepriekšējas izvēles",
|
||||
"pluginUserSettings": "Spraudņu iestatījumi",
|
||||
"sharedHosts": "Ar jums kopīgotie mezgli",
|
||||
"sharedCredentials": "Ar jums kopīgotie pieteikšanās dati",
|
||||
"vaultProfiles": "Vault profili",
|
||||
"snippetFolders": "Kodu fragmentu mapes",
|
||||
"snippets": "Kodu fragmenti",
|
||||
"dashboardServiceLinks": "Pakalpojumu saites",
|
||||
"homepageItems": "Sākumlapas elementi",
|
||||
"networkTopology": "Tīkla karte",
|
||||
"workspaces": "Darbvietas",
|
||||
"hostDefaults": "Mezglu noklusējuma vērtības",
|
||||
"hostDefaultsAdmin": "Servera mezglu noklusējuma vērtības",
|
||||
"aiProviders": "AI pakalpojumu sniedzēji",
|
||||
"homepageLayouts": "Sākumlapas izkārtojumi",
|
||||
"accountProfile": "Konta profils"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Mapa {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Režģis",
|
||||
"listView": "Saraksts",
|
||||
"compactRows": "Kompaktas rindas",
|
||||
"comfortableRows": "Plašas rindas"
|
||||
"comfortableRows": "Plašas rindas",
|
||||
"columns": {
|
||||
"title": "Kolonnas",
|
||||
"auto": "Automātiski",
|
||||
"count": "{{count}} kolonnu platums"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Saglabāts. Ierakstiet, lai to aizvietotu."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Sebahagian plugin tidak dapat diubah. Anda boleh membetulkannya kemudian dari tab Plugin. Tekan Seterusnya untuk meneruskan.",
|
||||
"pluginsApplyFailed": "Pilihan anda tidak dapat disimpan. Cuba lagi, atau teruskan dan ubah kemudian dari tab Plugin.",
|
||||
"pluginsLoadFailed": "Senarai plugin tidak dapat dimuatkan. Anda boleh memilih plugin kemudian dari tab Plugin.",
|
||||
"presetTitle": "Berapa banyak yang anda mahu pada skrin?",
|
||||
"presetIntro": "Pilih berapa banyak yang dipaparkan pada skrin.",
|
||||
"presetChangeLater": "Anda boleh menukar pratetap atau mengubah sebarang tetapan tunggal kemudian dalam Tetapan, di bawah Antaramuka.",
|
||||
"appearanceTitle": "Jadikan ia milik anda",
|
||||
"appearanceIntro": "Pilih tema, warna aksen, fon dan bahasa anda. Perubahan dipaparkan serta-merta, dan anda boleh mengubahnya kemudian dalam Tetapan.",
|
||||
"securityTitle": "Lindungi akaun anda",
|
||||
"securityIntro": "Tambahkan passkey atau aplikasi pengesah pada akaun anda. Anda juga boleh melakukan ini kemudian dalam Tetapan, di bawah Keselamatan.",
|
||||
"desktopTitle": "Bagaimana anda ingin menggunakan Termix?",
|
||||
"desktopBody": "Anda boleh mengubah ini pada bila-bila masa dari Sync di bar sisi.",
|
||||
"desktopLocalTitle": "Hanya pada peranti ini",
|
||||
"desktopLocalBody": "Semua disimpan di sini. Tiada apa-apa untuk disediakan.",
|
||||
"desktopLinkTitle": "Dengan pelayan Termix saya",
|
||||
"desktopLinkBody": "Log masuk ke pelayan anda untuk menggunakan hos dan tetapan yang sama pada setiap peranti.",
|
||||
"desktopLinked": "Disambungkan ke {{server}}",
|
||||
"pluginsDocsLink": "Baca tentang setiap satu"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} sedia untuk dipasang",
|
||||
"readyHint": "Ia akan dipasang pada kali seterusnya Termix dimulakan semula."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Modus selamat",
|
||||
"description": "Hanya plugin susun atur dan tema yang sedang berjalan. Mulakan semula pelayan tanpa TERMIX_SAFE_MODE untuk menghidupkan kembali yang lain."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Tutup panel",
|
||||
"moveSide": "Pindahkan panel",
|
||||
"resize": "Ubah saiz panel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Laman Utama",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hos",
|
||||
"credentials": "Kelayakan",
|
||||
"connections": "Sambungan",
|
||||
"sync": "Serentak",
|
||||
"reconnectDisconnectedTerminals": "Sambung semula semua terminal yang terputus",
|
||||
"reconnectingTerminals_other": "Menyambung semula {{count}} terminal",
|
||||
"noDisconnectedTerminals": "Tiada terminal yang terputus sedia untuk disambung semula",
|
||||
@@ -276,10 +272,7 @@
|
||||
"retry": "Cuba Lagi",
|
||||
"refresh": "Muat Semula",
|
||||
"optional": "Pilihan",
|
||||
"downloadSample": "Muat Turun Contoh",
|
||||
"failedToDeleteHost": "Gagal memadam {{name}}",
|
||||
"importSkipExisting": "Import (langkau yang sedia ada)",
|
||||
"importSSHConfig": "Import dari konfigurasi SSH",
|
||||
"connectionDetails": "Butiran Sambungan",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -497,10 +490,7 @@
|
||||
"noFolder": "(Tiada folder)",
|
||||
"deleteSelected": "Padam",
|
||||
"exitSelection": "Keluar daripada pemilihan",
|
||||
"importSkip": "Import (langkau yang sedia ada)",
|
||||
"importOverwrite": "Import (timpa)",
|
||||
"collapseBtn": "Runtuhkan",
|
||||
"importExportBtn": "Import / Eksport",
|
||||
"hostStatusesRefreshed": "Status hos dikemas kini",
|
||||
"failedToRefreshHosts": "Gagal mengemas kini hos",
|
||||
"movedHostTo": "Memindahkan {{host}} ke \"{{folder}}\"",
|
||||
@@ -553,6 +543,9 @@
|
||||
"folderDeleted": "Folder \"{{name}}\" dipadam",
|
||||
"deleteFolderConfirm_other": "Padam \"{{name}}\" dan {{count}} hosnya? Tindakan ini tidak boleh dibatalkan.",
|
||||
"failedToMoveHosts": "Gagal memindahkan hos",
|
||||
"managedBanner": "Hos ini dikendalikan oleh {{plugin}}. Ubah di sana. Anda masih boleh menyemat dan menyusun semula susunannya.",
|
||||
"managedTooltip": "Dikendalikan oleh {{plugin}}",
|
||||
"addBlocked": "Hos dikendalikan oleh {{plugin}}, jadi hos baharu tidak boleh ditambah di sini.",
|
||||
"failedToReorder": "Gagal menyusun semula",
|
||||
"expandAll": "Kembangkan semua folder",
|
||||
"collapseAll": "Runtuhkan semua folder",
|
||||
@@ -662,34 +655,6 @@
|
||||
"addCredentialBtn2": "Tambah Kelayakan",
|
||||
"checkingHostStatuses": "Menyahkan status hos...",
|
||||
"pinnedSection": "Disemat",
|
||||
"hostsExported": "Hos berjaya dieksport",
|
||||
"export": {
|
||||
"menuItem": "Eksport...",
|
||||
"title": "Eksport hos",
|
||||
"scope": "Skop",
|
||||
"scopeAll": "Semua",
|
||||
"scopeSelected": "Dipilih",
|
||||
"searchHosts": "Cari hos...",
|
||||
"include": "Sertakan",
|
||||
"groupConnection": "Sambungan",
|
||||
"groupCredentials": "Kredensial",
|
||||
"groupNotes": "Nota",
|
||||
"groupTags": "Tag & semat",
|
||||
"groupProxy": "Proksi",
|
||||
"groupJumpHosts": "Hos loncat",
|
||||
"groupFeatureFlags": "Tetapan plugin",
|
||||
"groupAdvanced": "Konfigurasi lanjutan",
|
||||
"preview": "Pratonton",
|
||||
"moreHosts_other": "... {{count}} hos lagi",
|
||||
"summary": "{{selected}} daripada {{total}} hos",
|
||||
"credentialsIncluded": "kredensial disertakan",
|
||||
"credentialsExcluded": "kredensial dikecualikan",
|
||||
"noneSelected": "Tiada hos dipilih",
|
||||
"cancel": "Batal",
|
||||
"confirm": "Eksport",
|
||||
"fetchFailed": "Gagal memuat hos untuk eksport",
|
||||
"bulkButton": "Eksport"
|
||||
},
|
||||
"sampleDownloaded": "Fail sampel dimuat turun",
|
||||
"failedToDeleteCredential2": "Gagal memadam kredensial",
|
||||
"noFolderOption": "(Tiada folder)",
|
||||
@@ -847,11 +812,7 @@
|
||||
"editorUpdate": "Kemas Kini Hos",
|
||||
"editorAdd": "Tambah Hos",
|
||||
"speedSearch": "Cari hos. Kek panah untuk memilih, Enter untuk menyambung, Esc untuk menutup",
|
||||
"speedSearchList": "Senarai hos. Taip atau tekan / untuk mencari.",
|
||||
"importNoHosts": "Tiada hos ditemui dalam fail",
|
||||
"importTooMany": "Anda boleh mengimport sehingga {{max}} hos sekaligus",
|
||||
"importSummary": "Import selesai: {{imported}} diimport, {{updated}} dikemas kini, {{failed}} gagal",
|
||||
"importHostsFailed": "Gagal mengimport hos"
|
||||
"speedSearchList": "Senarai hos. Taip atau tekan / untuk mencari."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Skrin terbahagi",
|
||||
@@ -1046,9 +1007,14 @@
|
||||
"hostCount_other": "{{count}} hos"
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "pengguna {{count}}",
|
||||
"rolesCount_one": "{{count}} peranan",
|
||||
"apiKeysCount_one": "{{count}} kunci",
|
||||
"sessionsActive_one": "aktif {{count}}",
|
||||
"hostsCount_other": "{{count}} hos",
|
||||
"credentialsCount_other": "{{count}} kelayakan",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} kebenaran",
|
||||
"groups": {
|
||||
"hosts": "Hos",
|
||||
"credentials": "Kelayakan",
|
||||
@@ -1088,20 +1054,63 @@
|
||||
"interfaceFontLabel": "Fon Antara Muka",
|
||||
"interfaceFontDescription": "Menukar fon antara muka aplikasi. Profil terminal mengekalkan tetapan fon mereka sendiri.",
|
||||
"accentColorLabel": "Warna Aksen",
|
||||
"apiKeyCount_one": "{{count}} kunci",
|
||||
"colorPickerTooltip": "Buka pemilih warna",
|
||||
"themeSystem": "Sistem",
|
||||
"themeLight": "Terang",
|
||||
"themeDark": "Gelap",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Gelap"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Bagaimana keseluruhan aplikasi disusun. Tema dan susun atur berasal daripada plugin.",
|
||||
"defaultsLabel": "Lalai untuk semua orang",
|
||||
"defaultsHint": "Apa yang dilihat pengguna sehingga mereka memilih susun atur atau tema mereka sendiri.",
|
||||
"followDefault": "Gunakan yang lalai",
|
||||
"defaultSaved": "Rupa lalai disimpan",
|
||||
"saveFailed": "Tidak dapat menyimpan rupa",
|
||||
"repair": {
|
||||
"title": "Susun atur ini tidak dapat dipaparkan",
|
||||
"safeTitle": "Mod selamat",
|
||||
"layout": "Susun atur",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Sebab",
|
||||
"error": "Ralat",
|
||||
"noError": "Tiada mesej ralat.",
|
||||
"copy": "Salin",
|
||||
"copied": "Disalin",
|
||||
"copyFailed": "Tidak dapat menyalin butiran",
|
||||
"retry": "Cuba lagi",
|
||||
"reset": "Set semula ke rupa lalai",
|
||||
"resetEveryone": "Set semula lalai untuk semua orang",
|
||||
"update": "Kemas kini {{name}} ke {{version}}",
|
||||
"disable": "Matikan {{name}}",
|
||||
"enable": "Hidupkan {{name}}",
|
||||
"startAgain": "Mulakan {{name}} semula",
|
||||
"install": "Cari susun atur dan tema",
|
||||
"installTitle": "Susun atur dan tema",
|
||||
"installButton": "Pasang",
|
||||
"nothingToInstall": "Tiada susun atur atau tema lain yang tersedia sekarang.",
|
||||
"registryUnreachable": "Daftar plugin tidak dapat dicapai.",
|
||||
"askAdmin": "Minta pentadbir mengemas kini atau membetulkan susun atur ini. Anda boleh beralih ke susun atur atau tema lain untuk diri anda di bawah.",
|
||||
"switchLayout": "Tukar susun atur",
|
||||
"switchTheme": "Tukar tema",
|
||||
"saveFailed": "Tidak dapat menyimpan pilihan anda",
|
||||
"reasons": {
|
||||
"safe-url": "Alamat meminta mod selamat. Pilih susun atur di bawah, atau buang ?safe-layout=1 daripada alamat.",
|
||||
"safe-env": "Pelayan dimulakan dengan TERMIX_SAFE_LAYOUT, jadi semua orang melihat skrin ini sehingga ia dibuang.",
|
||||
"missing": "Tiada plugin yang dipasang menyediakan susun atur ini.",
|
||||
"disabled": "Plugin yang menyediakan susun atur ini dimatikan.",
|
||||
"blocked": "Plugin yang menyediakan susun atur ini sedang menunggu sesuatu yang diperlukan.",
|
||||
"incompatible": "Plugin yang menyediakan susun atur ini tidak berfungsi dengan versi Termix ini.",
|
||||
"failed": "Susun atur gagal dimulakan.",
|
||||
"crashed": "Susun atur terhenti dua kali semasa melukis aplikasi."
|
||||
},
|
||||
"noLayout": "Tiada susun atur ditetapkan",
|
||||
"restore": "Pulihkan {{name}} yang dibundel",
|
||||
"restoreFailed": "Tidak dapat memulihkan salinan yang dibundel"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1124,6 +1133,18 @@
|
||||
"title": "Urus log masuk",
|
||||
"consequence": "Ia boleh menambah kaedah log masuk, faktor kedua atau jenis log masuk SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Tetapkan peraturan log masuk",
|
||||
"consequence": "Ia boleh mengeluarkan pengguna apabila tidak aktif, hadkan panjang sesi, matikan ingat saya dan memerlukan faktor kedua."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Pilih cara hos dicapai",
|
||||
"consequence": "Ia boleh membawa sambungan SSH ke hos melalui laluan sendiri, jadi ia melihat segala yang dihantar ke dan dari hos tersebut, termasuk kata laluan."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Jalankan segerak",
|
||||
"consequence": "Ia boleh menjawab semua permintaan segerak, jadi ia melihat data yang disegerakkan oleh peranti dan pelayan."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Urus sijil",
|
||||
"consequence": "Ia boleh menggantikan sijil yang dilayan oleh Termix melalui HTTPS dan menjawab semakan domain daripada pihak berkuasa sijil."
|
||||
@@ -1132,6 +1153,10 @@
|
||||
"title": "Akses peranti siri dan USB",
|
||||
"consequence": "Ia boleh membuka port siri fizikal pada mesin yang menjalankan Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Eksport hos dengan rahsia mereka",
|
||||
"consequence": "Boleh membaca semua hos anda sepenuhnya, termasuk kata laluan dan kunci yang disimpan, serta menyebarkannya. Setiap eksport dicatatkan dalam log audit."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Cipta dan ubah hos",
|
||||
"consequence": "Ia boleh menambah hos dan menyunting yang sudah anda ada."
|
||||
@@ -1176,10 +1201,30 @@
|
||||
"title": "Baca log audit",
|
||||
"consequence": "Ia boleh melihat siapa melakukan apa dan bila."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Semak jika port bertindak balas",
|
||||
"consequence": "Boleh membuka sambungan biasa ke mana-mana alamat dari pelayan, untuk melihat jika ia boleh dicapai."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Sediakan status hos",
|
||||
"consequence": "Menjadi sumber titik dalam talian dan luar talian untuk setiap hos."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Simpan aktiviti terkini",
|
||||
"consequence": "Menjadi stor untuk senarai aktiviti terkini setiap pengguna."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Urus hos sebagai baca sahaja",
|
||||
"consequence": "Hos yang diuruskan tidak boleh diedit, dipadam atau dikongsi semula oleh sesiapa pun."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Buka tetingkap desktop",
|
||||
"consequence": "Hanya dalam aplikasi desktop Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Gunakan komputer ini",
|
||||
"consequence": "Boleh membaca dan mengubah fail, menjalankan shell dan membuka port tempatan pada komputer ini. Hanya dalam aplikasi desktop Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Bertindak sebagai pengguna lain",
|
||||
"consequence": "Menjalankan kerja latar belakang dengan akses pengguna lain, seperti kerja yang dijadualkan. Setiap penggunaan ditulis ke log audit."
|
||||
@@ -1219,6 +1264,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Tambah skrin miliknya sendiri",
|
||||
"consequence": "Tab, panel dan tetapan yang boleh anda sembunyikan kemudian."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Gantikan keseluruhan susun atur aplikasi",
|
||||
"consequence": "Apabila dipilih, kodnya melukis setiap skrin, termasuk terminal dan tetapan anda."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Tambah tema warna",
|
||||
"consequence": "Hanya warna dan gaya. Tiada kod yang dijalankan untuk tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1245,7 +1298,8 @@
|
||||
"disabled": "Dilumpuhkan",
|
||||
"failed": "Berhenti secara tidak dijangka",
|
||||
"blocked": "Menunggu plugin lain",
|
||||
"server": "Berjalan pada pelayan anda"
|
||||
"server": "Berjalan pada pelayan anda",
|
||||
"safeMode": "Mati dalam modus selamat"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Berjalan",
|
||||
@@ -1259,11 +1313,6 @@
|
||||
"updated": "Dikemas kini baru-baru ini",
|
||||
"category": "Kategori"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Lajur",
|
||||
"auto": "Auto",
|
||||
"count": "Lebar {{count}}"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nama",
|
||||
"description": "Keterangan",
|
||||
@@ -1336,6 +1385,7 @@
|
||||
"options": "Tidak dapat menyimpan pilihan untuk {{name}}: {{error}}",
|
||||
"deleteData": "Tidak dapat memadam data untuk {{name}}: {{error}}",
|
||||
"managedByServer": "Meja ini disambungkan ke pelayan, yang menentukan pluginnya.",
|
||||
"defaultLook": "{{name}} adalah rupa lalai, jadi ia boleh dimatikan atau ditukar tetapi tidak boleh dinyahpasang.",
|
||||
"hasDependents": "{{name}} diperlukan oleh {{list}}. Matikan atau nyahpasang mereka dahulu.",
|
||||
"missingDependencies": "{{name}} memerlukan {{list}}, yang tidak dipasang.",
|
||||
"consentChanged": "Apa yang diminta oleh plugin ini telah berubah sejak anda melihatnya. Semak senarai sekali lagi.",
|
||||
@@ -1401,7 +1451,6 @@
|
||||
"noServerAccess": "Tiada akses ke pelayan anda",
|
||||
"searchInstalled": "Cari yang dipasang",
|
||||
"searchPlugins": "Cari plugin",
|
||||
"allCategories": "Semua",
|
||||
"nothingMatches": "Tiada padanan.",
|
||||
"noneInstalled": "Tiada plugin dipasang lagi. Layari untuk menambah beberapa.",
|
||||
"nothingHere": "Tiada apa-apa di sini.",
|
||||
@@ -1487,7 +1536,43 @@
|
||||
"documentation": "Dokumentasi",
|
||||
"envVars": "Pembolehubah persekitaran",
|
||||
"envRequired": "Wajib",
|
||||
"envDefault": "Lalai: {{value}}"
|
||||
"envDefault": "Lalai: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Susun atur",
|
||||
"themes": "Tema",
|
||||
"tabs": "Tab",
|
||||
"panels": "Panel bar sisi",
|
||||
"dashboardCards": "Kad papan pemuka",
|
||||
"protocols": "Jenis sambungan",
|
||||
"auth": "Kaedah log masuk",
|
||||
"actions": "Tindakan",
|
||||
"hostCapability": "Tetapan hos"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Jenis",
|
||||
"allTypes": "Semua jenis",
|
||||
"category": "Kategori",
|
||||
"allCategories": "Semua kategori",
|
||||
"results_other": "{{count}} plugin",
|
||||
"remove": "Buang penapis {{name}}",
|
||||
"clear": "Kosongkan penapis",
|
||||
"button": "Penapis",
|
||||
"buttonCount": "Penapis ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} daripada {{total}}",
|
||||
"page": "Halaman {{page}} daripada {{pages}}",
|
||||
"previous": "Halaman sebelumnya",
|
||||
"next": "Halaman seterusnya",
|
||||
"perPage": "{{count}} setiap halaman",
|
||||
"perPageLabel": "Plugin setiap halaman"
|
||||
},
|
||||
"showUnsupportedHint": "Ini disenaraikan tetapi tiada pelepasan yang berjalan pada versi ini lagi. Kemas kini Termix untuk memasangnya.",
|
||||
"unsupported": "Memerlukan Termix yang lebih baru",
|
||||
"unsupportedHint": "Tiada pelepasan plugin ini berjalan pada versi Termix ini. Kemas kini Termix untuk memasangnya.",
|
||||
"needsTermix": "Memerlukan Termix {{range}}",
|
||||
"showUnsupported": "Papar yang tidak disokong ({{count}})",
|
||||
"showMore": "Papar {{count}} lagi ({{total}} baki)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1503,80 +1588,6 @@
|
||||
"noData": "Tiada data",
|
||||
"filter": "Tapis..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_other": "{{count}} minit lalu",
|
||||
"hoursAgo_other": "{{count}} jam lalu",
|
||||
"pending_other": "{{count}} perubahan menunggu untuk disegerakkan",
|
||||
"proxy": {
|
||||
"headersTitle": "Header tambahan",
|
||||
"headersHint": "Dihantar dengan setiap permintaan ke pelayan, contohnya token perkhidmatan Cloudflare Access.",
|
||||
"headerName": "Nama header",
|
||||
"headerValue": "Nilai",
|
||||
"savedValue": "Disimpan, taip untuk mengubah",
|
||||
"addHeader": "Tambah header",
|
||||
"removeHeader": "Alih keluar header",
|
||||
"basicAuthTitle": "Nama pengguna dan kata laluan",
|
||||
"basicAuthHint": "Untuk proksi yang meminta nama pengguna dan kata laluan sebelum Termix.",
|
||||
"username": "Nama pengguna",
|
||||
"password": "Kata laluan",
|
||||
"allowInvalidCertificate": "Percayai sijil tandatangan sendiri",
|
||||
"allowInvalidCertificateHint": "Hanya untuk pelayan anda sendiri, apabila sijilnya bukan daripada pihak berkuasa yang dikenali."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Itu tidak kelihatan seperti alamat web.",
|
||||
"unreachable": "Tidak dapat menghubungi pelayan. Semak alamat dan pastikan pelayan sedang berjalan.",
|
||||
"unreachableWithReason": "Tidak dapat menghubungi pelayan: {{reason}}",
|
||||
"tlsUntrusted": "Sijil pelayan tidak dipercayai. Jika ini adalah pelayan anda sendiri dengan sijil tandatangan sendiri, hidupkan pilihan di bawah.",
|
||||
"basicAuthRequired": "Sesuatu di hadapan pelayan meminta nama pengguna dan kata laluan. Masukkan di bawah.",
|
||||
"proxyLogin": "Halaman log masuk atau proksi menjawab sebagai gantinya daripada Termix. Tambah pelayan yang diperlukan di bawah, atau semak alamat.",
|
||||
"notTermix": "Tiada pelayan Termix di alamat tersebut. Jika ia berjalan di bawah laluan, sertakan ia, seperti https://contoh.com/termix.",
|
||||
"versionMismatch": "Pelayan tersebut menjalankan Termix yang lebih lama. Kemaskini ke 2.9 atau lebih baru untuk menghubungkan.",
|
||||
"differentAccount": "Anda telah log masuk ke akaun yang berbeza. Log masuk ke akaun yang peranti ini dihubungkan, atau putuskan hubungan terlebih dahulu."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Sambungkan ke pelayan Termix",
|
||||
"reloginTitle": "Log masuk semula",
|
||||
"savedServers": "Pelayan terkini",
|
||||
"removeServer": "Buang daripada senarai",
|
||||
"serverDescription": "Masukkan alamat yang anda gunakan untuk membuka Termix dalam pelayar anda.",
|
||||
"signinDescription": "Log masuk ke {{url}}",
|
||||
"chooseDescription": "Peranti ini sudah mempunyai data. Apa yang perlu dilakukan dengannya?",
|
||||
"finishingDescription": "Menyambungkan peranti ini.",
|
||||
"serverUrl": "Alamat pelayan",
|
||||
"serverUrlHint": "Contohnya https://termix.contoh.com",
|
||||
"showProxySettings": "Tetapan proksi songsang",
|
||||
"hideProxySettings": "Sembunyikan tetapan proksi songsang",
|
||||
"continue": "Teruskan",
|
||||
"back": "Kembali",
|
||||
"mergeTitle": "Tambah ke akaun saya",
|
||||
"replaceTitle": "Gantikan dengan akaun saya",
|
||||
"link": "Sambungkan",
|
||||
"linking": "Menyambungkan dan menjalankan penyegerakan pertama...",
|
||||
"linked": "Disambungkan. Data anda sedang disegerakkan sekarang.",
|
||||
"signedInAgain": "Telah log masuk. Penyegerakan sedang berjalan semula."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hosten",
|
||||
"sshCredentials": "Kelayakan",
|
||||
"sshFolders": "Folder",
|
||||
"userPreferences": "Keutamaan",
|
||||
"pluginUserSettings": "Tetapan plugin",
|
||||
"sharedHosts": "Hosten yang dikongsi dengan anda",
|
||||
"sharedCredentials": "Kelayakan yang dikongsi dengan anda",
|
||||
"vaultProfiles": "Profil Vault",
|
||||
"snippetFolders": "Folder snippet",
|
||||
"snippets": "Snippet",
|
||||
"dashboardServiceLinks": "Pautan perkhidmatan",
|
||||
"homepageItems": "Item halaman utama",
|
||||
"networkTopology": "Peta rangkaian",
|
||||
"workspaces": "Ruang kerja",
|
||||
"hostDefaults": "Lalai hos",
|
||||
"hostDefaultsAdmin": "Lalai hos pelayan",
|
||||
"aiProviders": "Pembekal AI",
|
||||
"homepageLayouts": "Susun atur halaman utama",
|
||||
"accountProfile": "Profil akaun"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Folder {{name}}",
|
||||
@@ -1601,7 +1612,12 @@
|
||||
"gridView": "Grid",
|
||||
"listView": "Senarai",
|
||||
"compactRows": "Baris padat",
|
||||
"comfortableRows": "Baris selesa"
|
||||
"comfortableRows": "Baris selesa",
|
||||
"columns": {
|
||||
"title": "Lajur",
|
||||
"auto": "Auto",
|
||||
"count": "Lebar {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Disimpan. Taip untuk menggantikannya."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Sommige plugins konden niet worden gewijzigd. Je kunt ze later oplossen via het tabblad Plugins. Druk op Volgende om door te gaan.",
|
||||
"pluginsApplyFailed": "Je keuzes konden niet worden opgeslagen. Probeer het opnieuw, of ga door en pas ze later aan via het tabblad Plugins.",
|
||||
"pluginsLoadFailed": "De pluginlijst kon niet worden geladen. Je kunt later plugins kiezen via het tabblad Plugins.",
|
||||
"presetTitle": "Hoeveel wil je op het scherm zien?",
|
||||
"presetIntro": "Kies hoeveel er op het scherm wordt weergegeven.",
|
||||
"presetChangeLater": "Je kunt later van preset wisselen of individuele instellingen wijzigen in Instellingen, onder Interface.",
|
||||
"appearanceTitle": "Maak het persoonlijk",
|
||||
"appearanceIntro": "Kies een thema, een accentkleur, een lettertype en je taal. Wijzigingen worden direct weergegeven en je kunt ze later aanpassen in Instellingen.",
|
||||
"securityTitle": "Beveilig je account",
|
||||
"securityIntro": "Voeg een passkey of een authenticator-app toe aan je account. Je kunt dit ook later doen in Instellingen, onder Beveiliging.",
|
||||
"desktopTitle": "Hoe wil je Termix gebruiken?",
|
||||
"desktopBody": "Je kunt dit op elk moment wijzigen via Sync in de zijbalk.",
|
||||
"desktopLocalTitle": "Alleen op dit apparaat",
|
||||
"desktopLocalBody": "Alles wordt hierop opgeslagen. Niets in te stellen.",
|
||||
"desktopLinkTitle": "Met mijn Termix-server",
|
||||
"desktopLinkBody": "Meld je aan bij je server om dezelfde hosts en instellingen op elk apparaat te gebruiken.",
|
||||
"desktopLinked": "Gekoppeld aan {{server}}",
|
||||
"pluginsDocsLink": "Lees meer over elk plugin"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} is klaar om te installeren",
|
||||
"readyHint": "Het wordt geïnstalleerd de volgende keer dat Termix herstart."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Veilige modus",
|
||||
"description": "Alleen layout- en thema-plugins zijn actief. Herstart de server zonder TERMIX_SAFE_MODE om de rest weer in te schakelen."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Sluit paneel",
|
||||
"moveSide": "Verplaats paneel",
|
||||
"resize": "Wijzig grootte paneel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Home",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Aanmeldgegevens",
|
||||
"connections": "Verbindingen",
|
||||
"sync": "Synchroniseren",
|
||||
"reconnectDisconnectedTerminals": "Alle verbroken terminals opnieuw verbinden",
|
||||
"reconnectingTerminals_one": "{{count}} terminal opnieuw verbinden",
|
||||
"reconnectingTerminals_other": "{{count}} terminals opnieuw verbinden",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Opnieuw proberen",
|
||||
"refresh": "Vernieuwen",
|
||||
"optional": "Optioneel",
|
||||
"downloadSample": "Voorbeeld downloaden",
|
||||
"failedToDeleteHost": "Kon {{name}} niet verwijderen",
|
||||
"importSkipExisting": "Importeren (bestaande overslaan)",
|
||||
"importSSHConfig": "Importeren uit SSH-configuratie",
|
||||
"connectionDetails": "Verbindingsgegevens",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Geen map)",
|
||||
"deleteSelected": "Verwijderen",
|
||||
"exitSelection": "Selectie afsluiten",
|
||||
"importSkip": "Importeren (bestaande overslaan)",
|
||||
"importOverwrite": "Importeren (overschrijven)",
|
||||
"collapseBtn": "Samenvouwen",
|
||||
"importExportBtn": "Importeren / Exporteren",
|
||||
"hostStatusesRefreshed": "Hoststatussen vernieuwd",
|
||||
"failedToRefreshHosts": "Hosts vernieuwen mislukt",
|
||||
"movedHostTo": "{{host}} verplaatst naar \"{{folder}}\"",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Verwijder \"{{name}}\" en de {{count}} host? Dit kan niet ongedaan worden gemaakt.",
|
||||
"deleteFolderConfirm_other": "Verwijder \"{{name}}\" en de {{count}} hosts? Dit kan niet ongedaan worden gemaakt.",
|
||||
"failedToMoveHosts": "Hosts konden niet worden verplaatst",
|
||||
"managedBanner": "Deze host wordt beheerd door {{plugin}}. Pas deze daar aan. Je kunt deze host nog steeds vastmaken en van volgorde veranderen.",
|
||||
"managedTooltip": "Beheerd door {{plugin}}",
|
||||
"addBlocked": "Hosts worden beheerd door {{plugin}}, dus hier kunnen geen nieuwe hosts worden toegevoegd.",
|
||||
"failedToReorder": "Volgorde kon niet worden aangepast",
|
||||
"expandAll": "Alle mappen uitvouwen",
|
||||
"collapseAll": "Alle mappen inklappen",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Aanmeldgegevens toevoegen",
|
||||
"checkingHostStatuses": "Hoststatussen controleren...",
|
||||
"pinnedSection": "Vastgepind",
|
||||
"hostsExported": "Hosts succesvol geëxporteerd",
|
||||
"export": {
|
||||
"menuItem": "Exporteren...",
|
||||
"title": "Hosts exporteren",
|
||||
"scope": "Bereik",
|
||||
"scopeAll": "Alles",
|
||||
"scopeSelected": "Geselecteerd",
|
||||
"searchHosts": "Hosts zoeken...",
|
||||
"include": "Inbegrepen",
|
||||
"groupConnection": "Verbinding",
|
||||
"groupCredentials": "Inloggegevens",
|
||||
"groupNotes": "Notities",
|
||||
"groupTags": "Labels & vastpinnen",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump hosts",
|
||||
"groupFeatureFlags": "Plugin-instellingen",
|
||||
"groupAdvanced": "Geavanceerde configuratie",
|
||||
"preview": "Voorbeeld",
|
||||
"moreHosts_one": "... {{count}} extra host",
|
||||
"moreHosts_other": "... {{count}} extra hosts",
|
||||
"summary": "{{selected}} van {{total}} hosts",
|
||||
"credentialsIncluded": "inloggegevens inbegrepen",
|
||||
"credentialsExcluded": "inloggegevens uitgesloten",
|
||||
"noneSelected": "Geen hosts geselecteerd",
|
||||
"cancel": "Annuleren",
|
||||
"confirm": "Exporteren",
|
||||
"fetchFailed": "Kan hosts voor export niet laden",
|
||||
"bulkButton": "Exporteren"
|
||||
},
|
||||
"sampleDownloaded": "Voorbeeldbestand gedownload",
|
||||
"failedToDeleteCredential2": "Kan inloggegevens niet verwijderen",
|
||||
"noFolderOption": "(Geen map)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Host bijwerken",
|
||||
"editorAdd": "Host toevoegen",
|
||||
"speedSearch": "Zoek hosts. Pijltjestoetsen om te selecteren, Enter om te verbinden, Esc om te sluiten",
|
||||
"speedSearchList": "Hostlijst. Typ of druk op / om te zoeken.",
|
||||
"importNoHosts": "Geen hosts gevonden in het bestand",
|
||||
"importTooMany": "Je kunt maximaal {{max}} hosts tegelijk importeren",
|
||||
"importSummary": "Importeren voltooid: {{imported}} geïmporteerd, {{updated}} bijgewerkt, {{failed}} mislukt",
|
||||
"importHostsFailed": "Kan hosts niet importeren"
|
||||
"speedSearchList": "Hostlijst. Typ of druk op / om te zoeken."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Gesplitst scherm",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Kleurkiezer openen",
|
||||
"themeSystem": "Systeem",
|
||||
"themeLight": "Licht",
|
||||
"themeDark": "Donker",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Donker"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Hoe de hele app is opgebouwd. Thema's en lay-outs komen van plugins.",
|
||||
"defaultsLabel": "Standaard voor iedereen",
|
||||
"defaultsHint": "Wat mensen zien totdat ze hun eigen lay-out of thema kiezen.",
|
||||
"followDefault": "Gebruik de standaard",
|
||||
"defaultSaved": "Standaard uiterlijk opgeslagen",
|
||||
"saveFailed": "Kon het uiterlijk niet opslaan",
|
||||
"repair": {
|
||||
"title": "Deze lay-out kon niet worden weergegeven",
|
||||
"safeTitle": "Veilige modus",
|
||||
"layout": "Lay-out",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Reden",
|
||||
"error": "Fout",
|
||||
"noError": "Geen foutmelding.",
|
||||
"copy": "Kopiëren",
|
||||
"copied": "Gekopieerd",
|
||||
"copyFailed": "Kon de details niet kopiëren",
|
||||
"retry": "Opnieuw proberen",
|
||||
"reset": "Terugzetten naar het standaard uiterlijk",
|
||||
"resetEveryone": "Standaard voor iedereen terugzetten",
|
||||
"update": "Update {{name}} naar {{version}}",
|
||||
"disable": "Zet {{name}} uit",
|
||||
"enable": "{{name}} inschakelen",
|
||||
"startAgain": "{{name}} opnieuw starten",
|
||||
"install": "Lay-outs en thema's zoeken",
|
||||
"installTitle": "Lay-outs en thema's",
|
||||
"installButton": "Installeren",
|
||||
"nothingToInstall": "Er zijn momenteel geen andere lay-outs of thema's beschikbaar.",
|
||||
"registryUnreachable": "De pluginregister kon niet worden bereikt.",
|
||||
"askAdmin": "Vraag een beheerder om deze lay-out bij te werken of te repareren. Hieronder kun je voor jezelf overschakelen naar een andere lay-out of thema.",
|
||||
"switchLayout": "Lay-out wisselen",
|
||||
"switchTheme": "Thema wisselen",
|
||||
"saveFailed": "Kon je keuze niet opslaan",
|
||||
"reasons": {
|
||||
"safe-url": "Het adres vroeg om veilige modus. Kies hieronder een lay-out, of verwijder ?safe-layout=1 uit het adres.",
|
||||
"safe-env": "De server is gestart met TERMIX_SAFE_LAYOUT, dus iedereen ziet dit scherm totdat deze is verwijderd.",
|
||||
"missing": "Geen enkele geïnstalleerde plugin biedt deze lay-out aan.",
|
||||
"disabled": "De plugin die deze lay-out aanbiedt, is uitgeschakeld.",
|
||||
"blocked": "De plugin die deze lay-out aanbiedt, wacht op iets wat het nodig heeft.",
|
||||
"incompatible": "De plugin die deze lay-out aanbiedt, werkt niet met deze versie van Termix.",
|
||||
"failed": "De lay-out kon niet worden gestart.",
|
||||
"crashed": "De lay-out crashte twee keer tijdens het tekenen van de app."
|
||||
},
|
||||
"noLayout": "Geen lay-out ingesteld",
|
||||
"restore": "Herstel de meegeleverde {{name}}",
|
||||
"restoreFailed": "Kon de meegeleverde kopie niet herstellen"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Inloggen afhandelen",
|
||||
"consequence": "Het kan een inlogmethode, een tweede factor of een SSH-inlogtype toevoegen."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Inlogregels instellen",
|
||||
"consequence": "Het kan gebruikers uitloggen bij inactiviteit, de sessieduur beperken, 'Aangemeld blijven' uitschakelen en een tweede factor vereisen."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Kies hoe hosts worden bereikt",
|
||||
"consequence": "Het kan de SSH-verbinding met een host via zijn eigen route verzenden, zodat het alles ziet wat naar en van die hosts wordt gestuurd, inclusief wachtwoorden."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Synchronisatie uitvoeren",
|
||||
"consequence": "Het kan alle synchronisatieverzoeken beantwoorden, zodat het de gegevens ziet die apparaten en servers synchroniseren."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Certificaten beheren",
|
||||
"consequence": "Het kan het certificaat vervangen dat Termix via HTTPS aanbiedt en domeincontroles van certificeringsinstanties beantwoorden."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Toegang tot seriële en USB-apparaten",
|
||||
"consequence": "Het kan een fysieke seriële poort openen op de machine waarop Termix draait."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Hosts exporteren met hun geheimen",
|
||||
"consequence": "Kan al je hosts volledig lezen, inclusief opgeslagen wachtwoorden en sleutels, en deze delen. Elke export wordt in het auditlogboek geregistreerd."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Maak hosts aan en wijzig ze",
|
||||
"consequence": "Het kan hosts toevoegen en de bestaande hosts bewerken."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Lees het auditlogboek",
|
||||
"consequence": "Het kan zien wie wat en wanneer heeft gedaan."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Controleren of poorten reageren",
|
||||
"consequence": "Kan een eenvoudige verbinding openen naar elk adres vanaf de server, om te zien of het bereikbaar is."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Hoststatus verstrekken",
|
||||
"consequence": "Wordt de bron van de online- en offline-puntjes voor elke host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Recente activiteit opslaan",
|
||||
"consequence": "Wordt de opslag voor de recente activiteitenslijst van elke gebruiker."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Hosts als alleen-lezen beheren",
|
||||
"consequence": "Hosts die hierdoor worden beheerd, kunnen door niemand anders worden bewerkt, verwijderd of opnieuw gedeeld."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Open desktopvensters",
|
||||
"consequence": "Alleen in de Termix-desktopapp."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Deze computer gebruiken",
|
||||
"consequence": "Kan bestanden lezen en wijzigen, een shell uitvoeren en lokale poorten openen op deze computer. Alleen in de Termix-desktopapp."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Handel namens andere gebruikers",
|
||||
"consequence": "Voert achtergrondwerk uit met de toegang van een andere gebruiker, zoals geplande taken. Elk gebruik wordt vastgelegd in het auditlogboek."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Eigen schermen toevoegen",
|
||||
"consequence": "Tabbladen, panelen en instellingen die je later kunt verbergen."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "De volledige app-indeling vervangen",
|
||||
"consequence": "Wanneer geselecteerd, tekent de code elk scherm, inclusief je terminals en instellingen."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Kleurthema's toevoegen",
|
||||
"consequence": "Alleen kleuren en stijlen. Er wordt geen code uitgevoerd voor een thema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Uitgeschakeld",
|
||||
"failed": "Onverwacht gestopt",
|
||||
"blocked": "Wachten op een andere plugin",
|
||||
"server": "Wordt uitgevoerd op je server"
|
||||
"server": "Wordt uitgevoerd op je server",
|
||||
"safeMode": "Uitgeschakeld in veilige modus"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Actief",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Recent bijgewerkt",
|
||||
"category": "Categorie"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Kolommen",
|
||||
"auto": "Automatisch",
|
||||
"count": "{{count}} kolommen breed"
|
||||
},
|
||||
"table": {
|
||||
"name": "Naam",
|
||||
"description": "Beschrijving",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Opties voor {{name}} konden niet worden opgeslagen: {{error}}",
|
||||
"deleteData": "Gegevens voor {{name}} konden niet worden verwijderd: {{error}}",
|
||||
"managedByServer": "Dit bureaublad is gekoppeld aan een server, die bepaalt welke plugins worden gebruikt.",
|
||||
"defaultLook": "{{name}} is het standaard uiterlijk, dus het kan worden uitgeschakeld of vervangen, maar niet worden verwijderd.",
|
||||
"hasDependents": "{{name}} is nodig voor {{list}}. Schakel die eerst uit of verwijder ze.",
|
||||
"missingDependencies": "{{name}} heeft {{list}} nodig, wat niet is geïnstalleerd.",
|
||||
"consentChanged": "Wat deze plugin vraagt, is veranderd sinds je het laatste keer bekeek. Controleer de lijst opnieuw.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Geen toegang tot je servers",
|
||||
"searchInstalled": "Zoeken in geïnstalleerde",
|
||||
"searchPlugins": "Zoeken in plugins",
|
||||
"allCategories": "Alles",
|
||||
"nothingMatches": "Niets komt hiermee overeen.",
|
||||
"noneInstalled": "Nog geen plugins geïnstalleerd. Blader om er een paar toe te voegen.",
|
||||
"nothingHere": "Hier is niets.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Documentatie",
|
||||
"envVars": "Omgevingsvariabelen",
|
||||
"envRequired": "Verplicht",
|
||||
"envDefault": "Standaard: {{value}}"
|
||||
"envDefault": "Standaard: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Indelingen",
|
||||
"themes": "Thema's",
|
||||
"tabs": "Tabbladen",
|
||||
"panels": "Zijbalkpanelen",
|
||||
"dashboardCards": "Dashboardkaarten",
|
||||
"protocols": "Verbindingstypen",
|
||||
"auth": "Inlogmethoden",
|
||||
"actions": "Acties",
|
||||
"hostCapability": "Hostinstellingen"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Type",
|
||||
"allTypes": "Alle typen",
|
||||
"category": "Categorie",
|
||||
"allCategories": "Alle categorieën",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_other": "{{count}} plugins",
|
||||
"remove": "Filter {{name}} verwijderen",
|
||||
"clear": "Filters wissen",
|
||||
"button": "Filters",
|
||||
"buttonCount": "Filters ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} van {{total}}",
|
||||
"page": "Pagina {{page}} van {{pages}}",
|
||||
"previous": "Vorige pagina",
|
||||
"next": "Volgende pagina",
|
||||
"perPage": "{{count}} per pagina",
|
||||
"perPageLabel": "Plugins per pagina"
|
||||
},
|
||||
"showUnsupportedHint": "Deze worden weergegeven, maar er is nog geen release die op deze versie werkt. Werk Termix bij om ze te installeren.",
|
||||
"unsupported": "Vereist nieuwere Termix",
|
||||
"unsupportedHint": "Er is geen release van deze plugin die op deze versie van Termix werkt. Werk Termix bij om deze te installeren.",
|
||||
"needsTermix": "Vereist Termix {{range}}",
|
||||
"showUnsupported": "Ongestuurde weergeven ({{count}})",
|
||||
"showMore": "{{count}} meer weergeven ({{total}} over)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Geen gegevens",
|
||||
"filter": "Filteren..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minuut geleden",
|
||||
"minutesAgo_other": "{{count}} minuten geleden",
|
||||
"hoursAgo_one": "{{count}} uur geleden",
|
||||
"hoursAgo_other": "{{count}} uur geleden",
|
||||
"pending_one": "{{count}} wijziging wacht op synchronisatie",
|
||||
"pending_other": "{{count}} wijzigingen wachten op synchronisatie",
|
||||
"proxy": {
|
||||
"headersTitle": "Extra headers",
|
||||
"headersHint": "Verzonden met elke aanvraag naar de server, bijvoorbeeld een Cloudflare Access servicetoken.",
|
||||
"headerName": "Headernaam",
|
||||
"headerValue": "Waarde",
|
||||
"savedValue": "Opgeslagen, typ om te wijzigen",
|
||||
"addHeader": "Header toevoegen",
|
||||
"removeHeader": "Header verwijderen",
|
||||
"basicAuthTitle": "Gebruikersnaam en wachtwoord",
|
||||
"basicAuthHint": "Voor een proxy die om een gebruikersnaam en wachtwoord vraagt voordat Termix wordt geladen.",
|
||||
"username": "Gebruikersnaam",
|
||||
"password": "Wachtwoord",
|
||||
"allowInvalidCertificate": "Een zelfondertekend certificaat vertrouwen",
|
||||
"allowInvalidCertificateHint": "Alleen voor je eigen server, wanneer het certificaat niet van een bekende autoriteit is."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Dit lijkt niet op een webadres.",
|
||||
"unreachable": "De server is niet bereikbaar. Controleer het adres en of de server draait.",
|
||||
"unreachableWithReason": "De server is niet bereikbaar: {{reason}}",
|
||||
"tlsUntrusted": "Het certificaat van de server is niet vertrouwd. Als dit uw eigen server is met een zelfondertekend certificaat, schakel dan de onderstaande optie in.",
|
||||
"basicAuthRequired": "Er wordt door iets voor de server om een gebruikersnaam en wachtwoord gevraagd. Voer deze hieronder in.",
|
||||
"proxyLogin": "Er werd een inlogpagina of proxy teruggegeven in plaats van Termix. Voeg hieronder de benodigde headers toe, of controleer het adres.",
|
||||
"notTermix": "Op dat adres draait geen Termix-server. Als het onder een pad draait, neem dat dan mee, zoals https://voorbeeld.nl/termix.",
|
||||
"versionMismatch": "Die server draait een oudere versie van Termix. Werk deze bij naar 2.9 of nieuwer om te koppelen.",
|
||||
"differentAccount": "U bent ingelogd bij een ander account. Log in bij het account waarmee dit apparaat is gekoppeld, of koppel het eerst los."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Koppelen aan een Termix-server",
|
||||
"reloginTitle": "Opnieuw inloggen",
|
||||
"savedServers": "Recente servers",
|
||||
"removeServer": "Verwijderen uit de lijst",
|
||||
"serverDescription": "Voer het adres in dat u gebruikt om Termix in uw browser te openen.",
|
||||
"signinDescription": "Inloggen bij {{url}}",
|
||||
"chooseDescription": "Dit apparaat heeft al gegevens. Wat moet er mee gebeuren?",
|
||||
"finishingDescription": "Dit apparaat wordt gekoppeld.",
|
||||
"serverUrl": "Serveradres",
|
||||
"serverUrlHint": "Bijvoorbeeld https://termix.voorbeeld.nl",
|
||||
"showProxySettings": "Instellingen reverse proxy",
|
||||
"hideProxySettings": "Instellingen reverse proxy verbergen",
|
||||
"continue": "Verder",
|
||||
"back": "Terug",
|
||||
"mergeTitle": "Toevoegen aan mijn account",
|
||||
"mergeBody_one": "Het item op dit apparaat wordt toegevoegd aan uw account. Items die uw account al heeft, blijven zoals ze zijn op de server.",
|
||||
"mergeBody_other": "De {{count}} items op dit apparaat worden toegevoegd aan uw account. Items die uw account al heeft, blijven zoals ze zijn op de server.",
|
||||
"replaceTitle": "Vervangen door mijn account",
|
||||
"replaceBody_one": "Het item op dit apparaat wordt verwijderd en dit apparaat neemt alles over van uw account. Hosts die alleen op dit apparaat zijn bewaard, blijven behouden.",
|
||||
"replaceBody_other": "De {{count}} items op dit apparaat worden verwijderd en dit apparaat neemt alles over van uw account. Hosts die alleen op dit apparaat zijn bewaard, blijven behouden.",
|
||||
"link": "Koppelen",
|
||||
"linking": "Koppelen en eerste synchronisatie uitvoeren...",
|
||||
"linked": "Gekoppeld. Uw gegevens worden nu gesynchroniseerd.",
|
||||
"signedInAgain": "Ingelogd. Synchronisatie loopt weer."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hosts",
|
||||
"sshCredentials": "Referenties",
|
||||
"sshFolders": "Mappen",
|
||||
"userPreferences": "Voorkeuren",
|
||||
"pluginUserSettings": "Plugin-instellingen",
|
||||
"sharedHosts": "Met jou gedeelde hosts",
|
||||
"sharedCredentials": "Met jou gedeelde referenties",
|
||||
"vaultProfiles": "Vault-profielen",
|
||||
"snippetFolders": "Snippetmappen",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Servicelinks",
|
||||
"homepageItems": "Startpagina-items",
|
||||
"networkTopology": "Netwerkkaart",
|
||||
"workspaces": "Werkruimten",
|
||||
"hostDefaults": "Hoststandaarden",
|
||||
"hostDefaultsAdmin": "Serverhoststandaarden",
|
||||
"aiProviders": "AI-aanbieders",
|
||||
"homepageLayouts": "Startpaginalayouts",
|
||||
"accountProfile": "Accountprofiel"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Map {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Raster",
|
||||
"listView": "Lijst",
|
||||
"compactRows": "Compacte rijen",
|
||||
"comfortableRows": "Ruime rijen"
|
||||
"comfortableRows": "Ruime rijen",
|
||||
"columns": {
|
||||
"title": "Kolommen",
|
||||
"auto": "Automatisch",
|
||||
"count": "{{count}} kolommen breed"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Opgeslagen. Typ om het te vervangen."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Noen utvidelser kunne ikke endres. Du kan fikse dem senere fra fanen Utvidelser. Trykk Neste for å fortsette.",
|
||||
"pluginsApplyFailed": "Valgene dine kunne ikke lagres. Prøv igjen, eller fortsett og endre dem senere fra fanen Utvidelser.",
|
||||
"pluginsLoadFailed": "Listen over utvidelser kunne ikke lastes. Du kan velge utvidelser senere fra fanen Utvidelser.",
|
||||
"presetTitle": "Hvor mye vil du ha på skjermen?",
|
||||
"presetIntro": "Velg hvor mye som vises på skjermen.",
|
||||
"presetChangeLater": "Du kan bytte maler eller endre enkeltinnstillinger senere i Innstillinger, under Grensesnitt.",
|
||||
"appearanceTitle": "Gjør den din egen",
|
||||
"appearanceIntro": "Velg et tema, en aksentfarge, en skrifttype og språket ditt. Endringer vises med en gang, og du kan endre dem senere i Innstillinger.",
|
||||
"securityTitle": "Sikre kontoen din",
|
||||
"securityIntro": "Legg til en passnøkkel eller en autentikator-app til kontoen din. Du kan også gjøre dette senere i Innstillinger, under Sikkerhet.",
|
||||
"desktopTitle": "Hvordan vil du bruke Termix?",
|
||||
"desktopBody": "Du kan endre dette når som helst fra Synkroniser i sidefeltet.",
|
||||
"desktopLocalTitle": "Kun på denne enheten",
|
||||
"desktopLocalBody": "Alt lagres her. Ingenting å sette opp.",
|
||||
"desktopLinkTitle": "Med Termix-serveren min",
|
||||
"desktopLinkBody": "Logg inn på serveren din for å bruke de samme vertsene og innstillingene på alle enheter.",
|
||||
"desktopLinked": "Koblet til {{server}}",
|
||||
"pluginsDocsLink": "Les om hver enkelt"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} er klar til installasjon",
|
||||
"readyHint": "Den installeres neste gang Termix starter på nytt."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Sikker modus",
|
||||
"description": "Kun utforming- og tematillegg kjører. Start serveren på nytt uten TERMIX_SAFE_MODE for å slå på resten igjen."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Lukk panel",
|
||||
"moveSide": "Flytt panel",
|
||||
"resize": "Endre størrelse på panel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Hjem",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Verter",
|
||||
"credentials": "Innloggingsdetaljer",
|
||||
"connections": "Tilkoblinger",
|
||||
"sync": "Synkroniser",
|
||||
"reconnectDisconnectedTerminals": "Koble til alle frakoblede terminaler på nytt",
|
||||
"reconnectingTerminals_one": "Kobler til {{count}} terminal på nytt",
|
||||
"reconnectingTerminals_other": "Kobler til {{count}} terminaler på nytt",
|
||||
@@ -279,10 +275,7 @@
|
||||
"retry": "Prøv igjen",
|
||||
"refresh": "Oppdater",
|
||||
"optional": "Valgfritt",
|
||||
"downloadSample": "Last ned eksempel",
|
||||
"failedToDeleteHost": "Kunne ikke slette {{name}}",
|
||||
"importSkipExisting": "Importer (hopp over eksisterende)",
|
||||
"importSSHConfig": "Importer fra SSH-konfigurasjon",
|
||||
"connectionDetails": "Tilkoblingsdetaljer",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -501,10 +494,7 @@
|
||||
"noFolder": "(Ingen mappe)",
|
||||
"deleteSelected": "Slett",
|
||||
"exitSelection": "Avslutt valg",
|
||||
"importSkip": "Importer (hopp over eksisterende)",
|
||||
"importOverwrite": "Importer (overskriv)",
|
||||
"collapseBtn": "Skjul",
|
||||
"importExportBtn": "Importer / Eksporter",
|
||||
"hostStatusesRefreshed": "Vertstatuser oppdatert",
|
||||
"failedToRefreshHosts": "Kunne ikke oppdatere verter",
|
||||
"movedHostTo": "Flyttet {{host}} til \"{{folder}}\"",
|
||||
@@ -559,6 +549,9 @@
|
||||
"deleteFolderConfirm_one": "Slett \"{{name}}\" og dens {{count}} vert? Dette kan ikke angres.",
|
||||
"deleteFolderConfirm_other": "Slett \"{{name}}\" og dens {{count}} vert? Dette kan ikke angres.",
|
||||
"failedToMoveHosts": "Kunne ikke flytte vertene",
|
||||
"managedBanner": "Denne verten styres av {{plugin}}. Endre den der. Du kan fortsatt feste og endre rekkefølgen på den.",
|
||||
"managedTooltip": "Styres av {{plugin}}",
|
||||
"addBlocked": "Vertene styres av {{plugin}}, så nye verter kan ikke legges til her.",
|
||||
"failedToReorder": "Kunne ikke endre rekkefølge",
|
||||
"expandAll": "Utvid alle mapper",
|
||||
"collapseAll": "Skjul alle mapper",
|
||||
@@ -669,35 +662,6 @@
|
||||
"addCredentialBtn2": "Legg til legitimasjon",
|
||||
"checkingHostStatuses": "Sjekker vertstatuser...",
|
||||
"pinnedSection": "Festet",
|
||||
"hostsExported": "Venter eksportert",
|
||||
"export": {
|
||||
"menuItem": "Eksporter...",
|
||||
"title": "Eksporter verter",
|
||||
"scope": "Omfang",
|
||||
"scopeAll": "Alle",
|
||||
"scopeSelected": "Valgte",
|
||||
"searchHosts": "Søk etter verter...",
|
||||
"include": "Inkluder",
|
||||
"groupConnection": "Tilkobling",
|
||||
"groupCredentials": "Innloggingsdetaljer",
|
||||
"groupNotes": "Notater",
|
||||
"groupTags": "Tagger og festing",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Hoppverter",
|
||||
"groupFeatureFlags": "Tilleggstillvalg",
|
||||
"groupAdvanced": "Avansert konfigurasjon",
|
||||
"preview": "Forhåndsvisning",
|
||||
"moreHosts_one": "... {{count}} til vert",
|
||||
"moreHosts_other": "... {{count}} til vert",
|
||||
"summary": "{{selected}} av {{total}} verter",
|
||||
"credentialsIncluded": "innloggingsdetaljer inkludert",
|
||||
"credentialsExcluded": "innloggingsdetaljer ekskludert",
|
||||
"noneSelected": "Ingen verter valgt",
|
||||
"cancel": "Avbryt",
|
||||
"confirm": "Eksporter",
|
||||
"fetchFailed": "Kunne ikke laste inn verter for eksport",
|
||||
"bulkButton": "Eksporter"
|
||||
},
|
||||
"sampleDownloaded": "Eksempelfil lastet ned",
|
||||
"failedToDeleteCredential2": "Kunne ikke slette innloggingsdetaljer",
|
||||
"noFolderOption": "(Ingen mappe)",
|
||||
@@ -860,11 +824,7 @@
|
||||
"editorUpdate": "Oppdater vert",
|
||||
"editorAdd": "Legg til vert",
|
||||
"speedSearch": "Søk etter vertene. Piltaster for å velge, Enter for å koble til, Esc for å lukke",
|
||||
"speedSearchList": "Vertliste. Skriv eller trykk / for å søke.",
|
||||
"importNoHosts": "Ingen vertene funnet i filen",
|
||||
"importTooMany": "Du kan importere opptil {{max}} vertene om gangen",
|
||||
"importSummary": "Import fullført: {{imported}} importert, {{updated}} oppdatert, {{failed}} mislyktes",
|
||||
"importHostsFailed": "Kunne ikke importere vertene"
|
||||
"speedSearchList": "Vertliste. Skriv eller trykk / for å søke."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Delt skjerm",
|
||||
@@ -1115,17 +1075,59 @@
|
||||
"colorPickerTooltip": "Åpne fargevelger",
|
||||
"themeSystem": "System",
|
||||
"themeLight": "Lys",
|
||||
"themeDark": "Mørk",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Mørk"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Hvordan hele appen er lagt ut. Temaer og oppsett kommer fra plugins.",
|
||||
"defaultsLabel": "Standard for alle",
|
||||
"defaultsHint": "Hva folk ser til de velger sitt eget oppsett eller tema.",
|
||||
"followDefault": "Bruk standard",
|
||||
"defaultSaved": "Standard utseende lagret",
|
||||
"saveFailed": "Kunne ikke lagre utseendet",
|
||||
"repair": {
|
||||
"title": "Dette oppsettet kunne ikke vises",
|
||||
"safeTitle": "Sikker modus",
|
||||
"layout": "Oppsett",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Årsak",
|
||||
"error": "Feil",
|
||||
"noError": "Ingen feilmelding.",
|
||||
"copy": "Kopier",
|
||||
"copied": "Kopiert",
|
||||
"copyFailed": "Kunne ikke kopiere detaljene",
|
||||
"retry": "Prøv igjen",
|
||||
"reset": "Tilbakestill til standard utseende",
|
||||
"resetEveryone": "Tilbakestill standard for alle",
|
||||
"update": "Oppdater {{name}} til {{version}}",
|
||||
"disable": "Slå av {{name}}",
|
||||
"enable": "Slå på {{name}}",
|
||||
"startAgain": "Start {{name}} på nytt",
|
||||
"install": "Finn oppsett og temaer",
|
||||
"installTitle": "Oppsett og temaer",
|
||||
"installButton": "Installer",
|
||||
"nothingToInstall": "Det er ikke tilgjengelig andre oppsett eller temaer akkurat nå.",
|
||||
"registryUnreachable": "Plugin-registeret kunne ikke nås.",
|
||||
"askAdmin": "Be en administrator om å oppdatere eller fikse dette oppsettet. Du kan bytte til et annet oppsett eller tema for deg selv nedenfor.",
|
||||
"switchLayout": "Bytt oppsett",
|
||||
"switchTheme": "Bytt tema",
|
||||
"saveFailed": "Kunne ikke lagre valget ditt",
|
||||
"reasons": {
|
||||
"safe-url": "Adressen ba om sikker modus. Velg et oppsett nedenfor, eller fjern ?safe-layout=1 fra adressen.",
|
||||
"safe-env": "Serveren er startet med TERMIX_SAFE_LAYOUT, så alle ser denne skjermen til den fjernes.",
|
||||
"missing": "Ingen installert plugin tilbyr dette oppsettet.",
|
||||
"disabled": "Pluginen som tilbyr dette oppsettet er slått av.",
|
||||
"blocked": "Pluginen som tilbyr dette oppsettet venter på noe den trenger.",
|
||||
"incompatible": "Pluginen som tilbyr dette oppsettet fungerer ikke med denne versjonen av Termix.",
|
||||
"failed": "Oppsettet kunne ikke startes.",
|
||||
"crashed": "Oppsettet krasjet to ganger mens appen ble tegnet."
|
||||
},
|
||||
"noLayout": "Ingen oppsett er angitt",
|
||||
"restore": "Gjenopprett den medfølgende {{name}}",
|
||||
"restoreFailed": "Kunne ikke gjenopprette den medfølgende kopien"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1148,6 +1150,18 @@
|
||||
"title": "Håndter pålogging",
|
||||
"consequence": "Den kan legge til en påloggingsmetode, en andre faktor eller en SSH-påloggingstype."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Sett innloggingsregler",
|
||||
"consequence": "Den kan logge ut folk når de er inaktive, begrense økelengde, slå av «Husk meg» og kreve en annen faktor."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Velg hvordan verter nås",
|
||||
"consequence": "Den kan bære SSH-tilkoblingen til en vert over sin egen rute, slik at den ser alt som sendes til og fra disse vertene, inkludert passord."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Kjør synkronisering",
|
||||
"consequence": "Den kan svare på alle synkroniseringsforespørsler, slik at den ser dataene som enheter og servere synkroniserer."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Administrer sertifikater",
|
||||
"consequence": "Den kan erstatte sertifikatet Termix serverer over HTTPS og svare på domenetjekker fra sertifikatmyndigheter."
|
||||
@@ -1156,6 +1170,10 @@
|
||||
"title": "Tilgang til serielle og USB-enheter",
|
||||
"consequence": "Den kan åpne en fysisk seriell port på maskinen som kjører Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Eksporter verter med deres hemmeligheter",
|
||||
"consequence": "Kan lese vertene dine fullstendig, inkludert lagrede passord og nøkler, og dele dem ut. Hver eksport er skrevet til revisjonsloggen."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Opprett og endre vertene",
|
||||
"consequence": "Den kan legge til vertene og redigere de du allerede har."
|
||||
@@ -1200,10 +1218,30 @@
|
||||
"title": "Les revisjonsloggen",
|
||||
"consequence": "Den kan se hvem som gjorde hva og når."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Sjekk om porter svarer",
|
||||
"consequence": "Kan åpne en vanlig tilkobling til enhver adresse fra serveren, for å se om den er tilgjengelig."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Gi vertstatus",
|
||||
"consequence": "Blir kilden til de online og offline prikkene for hver vert."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Lagre nylig aktivitet",
|
||||
"consequence": "Blir lagringsstedet for den nylige aktivitetsoversikten for alle brukere."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Administrere vertsmaskiner som skrivebeskyttet",
|
||||
"consequence": "Vertsmaskinene den administrerer kan ikke redigeres, slettes eller deles på nytt av noen andre."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Åpne skrivebordsvinduer",
|
||||
"consequence": "Kun i Termix-skrivebordsappen."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Bruk denne datamaskinen",
|
||||
"consequence": "Kan lese og endre filer, kjøre en kommandotolke og åpne lokale porter på denne datamaskinen. Kun i Termix-skrivebordsappen."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Opptre som andre brukere",
|
||||
"consequence": "Kjør bakgrunnsarbeid med en annen brukers tilgang, for eksempel planlagte jobber. Hvert bruk er skrevet til revisjonsloggen."
|
||||
@@ -1243,6 +1281,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Legge til sine egne skjermer",
|
||||
"consequence": "Faner, paneler og innstillinger du kan skjule senere."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Erstatt hele appoppsettet",
|
||||
"consequence": "Når valgt, tegner koden hver skjerm, inkludert terminalene og innstillingene dine."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Legg til fargetemaer",
|
||||
"consequence": "Kun farger og stiler. Ingen kode kjøres for et tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1269,7 +1315,8 @@
|
||||
"disabled": "Deaktivert",
|
||||
"failed": "Stoppet uventet",
|
||||
"blocked": "Venter på et annet plugin",
|
||||
"server": "Kjører på serveren din"
|
||||
"server": "Kjører på serveren din",
|
||||
"safeMode": "Av i sikker modus"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Kjører",
|
||||
@@ -1283,11 +1330,6 @@
|
||||
"updated": "Nylig oppdatert",
|
||||
"category": "Kategori"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Kolonner",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} bred"
|
||||
},
|
||||
"table": {
|
||||
"name": "Navn",
|
||||
"description": "Beskrivelse",
|
||||
@@ -1372,6 +1414,7 @@
|
||||
"options": "Kunne ikke lagre alternativer for {{name}}: {{error}}",
|
||||
"deleteData": "Kunne ikke slette data for {{name}}: {{error}}",
|
||||
"managedByServer": "Denne skrivebordet er koblet til en server, som bestemmer dens plugins.",
|
||||
"defaultLook": "{{name}} er standard utseende, så det kan slås av eller byttes, men ikke avinstalleres.",
|
||||
"hasDependents": "{{name}} er nødvendig for {{list}}. Slå av disse eller avinstaller dem først.",
|
||||
"missingDependencies": "{{name}} trenger {{list}}, som ikke er installert.",
|
||||
"consentChanged": "Hva denne pluginen ber om har endret seg siden du så på det. Sjekk listen igjen.",
|
||||
@@ -1441,7 +1484,6 @@
|
||||
"noServerAccess": "Ingen tilgang til serverne dine",
|
||||
"searchInstalled": "Søk blant installerte",
|
||||
"searchPlugins": "Søk etter plugins",
|
||||
"allCategories": "Alle",
|
||||
"nothingMatches": "Ingenting samsvarer med dette.",
|
||||
"noneInstalled": "Ingen plugins er installert ennå. Bla gjennom for å legge til noen.",
|
||||
"nothingHere": "Ingenting her.",
|
||||
@@ -1531,7 +1573,44 @@
|
||||
"documentation": "Dokumentasjon",
|
||||
"envVars": "Miljøvariabler",
|
||||
"envRequired": "Påkrevd",
|
||||
"envDefault": "Standard: {{value}}"
|
||||
"envDefault": "Standard: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Oppsett",
|
||||
"themes": "Temaer",
|
||||
"tabs": "Faner",
|
||||
"panels": "Sidepaneler",
|
||||
"dashboardCards": "Dashbordkort",
|
||||
"protocols": "Tilkoplingstyper",
|
||||
"auth": "Innloggingsmetoder",
|
||||
"actions": "Handlinger",
|
||||
"hostCapability": "Vertsinnstillinger"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Type",
|
||||
"allTypes": "Alle typer",
|
||||
"category": "Kategori",
|
||||
"allCategories": "Alle kategorier",
|
||||
"results_one": "{{count}} programtillegg",
|
||||
"results_other": "{{count}} programtillegg",
|
||||
"remove": "Fjern filter {{name}}",
|
||||
"clear": "Fjern filtre",
|
||||
"button": "Filtre",
|
||||
"buttonCount": "Filtre ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}–{{to}} av {{total}}",
|
||||
"page": "Side {{page}} av {{pages}}",
|
||||
"previous": "Forrige side",
|
||||
"next": "Neste side",
|
||||
"perPage": "{{count}} per side",
|
||||
"perPageLabel": "Programtillegg per side"
|
||||
},
|
||||
"showUnsupportedHint": "Disse er oppført, men ingen utgave kjører på denne versjonen ennå. Oppdater Termix for å installere dem.",
|
||||
"unsupported": "Krever nyere Termix",
|
||||
"unsupportedHint": "Ingen utgave av dette programtillegget kjører på denne versjonen av Termix. Oppdater Termix for å installere det.",
|
||||
"needsTermix": "Krever Termix {{range}}",
|
||||
"showUnsupported": "Vis ikke støttet ({{count}})",
|
||||
"showMore": "Vis {{count}} til ({{total}} igjen)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1547,87 +1626,6 @@
|
||||
"noData": "Ingen data",
|
||||
"filter": "Filtrer..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minutt siden",
|
||||
"minutesAgo_other": "{{count}} minutter siden",
|
||||
"hoursAgo_one": "{{count}} time siden",
|
||||
"hoursAgo_other": "{{count}} timer siden",
|
||||
"pending_one": "{{count}} endring venter på synkronisering",
|
||||
"pending_other": "{{count}} endringer venter på synkronisering",
|
||||
"proxy": {
|
||||
"headersTitle": "Ekstra overskrifter",
|
||||
"headersHint": "Sendes med hver forespørsel til serveren, for eksempel en Cloudflare Access-tjenestetoken.",
|
||||
"headerName": "Overskriftsnavn",
|
||||
"headerValue": "Verdi",
|
||||
"savedValue": "Lagret, skriv for å endre",
|
||||
"addHeader": "Legg til overskrift",
|
||||
"removeHeader": "Fjern overskrift",
|
||||
"basicAuthTitle": "Brukernavn og passord",
|
||||
"basicAuthHint": "For en proxy som ber om brukernavn og passord før Termix.",
|
||||
"username": "Brukernavn",
|
||||
"password": "Passord",
|
||||
"allowInvalidCertificate": "Stol på et selvsignert sertifikat",
|
||||
"allowInvalidCertificateHint": "Kun for din egen server, når sertifikatet ikke er fra en kjent autoritet."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Det ser ikke ut som en nettadresse.",
|
||||
"unreachable": "Kunne ikke nå serveren. Sjekk adressen og at serveren kjører.",
|
||||
"unreachableWithReason": "Kunne ikke nå serveren: {{reason}}",
|
||||
"tlsUntrusted": "Serverens sertifikat er ikke stilt tillit til. Hvis dette er din egen server med et selvsignert sertifikat, slå på alternativet nedenfor.",
|
||||
"basicAuthRequired": "Noe foran serveren ber om brukernavn og passord. Skriv dem inn nedenfor.",
|
||||
"proxyLogin": "En påloggingside eller proxy svarte i stedet for Termix. Legg til de headerne den trenger nedenfor, eller sjekk adressen.",
|
||||
"notTermix": "Det er ingen Termix-server på den adressen. Hvis den kjører under en sti, inkluder den, som https://example.com/termix.",
|
||||
"versionMismatch": "Den serveren kjører en eldre versjon av Termix. Oppdater den til 2.9 eller nyere for å koble den.",
|
||||
"differentAccount": "Du har logget inn på en annen konto. Logg inn på kontoen denne enheten er koblet til, eller koble den fra først."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Koble til en Termix-server",
|
||||
"reloginTitle": "Logg inn igjen",
|
||||
"savedServers": "Siste servere",
|
||||
"removeServer": "Fjern fra listen",
|
||||
"serverDescription": "Skriv inn adressen du bruker for å åpne Termix i nettleseren din.",
|
||||
"signinDescription": "Logg inn på {{url}}",
|
||||
"chooseDescription": "Denne enheten har allerede data. Hva skal skje med dem?",
|
||||
"finishingDescription": "Kobler denne enheten.",
|
||||
"serverUrl": "Serveradresse",
|
||||
"serverUrlHint": "For eksempel https://termix.example.com",
|
||||
"showProxySettings": "Innstillinger for reversert proxy",
|
||||
"hideProxySettings": "Skjul innstillinger for reversert proxy",
|
||||
"continue": "Fortsett",
|
||||
"back": "Tilbake",
|
||||
"mergeTitle": "Legg den til i kontoen min",
|
||||
"mergeBody_one": "Elementet på denne enheten legges til i kontoen din. Elementer kontoen din allerede har, forblir uendret på serveren.",
|
||||
"mergeBody_other": "De {{count}} elementene på denne enheten legges til i kontoen din. Elementer kontoen din allerede har, forblir uendret på serveren.",
|
||||
"replaceTitle": "Erstatt den med kontoen min",
|
||||
"replaceBody_one": "Elementet på denne enheten fjernes, og denne enheten tar alt fra kontoen din. Vertser som kun beholdes på denne enheten, forblir.",
|
||||
"replaceBody_other": "De {{count}} elementene på denne enheten fjernes, og denne enheten tar alt fra kontoen din. Vertser som kun beholdes på denne enheten, forblir.",
|
||||
"link": "Koble",
|
||||
"linking": "Kobler og kjører første synkronisering...",
|
||||
"linked": "Koblet. Dataene dine synkroniseres nå.",
|
||||
"signedInAgain": "Logget inn. Synkroniseringen kjører igjen."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Vertsdatamaskiner",
|
||||
"sshCredentials": "Legitimasjon",
|
||||
"sshFolders": "Mapper",
|
||||
"userPreferences": "Preferanser",
|
||||
"pluginUserSettings": "Tilleggsinnstillinger",
|
||||
"sharedHosts": "Vertsdatamaskiner delt med deg",
|
||||
"sharedCredentials": "Legitimasjon delt med deg",
|
||||
"vaultProfiles": "Vault-profiler",
|
||||
"snippetFolders": "Snippetsmapper",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Tjenestelenker",
|
||||
"homepageItems": "Elementer på startsiden",
|
||||
"networkTopology": "Nettverkskart",
|
||||
"workspaces": "Arbeidsområder",
|
||||
"hostDefaults": "Standardverdier for vertsdatamaskiner",
|
||||
"hostDefaultsAdmin": "Standardverdier for serververtsdatamaskiner",
|
||||
"aiProviders": "AI-leverandører",
|
||||
"homepageLayouts": "Layouter for startsiden",
|
||||
"accountProfile": "Kontoprofil"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Mappe {{name}}",
|
||||
@@ -1656,7 +1654,12 @@
|
||||
"gridView": "Rutenett",
|
||||
"listView": "Liste",
|
||||
"compactRows": "Kompakte rader",
|
||||
"comfortableRows": "Komfortable rader"
|
||||
"comfortableRows": "Komfortable rader",
|
||||
"columns": {
|
||||
"title": "Kolonner",
|
||||
"auto": "Auto",
|
||||
"count": "{{count}} bred"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Lagret. Skriv for å erstatte den."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Nie udało się zmienić niektórych wtyczek. Możesz je naprawić później z karty Wtyczki. Naciśnij Dalej, aby kontynuować.",
|
||||
"pluginsApplyFailed": "Nie udało się zapisać wyborów. Spróbuj ponownie lub kontynuuj i zmień je później z karty Wtyczki.",
|
||||
"pluginsLoadFailed": "Nie udało się załadować listy wtyczek. Możesz wybrać wtyczki później z karty Wtyczki.",
|
||||
"presetTitle": "Ile chcesz mieć na ekranie?",
|
||||
"presetIntro": "Wybierz, ile ma być wyświetlanych na ekranie.",
|
||||
"presetChangeLater": "Możesz przełączać profile lub zmieniać dowolne pojedyncze ustawienie później w Ustawieniach, w sekcji Interfejs.",
|
||||
"appearanceTitle": "Dostosuj do siebie",
|
||||
"appearanceIntro": "Wybierz motyw, kolor akcentu, czcionkę i język. Zmiany są widoczne natychmiast, a możesz je zmienić później w Ustawieniach.",
|
||||
"securityTitle": "Zabezpiecz swoje konto",
|
||||
"securityIntro": "Dodaj klucz dostępu lub aplikację uwierzytelniającą do swojego konta. Możesz to również zrobić później w Ustawieniach, w sekcji Bezpieczeństwo.",
|
||||
"desktopTitle": "Jak chcesz korzystać z Termix?",
|
||||
"desktopBody": "Możesz to zmienić w dowolnym momencie z Synchronizacji w pasku bocznym.",
|
||||
"desktopLocalTitle": "Tylko na tym urządzeniu",
|
||||
"desktopLocalBody": "Wszystko jest przechowywane tutaj. Nic do konfiguracji.",
|
||||
"desktopLinkTitle": "Z moim serwerem Termix",
|
||||
"desktopLinkBody": "Zaloguj się na swój serwer, aby korzystać z tych samych hostów i ustawień na każdym urządzeniu.",
|
||||
"desktopLinked": "Połączono z {{server}}",
|
||||
"pluginsDocsLink": "Przeczytaj o każdej z nich"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} jest gotowy do instalacji",
|
||||
"readyHint": "Zostanie zainstalowany przy następnym ponownym uruchomieniu Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Tryb awaryjny",
|
||||
"description": "Uruchomione są tylko wtyczki układu i motywu. Uruchom ponownie serwer bez zmiennej środowiskowej TERMIX_SAFE_MODE, aby włączyć pozostałe wtyczki."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Zamknij panel",
|
||||
"moveSide": "Przenieś panel",
|
||||
"resize": "Zmień rozmiar panelu"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Strona główna",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosty",
|
||||
"credentials": "Poświadczenia",
|
||||
"connections": "Połączenia",
|
||||
"sync": "Synchronizacja",
|
||||
"reconnectDisconnectedTerminals": "Połącz ponownie wszystkie rozłączone terminale",
|
||||
"reconnectingTerminals_one": "Ponowne łączenie {{count}} terminala",
|
||||
"reconnectingTerminals_few": "Ponowne łączenie {{count}} terminali",
|
||||
@@ -285,10 +281,7 @@
|
||||
"retry": "Ponów próbę",
|
||||
"refresh": "Odśwież",
|
||||
"optional": "Opcjonalne",
|
||||
"downloadSample": "Pobierz przykład",
|
||||
"failedToDeleteHost": "Nie udało się usunąć {{name}}",
|
||||
"importSkipExisting": "Importuj (pomiń istniejące)",
|
||||
"importSSHConfig": "Importuj z konfiguracji SSH",
|
||||
"connectionDetails": "Szczegóły połączenia",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -509,10 +502,7 @@
|
||||
"noFolder": "(Brak folderu)",
|
||||
"deleteSelected": "Usuń",
|
||||
"exitSelection": "Zakończ zaznaczanie",
|
||||
"importSkip": "Importuj (pomiń istniejące)",
|
||||
"importOverwrite": "Importuj (nadpisz)",
|
||||
"collapseBtn": "Zwiń",
|
||||
"importExportBtn": "Importuj / Eksportuj",
|
||||
"hostStatusesRefreshed": "Statusy hostów zostały odświeżone",
|
||||
"failedToRefreshHosts": "Nie udało się odświeżyć hostów",
|
||||
"movedHostTo": "Przeniesiono {{host}} do \"{{folder}}\"",
|
||||
@@ -571,6 +561,9 @@
|
||||
"deleteFolderConfirm_many": "Usunąć \"{{name}}\" i jego {{count}} hostów? Tej operacji nie można cofnąć.",
|
||||
"deleteFolderConfirm_other": "Usunąć \"{{name}}\" i jego {{count}} hosta? Tej operacji nie można cofnąć.",
|
||||
"failedToMoveHosts": "Nie udało się przenieść hostów",
|
||||
"managedBanner": "Ten host jest zarządzany przez {{plugin}}. Zmień go tam. Możesz go nadal przypiąć i zmienić kolejność.",
|
||||
"managedTooltip": "Zarządzane przez {{plugin}}",
|
||||
"addBlocked": "Hosty są zarządzane przez {{plugin}}, więc nie można tutaj dodawać nowych hostów.",
|
||||
"failedToReorder": "Nie udało się zmienić kolejności",
|
||||
"expandAll": "Rozwiń wszystkie foldery",
|
||||
"collapseAll": "Zwiń wszystkie foldery",
|
||||
@@ -683,37 +676,6 @@
|
||||
"addCredentialBtn2": "Dodaj dane logowania",
|
||||
"checkingHostStatuses": "Sprawdzanie statusów hostów...",
|
||||
"pinnedSection": "Przypięte",
|
||||
"hostsExported": "Hosty wyeksportowane pomyślnie",
|
||||
"export": {
|
||||
"menuItem": "Eksportuj...",
|
||||
"title": "Eksportuj hosty",
|
||||
"scope": "Zakres",
|
||||
"scopeAll": "Wszystkie",
|
||||
"scopeSelected": "Zaznaczone",
|
||||
"searchHosts": "Szukaj hostów...",
|
||||
"include": "Uwzględnij",
|
||||
"groupConnection": "Połączenie",
|
||||
"groupCredentials": "Dane logowania",
|
||||
"groupNotes": "Notatki",
|
||||
"groupTags": "Tagi i przypięcie",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Hosty przeskoku",
|
||||
"groupFeatureFlags": "Ustawienia wtyczek",
|
||||
"groupAdvanced": "Zaawansowana konfiguracja",
|
||||
"preview": "Podgląd",
|
||||
"moreHosts_one": "... {{count}} więcej hosta",
|
||||
"moreHosts_few": "... {{count}} więcej hostów",
|
||||
"moreHosts_many": "... {{count}} więcej hostów",
|
||||
"moreHosts_other": "... {{count}} więcej hosta",
|
||||
"summary": "{{selected}} z {{total}} hostów",
|
||||
"credentialsIncluded": "uwzględniono dane logowania",
|
||||
"credentialsExcluded": "pominięto dane logowania",
|
||||
"noneSelected": "Nie zaznaczono żadnych hostów",
|
||||
"cancel": "Anuluj",
|
||||
"confirm": "Eksportuj",
|
||||
"fetchFailed": "Nie udało się załadować hostów do eksportu",
|
||||
"bulkButton": "Eksportuj"
|
||||
},
|
||||
"sampleDownloaded": "Pobrano plik przykładowy",
|
||||
"failedToDeleteCredential2": "Nie udało się usunąć danych logowania",
|
||||
"noFolderOption": "(Brak folderu)",
|
||||
@@ -886,11 +848,7 @@
|
||||
"editorUpdate": "Aktualizuj hosta",
|
||||
"editorAdd": "Dodaj hosta",
|
||||
"speedSearch": "Szukaj hostów. Strzałki do wyboru, Enter do połączenia, Esc do zamknięcia",
|
||||
"speedSearchList": "Lista hostów. Pisz lub naciśnij / aby szukać.",
|
||||
"importNoHosts": "Nie znaleziono hostów w pliku",
|
||||
"importTooMany": "Możesz zaimportować maksymalnie {{max}} hostów naraz",
|
||||
"importSummary": "Import zakończony: {{imported}} zaimportowano, {{updated}} zaktualizowano, {{failed}} nieudanych",
|
||||
"importHostsFailed": "Nie udało się zaimportować hostów"
|
||||
"speedSearchList": "Lista hostów. Pisz lub naciśnij / aby szukać."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Podzielony ekran",
|
||||
@@ -1095,17 +1053,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} użytkownik",
|
||||
"usersCount_few": "{{count}} użytkowników",
|
||||
"usersCount_many": "{{count}} użytkowników",
|
||||
"rolesCount_one": "{{count}} rola",
|
||||
"rolesCount_few": "{{count}} role",
|
||||
"rolesCount_many": "{{count}} ról",
|
||||
"apiKeysCount_one": "{{count}} klucz",
|
||||
"apiKeysCount_few": "{{count}} klucze",
|
||||
"apiKeysCount_many": "{{count}} kluczy",
|
||||
"sessionsActive_one": "{{count}} aktywna",
|
||||
"sessionsActive_few": "{{count}} aktywne",
|
||||
"sessionsActive_many": "{{count}} aktywnych",
|
||||
"hostsCount_one": "{{count}} host",
|
||||
"hostsCount_few": "{{count}} hosty",
|
||||
"hostsCount_many": "{{count}} hostów",
|
||||
@@ -1116,8 +1066,6 @@
|
||||
"credentialsCount_other": "{{count}} danych logowania",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} uprawnienie",
|
||||
"count_few": "{{count}} uprawnienia",
|
||||
"count_many": "{{count}} uprawnień",
|
||||
"groups": {
|
||||
"hosts": "Hosty",
|
||||
"credentials": "Poświadczenia",
|
||||
@@ -1158,22 +1106,62 @@
|
||||
"interfaceFontDescription": "Zmienia czcionkę interfejsu aplikacji. Profile terminalu zachowują własne ustawienia czcionki.",
|
||||
"accentColorLabel": "Kolor akcentu",
|
||||
"apiKeyCount_one": "{{count}} klucz",
|
||||
"apiKeyCount_few": "{{count}} klucze",
|
||||
"apiKeyCount_many": "{{count}} kluczy",
|
||||
"colorPickerTooltip": "Otwórz wybór koloru",
|
||||
"themeSystem": "Systemowy",
|
||||
"themeLight": "Jasny",
|
||||
"themeDark": "Ciemny",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Ciemny"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Jak wygląda układ całej aplikacji. Motywy i układy pochodzą z wtyczek.",
|
||||
"defaultsLabel": "Domyślne dla wszystkich",
|
||||
"defaultsHint": "To, co widzą użytkownicy, dopóki nie wybiorą własnego układu lub motywu.",
|
||||
"followDefault": "Użyj domyślnego",
|
||||
"defaultSaved": "Domyślny wygląd zapisany",
|
||||
"saveFailed": "Nie udało się zapisać wyglądu",
|
||||
"repair": {
|
||||
"title": "Nie udało się wyświetlić tego układu",
|
||||
"safeTitle": "Tryb bezpieczny",
|
||||
"layout": "Układ",
|
||||
"plugin": "Wtyczka",
|
||||
"reason": "Powód",
|
||||
"error": "Błąd",
|
||||
"noError": "Brak komunikatu o błędzie.",
|
||||
"copy": "Kopiuj",
|
||||
"copied": "Skopiowano",
|
||||
"copyFailed": "Nie udało się skopiować szczegółów",
|
||||
"retry": "Spróbuj ponownie",
|
||||
"reset": "Przywróć domyślny wygląd",
|
||||
"resetEveryone": "Przywróć domyślne ustawienia dla wszystkich",
|
||||
"update": "Aktualizuj {{name}} do wersji {{version}}",
|
||||
"disable": "Wyłącz {{name}}",
|
||||
"enable": "Włącz {{name}}",
|
||||
"startAgain": "Uruchom ponownie {{name}}",
|
||||
"install": "Szukaj układów i motywów",
|
||||
"installTitle": "Układy i motywy",
|
||||
"installButton": "Zainstaluj",
|
||||
"nothingToInstall": "Obecnie nie ma innych dostępnych układów ani motywów.",
|
||||
"registryUnreachable": "Nie udało się połączyć z rejestrem wtyczek.",
|
||||
"askAdmin": "Poproś administratora o aktualizację lub naprawę tego układu. Poniżej możesz przełączyć się na inny układ lub motyw dla siebie.",
|
||||
"switchLayout": "Przełącz układ",
|
||||
"switchTheme": "Przełącz motyw",
|
||||
"saveFailed": "Nie udało się zapisać Twojego wyboru",
|
||||
"reasons": {
|
||||
"safe-url": "Adres żądał trybu bezpiecznego. Wybierz układ poniżej lub usuń ?safe-layout=1 z adresu.",
|
||||
"safe-env": "Serwer został uruchomiony z opcją TERMIX_SAFE_LAYOUT, więc wszyscy widzą ten ekran, dopóki nie zostanie ona usunięta.",
|
||||
"missing": "Żadna zainstalowana wtyczka nie dostarcza tego układu.",
|
||||
"disabled": "Wtyczka dostarczająca ten układ jest wyłączona.",
|
||||
"blocked": "Wtyczka dostarczająca ten układ oczekuje na coś, czego potrzebuje.",
|
||||
"incompatible": "Wtyczka dostarczająca ten układ nie działa z tą wersją Termix.",
|
||||
"failed": "Układ nie mógł się uruchomić.",
|
||||
"crashed": "Układ zawiesił się dwa razy podczas renderowania aplikacji."
|
||||
},
|
||||
"noLayout": "Nie ustawiono układu",
|
||||
"restore": "Przywróć dołączony {{name}}",
|
||||
"restoreFailed": "Nie udało się przywrócić dołączonej kopii"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1196,6 +1184,18 @@
|
||||
"title": "Obsługa logowania",
|
||||
"consequence": "Może dodać metodę logowania, drugi czynnik uwierzytelniający lub typ logowania SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Ustaw reguły logowania",
|
||||
"consequence": "Może wylogowywać użytkowników po bezczynności, ograniczać długość sesji, wyłączać opcję „Zapamiętaj mnie” i wymagać drugiego czynnika uwierzytelniającego."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Wybierz sposób łączenia się z hostami",
|
||||
"consequence": "Może przenosić połączenie SSH z hostem przez własną trasę, więc widzi wszystko wysyłane do i z tych hostów, w tym hasła."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Uruchom synchronizację",
|
||||
"consequence": "Może odpowiadać na wszystkie żądania synchronizacji, więc widzi dane synchronizowane przez urządzenia i serwery."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Zarządzanie certyfikatami",
|
||||
"consequence": "Może zastąpić certyfikat, który Termix udostępnia przez HTTPS, oraz odpowiadać na weryfikacje domen od autorytetów certyfikacji."
|
||||
@@ -1204,6 +1204,10 @@
|
||||
"title": "Dostęp do urządzeń szeregowych i USB",
|
||||
"consequence": "Może otwierać fizyczny port szeregowy na komputerze, na którym działa Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Eksportuj hosty wraz z ich sekretami",
|
||||
"consequence": "Może czytać Twoje hosty w całości, w tym zapisane hasła i klucze, oraz je udostępniać. Każdy eksport jest zapisywany w dzienniku audytu."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Tworzenie i modyfikacja hostów",
|
||||
"consequence": "Może dodawać hosty i edytować te, które już posiadasz."
|
||||
@@ -1248,10 +1252,30 @@
|
||||
"title": "Odczytywanie dziennika audytu",
|
||||
"consequence": "Może widzieć, kto co zrobił i kiedy."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Sprawdź, czy porty odpowiadają",
|
||||
"consequence": "Może otwierać zwykłe połączenie z dowolnym adresem z serwera, aby sprawdzić, czy jest on osiągalny."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Dostarczaj status hosta",
|
||||
"consequence": "Staje się źródłem kropek online i offline dla każdego hosta."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Przechowuj ostatnią aktywność",
|
||||
"consequence": "Staje się magazynem dla listy ostatniej aktywności każdego użytkownika."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Zarządzaj hostami w trybie tylko do odczytu",
|
||||
"consequence": "Hosty nimi zarządzane nie mogą być edytowane, usuwane ani udostępniane ponownie przez innych użytkowników."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Otwieranie okien pulpitu",
|
||||
"consequence": "Tylko w aplikacji pulpitu Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Użyj tego komputera",
|
||||
"consequence": "Może odczytywać i zmieniać pliki, uruchamiać powłokę oraz otwierać lokalne porty na tym komputerze. Tylko w aplikacji Termix na komputerach."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Działanie w imieniu innych użytkowników",
|
||||
"consequence": "Uruchamia zadania w tle z uprawnieniami innego użytkownika, np. zadania zaplanowane. Każde użycie jest zapisywane w dzienniku audytu."
|
||||
@@ -1291,6 +1315,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Dodawanie własnych ekranów",
|
||||
"consequence": "Karty, panele i ustawienia, które możesz później ukryć."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Zastąp cały układ aplikacji",
|
||||
"consequence": "Po wybraniu, jego kod renderuje każdy ekran, w tym terminale i ustawienia."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Dodaj motywy kolorystyczne",
|
||||
"consequence": "Tylko kolory i style. Żaden kod nie jest uruchamiany dla motywu."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1317,7 +1349,8 @@
|
||||
"disabled": "Wyłączone",
|
||||
"failed": "Zatrzymane nieoczekiwanie",
|
||||
"blocked": "Oczekiwanie na inną wtyczkę",
|
||||
"server": "Uruchamiane na Twoim serwerze"
|
||||
"server": "Uruchamiane na Twoim serwerze",
|
||||
"safeMode": "Wyłączone w trybie awaryjnym"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Uruchomione",
|
||||
@@ -1331,11 +1364,6 @@
|
||||
"updated": "Ostatnio zaktualizowane",
|
||||
"category": "Kategoria"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Kolumny",
|
||||
"auto": "Automatycznie",
|
||||
"count": "{{count}} kolumn"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nazwa",
|
||||
"description": "Opis",
|
||||
@@ -1444,6 +1472,7 @@
|
||||
"options": "Nie udało się zapisać opcji dla {{name}}: {{error}}",
|
||||
"deleteData": "Nie udało się usunąć danych dla {{name}}: {{error}}",
|
||||
"managedByServer": "Ten pulpit jest połączony z serwerem, który decyduje o jego wtyczkach.",
|
||||
"defaultLook": "{{name}} to domyślny wygląd, więc można go wyłączyć lub zamienić, ale nie odinstalować.",
|
||||
"hasDependents": "{{name}} jest wymagane przez {{list}}. Najpierw wyłącz lub odinstaluj te elementy.",
|
||||
"missingDependencies": "{{name}} wymaga {{list}}, które nie jest zainstalowane.",
|
||||
"consentChanged": "To, czego ta wtyczka wymaga, zmieniło się od czasu ostatniego sprawdzenia. Sprawdź listę ponownie.",
|
||||
@@ -1521,7 +1550,6 @@
|
||||
"noServerAccess": "Brak dostępu do Twoich serwerów",
|
||||
"searchInstalled": "Szukaj wśród zainstalowanych",
|
||||
"searchPlugins": "Szukaj wtyczek",
|
||||
"allCategories": "Wszystkie",
|
||||
"nothingMatches": "Nic nie pasuje do tego.",
|
||||
"noneInstalled": "Nie zainstalowano jeszcze żadnych wtyczek. Przeglądaj, aby dodać kilka.",
|
||||
"nothingHere": "Nic tutaj nie ma.",
|
||||
@@ -1619,7 +1647,46 @@
|
||||
"documentation": "Dokumentacja",
|
||||
"envVars": "Zmienne środowiskowe",
|
||||
"envRequired": "Wymagane",
|
||||
"envDefault": "Domyślnie: {{value}}"
|
||||
"envDefault": "Domyślnie: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Układy",
|
||||
"themes": "Motywy",
|
||||
"tabs": "Karty",
|
||||
"panels": "Panele boczne",
|
||||
"dashboardCards": "Karty pulpitu",
|
||||
"protocols": "Typy połączeń",
|
||||
"auth": "Metody logowania",
|
||||
"actions": "Akcje",
|
||||
"hostCapability": "Ustawienia hosta"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Typ",
|
||||
"allTypes": "Wszystkie typy",
|
||||
"category": "Kategoria",
|
||||
"allCategories": "Wszystkie kategorie",
|
||||
"results_one": "{{count}} wtyczka",
|
||||
"results_few": "{{count}} wtyczki",
|
||||
"results_many": "{{count}} wtyczek",
|
||||
"results_other": "{{count}} wtyczek",
|
||||
"remove": "Usuń filtr {{name}}",
|
||||
"clear": "Wyczyść filtry",
|
||||
"button": "Filtry",
|
||||
"buttonCount": "Filtry ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} z {{total}}",
|
||||
"page": "Strona {{page}} z {{pages}}",
|
||||
"previous": "Poprzednia strona",
|
||||
"next": "Następna strona",
|
||||
"perPage": "{{count}} na stronę",
|
||||
"perPageLabel": "Wtyczki na stronę"
|
||||
},
|
||||
"showUnsupportedHint": "Są wymienione, ale żadna wersja nie działa jeszcze na tej wersji. Zaktualizuj Termix, aby je zainstalować.",
|
||||
"unsupported": "Wymaga nowszej wersji Termix",
|
||||
"unsupportedHint": "Żadna wersja tej wtyczki nie działa na tej wersji Termix. Zaktualizuj Termix, aby ją zainstalować.",
|
||||
"needsTermix": "Wymaga Termix {{range}}",
|
||||
"showUnsupported": "Pokaż nieobsługiwane ({{count}})",
|
||||
"showMore": "Pokaż {{count}} więcej (pozostało {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1635,97 +1702,6 @@
|
||||
"noData": "Brak danych",
|
||||
"filter": "Filtruj..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minutę temu",
|
||||
"minutesAgo_few": "{{count}} minuty temu",
|
||||
"minutesAgo_many": "{{count}} minut temu",
|
||||
"minutesAgo_other": "{{count}} minut temu",
|
||||
"hoursAgo_one": "{{count}} godzinę temu",
|
||||
"hoursAgo_few": "{{count}} godziny temu",
|
||||
"hoursAgo_many": "{{count}} godzin temu",
|
||||
"hoursAgo_other": "{{count}} godzin temu",
|
||||
"pending_one": "{{count}} zmiana oczekuje na synchronizację",
|
||||
"pending_few": "{{count}} zmiany oczekują na synchronizację",
|
||||
"pending_many": "{{count}} zmian oczekuje na synchronizację",
|
||||
"pending_other": "{{count}} zmian oczekuje na synchronizację",
|
||||
"proxy": {
|
||||
"headersTitle": "Dodatkowe nagłówki",
|
||||
"headersHint": "Wysyłane z każdym żądaniem do serwera, na przykład token usługi Cloudflare Access.",
|
||||
"headerName": "Nazwa nagłówka",
|
||||
"headerValue": "Wartość",
|
||||
"savedValue": "Zapisano, wpisz, aby zmienić",
|
||||
"addHeader": "Dodaj nagłówek",
|
||||
"removeHeader": "Usuń nagłówek",
|
||||
"basicAuthTitle": "Nazwa użytkownika i hasło",
|
||||
"basicAuthHint": "Dla proxy, które wymaga podania nazwy użytkownika i hasła przed Termix.",
|
||||
"username": "Nazwa użytkownika",
|
||||
"password": "Hasło",
|
||||
"allowInvalidCertificate": "Ufaj certyfikatowi samopodpisanemu",
|
||||
"allowInvalidCertificateHint": "Tylko dla własnego serwera, gdy jego certyfikat nie pochodzi od zaufanej instytucji."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "To nie wygląda na adres internetowy.",
|
||||
"unreachable": "Nie udało się połączyć z serwerem. Sprawdź adres i czy serwer jest uruchomiony.",
|
||||
"unreachableWithReason": "Nie udało się połączyć z serwerem: {{reason}}",
|
||||
"tlsUntrusted": "Certyfikat serwera nie jest zaufany. Jeśli to Twój własny serwer z certyfikatem samopodpisanym, włącz opcję poniżej.",
|
||||
"basicAuthRequired": "Coś przed serwerem żąda nazwy użytkownika i hasła. Wpisz je poniżej.",
|
||||
"proxyLogin": "Zamiast Termix odpowiedziała strona logowania lub proxy. Dodaj poniżej wymagane nagłówki lub sprawdź adres.",
|
||||
"notTermix": "Pod tym adresem nie ma serwera Termix. Jeśli działa pod ścieżką, podaj ją, np. https://example.com/termix.",
|
||||
"versionMismatch": "Ten serwer używa starszej wersji Termix. Zaktualizuj go do wersji 2.9 lub nowszej, aby połączyć.",
|
||||
"differentAccount": "Zalogowałeś się na inne konto. Zaloguj się na konto, z którym połączone jest to urządzenie, lub najpierw odłącz je."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Połącz z serwerem Termix",
|
||||
"reloginTitle": "Zaloguj się ponownie",
|
||||
"savedServers": "Ostatnie serwery",
|
||||
"removeServer": "Usuń z listy",
|
||||
"serverDescription": "Wpisz adres, którego używasz do otwierania Termix w przeglądarce.",
|
||||
"signinDescription": "Zaloguj się do {{url}}",
|
||||
"chooseDescription": "To urządzenie już zawiera dane. Co należy z nimi zrobić?",
|
||||
"finishingDescription": "Łączenie tego urządzenia.",
|
||||
"serverUrl": "Adres serwera",
|
||||
"serverUrlHint": "Na przykład https://termix.example.com",
|
||||
"showProxySettings": "Ustawienia proxy odwrotnego",
|
||||
"hideProxySettings": "Ukryj ustawienia proxy odwrotnego",
|
||||
"continue": "Kontynuuj",
|
||||
"back": "Wstecz",
|
||||
"mergeTitle": "Dodaj do mojego konta",
|
||||
"mergeBody_one": "Element z tego urządzenia zostanie dodany do Twojego konta. Elementy, które już są na Twoim koncie, pozostaną bez zmian na serwerze.",
|
||||
"mergeBody_few": "{{count}} elementy z tego urządzenia zostaną dodane do Twojego konta. Elementy, które już są na Twoim koncie, pozostaną bez zmian na serwerze.",
|
||||
"mergeBody_many": "{{count}} elementów z tego urządzenia zostanie dodanych do Twojego konta. Elementy, które już są na Twoim koncie, pozostaną bez zmian na serwerze.",
|
||||
"mergeBody_other": "{{count}} elementu z tego urządzenia zostanie dodanych do Twojego konta. Elementy, które już są na Twoim koncie, pozostaną bez zmian na serwerze.",
|
||||
"replaceTitle": "Zastąp danymi z mojego konta",
|
||||
"replaceBody_one": "Element z tego urządzenia zostanie usunięty, a urządzenie pobierze wszystko z Twojego konta. Hosty przechowywane wyłącznie na tym urządzeniu pozostaną.",
|
||||
"replaceBody_few": "{{count}} elementy z tego urządzenia zostaną usunięte, a urządzenie pobierze wszystko z Twojego konta. Hosty przechowywane wyłącznie na tym urządzeniu pozostaną.",
|
||||
"replaceBody_many": "{{count}} elementów z tego urządzenia zostanie usuniętych, a urządzenie pobierze wszystko z Twojego konta. Hosty przechowywane wyłącznie na tym urządzeniu pozostaną.",
|
||||
"replaceBody_other": "{{count}} elementu z tego urządzenia zostanie usuniętych, a urządzenie pobierze wszystko z Twojego konta. Hosty przechowywane wyłącznie na tym urządzeniu pozostaną.",
|
||||
"link": "Połącz",
|
||||
"linking": "Łączenie i uruchamianie pierwszej synchronizacji...",
|
||||
"linked": "Połączono. Dane są teraz synchronizowane.",
|
||||
"signedInAgain": "Zalogowano. Synchronizacja została wznowiona."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hosty",
|
||||
"sshCredentials": "Dane logowania",
|
||||
"sshFolders": "Foldery",
|
||||
"userPreferences": "Preferencje",
|
||||
"pluginUserSettings": "Ustawienia wtyczek",
|
||||
"sharedHosts": "Hosty udostępnione Tobie",
|
||||
"sharedCredentials": "Dane logowania udostępnione Tobie",
|
||||
"vaultProfiles": "Profile Vault",
|
||||
"snippetFolders": "Foldery fragmentów",
|
||||
"snippets": "Fragmenty",
|
||||
"dashboardServiceLinks": "Linki do usług",
|
||||
"homepageItems": "Elementy strony głównej",
|
||||
"networkTopology": "Mapa sieci",
|
||||
"workspaces": "Przestrzeze robocze",
|
||||
"hostDefaults": "Domyślne ustawienia hostów",
|
||||
"hostDefaultsAdmin": "Domyślne ustawienia hostów serwera",
|
||||
"aiProviders": "Dostawcy AI",
|
||||
"homepageLayouts": "Układy strony głównej",
|
||||
"accountProfile": "Profil konta"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Folder {{name}}",
|
||||
@@ -1762,7 +1738,12 @@
|
||||
"gridView": "Siatka",
|
||||
"listView": "Lista",
|
||||
"compactRows": "Zwięzłe wiersze",
|
||||
"comfortableRows": "Przestrzenne wiersze"
|
||||
"comfortableRows": "Przestrzenne wiersze",
|
||||
"columns": {
|
||||
"title": "Kolumny",
|
||||
"auto": "Automatycznie",
|
||||
"count": "Szerokość: {{count}}"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Zapisano. Wpisz nową wartość, aby ją zmienić."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Não foi possível alterar alguns plugins. Você pode corrigi-los mais tarde na aba Plugins. Pressione Próximo para continuar.",
|
||||
"pluginsApplyFailed": "Não foi possível salvar suas escolhas. Tente novamente ou continue e altere-as mais tarde na aba Plugins.",
|
||||
"pluginsLoadFailed": "Não foi possível carregar a lista de plugins. Você pode escolher os plugins mais tarde na aba Plugins.",
|
||||
"presetTitle": "Quanto você quer na tela?",
|
||||
"presetIntro": "Escolha quanto conteúdo exibir na tela.",
|
||||
"presetChangeLater": "Você pode alternar entre predefinições ou alterar qualquer configuração individual mais tarde em Configurações, em Interface.",
|
||||
"appearanceTitle": "Personalize ao seu gosto",
|
||||
"appearanceIntro": "Escolha um tema, uma cor de destaque, uma fonte e seu idioma. As alterações aparecem imediatamente e você pode mudá-las mais tarde em Configurações.",
|
||||
"securityTitle": "Proteja sua conta",
|
||||
"securityIntro": "Adicione uma chave de acesso ou um aplicativo autenticador à sua conta. Você também pode fazer isso mais tarde em Configurações, em Segurança.",
|
||||
"desktopTitle": "Como você quer usar o Termix?",
|
||||
"desktopBody": "Você pode alterar isso a qualquer momento em Sincronização na barra lateral.",
|
||||
"desktopLocalTitle": "Apenas neste dispositivo",
|
||||
"desktopLocalBody": "Tudo é armazenado aqui. Nada para configurar.",
|
||||
"desktopLinkTitle": "Com meu servidor Termix",
|
||||
"desktopLinkBody": "Faça login no seu servidor para usar os mesmos hosts e configurações em todos os dispositivos.",
|
||||
"desktopLinked": "Vinculado a {{server}}",
|
||||
"pluginsDocsLink": "Leia sobre cada um"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} está pronto para instalação",
|
||||
"readyHint": "Será instalado na próxima vez que o Termix reiniciar."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Modo de segurança",
|
||||
"description": "Apenas os plugins de layout e tema estão ativos. Reinicie o servidor sem a variável TERMIX_SAFE_MODE para reativar os demais."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Fechar painel",
|
||||
"moveSide": "Mover painel",
|
||||
"resize": "Redimensionar painel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Início",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Credenciais",
|
||||
"connections": "Conexões",
|
||||
"sync": "Sincronizar",
|
||||
"reconnectDisconnectedTerminals": "Reconectar todos os terminais desconectados",
|
||||
"reconnectingTerminals_one": "Reconectando {{count}} terminal",
|
||||
"reconnectingTerminals_many": "Reconectando {{count}} terminais",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Tentar novamente",
|
||||
"refresh": "Atualizar",
|
||||
"optional": "Opcional",
|
||||
"downloadSample": "Baixar exemplo",
|
||||
"failedToDeleteHost": "Falha ao excluir {{name}}",
|
||||
"importSkipExisting": "Importar (ignorar existentes)",
|
||||
"importSSHConfig": "Importar da configuração SSH",
|
||||
"connectionDetails": "Detalhes da conexão",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Sem pasta)",
|
||||
"deleteSelected": "Excluir",
|
||||
"exitSelection": "Sair da seleção",
|
||||
"importSkip": "Importar (ignorar existentes)",
|
||||
"importOverwrite": "Importar (substituir)",
|
||||
"collapseBtn": "Recolher",
|
||||
"importExportBtn": "Importar / Exportar",
|
||||
"hostStatusesRefreshed": "Status dos hosts atualizados",
|
||||
"failedToRefreshHosts": "Falha ao atualizar hosts",
|
||||
"movedHostTo": "Movido {{host}} para \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_many": "Excluir \"{{name}}\" e seus {{count}} hosts? Isso não pode ser desfeito.",
|
||||
"deleteFolderConfirm_other": "Excluir \"{{name}}\" e seus {{count}} hosts? Isso não pode ser desfeito.",
|
||||
"failedToMoveHosts": "Falha ao mover hosts",
|
||||
"managedBanner": "Este host é gerenciado por {{plugin}}. Faça alterações lá. Você ainda pode fixá-lo e reordená-lo.",
|
||||
"managedTooltip": "Gerenciado por {{plugin}}",
|
||||
"addBlocked": "Os hosts são gerenciados por {{plugin}}, portanto, novos hosts não podem ser adicionados aqui.",
|
||||
"failedToReorder": "Falha ao reordenar",
|
||||
"expandAll": "Expandir todas as pastas",
|
||||
"collapseAll": "Recolher todas as pastas",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Adicionar Credencial",
|
||||
"checkingHostStatuses": "Verificando status dos hosts...",
|
||||
"pinnedSection": "Fixados",
|
||||
"hostsExported": "Hosts exportados com sucesso",
|
||||
"export": {
|
||||
"menuItem": "Exportar...",
|
||||
"title": "Exportar hosts",
|
||||
"scope": "Escopo",
|
||||
"scopeAll": "Todos",
|
||||
"scopeSelected": "Selecionados",
|
||||
"searchHosts": "Pesquisar hosts...",
|
||||
"include": "Incluir",
|
||||
"groupConnection": "Conexão",
|
||||
"groupCredentials": "Credenciais",
|
||||
"groupNotes": "Notas",
|
||||
"groupTags": "Tags e fixação",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump hosts",
|
||||
"groupFeatureFlags": "Configurações de plugins",
|
||||
"groupAdvanced": "Configuração avançada",
|
||||
"preview": "Visualização",
|
||||
"moreHosts_one": "... {{count}} host a mais",
|
||||
"moreHosts_many": "... {{count}} hosts a mais",
|
||||
"moreHosts_other": "... {{count}} hosts a mais",
|
||||
"summary": "{{selected}} de {{total}} hosts",
|
||||
"credentialsIncluded": "credenciais incluídas",
|
||||
"credentialsExcluded": "credenciais excluídas",
|
||||
"noneSelected": "Nenhum host selecionado",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Exportar",
|
||||
"fetchFailed": "Falha ao carregar hosts para exportação",
|
||||
"bulkButton": "Exportar"
|
||||
},
|
||||
"sampleDownloaded": "Arquivo de exemplo baixado",
|
||||
"failedToDeleteCredential2": "Falha ao excluir credencial",
|
||||
"noFolderOption": "(Sem pasta)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Atualizar Host",
|
||||
"editorAdd": "Adicionar Host",
|
||||
"speedSearch": "Pesquisar hosts. Teclas de seta para selecionar, Enter para conectar, Esc para fechar",
|
||||
"speedSearchList": "Lista de hosts. Digite ou pressione / para pesquisar.",
|
||||
"importNoHosts": "Nenhum host encontrado no arquivo",
|
||||
"importTooMany": "Você pode importar até {{max}} hosts de uma vez",
|
||||
"importSummary": "Importação concluída: {{imported}} importados, {{updated}} atualizados, {{failed}} com falha",
|
||||
"importHostsFailed": "Falha ao importar hosts"
|
||||
"speedSearchList": "Lista de hosts. Digite ou pressione / para pesquisar."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Tela dividida",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} usuário",
|
||||
"usersCount_many": "{{count}} usuários",
|
||||
"rolesCount_one": "{{count}} função",
|
||||
"rolesCount_many": "{{count}} funções",
|
||||
"apiKeysCount_one": "{{count}} chave",
|
||||
"apiKeysCount_many": "{{count}} chaves",
|
||||
"sessionsActive_one": "{{count}} ativo",
|
||||
"sessionsActive_many": "{{count}} ativos",
|
||||
"hostsCount_one": "{{count}} host",
|
||||
"hostsCount_many": "{{count}} hosts",
|
||||
"hostsCount_other": "{{count}} hosts",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} credenciais",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} permissão",
|
||||
"count_many": "{{count}} permissões",
|
||||
"groups": {
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Credenciais",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Altera a fonte da interface do aplicativo. Os perfis de terminal mantêm suas próprias configurações de fonte.",
|
||||
"accentColorLabel": "Cor de Destaque",
|
||||
"apiKeyCount_one": "{{count}} chave",
|
||||
"apiKeyCount_many": "{{count}} chaves",
|
||||
"colorPickerTooltip": "Abrir seletor de cores",
|
||||
"themeSystem": "Sistema",
|
||||
"themeLight": "Claro",
|
||||
"themeDark": "Escuro",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Escuro"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Como o aplicativo inteiro é organizado. Temas e layouts vêm de plugins.",
|
||||
"defaultsLabel": "Padrão para todos",
|
||||
"defaultsHint": "O que as pessoas veem até escolherem seu próprio layout ou tema.",
|
||||
"followDefault": "Usar o padrão",
|
||||
"defaultSaved": "Aparência padrão salva",
|
||||
"saveFailed": "Não foi possível salvar a aparência",
|
||||
"repair": {
|
||||
"title": "Este layout não pôde ser exibido",
|
||||
"safeTitle": "Modo de segurança",
|
||||
"layout": "Layout",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Motivo",
|
||||
"error": "Erro",
|
||||
"noError": "Nenhuma mensagem de erro.",
|
||||
"copy": "Copiar",
|
||||
"copied": "Copiado",
|
||||
"copyFailed": "Não foi possível copiar os detalhes",
|
||||
"retry": "Tentar novamente",
|
||||
"reset": "Restaurar a aparência padrão",
|
||||
"resetEveryone": "Restaurar o padrão para todos",
|
||||
"update": "Atualizar {{name}} para {{version}}",
|
||||
"disable": "Desativar {{name}}",
|
||||
"enable": "Ativar {{name}}",
|
||||
"startAgain": "Reiniciar {{name}}",
|
||||
"install": "Encontrar layouts e temas",
|
||||
"installTitle": "Layouts e temas",
|
||||
"installButton": "Instalar",
|
||||
"nothingToInstall": "Nenhum outro layout ou tema está disponível no momento.",
|
||||
"registryUnreachable": "Não foi possível acessar o registro de plugins.",
|
||||
"askAdmin": "Peça a um administrador para atualizar ou corrigir este layout. Você pode alternar para outro layout ou tema para si mesmo abaixo.",
|
||||
"switchLayout": "Alternar layout",
|
||||
"switchTheme": "Alternar tema",
|
||||
"saveFailed": "Não foi possível salvar sua escolha",
|
||||
"reasons": {
|
||||
"safe-url": "O endereço solicitou o modo de segurança. Escolha um layout abaixo ou remova ?safe-layout=1 do endereço.",
|
||||
"safe-env": "O servidor foi iniciado com TERMIX_SAFE_LAYOUT, então todos veem esta tela até que ele seja removido.",
|
||||
"missing": "Nenhum plugin instalado fornece este layout.",
|
||||
"disabled": "O plugin que fornece este layout está desativado.",
|
||||
"blocked": "O plugin que fornece este layout está aguardando algo de que precisa.",
|
||||
"incompatible": "O plugin que fornece este layout não é compatível com esta versão do Termix.",
|
||||
"failed": "O layout falhou ao iniciar.",
|
||||
"crashed": "O layout travou duas vezes ao renderizar o aplicativo."
|
||||
},
|
||||
"noLayout": "Nenhum layout está definido",
|
||||
"restore": "Restaurar o {{name}} incluído",
|
||||
"restoreFailed": "Não foi possível restaurar a cópia incluída"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Gerenciar login",
|
||||
"consequence": "Ele pode adicionar um método de login, um segundo fator ou um tipo de login SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Definir regras de login",
|
||||
"consequence": "Ele pode desconectar pessoas quando inativas, limitar a duração da sessão, desativar a opção 'lembrar-me' e exigir um segundo fator."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Escolher como os hosts são acessados",
|
||||
"consequence": "Ele pode transportar a conexão SSH para um host por sua própria rota, então ele vê tudo enviado para e desses hosts, incluindo senhas."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Executar sincronização",
|
||||
"consequence": "Ele pode responder a todas as solicitações de sincronização, então ele vê os dados que dispositivos e servidores sincronizam."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Gerenciar certificados",
|
||||
"consequence": "Ele pode substituir o certificado que o Termix serve via HTTPS e responder a verificações de domínio de autoridades certificadoras."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Acessar dispositivos seriais e USB",
|
||||
"consequence": "Ele pode abrir uma porta serial física na máquina que executa o Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Exportar hosts com seus segredos",
|
||||
"consequence": "Pode ler seus hosts por completo, incluindo senhas e chaves salvas, e distribuí-los. Cada exportação é registrada no log de auditoria."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Criar e alterar hosts",
|
||||
"consequence": "Ele pode adicionar hosts e editar os que você já possui."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Ler o log de auditoria",
|
||||
"consequence": "Ele pode ver quem fez o quê e quando."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Verificar se portas respondem",
|
||||
"consequence": "Pode abrir uma conexão simples para qualquer endereço a partir do servidor, para ver se é acessível."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Fornecer status do host",
|
||||
"consequence": "Torna-se a fonte dos pontos online e offline para cada host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Armazenar atividade recente",
|
||||
"consequence": "Torna-se o repositório da lista de atividades recentes de todos os usuários."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Gerenciar hosts como somente leitura",
|
||||
"consequence": "Os hosts gerenciados não podem ser editados, excluídos ou compartilhados novamente por ninguém."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Abrir janelas de desktop",
|
||||
"consequence": "Apenas no aplicativo desktop do Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Usar este computador",
|
||||
"consequence": "Pode ler e alterar arquivos, executar um shell e abrir portas locais neste computador. Apenas no aplicativo desktop do Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Agir como outros usuários",
|
||||
"consequence": "Executa tarefas em segundo plano com o acesso de outro usuário, como trabalhos agendados. Cada uso é registrado no log de auditoria."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Adicionar suas próprias telas",
|
||||
"consequence": "Abas, painéis e configurações que você pode ocultar depois."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Substituir todo o layout do aplicativo",
|
||||
"consequence": "Quando selecionado, seu código desenha todas as telas, incluindo seus terminais e configurações."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Adicionar temas de cores",
|
||||
"consequence": "Apenas cores e estilos. Nenhum código é executado para um tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Desativado",
|
||||
"failed": "Parado inesperadamente",
|
||||
"blocked": "Aguardando outro plugin",
|
||||
"server": "Executa no seu servidor"
|
||||
"server": "Executa no seu servidor",
|
||||
"safeMode": "Desativado no modo de segurança"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Em execução",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Atualizados recentemente",
|
||||
"category": "Categoria"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Colunas",
|
||||
"auto": "Automático",
|
||||
"count": "{{count}} de largura"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nome",
|
||||
"description": "Descrição",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "Não foi possível salvar as opções de {{name}}: {{error}}",
|
||||
"deleteData": "Não foi possível excluir os dados de {{name}}: {{error}}",
|
||||
"managedByServer": "Esta área de trabalho está vinculada a um servidor, que decide seus plugins.",
|
||||
"defaultLook": "{{name}} é o visual padrão, portanto, pode ser desativado ou substituído, mas não desinstalado.",
|
||||
"hasDependents": "{{name}} é necessário por {{list}}. Desative-os ou desinstale-os primeiro.",
|
||||
"missingDependencies": "{{name}} precisa de {{list}}, que não está instalado.",
|
||||
"consentChanged": "O que este plugin solicita mudou desde que você verificou. Confira a lista novamente.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Sem acesso aos seus servidores",
|
||||
"searchInstalled": "Pesquisar instalados",
|
||||
"searchPlugins": "Pesquisar plugins",
|
||||
"allCategories": "Todos",
|
||||
"nothingMatches": "Nada corresponde a isso.",
|
||||
"noneInstalled": "Nenhum plugin instalado ainda. Navegue para adicionar alguns.",
|
||||
"nothingHere": "Nada aqui.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Documentação",
|
||||
"envVars": "Variáveis de ambiente",
|
||||
"envRequired": "Obrigatório",
|
||||
"envDefault": "Padrão: {{value}}"
|
||||
"envDefault": "Padrão: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Layouts",
|
||||
"themes": "Temas",
|
||||
"tabs": "Abas",
|
||||
"panels": "Painéis da barra lateral",
|
||||
"dashboardCards": "Cards do painel",
|
||||
"protocols": "Tipos de conexão",
|
||||
"auth": "Métodos de login",
|
||||
"actions": "Ações",
|
||||
"hostCapability": "Configurações do host"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tipo",
|
||||
"allTypes": "Todos os tipos",
|
||||
"category": "Categoria",
|
||||
"allCategories": "Todas as categorias",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_many": "{{count}} plugins",
|
||||
"results_other": "{{count}} plugins",
|
||||
"remove": "Remover filtro {{name}}",
|
||||
"clear": "Limpar filtros",
|
||||
"button": "Filtros",
|
||||
"buttonCount": "Filtros ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} de {{total}}",
|
||||
"page": "Página {{page}} de {{pages}}",
|
||||
"previous": "Página anterior",
|
||||
"next": "Próxima página",
|
||||
"perPage": "{{count}} por página",
|
||||
"perPageLabel": "Plugins por página"
|
||||
},
|
||||
"showUnsupportedHint": "Estes estão listados, mas nenhuma versão é compatível com esta versão ainda. Atualize o Termix para instalá-los.",
|
||||
"unsupported": "Requer uma versão mais recente do Termix",
|
||||
"unsupportedHint": "Nenhuma versão deste plugin é compatível com esta versão do Termix. Atualize o Termix para instalá-lo.",
|
||||
"needsTermix": "Requer Termix {{range}}",
|
||||
"showUnsupported": "Mostrar incompatíveis ({{count}})",
|
||||
"showMore": "Mostrar mais {{count}} ({{total}} restantes)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Sem dados",
|
||||
"filter": "Filtrar..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minuto atrás",
|
||||
"minutesAgo_many": "{{count}} minutos atrás",
|
||||
"minutesAgo_other": "{{count}} minutos atrás",
|
||||
"hoursAgo_one": "{{count}} hora atrás",
|
||||
"hoursAgo_many": "{{count}} horas atrás",
|
||||
"hoursAgo_other": "{{count}} horas atrás",
|
||||
"pending_one": "{{count}} alteração aguardando sincronização",
|
||||
"pending_many": "{{count}} alterações aguardando sincronização",
|
||||
"pending_other": "{{count}} alterações aguardando sincronização",
|
||||
"proxy": {
|
||||
"headersTitle": "Cabeçalhos extras",
|
||||
"headersHint": "Enviados com cada solicitação ao servidor, por exemplo, um token de serviço do Cloudflare Access.",
|
||||
"headerName": "Nome do cabeçalho",
|
||||
"headerValue": "Valor",
|
||||
"savedValue": "Salvo, digite para alterar",
|
||||
"addHeader": "Adicionar cabeçalho",
|
||||
"removeHeader": "Remover cabeçalho",
|
||||
"basicAuthTitle": "Nome de usuário e senha",
|
||||
"basicAuthHint": "Para um proxy que solicita nome de usuário e senha antes do Termix.",
|
||||
"username": "Nome de usuário",
|
||||
"password": "Senha",
|
||||
"allowInvalidCertificate": "Confiar em um certificado autoassinado",
|
||||
"allowInvalidCertificateHint": "Apenas para seu próprio servidor, quando seu certificado não é de uma autoridade conhecida."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Isso não parece ser um endereço web.",
|
||||
"unreachable": "Não foi possível acessar o servidor. Verifique o endereço e se o servidor está em execução.",
|
||||
"unreachableWithReason": "Não foi possível acessar o servidor: {{reason}}",
|
||||
"tlsUntrusted": "O certificado do servidor não é confiável. Se este for seu próprio servidor com um certificado autoassinado, ative a opção abaixo.",
|
||||
"basicAuthRequired": "Algo antes do servidor está solicitando um nome de usuário e senha. Insira-os abaixo.",
|
||||
"proxyLogin": "Uma página de login ou proxy respondeu em vez do Termix. Adicione os cabeçalhos necessários abaixo ou verifique o endereço.",
|
||||
"notTermix": "Não há um servidor Termix nesse endereço. Se ele estiver em um caminho, inclua-o, como https://example.com/termix.",
|
||||
"versionMismatch": "Esse servidor executa uma versão antiga do Termix. Atualize para a versão 2.9 ou mais recente para vincular.",
|
||||
"differentAccount": "Você fez login em uma conta diferente. Faça login na conta vinculada a este dispositivo ou desvincule primeiro."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Vincular a um servidor Termix",
|
||||
"reloginTitle": "Fazer login novamente",
|
||||
"savedServers": "Servidores recentes",
|
||||
"removeServer": "Remover da lista",
|
||||
"serverDescription": "Insira o endereço que você usa para abrir o Termix no navegador.",
|
||||
"signinDescription": "Faça login em {{url}}",
|
||||
"chooseDescription": "Este dispositivo já possui dados. O que deve acontecer com eles?",
|
||||
"finishingDescription": "Vinculando este dispositivo.",
|
||||
"serverUrl": "Endereço do servidor",
|
||||
"serverUrlHint": "Por exemplo, https://termix.example.com",
|
||||
"showProxySettings": "Configurações de proxy reverso",
|
||||
"hideProxySettings": "Ocultar configurações de proxy reverso",
|
||||
"continue": "Continuar",
|
||||
"back": "Voltar",
|
||||
"mergeTitle": "Adicionar à minha conta",
|
||||
"mergeBody_one": "O item neste dispositivo será adicionado à sua conta. Os itens que sua conta já possui permanecerão como estão no servidor.",
|
||||
"mergeBody_many": "Os {{count}} itens neste dispositivo serão adicionados à sua conta. Os itens que sua conta já possui permanecerão como estão no servidor.",
|
||||
"mergeBody_other": "Os {{count}} itens neste dispositivo serão adicionados à sua conta. Os itens que sua conta já possui permanecerão como estão no servidor.",
|
||||
"replaceTitle": "Substituir pela minha conta",
|
||||
"replaceBody_one": "O item neste dispositivo será removido e este dispositivo receberá tudo da sua conta. Hosts mantidos apenas neste dispositivo permanecerão.",
|
||||
"replaceBody_many": "Os {{count}} itens neste dispositivo serão removidos e este dispositivo receberá tudo da sua conta. Hosts mantidos apenas neste dispositivo permanecerão.",
|
||||
"replaceBody_other": "Os {{count}} itens neste dispositivo serão removidos e este dispositivo receberá tudo da sua conta. Hosts mantidos apenas neste dispositivo permanecerão.",
|
||||
"link": "Vincular",
|
||||
"linking": "Vinculando e executando a primeira sincronização...",
|
||||
"linked": "Vinculado. Seus dados estão sendo sincronizados agora.",
|
||||
"signedInAgain": "Login realizado. A sincronização está em execução novamente."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hosts",
|
||||
"sshCredentials": "Credenciais",
|
||||
"sshFolders": "Pastas",
|
||||
"userPreferences": "Preferências",
|
||||
"pluginUserSettings": "Configurações de plugins",
|
||||
"sharedHosts": "Hosts compartilhados com você",
|
||||
"sharedCredentials": "Credenciais compartilhadas com você",
|
||||
"vaultProfiles": "Perfis de Vault",
|
||||
"snippetFolders": "Pastas de snippets",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Links de serviços",
|
||||
"homepageItems": "Itens da página inicial",
|
||||
"networkTopology": "Mapa de rede",
|
||||
"workspaces": "Espaços de trabalho",
|
||||
"hostDefaults": "Padrões de host",
|
||||
"hostDefaultsAdmin": "Padrões de host do servidor",
|
||||
"aiProviders": "Provedores de IA",
|
||||
"homepageLayouts": "Layouts da página inicial",
|
||||
"accountProfile": "Perfil da conta"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Pasta {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Grade",
|
||||
"listView": "Lista",
|
||||
"compactRows": "Linhas compactas",
|
||||
"comfortableRows": "Linhas confortáveis"
|
||||
"comfortableRows": "Linhas confortáveis",
|
||||
"columns": {
|
||||
"title": "Colunas",
|
||||
"auto": "Automático",
|
||||
"count": "{{count}} colunas"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Salvo. Digite para substituí-lo."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Alguns plugins não puderam ser alterados. Pode corrigi-los mais tarde na aba Plugins. Prima Seguinte para continuar.",
|
||||
"pluginsApplyFailed": "As suas escolhas não puderam ser guardadas. Tente novamente, ou continue e altere-as mais tarde na aba Plugins.",
|
||||
"pluginsLoadFailed": "A lista de plugins não pôde ser carregada. Pode escolher plugins mais tarde na aba Plugins.",
|
||||
"presetTitle": "Quanto conteúdo quer ver no ecrã?",
|
||||
"presetIntro": "Escolha quanto conteúdo aparece no ecrã.",
|
||||
"presetChangeLater": "Pode alterar predefinições ou qualquer definição individual mais tarde em Definições, sob Interface.",
|
||||
"appearanceTitle": "Personalize ao seu gosto",
|
||||
"appearanceIntro": "Escolha um tema, uma cor de destaque, uma fonte e o seu idioma. As alterações aparecem imediatamente e pode alterá-las mais tarde em Definições.",
|
||||
"securityTitle": "Segure a sua conta",
|
||||
"securityIntro": "Adicione uma passkey ou uma aplicação de autenticação à sua conta. Também pode fazer isto mais tarde em Definições, sob Segurança.",
|
||||
"desktopTitle": "Como pretende usar o Termix?",
|
||||
"desktopBody": "Pode alterar isto a qualquer momento em Sincronização na barra lateral.",
|
||||
"desktopLocalTitle": "Apenas neste dispositivo",
|
||||
"desktopLocalBody": "Tudo é armazenado aqui. Nada para configurar.",
|
||||
"desktopLinkTitle": "Com o meu servidor Termix",
|
||||
"desktopLinkBody": "Inicie sessão no seu servidor para usar os mesmos hosts e definições em todos os dispositivos.",
|
||||
"desktopLinked": "Ligado a {{server}}",
|
||||
"pluginsDocsLink": "Leia sobre cada um"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "O Termix {{version}} está pronto para instalar",
|
||||
"readyHint": "Será instalado na próxima reinicialização do Termix."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Modo seguro",
|
||||
"description": "Apenas os plugins de layout e tema estão em execução. Reinicie o servidor sem a variável TERMIX_SAFE_MODE para reativar os restantes."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Fechar painel",
|
||||
"moveSide": "Mover painel",
|
||||
"resize": "Redimensionar painel"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Início",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Credenciais",
|
||||
"connections": "Conexões",
|
||||
"sync": "Sincronizar",
|
||||
"reconnectDisconnectedTerminals": "Reconectar todos os terminais desconetados",
|
||||
"reconnectingTerminals_one": "A reconectar {{count}} terminal",
|
||||
"reconnectingTerminals_many": "A reconectar {{count}} terminais",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Tentar novamente",
|
||||
"refresh": "Atualizar",
|
||||
"optional": "Opcional",
|
||||
"downloadSample": "Transferir exemplo",
|
||||
"failedToDeleteHost": "Falha ao eliminar {{name}}",
|
||||
"importSkipExisting": "Importar (ignorar existentes)",
|
||||
"importSSHConfig": "Importar a partir da configuração SSH",
|
||||
"connectionDetails": "Detalhes da conexão",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Sem pasta)",
|
||||
"deleteSelected": "Eliminar",
|
||||
"exitSelection": "Sair da seleção",
|
||||
"importSkip": "Importar (ignorar existentes)",
|
||||
"importOverwrite": "Importar (substituir)",
|
||||
"collapseBtn": "Recolher",
|
||||
"importExportBtn": "Importar / Exportar",
|
||||
"hostStatusesRefreshed": "Estados dos hosts atualizados",
|
||||
"failedToRefreshHosts": "Falha ao atualizar hosts",
|
||||
"movedHostTo": "Movido {{host}} para \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_many": "Eliminar \"{{name}}\" e os seus {{count}} servidores? Esta ação não pode ser desfeita.",
|
||||
"deleteFolderConfirm_other": "Eliminar \"{{name}}\" e os seus {{count}} servidores? Esta ação não pode ser desfeita.",
|
||||
"failedToMoveHosts": "Falha ao mover hosts",
|
||||
"managedBanner": "Este host é gerido pelo {{plugin}}. Altere-o lá. Pode ainda fixá-lo e reordená-lo.",
|
||||
"managedTooltip": "Gerido por {{plugin}}",
|
||||
"addBlocked": "Os hosts são geridos pelo {{plugin}}, por isso não é possível adicionar novos hosts aqui.",
|
||||
"failedToReorder": "Falha ao reordenar",
|
||||
"expandAll": "Expandir todas as pastas",
|
||||
"collapseAll": "Recolher todas as pastas",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Adicionar Credencial",
|
||||
"checkingHostStatuses": "A verificar os estados dos hosts...",
|
||||
"pinnedSection": "Fixados",
|
||||
"hostsExported": "Hosts exportados com sucesso",
|
||||
"export": {
|
||||
"menuItem": "Exportar...",
|
||||
"title": "Exportar hosts",
|
||||
"scope": "Âmbito",
|
||||
"scopeAll": "Todos",
|
||||
"scopeSelected": "Selecionados",
|
||||
"searchHosts": "Pesquisar hosts...",
|
||||
"include": "Incluir",
|
||||
"groupConnection": "Conexão",
|
||||
"groupCredentials": "Credenciais",
|
||||
"groupNotes": "Notas",
|
||||
"groupTags": "Etiquetas e fixação",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Jump hosts",
|
||||
"groupFeatureFlags": "Definições de plugins",
|
||||
"groupAdvanced": "Configuração avançada",
|
||||
"preview": "Pré-visualização",
|
||||
"moreHosts_one": "... {{count}} servidor adicional",
|
||||
"moreHosts_many": "... {{count}} servidores adicionais",
|
||||
"moreHosts_other": "... {{count}} servidores adicionais",
|
||||
"summary": "{{selected}} de {{total}} hosts",
|
||||
"credentialsIncluded": "credenciais incluídas",
|
||||
"credentialsExcluded": "credenciais excluídas",
|
||||
"noneSelected": "Nenhum host selecionado",
|
||||
"cancel": "Cancelar",
|
||||
"confirm": "Exportar",
|
||||
"fetchFailed": "Falha ao carregar hosts para exportação",
|
||||
"bulkButton": "Exportar"
|
||||
},
|
||||
"sampleDownloaded": "Ficheiro de exemplo descarregado",
|
||||
"failedToDeleteCredential2": "Falha ao eliminar a credencial",
|
||||
"noFolderOption": "(Sem pasta)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Atualizar Host",
|
||||
"editorAdd": "Adicionar Host",
|
||||
"speedSearch": "Pesquisar hosts. Teclas de seta para selecionar, Enter para ligar, Esc para fechar",
|
||||
"speedSearchList": "Lista de hosts. Escreva ou prima / para pesquisar.",
|
||||
"importNoHosts": "Nenhum host encontrado no ficheiro",
|
||||
"importTooMany": "Pode importar até {{max}} hosts de cada vez",
|
||||
"importSummary": "Importação concluída: {{imported}} importados, {{updated}} atualizados, {{failed}} falhados",
|
||||
"importHostsFailed": "Falha ao importar hosts"
|
||||
"speedSearchList": "Lista de hosts. Escreva ou prima / para pesquisar."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Ecrã dividido",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} utilizador",
|
||||
"usersCount_many": "{{count}} utilizadores",
|
||||
"rolesCount_one": "{{count}} função",
|
||||
"rolesCount_many": "{{count}} funções",
|
||||
"apiKeysCount_one": "{{count}} chave",
|
||||
"apiKeysCount_many": "{{count}} chaves",
|
||||
"sessionsActive_one": "{{count}} ativa",
|
||||
"sessionsActive_many": "{{count}} ativas",
|
||||
"hostsCount_one": "{{count}} servidor",
|
||||
"hostsCount_many": "{{count}} servidores",
|
||||
"hostsCount_other": "{{count}} servidores",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} credenciais",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} permissão",
|
||||
"count_many": "{{count}} permissões",
|
||||
"groups": {
|
||||
"hosts": "Hosts",
|
||||
"credentials": "Credenciais",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Altera a fonte da interface da aplicação. Os perfis do terminal mantêm as suas próprias definições de fonte.",
|
||||
"accentColorLabel": "Cor de Destaque",
|
||||
"apiKeyCount_one": "{{count}} chave",
|
||||
"apiKeyCount_many": "{{count}} chaves",
|
||||
"colorPickerTooltip": "Abrir seletor de cores",
|
||||
"themeSystem": "Sistema",
|
||||
"themeLight": "Claro",
|
||||
"themeDark": "Escuro",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Escuro"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Como a aplicação inteira é organizada. Temas e layouts vêm de plugins.",
|
||||
"defaultsLabel": "Predefinição para todos",
|
||||
"defaultsHint": "O que as pessoas veem até escolherem o seu próprio layout ou tema.",
|
||||
"followDefault": "Usar a predefinição",
|
||||
"defaultSaved": "Aparência predefinida guardada",
|
||||
"saveFailed": "Não foi possível guardar a aparência",
|
||||
"repair": {
|
||||
"title": "Este layout não pôde ser exibido",
|
||||
"safeTitle": "Modo seguro",
|
||||
"layout": "Layout",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Motivo",
|
||||
"error": "Erro",
|
||||
"noError": "Sem mensagem de erro.",
|
||||
"copy": "Copiar",
|
||||
"copied": "Copiado",
|
||||
"copyFailed": "Não foi possível copiar os detalhes",
|
||||
"retry": "Tentar novamente",
|
||||
"reset": "Repor para a aparência predefinida",
|
||||
"resetEveryone": "Repor a predefinição para todos",
|
||||
"update": "Atualizar {{name}} para {{version}}",
|
||||
"disable": "Desativar {{name}}",
|
||||
"enable": "Ativar {{name}}",
|
||||
"startAgain": "Reiniciar {{name}}",
|
||||
"install": "Procurar layouts e temas",
|
||||
"installTitle": "Layouts e temas",
|
||||
"installButton": "Instalar",
|
||||
"nothingToInstall": "Não há outros layouts ou temas disponíveis de momento.",
|
||||
"registryUnreachable": "Não foi possível aceder ao registo de plugins.",
|
||||
"askAdmin": "Peça a um administrador para atualizar ou corrigir este layout. Pode mudar para outro layout ou tema para si mesmo abaixo.",
|
||||
"switchLayout": "Mudar layout",
|
||||
"switchTheme": "Mudar tema",
|
||||
"saveFailed": "Não foi possível guardar a sua escolha",
|
||||
"reasons": {
|
||||
"safe-url": "O endereço pediu o modo seguro. Escolha um layout abaixo, ou remova ?safe-layout=1 do endereço.",
|
||||
"safe-env": "O servidor foi iniciado com TERMIX_SAFE_LAYOUT, por isso todos veem este ecrã até que seja removido.",
|
||||
"missing": "Nenhum plugin instalado fornece este layout.",
|
||||
"disabled": "O plugin que fornece este layout está desativado.",
|
||||
"blocked": "O plugin que fornece este layout está à espera de algo de que precisa.",
|
||||
"incompatible": "O plugin que fornece este layout não funciona com esta versão do Termix.",
|
||||
"failed": "O layout falhou ao iniciar.",
|
||||
"crashed": "O layout falhou duas vezes ao desenhar a aplicação."
|
||||
},
|
||||
"noLayout": "Nenhum layout está definido",
|
||||
"restore": "Restaurar o {{name}} incluído",
|
||||
"restoreFailed": "Não foi possível restaurar a cópia incluída"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Gerir início de sessão",
|
||||
"consequence": "Pode adicionar um método de login, um segundo fator ou um tipo de início de sessão SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Definir regras de início de sessão",
|
||||
"consequence": "Pode terminar a sessão das pessoas quando inativas, limitar a duração da sessão, desativar a opção \"lembrar-me\" e exigir um segundo fator."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Escolher como os hosts são acedidos",
|
||||
"consequence": "Pode transportar a ligação SSH para um host pela sua própria rota, por isso vê tudo o que é enviado para e desde esses hosts, incluindo passwords."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Executar sincronização",
|
||||
"consequence": "Pode responder a todos os pedidos de sincronização, por isso vê os dados que os dispositivos e servidores sincronizam."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Gerir certificados",
|
||||
"consequence": "Pode substituir o certificado que o Termix serve via HTTPS e responder a verificações de domínio de autoridades de certificação."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Aceder a dispositivos série e USB",
|
||||
"consequence": "Pode abrir uma porta série física na máquina que executa o Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Exportar hosts com os seus segredos",
|
||||
"consequence": "Pode ler os seus hosts por completo, incluindo passwords e chaves guardadas, e distribuí-los. Cada exportação é registada no log de auditoria."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Criar e alterar servidores",
|
||||
"consequence": "Pode adicionar servidores e editar os que já tem."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Ler o registo de auditoria",
|
||||
"consequence": "Pode ver quem fez o quê e quando."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Verificar se as portas respondem",
|
||||
"consequence": "Pode abrir uma ligação simples para qualquer endereço a partir do servidor, para ver se é acessível."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Fornecer estado do host",
|
||||
"consequence": "Torna-se a fonte dos pontos online e offline para cada host."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Guardar atividade recente",
|
||||
"consequence": "Torna-se o repositório da lista de atividade recente de todos os utilizadores."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Gerir hosts como apenas leitura",
|
||||
"consequence": "Os hosts que gere não podem ser editados, eliminados ou partilhados novamente por ninguém."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Abrir janelas de ambiente de trabalho",
|
||||
"consequence": "Apenas na aplicação de ambiente de trabalho Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Usar este computador",
|
||||
"consequence": "Pode ler e alterar ficheiros, executar um shell e abrir portas locais neste computador. Apenas na aplicação desktop do Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Agir como outros utilizadores",
|
||||
"consequence": "Executa tarefas em segundo plano com o acesso de outro utilizador, como tarefas agendadas. Cada utilização é registada no registo de auditoria."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Adicionar as suas próprias ecrãs",
|
||||
"consequence": "Separadores, painéis e definições que pode ocultar mais tarde."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Substituir todo o layout da aplicação",
|
||||
"consequence": "Quando selecionado, o seu código desenha todos os ecrãs, incluindo os seus terminais e definições."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Adicionar temas de cores",
|
||||
"consequence": "Apenas cores e estilos. Nenhum código é executado para um tema."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Desativado",
|
||||
"failed": "Parado inesperadamente",
|
||||
"blocked": "À espera de outro plugin",
|
||||
"server": "Executa no seu servidor"
|
||||
"server": "Executa no seu servidor",
|
||||
"safeMode": "Desativado no modo seguro"
|
||||
},
|
||||
"groups": {
|
||||
"running": "Em execução",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Atualizados recentemente",
|
||||
"category": "Categoria"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Colunas",
|
||||
"auto": "Automático",
|
||||
"count": "{{count}} de largura"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nome",
|
||||
"description": "Descrição",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "Não foi possível guardar as opções de {{name}}: {{error}}",
|
||||
"deleteData": "Não foi possível eliminar os dados de {{name}}: {{error}}",
|
||||
"managedByServer": "Este ambiente de trabalho está ligado a um servidor, que decide os seus plugins.",
|
||||
"defaultLook": "{{name}} é o aspeto predefinido, por isso pode ser desativado ou substituído, mas não desinstalado.",
|
||||
"hasDependents": "{{name}} é necessário por {{list}}. Desative-os ou desinstale-os primeiro.",
|
||||
"missingDependencies": "{{name}} precisa de {{list}}, que não está instalado.",
|
||||
"consentChanged": "O que este plugin solicita mudou desde que o consultou. Verifique a lista novamente.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Sem acesso aos seus servidores",
|
||||
"searchInstalled": "Pesquisar instalados",
|
||||
"searchPlugins": "Pesquisar plugins",
|
||||
"allCategories": "Todos",
|
||||
"nothingMatches": "Nada corresponde a isso.",
|
||||
"noneInstalled": "Ainda não há plugins instalados. Navegue para adicionar alguns.",
|
||||
"nothingHere": "Nada aqui.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Documentação",
|
||||
"envVars": "Variáveis de ambiente",
|
||||
"envRequired": "Obrigatório",
|
||||
"envDefault": "Predefinição: {{value}}"
|
||||
"envDefault": "Predefinição: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Layouts",
|
||||
"themes": "Temas",
|
||||
"tabs": "Separadores",
|
||||
"panels": "Painéis da barra lateral",
|
||||
"dashboardCards": "Cartões do painel",
|
||||
"protocols": "Tipos de conexão",
|
||||
"auth": "Métodos de início de sessão",
|
||||
"actions": "Ações",
|
||||
"hostCapability": "Definições do host"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tipo",
|
||||
"allTypes": "Todos os tipos",
|
||||
"category": "Categoria",
|
||||
"allCategories": "Todas as categorias",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_many": "{{count}} plugins",
|
||||
"results_other": "{{count}} plugins",
|
||||
"remove": "Remover filtro {{name}}",
|
||||
"clear": "Limpar filtros",
|
||||
"button": "Filtros",
|
||||
"buttonCount": "Filtros ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} de {{total}}",
|
||||
"page": "Página {{page}} de {{pages}}",
|
||||
"previous": "Página anterior",
|
||||
"next": "Próxima página",
|
||||
"perPage": "{{count}} por página",
|
||||
"perPageLabel": "Plugins por página"
|
||||
},
|
||||
"showUnsupportedHint": "Estes estão listados, mas nenhuma versão está disponível para esta versão ainda. Atualize o Termix para os instalar.",
|
||||
"unsupported": "Requer uma versão mais recente do Termix",
|
||||
"unsupportedHint": "Nenhuma versão deste plugin está disponível para esta versão do Termix. Atualize o Termix para o instalar.",
|
||||
"needsTermix": "Requer Termix {{range}}",
|
||||
"showUnsupported": "Mostrar incompatíveis ({{count}})",
|
||||
"showMore": "Mostrar mais {{count}} ({{total}} restantes)"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Sem dados",
|
||||
"filter": "Filtrar..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minuto atrás",
|
||||
"minutesAgo_many": "{{count}} minutos atrás",
|
||||
"minutesAgo_other": "{{count}} minutos atrás",
|
||||
"hoursAgo_one": "{{count}} hora atrás",
|
||||
"hoursAgo_many": "{{count}} horas atrás",
|
||||
"hoursAgo_other": "{{count}} horas atrás",
|
||||
"pending_one": "{{count}} alteração à espera de sincronização",
|
||||
"pending_many": "{{count}} alterações à espera de sincronização",
|
||||
"pending_other": "{{count}} alterações à espera de sincronização",
|
||||
"proxy": {
|
||||
"headersTitle": "Cabeçalhos extra",
|
||||
"headersHint": "Enviados com cada pedido ao servidor, por exemplo, um token de serviço do Cloudflare Access.",
|
||||
"headerName": "Nome do cabeçalho",
|
||||
"headerValue": "Valor",
|
||||
"savedValue": "Guardado, escreva para alterar",
|
||||
"addHeader": "Adicionar cabeçalho",
|
||||
"removeHeader": "Remover cabeçalho",
|
||||
"basicAuthTitle": "Nome de utilizador e palavra-passe",
|
||||
"basicAuthHint": "Para um proxy que pede um nome de utilizador e palavra-passe antes do Termix.",
|
||||
"username": "Nome de utilizador",
|
||||
"password": "Palavra-passe",
|
||||
"allowInvalidCertificate": "Confiar num certificado autoassinado",
|
||||
"allowInvalidCertificateHint": "Apenas para o seu próprio servidor, quando o seu certificado não é de uma autoridade conhecida."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Isto não parece ser um endereço web.",
|
||||
"unreachable": "Não foi possível aceder ao servidor. Verifique o endereço e se o servidor está em execução.",
|
||||
"unreachableWithReason": "Não foi possível aceder ao servidor: {{reason}}",
|
||||
"tlsUntrusted": "O certificado do servidor não é confiável. Se este for o seu próprio servidor com um certificado auto-assinado, ative a opção abaixo.",
|
||||
"basicAuthRequired": "Algo à frente do servidor pede um nome de utilizador e palavra-passe. Introduza-os abaixo.",
|
||||
"proxyLogin": "Uma página de login ou proxy respondeu em vez do Termix. Adicione os cabeçalhos que necessita abaixo, ou verifique o endereço.",
|
||||
"notTermix": "Não há um servidor Termix nesse endereço. Se estiver a correr num caminho, inclua-o, como https://exemplo.com/termix.",
|
||||
"versionMismatch": "Esse servidor executa uma versão mais antiga do Termix. Atualize-o para a versão 2.9 ou superior para ligar.",
|
||||
"differentAccount": "Iniciou sessão numa conta diferente. Inicie sessão na conta a que este dispositivo está ligado, ou desligue primeiro."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Ligar a um servidor Termix",
|
||||
"reloginTitle": "Iniciar sessão novamente",
|
||||
"savedServers": "Servidores recentes",
|
||||
"removeServer": "Remover da lista",
|
||||
"serverDescription": "Introduza o endereço que utiliza para abrir o Termix no seu navegador.",
|
||||
"signinDescription": "Iniciar sessão em {{url}}",
|
||||
"chooseDescription": "Este dispositivo já tem dados. O que deve acontecer com eles?",
|
||||
"finishingDescription": "A ligar este dispositivo.",
|
||||
"serverUrl": "Endereço do servidor",
|
||||
"serverUrlHint": "Por exemplo https://termix.exemplo.com",
|
||||
"showProxySettings": "Definições de proxy reverso",
|
||||
"hideProxySettings": "Ocultar definições de proxy reverso",
|
||||
"continue": "Continuar",
|
||||
"back": "Voltar",
|
||||
"mergeTitle": "Adicionar à minha conta",
|
||||
"mergeBody_one": "O item neste dispositivo é adicionado à sua conta. Os itens que a sua conta já tem mantêm-se como estão no servidor.",
|
||||
"mergeBody_many": "Os {{count}} itens neste dispositivo são adicionados à sua conta. Os itens que a sua conta já tem mantêm-se como estão no servidor.",
|
||||
"mergeBody_other": "Os {{count}} itens neste dispositivo são adicionados à sua conta. Os itens que a sua conta já tem mantêm-se como estão no servidor.",
|
||||
"replaceTitle": "Substituir pela minha conta",
|
||||
"replaceBody_one": "O item neste dispositivo é removido, e este dispositivo assume tudo da sua conta. Os hosts mantidos apenas neste dispositivo permanecem.",
|
||||
"replaceBody_many": "Os {{count}} itens neste dispositivo são removidos, e este dispositivo assume tudo da sua conta. Os hosts mantidos apenas neste dispositivo permanecem.",
|
||||
"replaceBody_other": "Os {{count}} itens neste dispositivo são removidos, e este dispositivo assume tudo da sua conta. Os hosts mantidos apenas neste dispositivo permanecem.",
|
||||
"link": "Ligar",
|
||||
"linking": "A ligar e a executar a primeira sincronização...",
|
||||
"linked": "Ligado. Os seus dados estão agora a sincronizar.",
|
||||
"signedInAgain": "Sessão iniciada. A sincronização está novamente em execução."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Hosts",
|
||||
"sshCredentials": "Credenciais",
|
||||
"sshFolders": "Pastas",
|
||||
"userPreferences": "Preferências",
|
||||
"pluginUserSettings": "Definições de plugins",
|
||||
"sharedHosts": "Hosts partilhados consigo",
|
||||
"sharedCredentials": "Credenciais partilhadas consigo",
|
||||
"vaultProfiles": "Perfis do Vault",
|
||||
"snippetFolders": "Pastas de snippets",
|
||||
"snippets": "Snippets",
|
||||
"dashboardServiceLinks": "Ligações a serviços",
|
||||
"homepageItems": "Itens da página inicial",
|
||||
"networkTopology": "Mapa de rede",
|
||||
"workspaces": "Espaços de trabalho",
|
||||
"hostDefaults": "Definições predefinidas de hosts",
|
||||
"hostDefaultsAdmin": "Definições predefinidas de hosts do servidor",
|
||||
"aiProviders": "Provedores de IA",
|
||||
"homepageLayouts": "Layouts da página inicial",
|
||||
"accountProfile": "Perfil da conta"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Pasta {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Grelha",
|
||||
"listView": "Lista",
|
||||
"compactRows": "Linhas compactas",
|
||||
"comfortableRows": "Linhas confortáveis"
|
||||
"comfortableRows": "Linhas confortáveis",
|
||||
"columns": {
|
||||
"title": "Colunas",
|
||||
"auto": "Automático",
|
||||
"count": "{{count}} de largura"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Guardado. Escreva para substituir."
|
||||
|
||||
@@ -213,20 +213,8 @@
|
||||
"pluginsSomeFailed": "Unele plugin-uri nu au putut fi modificate. Le poți repara mai târziu din fila Plugin-uri. Apasă Înainte pentru a continua.",
|
||||
"pluginsApplyFailed": "Alegerile tale nu au putut fi salvate. Încearcă din nou sau continuă și modifică-le mai târziu din fila Plugin-uri.",
|
||||
"pluginsLoadFailed": "Lista de plugin-uri nu a putut fi încărcată. Poți alege plugin-uri mai târziu din fila Plugin-uri.",
|
||||
"presetTitle": "Cât de mult vrei să apară pe ecran?",
|
||||
"presetIntro": "Alege cât de mult se afișează pe ecran.",
|
||||
"presetChangeLater": "Poți schimba presetările sau orice setare individuală mai târziu în Setări, la secțiunea Interfață.",
|
||||
"appearanceTitle": "Personalizează-l",
|
||||
"appearanceIntro": "Alege o temă, o culoare de accent, un font și limba ta. Modificările apar imediat și le poți schimba mai târziu în Setări.",
|
||||
"securityTitle": "Securizează-ți contul",
|
||||
"securityIntro": "Adaugă o cheie de acces sau o aplicație de autentificare la contul tău. Poți face acest lucru și mai târziu în Setări, la secțiunea Securitate.",
|
||||
"desktopTitle": "Cum vrei să folosești Termix?",
|
||||
"desktopBody": "Poți modifica acest lucru oricând din Sincronizare în bara laterală.",
|
||||
"desktopLocalTitle": "Doar pe acest dispozitiv",
|
||||
"desktopLocalBody": "Totul este stocat aici. Nu este nevoie de configurare.",
|
||||
"desktopLinkTitle": "Cu serverul meu Termix",
|
||||
"desktopLinkBody": "Conectează-te la serverul tău pentru a folosi aceleași gazde și setări pe fiecare dispozitiv.",
|
||||
"desktopLinked": "Legat de {{server}}",
|
||||
"pluginsDocsLink": "Citește despre fiecare"
|
||||
},
|
||||
"desktopUpdates": {
|
||||
@@ -247,6 +235,15 @@
|
||||
"ready": "Termix {{version}} este gata de instalare",
|
||||
"readyHint": "Se instalează data viitoare când Termix se repornește."
|
||||
},
|
||||
"safeMode": {
|
||||
"title": "Mod sigur",
|
||||
"description": "Doar plugin-urile de aspect și temă sunt active. Repornește serverul fără variabila TERMIX_SAFE_MODE pentru a reactiva restul."
|
||||
},
|
||||
"companion": {
|
||||
"close": "Închide panoul",
|
||||
"moveSide": "Mută panoul",
|
||||
"resize": "Redimensionează panoul"
|
||||
},
|
||||
"nav": {
|
||||
"home": "Acasă",
|
||||
"terminal": "Terminal",
|
||||
@@ -257,7 +254,6 @@
|
||||
"hosts": "Gazde",
|
||||
"credentials": "Credențiale",
|
||||
"connections": "Conexiuni",
|
||||
"sync": "Sincronizare",
|
||||
"reconnectDisconnectedTerminals": "Reconectează toate terminalele deconectate",
|
||||
"reconnectingTerminals_one": "Se reconectează {{count}} terminal",
|
||||
"reconnectingTerminals_few": "Se reconectează {{count}} terminale",
|
||||
@@ -282,10 +278,7 @@
|
||||
"retry": "Reîncearcă",
|
||||
"refresh": "Reîmprospătează",
|
||||
"optional": "Opțional",
|
||||
"downloadSample": "Descarcă exemplul",
|
||||
"failedToDeleteHost": "Ștergerea lui {{name}} a eșuat",
|
||||
"importSkipExisting": "Importă (omite existentele)",
|
||||
"importSSHConfig": "Importă din configurația SSH",
|
||||
"connectionDetails": "Detalii conexiune",
|
||||
"ssh": "SSH",
|
||||
"telnet": "Telnet",
|
||||
@@ -505,10 +498,7 @@
|
||||
"noFolder": "(Fără dosar)",
|
||||
"deleteSelected": "Șterge",
|
||||
"exitSelection": "Ieși din selecție",
|
||||
"importSkip": "Importă (sari peste existente)",
|
||||
"importOverwrite": "Importă (suprascrie)",
|
||||
"collapseBtn": "Restrânge",
|
||||
"importExportBtn": "Importă / Exportă",
|
||||
"hostStatusesRefreshed": "Stările gazdelor au fost reîmprospătate",
|
||||
"failedToRefreshHosts": "Reîmprospătarea gazdelor a eșuat",
|
||||
"movedHostTo": "{{host}} mutat în \"{{folder}}\"",
|
||||
@@ -565,6 +555,9 @@
|
||||
"deleteFolderConfirm_few": "Ștergeți \"{{name}}\" și {{count}} gazdele sale? Această acțiune nu poate fi anulată.",
|
||||
"deleteFolderConfirm_other": "Ștergeți \"{{name}}\" și {{count}} gazdele sale? Această acțiune nu poate fi anulată.",
|
||||
"failedToMoveHosts": "Mutarea gazdelor a eșuat",
|
||||
"managedBanner": "Acest gazdă este gestionată de {{plugin}}. Modifică-l acolo. Îl poți ancora și rearanja.",
|
||||
"managedTooltip": "Gestionat de {{plugin}}",
|
||||
"addBlocked": "Gazdele sunt gestionate de {{plugin}}, așa că nu se pot adăuga gazde noi aici.",
|
||||
"failedToReorder": "Reordonarea a eșuat",
|
||||
"expandAll": "Extinde toate dosarele",
|
||||
"collapseAll": "Restrânge toate dosarele",
|
||||
@@ -676,36 +669,6 @@
|
||||
"addCredentialBtn2": "Adaugă Acreditare",
|
||||
"checkingHostStatuses": "Se verifică stările gazdelor...",
|
||||
"pinnedSection": "Fixate",
|
||||
"hostsExported": "Gazdele au fost exportate cu succes",
|
||||
"export": {
|
||||
"menuItem": "Exportă...",
|
||||
"title": "Exportă gazde",
|
||||
"scope": "Domeniu",
|
||||
"scopeAll": "Toate",
|
||||
"scopeSelected": "Selectate",
|
||||
"searchHosts": "Caută gazde...",
|
||||
"include": "Include",
|
||||
"groupConnection": "Conexiune",
|
||||
"groupCredentials": "Credențiale",
|
||||
"groupNotes": "Note",
|
||||
"groupTags": "Etichete și fixare",
|
||||
"groupProxy": "Proxy",
|
||||
"groupJumpHosts": "Gazde intermediare",
|
||||
"groupFeatureFlags": "Setări plugin",
|
||||
"groupAdvanced": "Configurare avansată",
|
||||
"preview": "Previzualizare",
|
||||
"moreHosts_one": "... încă {{count}} gazdă",
|
||||
"moreHosts_few": "... încă {{count}} gazde",
|
||||
"moreHosts_other": "... încă {{count}} gazde",
|
||||
"summary": "{{selected}} din {{total}} gazde",
|
||||
"credentialsIncluded": "credințiale incluse",
|
||||
"credentialsExcluded": "credințiale excluse",
|
||||
"noneSelected": "Nicio gazdă selectată",
|
||||
"cancel": "Anulează",
|
||||
"confirm": "Exportă",
|
||||
"fetchFailed": "Nu s-au putut încărca gazdele pentru export",
|
||||
"bulkButton": "Exportă"
|
||||
},
|
||||
"sampleDownloaded": "Fișierul de exemplu a fost descărcat",
|
||||
"failedToDeleteCredential2": "Nu s-a putut șterge credențiala",
|
||||
"noFolderOption": "(Fără dosar)",
|
||||
@@ -873,11 +836,7 @@
|
||||
"editorUpdate": "Actualizează gazda",
|
||||
"editorAdd": "Adaugă gazdă",
|
||||
"speedSearch": "Caută gazde. Tastele săgeată pentru selectare, Enter pentru conectare, Esc pentru închidere",
|
||||
"speedSearchList": "Lista de gazde. Tastează sau apasă / pentru căutare.",
|
||||
"importNoHosts": "Nicio gazdă găsită în fișier",
|
||||
"importTooMany": "Poți importa până la {{max}} gazde simultan",
|
||||
"importSummary": "Import finalizat: {{imported}} importate, {{updated}} actualizate, {{failed}} eșuate",
|
||||
"importHostsFailed": "Nu s-au putut importa gazdele"
|
||||
"speedSearchList": "Lista de gazde. Tastează sau apasă / pentru căutare."
|
||||
},
|
||||
"splitScreen": {
|
||||
"title": "Ecran divizat",
|
||||
@@ -1079,13 +1038,9 @@
|
||||
},
|
||||
"admin": {
|
||||
"usersCount_one": "{{count}} utilizator",
|
||||
"usersCount_few": "{{count}} utilizatori",
|
||||
"rolesCount_one": "{{count}} rol",
|
||||
"rolesCount_few": "{{count}} roluri",
|
||||
"apiKeysCount_one": "{{count}} cheie",
|
||||
"apiKeysCount_few": "{{count}} chei",
|
||||
"sessionsActive_one": "{{count}} activ",
|
||||
"sessionsActive_few": "{{count}} active",
|
||||
"hostsCount_one": "{{count}} gazdă",
|
||||
"hostsCount_few": "{{count}} gazde",
|
||||
"hostsCount_other": "{{count}} gazde",
|
||||
@@ -1094,7 +1049,6 @@
|
||||
"credentialsCount_other": "{{count}} acreditări",
|
||||
"rolePermissions": {
|
||||
"count_one": "{{count}} permisiune",
|
||||
"count_few": "{{count}} permisiuni",
|
||||
"groups": {
|
||||
"hosts": "Gazde",
|
||||
"credentials": "Acreditări",
|
||||
@@ -1135,21 +1089,62 @@
|
||||
"interfaceFontDescription": "Modifică fontul interfeței aplicației. Profilele de terminal își păstrează propriile setări de font.",
|
||||
"accentColorLabel": "Culoare accent",
|
||||
"apiKeyCount_one": "{{count}} cheie",
|
||||
"apiKeyCount_few": "{{count}} chei",
|
||||
"colorPickerTooltip": "Deschide selectorul de culori",
|
||||
"themeSystem": "Sistem",
|
||||
"themeLight": "Luminos",
|
||||
"themeDark": "Întunecat",
|
||||
"themeDracula": "Dracula",
|
||||
"themeCatppuccin": "Catppuccin",
|
||||
"themeNord": "Nord",
|
||||
"themeSolarized": "Solarized",
|
||||
"themeTokyoNight": "Tokyo Night",
|
||||
"themeOneDark": "One Dark",
|
||||
"themeGruvbox": "Gruvbox"
|
||||
"themeDark": "Întunecat"
|
||||
}
|
||||
}
|
||||
},
|
||||
"looks": {
|
||||
"layoutHint": "Cum este organizată întreaga aplicație. Temele și aspectele provin din plugin-uri.",
|
||||
"defaultsLabel": "Implicit pentru toți",
|
||||
"defaultsHint": "Ce văd utilizatorii până își aleg propriul aspect sau temă.",
|
||||
"followDefault": "Folosește implicitul",
|
||||
"defaultSaved": "Aspectul implicit a fost salvat",
|
||||
"saveFailed": "Nu s-a putut salva aspectul",
|
||||
"repair": {
|
||||
"title": "Acest aspect nu a putut fi afișat",
|
||||
"safeTitle": "Mod sigur",
|
||||
"layout": "Aspect",
|
||||
"plugin": "Plugin",
|
||||
"reason": "Motiv",
|
||||
"error": "Eroare",
|
||||
"noError": "Niciun mesaj de eroare.",
|
||||
"copy": "Copiază",
|
||||
"copied": "Copiat",
|
||||
"copyFailed": "Nu s-au putut copia detaliile",
|
||||
"retry": "Încearcă din nou",
|
||||
"reset": "Resetează la aspectul implicit",
|
||||
"resetEveryone": "Resetează implicitul pentru toți",
|
||||
"update": "Actualizează {{name}} la {{version}}",
|
||||
"disable": "Dezactivează {{name}}",
|
||||
"enable": "Activează {{name}}",
|
||||
"startAgain": "Pornește din nou {{name}}",
|
||||
"install": "Găsește aspecte și teme",
|
||||
"installTitle": "Aspecte și teme",
|
||||
"installButton": "Instalează",
|
||||
"nothingToInstall": "Nu sunt disponibile alte aspecte sau teme în acest moment.",
|
||||
"registryUnreachable": "Registrul de plugin-uri nu a putut fi contactat.",
|
||||
"askAdmin": "Cere unui administrator să actualizeze sau să repare acest aspect. Mai jos poți comuta la un alt aspect sau temă pentru tine.",
|
||||
"switchLayout": "Comută aspectul",
|
||||
"switchTheme": "Comută tema",
|
||||
"saveFailed": "Nu s-a putut salva alegerea ta",
|
||||
"reasons": {
|
||||
"safe-url": "Adresa a solicitat modul sigur. Alege un aspect mai jos sau elimină ?safe-layout=1 din adresă.",
|
||||
"safe-env": "Serverul a fost pornit cu TERMIX_SAFE_LAYOUT, așa că toți văd acest ecran până când este eliminat.",
|
||||
"missing": "Niciun plugin instalat nu oferă acest aspect.",
|
||||
"disabled": "Plugin-ul care oferă acest aspect este dezactivat.",
|
||||
"blocked": "Plugin-ul care oferă acest aspect așteaptă ceva de care are nevoie.",
|
||||
"incompatible": "Plugin-ul care oferă acest aspect nu funcționează cu această versiune de Termix.",
|
||||
"failed": "Aspectul nu a putut fi pornit.",
|
||||
"crashed": "Aspectul a eșuat de două ori în timpul randării aplicației."
|
||||
},
|
||||
"noLayout": "Niciun aspect nu este setat",
|
||||
"restore": "Restaurează {{name}} inclus",
|
||||
"restoreFailed": "Nu s-a putut restaura copia inclusă"
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"capabilities": {
|
||||
"credentials:read": {
|
||||
@@ -1172,6 +1167,18 @@
|
||||
"title": "Gestionează autentificarea",
|
||||
"consequence": "Poate adăuga o metodă de autentificare, un al doilea factor sau un tip de autentificare SSH."
|
||||
},
|
||||
"auth:policy": {
|
||||
"title": "Setează reguli de autentificare",
|
||||
"consequence": "Poate deconecta utilizatorii când sunt inactivi, limita durata sesiunii, dezactiva opțiunea „Ține-mă minte” și cere un al doilea factor."
|
||||
},
|
||||
"ssh:transport": {
|
||||
"title": "Alege cum sunt accesate gazdele",
|
||||
"consequence": "Poate transporta conexiunea SSH către o gazdă pe propriul său traseu, așa că vede tot ce este trimis către și de la acele gazde, inclusiv parolele."
|
||||
},
|
||||
"sync:provide": {
|
||||
"title": "Rulează sincronizarea",
|
||||
"consequence": "Poate răspunde la toate cererile de sincronizare, așa că vede datele pe care dispozitivele și serverele le sincronizează."
|
||||
},
|
||||
"system:tls": {
|
||||
"title": "Gestionează certificatele",
|
||||
"consequence": "Poate înlocui certificatul pe care Termix îl servește prin HTTPS și poate răspunde la verificările de domeniu de la autoritățile de certificare."
|
||||
@@ -1180,6 +1187,10 @@
|
||||
"title": "Accesează dispozitivele seriale și USB",
|
||||
"consequence": "Poate deschide un port serial fizic pe mașina care rulează Termix."
|
||||
},
|
||||
"hosts:export": {
|
||||
"title": "Exportă gazdele cu secretele lor",
|
||||
"consequence": "Poate citi gazdele tale în totalitate, inclusiv parolele și cheile salvate, și le poate distribui. Fiecare export este înregistrat în jurnalul de audit."
|
||||
},
|
||||
"hosts:write": {
|
||||
"title": "Creează și modifică host-uri",
|
||||
"consequence": "Poate adăuga host-uri și edita pe cele pe care le ai deja."
|
||||
@@ -1224,10 +1235,30 @@
|
||||
"title": "Citește jurnalul de audit",
|
||||
"consequence": "Poate vedea cine a făcut ce și când."
|
||||
},
|
||||
"network:probe": {
|
||||
"title": "Verifică dacă porturile răspund",
|
||||
"consequence": "Poate deschide o conexiune simplă către orice adresă de pe server, pentru a vedea dacă este accesibilă."
|
||||
},
|
||||
"hosts:status-provide": {
|
||||
"title": "Furnizează starea gazdei",
|
||||
"consequence": "Devine sursa punctelor online și offline pentru fiecare gazdă."
|
||||
},
|
||||
"hosts:activity-provide": {
|
||||
"title": "Păstrează activitatea recentă",
|
||||
"consequence": "Devine stocul pentru lista de activitate recentă a fiecărui utilizator."
|
||||
},
|
||||
"hosts:lock": {
|
||||
"title": "Gestionează gazdele ca doar pentru citire",
|
||||
"consequence": "Gazdele pe care le gestionează nu pot fi editate, șterse sau redistribuite de nimeni altcineva."
|
||||
},
|
||||
"desktop:window": {
|
||||
"title": "Deschide ferestre desktop",
|
||||
"consequence": "Doar în aplicația desktop Termix."
|
||||
},
|
||||
"desktop:local": {
|
||||
"title": "Folosește acest calculator",
|
||||
"consequence": "Poate citi și modifica fișiere, rula un shell și deschide porturi locale pe acest calculator. Doar în aplicația desktop Termix."
|
||||
},
|
||||
"users:impersonate": {
|
||||
"title": "Acționează în numele altor utilizatori",
|
||||
"consequence": "Rulează sarcini în fundal cu accesul altui utilizator, cum ar fi job-urile programate. Fiecare utilizare este înregistrată în jurnalul de audit."
|
||||
@@ -1267,6 +1298,14 @@
|
||||
"ui:surface": {
|
||||
"title": "Să adauge propriile ecrane",
|
||||
"consequence": "File, panouri și setări pe care le poți ascunde ulterior."
|
||||
},
|
||||
"ui:layout": {
|
||||
"title": "Înlocuiește întreaga structură a aplicației",
|
||||
"consequence": "Când este selectat, codul său desenează fiecare ecran, inclusiv terminalele și setările tale."
|
||||
},
|
||||
"ui:theme": {
|
||||
"title": "Adaugă teme de culori",
|
||||
"consequence": "Doar culori și stiluri. Nu se execută niciun cod pentru o temă."
|
||||
}
|
||||
},
|
||||
"runtime": {
|
||||
@@ -1293,7 +1332,8 @@
|
||||
"disabled": "Dezactivat",
|
||||
"failed": "Oprit neașteptat",
|
||||
"blocked": "Așteaptă un alt plugin",
|
||||
"server": "Rulează pe serverul tău"
|
||||
"server": "Rulează pe serverul tău",
|
||||
"safeMode": "Oprit în modul sigur"
|
||||
},
|
||||
"groups": {
|
||||
"running": "În execuție",
|
||||
@@ -1307,11 +1347,6 @@
|
||||
"updated": "Actualizate recent",
|
||||
"category": "Categorie"
|
||||
},
|
||||
"columns": {
|
||||
"title": "Coloane",
|
||||
"auto": "Automat",
|
||||
"count": "{{count}} coloane"
|
||||
},
|
||||
"table": {
|
||||
"name": "Nume",
|
||||
"description": "Descriere",
|
||||
@@ -1408,6 +1443,7 @@
|
||||
"options": "Nu s-au putut salva opțiunile pentru {{name}}: {{error}}",
|
||||
"deleteData": "Nu s-au putut șterge datele pentru {{name}}: {{error}}",
|
||||
"managedByServer": "Acest desktop este legat de un server, care decide plugin-urile sale.",
|
||||
"defaultLook": "{{name}} este aspectul implicit, așa că poate fi dezactivat sau înlocuit, dar nu dezinstalat.",
|
||||
"hasDependents": "{{name}} este necesar pentru {{list}}. Dezactivează-le sau dezinstalează-le mai întâi.",
|
||||
"missingDependencies": "{{name}} are nevoie de {{list}}, care nu este instalat.",
|
||||
"consentChanged": "Ceea ce solicită acest plugin s-a schimbat de când l-ai verificat. Verifică din nou lista.",
|
||||
@@ -1481,7 +1517,6 @@
|
||||
"noServerAccess": "Fără acces la serverele tale",
|
||||
"searchInstalled": "Caută în instalate",
|
||||
"searchPlugins": "Caută plugin-uri",
|
||||
"allCategories": "Toate",
|
||||
"nothingMatches": "Nimic nu se potrivește.",
|
||||
"noneInstalled": "Nu sunt plugin-uri instalate încă. Răsfoiește pentru a adăuga unele.",
|
||||
"nothingHere": "Nimic aici.",
|
||||
@@ -1575,7 +1610,45 @@
|
||||
"documentation": "Documentație",
|
||||
"envVars": "Variabile de mediu",
|
||||
"envRequired": "Obligatoriu",
|
||||
"envDefault": "Implicit: {{value}}"
|
||||
"envDefault": "Implicit: {{value}}",
|
||||
"kinds": {
|
||||
"layouts": "Structuri",
|
||||
"themes": "Teme",
|
||||
"tabs": "File",
|
||||
"panels": "Pânouri laterale",
|
||||
"dashboardCards": "Carduri de tablou de bord",
|
||||
"protocols": "Tipuri de conexiune",
|
||||
"auth": "Metode de autentificare",
|
||||
"actions": "Acțiuni",
|
||||
"hostCapability": "Setări gazdă"
|
||||
},
|
||||
"filters": {
|
||||
"type": "Tip",
|
||||
"allTypes": "Toate tipurile",
|
||||
"category": "Categorie",
|
||||
"allCategories": "Toate categoriile",
|
||||
"results_one": "{{count}} plugin",
|
||||
"results_few": "{{count}} pluginuri",
|
||||
"results_other": "{{count}} pluginuri",
|
||||
"remove": "Elimină filtrul {{name}}",
|
||||
"clear": "Șterge filtrele",
|
||||
"button": "Filtre",
|
||||
"buttonCount": "Filtre ({{count}})"
|
||||
},
|
||||
"pager": {
|
||||
"range": "{{from}}-{{to}} din {{total}}",
|
||||
"page": "Pagina {{page}} din {{pages}}",
|
||||
"previous": "Pagina anterioară",
|
||||
"next": "Pagina următoare",
|
||||
"perPage": "{{count}} per pagină",
|
||||
"perPageLabel": "Pluginuri per pagină"
|
||||
},
|
||||
"showUnsupportedHint": "Acestea sunt listate, dar nicio versiune nu rulează încă pe această versiune. Actualizează Termix pentru a le instala.",
|
||||
"unsupported": "Necesită o versiune mai nouă de Termix",
|
||||
"unsupportedHint": "Nicio versiune a acestui plugin nu rulează pe această versiune de Termix. Actualizează Termix pentru a-l instala.",
|
||||
"needsTermix": "Necesită Termix {{range}}",
|
||||
"showUnsupported": "Afișează nesuportate ({{count}})",
|
||||
"showMore": "Afișează încă {{count}} (mai rămân {{total}})"
|
||||
}
|
||||
},
|
||||
"settings": {
|
||||
@@ -1591,92 +1664,6 @@
|
||||
"noData": "Fără date",
|
||||
"filter": "Filtrează..."
|
||||
},
|
||||
"sync": {
|
||||
"minutesAgo_one": "{{count}} minut în urmă",
|
||||
"minutesAgo_few": "{{count}} minute în urmă",
|
||||
"minutesAgo_other": "{{count}} minute în urmă",
|
||||
"hoursAgo_one": "{{count}} oră în urmă",
|
||||
"hoursAgo_few": "{{count}} ore în urmă",
|
||||
"hoursAgo_other": "{{count}} ore în urmă",
|
||||
"pending_one": "{{count}} modificare în așteptarea sincronizării",
|
||||
"pending_few": "{{count}} modificări în așteptarea sincronizării",
|
||||
"pending_other": "{{count}} modificări în așteptarea sincronizării",
|
||||
"proxy": {
|
||||
"headersTitle": "Antete suplimentare",
|
||||
"headersHint": "Trimise cu fiecare cerere către server, de exemplu un token de serviciu Cloudflare Access.",
|
||||
"headerName": "Nume antet",
|
||||
"headerValue": "Valoare",
|
||||
"savedValue": "Salvat, tastați pentru a modifica",
|
||||
"addHeader": "Adaugă antet",
|
||||
"removeHeader": "Elimină antet",
|
||||
"basicAuthTitle": "Nume utilizator și parolă",
|
||||
"basicAuthHint": "Pentru un proxy care solicită un nume de utilizator și o parolă înainte de Termix.",
|
||||
"username": "Nume utilizator",
|
||||
"password": "Parolă",
|
||||
"allowInvalidCertificate": "Încredere într-un certificat auto-semnat",
|
||||
"allowInvalidCertificateHint": "Doar pentru serverul dvs. propriu, când certificatul său nu provine de la o autoritate cunoscută."
|
||||
},
|
||||
"problems": {
|
||||
"invalidUrl": "Acesta nu pare a fi o adresă web.",
|
||||
"unreachable": "Nu s-a putut accesa serverul. Verificați adresa și că serverul rulează.",
|
||||
"unreachableWithReason": "Nu s-a putut accesa serverul: {{reason}}",
|
||||
"tlsUntrusted": "Certificatul serverului nu este de încredere. Dacă acesta este serverul dvs. cu un certificat semnat de sine, activați opțiunea de mai jos.",
|
||||
"basicAuthRequired": "Un element din fața serverului solicită un nume de utilizator și o parolă. Introduceți-le mai jos.",
|
||||
"proxyLogin": "O pagină de autentificare sau un proxy a răspuns în loc de Termix. Adăugați anteturile necesare mai jos sau verificați adresa.",
|
||||
"notTermix": "Nu există un server Termix la această adresă. Dacă rulează pe o cale, includeți-o, de exemplu https://example.com/termix.",
|
||||
"versionMismatch": "Acest server rulează o versiune mai veche de Termix. Actualizați-l la 2.9 sau mai nou pentru a-l conecta.",
|
||||
"differentAccount": "V-ați autentificat într-un cont diferit. Autentificați-vă în contul cu care este legat acest dispozitiv sau deconectați-l mai întâi."
|
||||
},
|
||||
"wizard": {
|
||||
"title": "Conectare la un server Termix",
|
||||
"reloginTitle": "Autentificare din nou",
|
||||
"savedServers": "Servere recente",
|
||||
"removeServer": "Eliminare din listă",
|
||||
"serverDescription": "Introduceți adresa pe care o folosiți pentru a deschide Termix în browser.",
|
||||
"signinDescription": "Autentificare la {{url}}",
|
||||
"chooseDescription": "Acest dispozitiv are deja date. Ce ar trebui să se întâmple cu ele?",
|
||||
"finishingDescription": "Se conectează acest dispozitiv.",
|
||||
"serverUrl": "Adresa serverului",
|
||||
"serverUrlHint": "De exemplu https://termix.example.com",
|
||||
"showProxySettings": "Setări proxy invers",
|
||||
"hideProxySettings": "Ascunde setările proxy invers",
|
||||
"continue": "Continuare",
|
||||
"back": "Înapoi",
|
||||
"mergeTitle": "Adaugă-l în contul meu",
|
||||
"mergeBody_one": "Elementul de pe acest dispozitiv este adăugat în contul dvs. Elementele pe care contul dvs. le are deja rămân neschimbate pe server.",
|
||||
"mergeBody_few": "Cele {{count}} elemente de pe acest dispozitiv sunt adăugate în contul dvs. Elementele pe care contul dvs. le are deja rămân neschimbate pe server.",
|
||||
"mergeBody_other": "Cele {{count}} elemente de pe acest dispozitiv sunt adăugate în contul dvs. Elementele pe care contul dvs. le are deja rămân neschimbate pe server.",
|
||||
"replaceTitle": "Înlocuiește-l cu contul meu",
|
||||
"replaceBody_one": "Elementul de pe acest dispozitiv este eliminat, iar acest dispozitiv preia totul din contul dvs. Gazdele păstrate doar pe acest dispozitiv rămân.",
|
||||
"replaceBody_few": "Cele {{count}} elemente de pe acest dispozitiv sunt eliminate, iar acest dispozitiv preia totul din contul dvs. Gazdele păstrate doar pe acest dispozitiv rămân.",
|
||||
"replaceBody_other": "Cele {{count}} elemente de pe acest dispozitiv sunt eliminate, iar acest dispozitiv preia totul din contul dvs. Gazdele păstrate doar pe acest dispozitiv rămân.",
|
||||
"link": "Conectare",
|
||||
"linking": "Se conectează și se rulează prima sincronizare...",
|
||||
"linked": "Conectat. Datele dvs. se sincronizează acum.",
|
||||
"signedInAgain": "Autentificat. Sincronizarea rulează din nou."
|
||||
},
|
||||
"entities": {
|
||||
"hosts": "Gazde",
|
||||
"sshCredentials": "Acreditări",
|
||||
"sshFolders": "Foldere",
|
||||
"userPreferences": "Preferințe",
|
||||
"pluginUserSettings": "Setări plugin",
|
||||
"sharedHosts": "Gazde partajate cu dvs.",
|
||||
"sharedCredentials": "Acreditări partajate cu dvs.",
|
||||
"vaultProfiles": "Profiluri Vault",
|
||||
"snippetFolders": "Foldere de snippet-uri",
|
||||
"snippets": "Snippet-uri",
|
||||
"dashboardServiceLinks": "Legături la servicii",
|
||||
"homepageItems": "Elemente pagină principală",
|
||||
"networkTopology": "Hartă de rețea",
|
||||
"workspaces": "Spații de lucru",
|
||||
"hostDefaults": "Setări implicite gazdă",
|
||||
"hostDefaultsAdmin": "Setări implicite gazdă server",
|
||||
"aiProviders": "Furnizori AI",
|
||||
"homepageLayouts": "Aspecte pagină principală",
|
||||
"accountProfile": "Profil cont"
|
||||
}
|
||||
},
|
||||
"hostDefaults": {
|
||||
"source": {
|
||||
"folder": "Dosar {{name}}",
|
||||
@@ -1709,7 +1696,12 @@
|
||||
"gridView": "Grilă",
|
||||
"listView": "Listă",
|
||||
"compactRows": "Rânduri compacte",
|
||||
"comfortableRows": "Rânduri confortabile"
|
||||
"comfortableRows": "Rânduri confortabile",
|
||||
"columns": {
|
||||
"title": "Coloane",
|
||||
"auto": "Automat",
|
||||
"count": "{{count}} coloane"
|
||||
}
|
||||
},
|
||||
"fields": {
|
||||
"secretSaved": "Salvat. Tastează pentru a-l înlocui."
|
||||
|
||||
Loaded 100 of 139 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user