mirror of
https://github.com/Termix-SSH/Termix.git
synced 2026-10-30 07:05:24 +00:00
* fix(sso): send the PKCE verifier for GitHub login (#1534) * fix(remote-desktop): clip cursor overflow without disabling zoom (#1535) * test(remote-desktop): preserve sessions beyond one hour (#1536) * fix(hosts): expose controls for overflowing editor tabs (#1537) * fix(hosts): expose controls for overflowing editor tabs * test(hosts): mock resize observation in admin panel tests * fix(status): skip TCP probes while host sessions are active (#1538) * fix(database): batch session activity persistence (#1539) * docs(api): describe cookie and API key authentication (#1540) * fix(snippets): repair missing note column on SQLite upgrades (#1541) * fix(docker): retain stored SSH credential association (#1543) * fix(file-manager): render transfer toasts without plugin hooks (#1546) * feat(hosts): keep compact row actions inline (#1547) * fix(auth): allow retrying unavailable second-factor interfaces (#1549) * fix(auth): reject unresolved legacy identity provisioning (#1550) * fix(desktop): ship the plugin SDK inside Mac App Store builds (#1551) * fix(tmux): pass full session info to the terminal's session picker (#1552) The tmux.sessions service reduced detected sessions to bare names, but the picker reads session.name, so every entry rendered blank and selecting one sent an empty name, which created a new session instead of attaching. * fix(ssh): read force keyboard-interactive as a boolean when resolving hosts (#1553) The column holds the text "true"/"false", and the resolver passed it through as-is. The string "false" is truthy, so the password provider treated every saved host as forced keyboard-interactive and left the password out. Jump hops are built straight from the resolved host, so a password hop whose server doesn't offer keyboard-interactive failed with "All configured authentication methods failed". * fix(database): batch database saves for bulk host writes (#1554) * fix(database): yield to the event loop between database saves Each SQLite save serializes and encrypts the whole database into new buffers, which V8 only releases once the event loop turns. Boot migrations and bulk host import write plugin settings per host and per key in an awaited loop, so hundreds of full copies piled up and the container ran out of memory. * fix(database): save once per bulk host write instead of once per row On SQLite every repository write force-saves the whole database. Boot plugin data migrations, host defaults materialization and the bulk host routes write one row per host per setting, so they serialized and encrypted the full database hundreds of times in a row. DatabaseSaveTrigger.batched wraps a function so force saves made while it runs collapse into a single save when it finishes. Nested scopes fold into the outer one, and work that outlives its scope saves normally. * feat(hosts): add instance-wide predefined tag suggestions (#1548) * feat(hosts): add shared predefined tag suggestions * style(hosts): format tag catalog routes * test(database): advance fake timers past the save yield (#1555) * fix(i18n): complete Simplified Chinese core and plugin translations (#1542) * fix(i18n): complete Chinese onboarding and navigation labels * fix(i18n): translate remaining Chinese core and plugin interfaces * fix(i18n): translate host editor tab overflow controls * fix(i18n): use consistent Chinese fleet terminology * fix(i18n): localize hardcoded controls and plugin views * fix(i18n): translate built-in homepage widget catalog * test(homepage): follow translated timezone placeholder * fix(i18n): translate plugin-provided homepage widgets * fix(i18n): localize feature settings section titles * fix: 2.8 oidc accounts unable to sign in after upgrading (#1381) * fix: plugins losing the saved ssh login when copying a host (#1391) * fix: fleets, proxmox and automations not getting the host sudo password * fix: host imports running a defaults pass and metrics restart per host (#1384) * fix: high cpu from status probes and full database saves on every sample (#1300) * fix: user data export freezing the server (#1393) * fix: op:// secret references rejected as ssh keys on credentials (#1394) * fix: slow file deletes from the trash lookups on every delete (#1390) * fix: add openapi docs and error handling to host tag routes * test: compare download stream buffers directly so it stops timing out * chore: drop em dash from host row comment * chore: update release notes for 2.9.1 * fix: restore space to add host tags and redesign predefined tags editor * fix: host key silently accepted when the host is missing from the database (#1397) * fix: clearer host login failed status label and fix its translations (#1396) * chore: add host key and status label fixes to release notes * fix: sso and ldap provider dialogs overflowing the screen and using mismatched toggles * chore: increment ver * fix(audit): store plugin entries with no acting user as a null user_id (#1556) Plugin audit entries written outside a request used the literal "system" as user_id. That column references users.id, so the insert was refused (Postgres logs it as an FK violation) and the entry was silently dropped. Write null instead and keep "system" / plugin:<id> in username. * chore: add sso/ldap dialog and audit log fixes to release notes * fix: tunnels and host settings missing from shared hosts on desktop * fix: remote desktop logins missing from shared hosts on desktop * fix: simplify host status to online/offline and keep it live without a refresh * chore: sync Crowdin translations for 2.9.1 --------- Co-authored-by: ZacharyZcR <zacharyzcr1984@gmail.com>
239 lines
12 KiB
JSON
239 lines
12 KiB
JSON
{
|
|
"nav": {
|
|
"snippets": "スニペット"
|
|
},
|
|
"onboarding": {
|
|
"feature_snippets": "スニペット",
|
|
"feature_snippets_desc": "よく使うコマンドを保存して、ワンクリックでターミナルに送信できます。"
|
|
},
|
|
"permissions": {
|
|
"view": {
|
|
"title": "抜粋を見る",
|
|
"description": "自分のスニペット、メモ、共有されたスニペットを確認できます。"
|
|
},
|
|
"create": {
|
|
"title": "スニペットを作成する",
|
|
"description": "新しいスニペット、メモ、フォルダーを作成します。"
|
|
},
|
|
"edit": {
|
|
"title": "スニペットを編集する",
|
|
"description": "既存のスニペットやフォルダの名前を変更または修正します。"
|
|
},
|
|
"delete": {
|
|
"title": "スニペットを削除する",
|
|
"description": "スニペットとフォルダを削除します。"
|
|
},
|
|
"share": {
|
|
"title": "抜粋を共有する",
|
|
"description": "スニペットやフォルダを他のユーザーやロールと共有します。"
|
|
}
|
|
},
|
|
"settings": {
|
|
"foldersCollapsed": {
|
|
"label": "デフォルトでフォルダを折りたたむ",
|
|
"description": "スニペットパネルを開いたとき、各スニペットフォルダは折りたたまれた状態で起動します。"
|
|
},
|
|
"showCommands": {
|
|
"label": "コマンドを表示する",
|
|
"description": "各スニペットのコマンドの最初の行を、その名前の下に表示します。"
|
|
},
|
|
"confirmExecution": {
|
|
"label": "実行前に確認してください",
|
|
"description": "ターミナルでコマンドを実行する前に、必ず許可を求めてください。"
|
|
}
|
|
},
|
|
"cancel": "キャンセル",
|
|
"loading": "読み込み中...",
|
|
"searchPlaceholder": "スニペットを検索",
|
|
"newFolder": "新規フォルダ",
|
|
"newSnippet": "新しいスニペット",
|
|
"noFolder": "フォルダーなし",
|
|
"noSnippetsInFolder": "このフォルダにスニペットはありません",
|
|
"noTerminalTabsOpen": "ターミナルタブが開いていません",
|
|
"run": "実行",
|
|
"pasteToTerminal": "ターミナルに貼り付けてください",
|
|
"copySuccess": "クリップボードにコピーしました",
|
|
"importExport": "インポート / エクスポート",
|
|
"importFailed": "スニペットのインポートに失敗しました",
|
|
"nameLabel": "名前",
|
|
"namePlaceholder": "スニペット名",
|
|
"descriptionLabel": "説明",
|
|
"descriptionPlaceholder": "任意の説明",
|
|
"folderLabel": "フォルダ",
|
|
"typeLabel": "タイプ",
|
|
"typeCommand": "コマンド",
|
|
"typeNote": "注記",
|
|
"commandLabel": "コマンド",
|
|
"commandPlaceholder": "実行するコマンド、例:systemctl status $HOST",
|
|
"noteLabel": "注記",
|
|
"notePlaceholder": "ターミナルに貼り付けるテキスト",
|
|
"createSnippetTitle": "スニペットを作成する",
|
|
"createSnippetButton": "スニペットを作成する",
|
|
"createSuccess": "スニペットが作成されました",
|
|
"createFailed": "スニペットの作成に失敗しました",
|
|
"editSnippetTitle": "スニペットを編集",
|
|
"saveSnippetButton": "スニペットを保存",
|
|
"updateSuccess": "スニペットが更新されました",
|
|
"updateFailed": "スニペットの更新に失敗しました",
|
|
"deleteFailed": "スニペットの削除に失敗しました",
|
|
"createFolderTitle": "フォルダの作成",
|
|
"createFolderButton": "フォルダの作成",
|
|
"folderCreateSuccess": "フォルダが作成されました",
|
|
"folderCreateFailed": "フォルダの作成に失敗しました",
|
|
"editFolderTitle": "フォルダを編集",
|
|
"saveFolderButton": "フォルダーを保存",
|
|
"folderEditSuccess": "フォルダが更新されました",
|
|
"folderEditFailed": "フォルダの更新に失敗しました",
|
|
"folderNameLabel": "フォルダ名",
|
|
"folderNamePlaceholder": "フォルダ名",
|
|
"folderIconLabel": "アイコン",
|
|
"folderDeleteSuccess": "フォルダが削除されました",
|
|
"folderDeleteFailed": "フォルダの削除に失敗しました",
|
|
"confirmRunMessage": "「{{name}}」を実行しますか?",
|
|
"confirmRunButton": "実行",
|
|
"runSuccess": "{{name}}を {{count}} 端末で実行しました",
|
|
"pasteSuccess": "「{{name}}」を {{count}} 端末に貼り付けました",
|
|
"admin": {
|
|
"tabTitle": "スニペット",
|
|
"count": "{{count}} 個のスニペット",
|
|
"add": "スニペットを追加",
|
|
"namePlaceholder": "スニペット名",
|
|
"contentPlaceholder": "コマンドの内容",
|
|
"folderPlaceholder": "フォルダー (任意)",
|
|
"empty": "このユーザーはスニペットを持っていません",
|
|
"deleteConfirm": "{{username}} に属するスニペット \"{{name}}\" を削除しますか?",
|
|
"deleted": "スニペットを削除しました",
|
|
"deleteFailed": "スニペットの削除に失敗しました",
|
|
"requiredFields": "スニペット名と内容は必須です",
|
|
"saved": "スニペットを保存しました",
|
|
"saveFailed": "スニペットの保存に失敗しました",
|
|
"saving": "保存中...",
|
|
"save": "保存"
|
|
},
|
|
"backToSnippets": "抜粋に戻る",
|
|
"settingsTitle": "スニペット設定",
|
|
"settingsDisplayTitle": "画面",
|
|
"settingsBehaviorTitle": "動作",
|
|
"typeCommandHint": "アクティブな端末で実行されます。",
|
|
"typeNoteHint": "実行せずにアクティブなターミナルに貼り付けます。",
|
|
"variablesHint": "変数: $HOST、 $USER、 $PORT、 $NAME、 ${INPUT_1:Label}",
|
|
"doubleClickToRun": "ダブルクリックして実行",
|
|
"sharedBadge": "共有済み",
|
|
"copyToClipboard": "クリップボードにコピー",
|
|
"copyFailed": "クリップボードへのコピーに失敗しました",
|
|
"moreOptions": "その他のオプション",
|
|
"moreActions": "その他の操作",
|
|
"moveToFolder": "フォルダに移動",
|
|
"deleteSnippet": "スニペットを削除",
|
|
"deleteSnippetConfirm": "スニペット「{{name}}」を削除しますか?",
|
|
"deleteSuccess": "スニペットを削除しました",
|
|
"delete": "削除",
|
|
"folderActions": "フォルダー操作",
|
|
"addSnippetHere": "新しいスニペットはこちら",
|
|
"deleteFolder": "フォルダを削除",
|
|
"deleteFolderConfirm": "フォルダ \"{{name}}\" を削除しますか?そのスニペットはフォルダから移動します。",
|
|
"createFolderDescription": "関連する断片をまとめてグループ化する。",
|
|
"editFolderDescription": "このフォルダの名前、色、またはアイコンを変更します。",
|
|
"folderColorLabel": "色",
|
|
"loadFailed": "スニペットの読み込みに失敗しました",
|
|
"importSkipExisting": "インポート (既存をスキップ)",
|
|
"importOverwrite": "インポート(既存のものを上書き)",
|
|
"importInvalidFile": "そのファイルは有効なスニペットエクスポートではありません",
|
|
"importSuccess": "インポート済み {{imported}}、更新済み {{updated}}、スキップ済み {{skipped}}",
|
|
"exportSnippets": "スニペットをエクスポートする",
|
|
"exportSuccess": "スニペットをエクスポートしました",
|
|
"exportFailed": "スニペットのエクスポートに失敗しました",
|
|
"expandAll": "すべてのフォルダーを展開",
|
|
"collapseAll": "すべてのフォルダーを折りたたむ",
|
|
"docsLink": "文書",
|
|
"clearSearch": "検索をクリアする",
|
|
"noSearchResults": "検索条件に一致するスニペットはありません",
|
|
"emptyTitle": "まだスニペットはありません",
|
|
"emptyDescription": "よく使うコマンドを保存しておけば、ワンクリックでターミナルから実行できます。",
|
|
"shareSnippet": "スニペットを共有",
|
|
"shareFolder": "共有フォルダ",
|
|
"shareExpiry": "有効期限",
|
|
"shareExpiryOptions": {
|
|
"h0": "なし",
|
|
"h1": "1時間後",
|
|
"h24": "1日で",
|
|
"h168": "7日後",
|
|
"h720": "30日後"
|
|
},
|
|
"shareButton": "共有",
|
|
"shareSuccess": "{{count}}と共有されています",
|
|
"shareFailed": "共有に失敗しました",
|
|
"shareLoadFailed": "共有情報の読み込みに失敗しました",
|
|
"currentAccess": "現在のアクセス",
|
|
"notSharedYet": "まだ誰にも共有されていません",
|
|
"revokeAccess": "無効化",
|
|
"revokeSuccess": "アクセスが取り消されました",
|
|
"revokeFailed": "アクセスの取り消しに失敗しました",
|
|
"close": "閉じる",
|
|
"targetHostsLabel": "対象ホスト",
|
|
"targetHostsHint": "このコマンドをターミナルを開かずに直接実行するホストを選択してください。空欄のままにすると、アクティブなターミナルで実行されます。",
|
|
"clearTargetHosts": "クリア",
|
|
"noHostsAvailable": "ホストがいません",
|
|
"searchHosts": "ホストを検索",
|
|
"runOnTargets": "ターゲットホスト上で実行",
|
|
"executionResultTitle": "「{{name}}」の検索結果",
|
|
"executionResultDescription": "各ターゲットホストからの出力。",
|
|
"executionSuccess": "成功",
|
|
"executionFailed": "失敗",
|
|
"directRunSuccess": "\"{{name}}\" を {{count}} 台のホストで実行しました",
|
|
"directRunPartialFail": "「{{name}}」が一部のホストで失敗しました",
|
|
"reorderFailed": "スニペットの並べ替えに失敗しました",
|
|
"dropToRemoveFromFolder": "フォルダから移動するには、ここにドロップしてください。",
|
|
"shareSnippetTitle": "「{{name}} を共有する」",
|
|
"shareFolderTitle": "共有フォルダ \"{{name}}\"",
|
|
"shareWith": "共有相手",
|
|
"usersTab": "ユーザー",
|
|
"rolesTab": "ロール",
|
|
"shareSearchPlaceholder": "ユーザーまたはロールを検索",
|
|
"shareNoMatches": "一致する項目はありません",
|
|
"shareWithCount": "{{count}}と共有する",
|
|
"shareFolderHint": "このフォルダ内のすべてのスニペットを共有します。後から追加されたスニペットは自動的に共有されません。",
|
|
"shareFolderSummary": "このフォルダには共有されたスニペットが {{count}} 個あります。",
|
|
"grantedBy": "付与者",
|
|
"expired": "期限切れ",
|
|
"variablesDialogTitle": "「{{name}} を実行」",
|
|
"variablesDialogDescription": "このコードスニペットを実行する前に、必要な値を入力してください。",
|
|
"variablesPreviewLabel": "プレビュー",
|
|
"variablesConfirmButton": "実行",
|
|
"keybindings": {
|
|
"runSnippet": "既存のスニペットを実行する",
|
|
"snippetLabel": "抜粋",
|
|
"selectSnippet": "抜粋を選択してください",
|
|
"snippetMissing": "スニペットが見つかりません",
|
|
"snippetRequired": "抜粋を選択してください"
|
|
},
|
|
"paletteHintRun": "アクティブなターミナルタブで実行します",
|
|
"host": {
|
|
"startupTitle": "起動時スニペット",
|
|
"quickActionsTitle": "クイックアクション",
|
|
"quickActionsDescription": "クイックアクションはホストメトリクスツールバーにボタンとして表示され、ワンクリックでコマンドを実行できます。",
|
|
"noQuickActions": "クイックアクションはまだありません",
|
|
"buttonLabel": "ボタンラベル",
|
|
"selectSnippet": "スニペットを選択...",
|
|
"addQuickAction": "アクションを追加",
|
|
"tabTitle": "スニペット",
|
|
"startupDescription": "このホストに接続するたびにターミナルで実行されます。 $HOST のような変数には値が入力され、入力を求めるスニペットはスキップされます。",
|
|
"none": "すべて解除",
|
|
"removeQuickAction": "クイックアクションを削除する"
|
|
},
|
|
"quickActions": {
|
|
"running": "{{name}} を実行中...",
|
|
"succeeded": "{{name}} が正常に完了しました",
|
|
"failed": "{{name}} が失敗しました",
|
|
"error": "{{name}} の実行に失敗しました"
|
|
},
|
|
"paletteHintPaste": "アクティブなターミナルタブに貼り付けてください",
|
|
"targetTerminals": "走る",
|
|
"targetTerminalsHint": "オプション、それ以外の場合はアクティブなタブ",
|
|
"selectAll": "すべて選択",
|
|
"selectNone": "すべて解除",
|
|
"plugin": {
|
|
"name": "Snippets"
|
|
}
|
|
}
|