Internationalization: 7 languages with live switching
Custom signal-based runtime (no i18n dependency): shared src/shared/i18n dictionaries, ui I18nService.t() reactive by construction so language switches live, and a backend i18n.ts for native menus + thrown errors. Every user-facing string keyed across templates, toasts, dialogs, file kinds, columns, macOS menu/context menus, and errors. Language picker in Options (auto-detects OS locale, falls back to English); switching relabels the webview and native chrome instantly. English/Spanish/French/ German fully drafted; Chinese/Japanese/Basque drafted, flagged for native review. Docs updated. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,299 @@
|
||||
// Japanese translations. Fall back to English for missing keys.
|
||||
// TODO(i18n): AI draft — needs native-speaker review.
|
||||
export const ja = {
|
||||
common: {
|
||||
cancel: "キャンセル",
|
||||
save: "保存",
|
||||
close: "閉じる",
|
||||
delete: "削除",
|
||||
rename: "名前を変更",
|
||||
create: "作成",
|
||||
apply: "適用",
|
||||
choose: "選択…",
|
||||
connect: "接続",
|
||||
local: "ローカル",
|
||||
},
|
||||
app: {
|
||||
notConnectedTitle: "アプリに接続されていません",
|
||||
notConnectedBody: "このページは通常のブラウザで動作しています。デスクトップアプリを起動して使用してください。",
|
||||
managerOpen: "接続マネージャーが開いています。",
|
||||
showConnections: "接続を表示",
|
||||
},
|
||||
tabBar: {
|
||||
connections: "接続",
|
||||
manageConnections: "接続を管理",
|
||||
newTab: "新しいタブ ({mod}T)",
|
||||
closeTab: "タブを閉じる ({mod}W)",
|
||||
options: "オプション",
|
||||
},
|
||||
options: {
|
||||
title: "オプション",
|
||||
language: "言語",
|
||||
system: "システム",
|
||||
theme: { label: "テーマ", system: "システム", light: "ライト", dark: "ダーク" },
|
||||
tone: { label: "トーン", dark: "ダーク", darker: "より暗く" },
|
||||
accent: { label: "アクセント" },
|
||||
accentNames: {
|
||||
graphite: "グラファイト",
|
||||
blue: "ブルー",
|
||||
indigo: "インディゴ",
|
||||
purple: "パープル",
|
||||
rose: "ローズ",
|
||||
orange: "オレンジ",
|
||||
green: "グリーン",
|
||||
teal: "ティール",
|
||||
},
|
||||
fileIcons: { label: "ファイルアイコン", plain: "シンプル", multi: "カラー" },
|
||||
interface: { label: "インターフェース", compact: "コンパクト", default: "標準", large: "大" },
|
||||
speedUnit: { label: "速度の単位" },
|
||||
transfers: { label: "転送", single: "1件ずつ", multi: "複数" },
|
||||
atOnce: "同時数",
|
||||
editor: { label: "エディタ", builtin: "内蔵", custom: "カスタム" },
|
||||
systemDefault: "システムの既定",
|
||||
resetDefault: "既定に戻す",
|
||||
finishedTransfers: { label: "完了した転送", autoClear: "自動クリア", keep: "保持" },
|
||||
},
|
||||
kinds: {
|
||||
folder: "フォルダ",
|
||||
symlink: "シンボリックリンク",
|
||||
file: "ファイル",
|
||||
image: "画像",
|
||||
audio: "オーディオ",
|
||||
video: "動画",
|
||||
archive: "アーカイブ",
|
||||
code: "コード",
|
||||
document: "ドキュメント",
|
||||
},
|
||||
columns: {
|
||||
name: "名前",
|
||||
size: "サイズ",
|
||||
mtime: "更新日時",
|
||||
kind: "種類",
|
||||
rights: "権限",
|
||||
owner: "所有者",
|
||||
group: "グループ",
|
||||
},
|
||||
panel: {
|
||||
choosePanel: "このパネルに表示する内容を選択",
|
||||
copy: "コピー",
|
||||
copyToRight: "右のパネルへコピー (F5)",
|
||||
copyToLeft: "左のパネルへコピー (F5)",
|
||||
edit: "編集",
|
||||
editFile: "ファイルを編集 (F4)",
|
||||
rename: "名前を変更 (F2)",
|
||||
newFolder: "新規フォルダ (F7)",
|
||||
newFile: "新規ファイル",
|
||||
permissions: "アクセス権",
|
||||
delete: "削除",
|
||||
deleteHint: "削除 (F8 / Del)",
|
||||
parentDir: "親フォルダ (Backspace)",
|
||||
refresh: "更新",
|
||||
clearFilter: "フィルターをクリア (Esc)",
|
||||
sshConfig: "~/.ssh/config",
|
||||
connectingTo: "{name} に接続中…",
|
||||
emptyDir: "空のフォルダ",
|
||||
noMatches: "一致なし",
|
||||
matches: { other: "{count} 件一致 · Esc" },
|
||||
},
|
||||
connMgr: {
|
||||
title: "接続",
|
||||
importWinscp: "WinSCP からインポート…",
|
||||
importWinscpHint: "WinSCP.ini エクスポートからセッションをインポート",
|
||||
newConnection: "接続",
|
||||
newConnectionHint: "新規接続",
|
||||
newStack: "グループ",
|
||||
newStackHint: "新規グループ",
|
||||
expand: "展開",
|
||||
collapse: "折りたたむ",
|
||||
renameStack: "グループ名を変更",
|
||||
deleteStack: "グループを削除",
|
||||
openStack: "グループをタブで開く",
|
||||
empty: "空",
|
||||
connectionsHeader: "接続",
|
||||
noneTitle: "保存された接続はまだありません。",
|
||||
noneBody: "作成するか、WinSCP セッションをインポートしてください。",
|
||||
name: "名前",
|
||||
namePlaceholder: "マイサーバー",
|
||||
host: "ホスト",
|
||||
port: "ポート",
|
||||
stack: "グループ",
|
||||
stackNone: "(なし)",
|
||||
username: "ユーザー名",
|
||||
remotePath: "リモートパス(任意)",
|
||||
remotePathPlaceholder: "ホームディレクトリ",
|
||||
auth: "認証",
|
||||
authPassword: "パスワード",
|
||||
authKey: "秘密鍵",
|
||||
password: "パスワード",
|
||||
privateKeyFile: "秘密鍵ファイル",
|
||||
passphrase: "パスフレーズ(任意)",
|
||||
localDir: "ローカルディレクトリ(任意)",
|
||||
localDirPlaceholder: "~/projects/my-server",
|
||||
localDirHint: "もう一方のパネルがローカルで未操作のとき、ここが開きます。",
|
||||
more: "詳細…",
|
||||
less: "閉じる…",
|
||||
selectPrompt: "接続を選択するか、新しく作成してください。",
|
||||
newStackTitle: "新規グループ",
|
||||
newStackPrompt: "グループ名",
|
||||
renameStackTitle: "グループ名を変更",
|
||||
deleteStackTitle: "グループを削除",
|
||||
deleteStackBody: 'グループ "{name}" を削除しますか?含まれる接続は残り、グループ解除されます。',
|
||||
deleteConnectionTitle: "接続を削除",
|
||||
deleteConnectionBody: '"{name}" を削除しますか?',
|
||||
},
|
||||
editor: {
|
||||
noFileTitle: "編集するファイルがありません",
|
||||
noFileBody: "このウィンドウはエディタコンテキストなしで開かれました。アプリからファイルを開いてください。",
|
||||
wrap: "折り返し",
|
||||
wrapHint: "長い行を折り返す — 行番号を非表示 ({alt}Z)",
|
||||
findHint: "検索 ({mod}F)",
|
||||
findPlaceholder: "ファイル内を検索",
|
||||
prevMatch: "前の一致 (⇧↵)",
|
||||
nextMatch: "次の一致 (↵)",
|
||||
closeHint: "閉じる (Esc)",
|
||||
disconnected: "{name} から切断されました — 保存は失敗しますが、テキストはこのウィンドウに保持されます。",
|
||||
cantOpen: "{name} を開けません",
|
||||
closeWindow: "ウィンドウを閉じる",
|
||||
shortcuts: "{mod}S 保存 · {mod}F 検索 · {mod}W 閉じる",
|
||||
lines: { other: "{count} 行" },
|
||||
close: "閉じる",
|
||||
save: "保存",
|
||||
saveChangesTitle: '"{name}" への変更を保存しますか?',
|
||||
saveChangesBody: "保存しないと変更は失われます。",
|
||||
dontSave: "保存しない",
|
||||
countLabel: "{total} 件中 {current} 件目",
|
||||
noMatches: "一致なし",
|
||||
},
|
||||
transfer: {
|
||||
summary: "{active} 件実行中 · {finished} 件完了",
|
||||
clearFinished: "完了分をクリア",
|
||||
cancel: "キャンセル",
|
||||
dismiss: "閉じる",
|
||||
showDetails: "転送の詳細を表示",
|
||||
copying: "{name} をコピー中 · {percent}%{speed}",
|
||||
queued: "{count} 件待機中",
|
||||
failed: { other: "{count} 件の転送が失敗" },
|
||||
finished: "転送が完了しました",
|
||||
ready: "準備完了",
|
||||
items: "{count} 項目",
|
||||
selected: "{count} 件選択中",
|
||||
queuedState: "待機中",
|
||||
scanning: "スキャン中…",
|
||||
failedState: "失敗",
|
||||
cancelled: "キャンセル済み",
|
||||
completedFiles: { other: "{count} 個のファイル · {size}" },
|
||||
left: "残り {eta}",
|
||||
},
|
||||
dialogs: {
|
||||
chmodTitle: "アクセス権",
|
||||
chmodItems: "{count} 項目",
|
||||
read: "読み取り",
|
||||
write: "書き込み",
|
||||
execute: "実行",
|
||||
roleOwner: "所有者",
|
||||
roleGroup: "グループ",
|
||||
roleOthers: "その他",
|
||||
octal: "8進数",
|
||||
mergeFolder: "フォルダを結合",
|
||||
replace: "置き換える",
|
||||
merge: "結合",
|
||||
mergeAll: "すべて結合",
|
||||
replaceAll: "すべて置き換える",
|
||||
skip: "スキップ",
|
||||
skipAll: "すべてスキップ",
|
||||
ofTotal: "{total} 件中 {index} 件目",
|
||||
overwriteDirBody: "コピー先に同名のフォルダが既にあります。結合すると中のファイルが置き換わる可能性があります。",
|
||||
overwriteFileBody: "コピー先に同名のファイルが既にあります。",
|
||||
source: "コピー元",
|
||||
destination: "コピー先",
|
||||
newer: "新しい",
|
||||
},
|
||||
toasts: {
|
||||
movedToTrash: '"{name}" をゴミ箱に移動しました',
|
||||
editingExternal: "{name} を編集中 — 保存すると自動でアップロードされます",
|
||||
nothingToCopy: "コピーする項目がありません(シンボリックリンクはスキップされます)",
|
||||
nothingToCopyAllSkipped: "コピーする項目がありません — 競合する項目はすべてスキップされました",
|
||||
sameFolder: "両方のパネルが同じフォルダを表示しています",
|
||||
sameFile: '"{name}" をスキップしました — 同じファイルです',
|
||||
typeMismatch: '"{name}" をスキップしました — 別の種類の項目があります',
|
||||
transferFailed: '転送 "{name}" が失敗しました: {error}',
|
||||
unknownError: "不明なエラー",
|
||||
saved: "{name} を保存しました",
|
||||
disconnectedReason: "{title}: 切断されました ({reason})",
|
||||
imported: { other: "{count} 件の接続をインポートしました" },
|
||||
importedIntoStacks: { other: "({count} 件の新規グループに)" },
|
||||
importedSkipped: "({skipped} 件スキップ)",
|
||||
leftoverTitle: "残った編集済みファイル",
|
||||
leftoverMore: "、他 {count} 件",
|
||||
leftoverBody: {
|
||||
other: "前回のセッションで {count} 件の一時編集ファイルが残っています({names})。クリアしますか?",
|
||||
},
|
||||
leftoverClear: "クリア",
|
||||
},
|
||||
fileActions: {
|
||||
deleteTitle: "削除",
|
||||
deleteBody: "{what} を削除しますか?フォルダは再帰的に削除されます。この操作は取り消せません。",
|
||||
deleteConfirm: "削除",
|
||||
renameTitle: '"{name}" の名前を変更',
|
||||
renameConfirm: "名前を変更",
|
||||
newFolderTitle: "新規フォルダ",
|
||||
newFolderPlaceholder: "フォルダ名",
|
||||
newFileTitle: "新規ファイル",
|
||||
newFilePlaceholder: "ファイル名",
|
||||
createConfirm: "作成",
|
||||
itemsCount: "{count} 項目",
|
||||
},
|
||||
menu: {
|
||||
about: "{app} について",
|
||||
quit: "終了",
|
||||
file: "ファイル",
|
||||
newTab: "新しいタブ",
|
||||
closeTab: "タブを閉じる",
|
||||
newFolder: "新規フォルダ",
|
||||
newFile: "新規ファイル",
|
||||
editFile: "ファイルを編集",
|
||||
connect: "接続",
|
||||
connectionManager: "接続マネージャー…",
|
||||
edit: "編集",
|
||||
view: "表示",
|
||||
refresh: "更新",
|
||||
window: "ウィンドウ",
|
||||
},
|
||||
ctx: {
|
||||
size: "サイズ",
|
||||
modified: "更新日時",
|
||||
kind: "種類",
|
||||
rights: "権限",
|
||||
owner: "所有者",
|
||||
group: "グループ",
|
||||
revealFinder: "Finder で表示",
|
||||
revealExplorer: "エクスプローラーで表示",
|
||||
revealFileManager: "ファイルマネージャーで表示",
|
||||
moveToTrash: "ゴミ箱に移動",
|
||||
moveToRecycleBin: "ごみ箱に移動",
|
||||
newFolder: "新規フォルダ",
|
||||
newFile: "新規ファイル",
|
||||
refresh: "更新",
|
||||
open: "開く",
|
||||
openDefault: "既定のアプリで開く",
|
||||
edit: "編集",
|
||||
copyToOther: "もう一方のパネルへコピー",
|
||||
rename: "名前を変更",
|
||||
permissions: "アクセス権",
|
||||
copyPath: "パスをコピー",
|
||||
delete: "削除",
|
||||
columns: "列",
|
||||
trashTooltip: "ここからゴミ箱に入れた項目は Finder の「戻す」を利用できません",
|
||||
},
|
||||
errors: {
|
||||
sshAgentUnavailable: "ssh-agent が利用できません(SSH_AUTH_SOCK が未設定)",
|
||||
identityFileNotFound: "認証鍵ファイルが見つかりません: {path}",
|
||||
sessionNotConnected: 'セッション "{id}" は接続されていません',
|
||||
localCannotDisconnect: "ローカルセッションは切断できません",
|
||||
notADirectory: '"{path}" は存在し、フォルダではありません',
|
||||
sameFileTransfer: '"{name}": コピー元とコピー先が同じファイルです',
|
||||
sameFileNoName: "コピー元とコピー先が同じファイルです",
|
||||
folderOntoItself: "フォルダをそれ自身の上にコピーすることはできません",
|
||||
folderIntoItself: "フォルダをそれ自身の中にコピーすることはできません",
|
||||
},
|
||||
} as const;
|
||||
Reference in New Issue
Block a user