mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-10-13 13:09:52 +08:00
* refactor(canvas): decouple the canvas from the chat engine
The canvas components will be reused by the MCP server's browser shell,
which has no chat and no Next.js. They now read everything they need
from small contexts and the canvas store instead of the chat engine:
- components/canvas/versions-context.tsx: VersionsProvider and
useVersionsContext give the version cards, the strip and the compare
dialog a VersionsSource (versions, onCanvasId, undoneId, isBusy,
canUndo, canRedo, restore, undo, redo). The chat fills it from the
versions store and the engine in components/chat/chat-versions.tsx.
- stores/canvas-store.ts: isBusy and busyReason; the chat engine sets
them while a turn runs, SelectionAsk and the version UI read them.
- components/canvas/version-card.tsx: the visual version card and the
thumbnail, out of tool-activity.tsx; the chat's card composes it and
adds its "Show XML" link and code panel.
- compare-dialog.tsx and version-strip.tsx move to components/canvas;
the strip takes the minimum number of versions to show as a prop, the
chat panel computes it from the cards it has.
- components/canvas/locale-context.tsx: LocaleProvider and useLocale,
fed by the [lang] layout; CanvasStage no longer uses next/navigation.
The overlay (SelectionAsk) is a slot and the wait for the saved
language is a prop, so the shell can leave both out.
- lib/version-text.ts: describeChanges is now describeChangeSummary, so
it can be imported next to the MCP core's describeChanges.
* test(unit): canvas import boundary and the shared version card
The boundary test scans the canvas modules' imports and bundles the canvas components with esbuild; both fail on anything from components/chat, the tool handlers, next/navigation, next/font, next/script, next/headers or a server-only module. The card test renders VersionCard and VersionStrip on a fake VersionsSource.
* refactor(scripts): pin the draw.io release in one json file and share the zip reader
* feat(mcp-server): bundle a trimmed draw.io into dist/drawio at build time
scripts/fetch-drawio.mjs downloads the pinned draw.war into a cache
(DRAWIO_WAR_CACHE, or DRAWIO_WAR for a local file), checks its SHA-256
and extracts the files named in drawio-files.txt plus a LICENSE with the
Apache-2.0 text. scripts/check-drawio-files.mjs drives the embedded
editor in headless Chromium from a full copy, records every requested
file and checks or rewrites (--update) the list.
* feat(mcp-server): serve the bundled draw.io same-origin behind an api token
GET /drawio/<path> serves dist/drawio with a MIME table, a day of
caching and nosniff; paths are normalized and never reach WEB-INF or
META-INF. The preview embeds /drawio/index.html when the copy exists and
DRAWIO_BASE_URL is unset, else the external draw.io as before (and
start_session says so). Every /api request must carry the per-process
X-Drawio-Token the page gets in its HTML; pages send
frame-ancestors 'self' and nosniff.
* build(mcp-server): require the bundled draw.io in the package and cap the tarball at 40 MB
* fix(mcp-server): review fixes for the preview token and the draw.io static files
- The preview page fetches a fresh copy of itself and retries once when an
API request is refused with 403: another MCP process, with its own token,
now answers on this port, and the recovery logic (recoverState) needs its
polls to go through. The page is sent with Cache-Control: no-store.
- draw.io files are served with an ETag and Cache-Control: no-cache instead
of a 24 hour max-age: their names do not change between versions, so a
package upgrade must reach the browser on the next preview. HEAD and
If-None-Match (304) are answered.
- The file read stream goes through stream.pipeline, so a read error no
longer ends the MCP process and a client that leaves mid-download no
longer leaks the file handle.
* fix(mcp-server): review fixes for the draw.io file list and its guard
- The list now ships the templates of Insert > Template, the PlantUML
parser of Insert > Advanced and the template dialog's icon: the menu
items were shown but failed with 404s. 15.1 MB packed; the tarball cap
goes from 40 MB to 20 MB, where it still catches a list that grew by a
whole js/ directory.
- The guard drives both features, fails when the copy it runs against
lacks files the editor asked for or when an export does not answer,
checks that the copy is the pinned draw.io version, and runs in CI
(npm run check-drawio, one E2E shard) so a list regression cannot reach
a release.
* docs: review fixes for the draw.io version pointer and the preview's embedding
- The offline deployment guides point at packages/mcp-server/src/
drawio-version.json for the draw.war version; scripts/fetch-drawio.mjs
no longer names it.
- The MCP README says what the bundled draw.io copy includes, and that the
preview page cannot be shown inside an editor's built-in browser since it
is served with frame-ancestors 'self'.
* refactor(canvas): review fixes for the busy flag, the comparison note and the bundle size check
- busyReason had no reader: the chat engine sets isBusy through the store's
generic set, like every other flag.
- The isSameDocument comment says the two "same document" rules disagree
in both directions, so neither is a subset of the other.
- The import boundary test bundles minified with one pako (the MCP core
resolves its own copy) and caps the canvas core at 160 KB (134 KB now).
* fix(mcp-server): name exports at random and stamp the draw.io version into ETags
- Export requests carried a per-process counter. The preview page retries a
result refused with 403 against the process that took over the port, so a
late result of the old process's export could be taken for the new
process's export with the same number. The id is a random UUID now.
- The ETag of a bundled draw.io file now starts with the version the fetch
script stamps into dist/drawio/.version. An install that keeps the
archive's dates (npm does not) would otherwise answer 304 for a changed
file of the same size after an upgrade.
* docs(mcp-server): mermaid is in the bundled draw.io, which has no image proxy
- Mermaid's converter is in js/extensions.min.js, which the editor loads at
startup, so the README no longer lists it as left out; the org chart
layout (js/orgchart.min.js) is the example of a feature that is.
- Note that the bundled copy, like the web app's, has no /drawio/proxy:
images from other websites, including those in some templates, are left
out of exports and thumbnails. The guard's comment names this as a known
limitation it does not cover.
* refactor(canvas): getDrawioSrc takes the editor's source, and CanvasStage can be given one
* feat(mcp-server): canvas shell bundled from the web app's canvas with esbuild
The shell (packages/mcp-server/shell) renders DrawioFrame inside the
shared providers without the chat: its config comes from
window.__MCP_CONFIG__, the four dictionaries ship in the bundle, the
theme is kept under an mcp: localStorage key, and system fonts stand in
for the web fonts. scripts/build-shell.mjs bundles it into dist/shell
with the root's esbuild and Tailwind; check-package caps shell.js at
1.5 MB and shell.css at 300 KB.
* feat(mcp-server): serve the canvas shell at /shell/ behind DRAWIO_PREVIEW_UI
GET /shell/ fills the page template's {{CONFIG_JSON}} with the session,
the API token, where draw.io comes from and the host's editor settings,
with the classic page's security headers; /shell/<file> serves the built
files like the draw.io copy. start_session opens the shell when
DRAWIO_PREVIEW_UI=shell; the classic page stays the default.
* test(mcp-server): open the built shell with playwright
npm run test:e2e starts dist/index.js over the MCP SDK with
DRAWIO_PREVIEW_UI=shell, opens the URL start_session returns in headless
Chromium, and checks that the bundled draw.io loads without console
errors and that the theme toggle switches draw.io in place.
* ci: install the root dependencies before building the mcp package
The shell build needs the root's esbuild, Tailwind and React.
* feat(canvas): DiagramProvider exports with options and shows a transient document
requestExport(request, timeoutMs) runs one draw.io export with the
request's own parameters (a PNG's pageId and width) and resolves with its
answer (data, or xml for format "xml"); null when draw.io does not answer.
showTransient(xml) puts a document on the canvas for an export only: it is
not recorded, its autosaves are ignored, and the next loadDiagram brings
the user back to the page they were on. The MCP's canvas shell answers the
server's export requests with both.
* feat(mcp-server): the shell syncs with the server like the classic page
shell/mcp-sync-core.ts ports preview.js's protocol without the page or
React: polling GET /api/state every 2 s with the state id and version,
pushes of the user's edits with their base version and state, 409 and 413
handling, recovery of a recreated session (the tab's copy goes to History),
the token refresh after a 403, sync and export requests (PNG by page id,
SVG of another page through a transient one-page projection with autosave
ignored, the 600 ms wait for icons), thumbnails for History, and History
reads and restores that name the state the list belongs to.
A server write goes on the canvas as one undo step (loadDiagram commit,
with the change marked) when decideLoad finds it changes only the page on
screen, keeps the file variables and needs no load-only setting; the other
pages are compared with the MCP core's contentFingerprint. draw.io's own
re-serialized copy of such a write is recognized with isSameDocument and
not pushed back as an edit.
shell/use-mcp-sync.ts mounts the sync once inside DiagramProvider, reads
draw.io's autosave and load messages, and reports the connection state,
which the shell's status bar shows; notices come as toasts from the
dictionaries.
* test(mcp-server): port the preview protocol tests to the sync core
The recovery, thumbnail, size limit and History cases of
tests/unit/mcp-preview-recovery.test.ts, driven against mcp-sync-core.ts
with a stubbed server and canvas, plus the stale 409 recovery, an export
request answered once, a projection that ignores edits and restores the
document, the thumbnail of a write loaded before draw.io was ready, writes
taken in place as commits (draw.io's own copy is not pushed), and the
commit-or-load decision table of decideLoad.
* test(mcp-server): e2e of the shell's sync with the server
The shell connects, shows what create_new_diagram draws, marks an
edit_diagram change and takes it back with one Ctrl+Z (which get_diagram
then reflects), pushes a shape inserted in the editor, serves
screenshot_diagram, and shows another page only for its SVG export before
the user's page comes back.
* fix(mcp-server): review fixes for the shell's sync core
A recovery loads the server's diagram in full and waits for draw.io's
load report, as the classic page does: whether the canvas takes a write
in place is decided inside DiagramProvider, and an autosave of the
canvas being replaced went to the server as an edit when the decision
was wrong. A paper size change alone is pushed again: autosaves are
compared as documents only for draw.io's own copy of a committed write.
A projection stays on screen until draw.io reports the restore load
(5 s at most), the whole export ends in 15 s even when its result POST
hangs, and an export in flight is dropped when draw.io starts over. A
refused poll shows the tab offline. With several pages and the page on
screen unknown, a write loads in full. hasLoadOnlySettings and the
highlight of an AI change are shared with the editor bridge.
* fix(mcp-server): review fixes for the preview URL and the theme menu
The stalled-tab note names the page start_session opened (the shell
with DRAWIO_PREVIEW_UI=shell) instead of the classic page. With the
shell not built, start_session opens the classic page and the server
says so at startup, as it does for a missing dist/drawio. BROWSER=none
skips the system browser, as Vite and CRA dev servers do: the e2e tests
set it. Without a fixed DRAWIO_UI, the shell's draw.io URL carries
themes=1 so Extras > Theme is offered, as on the classic page.
* fix(mcp-server): review fixes for the shell's build
tsc -p shell checked nothing: the inherited exclude dropped every shell
file; the shell's tsconfig now excludes node_modules only. Tailwind scans
app-toaster.tsx too, so the sync notices look like the web app's toasts.
The bundle keeps its dependencies' license comments (esbuild appends them
at the end). postcss, which build-shell.mjs loads from the root, is a
declared devDependency.
* ci: run the shell's browser tests on the packed tarball, publish on shared code changes
The e2e job's first shard builds the MCP package, packs it, installs the
tarball in an empty directory and runs packages/mcp-server/tests/e2e
against the installed dist/index.js (MCP_SERVER_ENTRY), so a shell that
builds but fails in the browser, or a tarball missing a runtime
dependency, fails the PR. Its traces go with the Playwright report. The
publish workflow also triggers on the web app code the shell is bundled
from (components, contexts, hooks, lib, stores, globals.css) and the
root lockfile.
* fix(canvas): ignore autosaves of the document a pending full load replaces
An autosave that arrives after loadDiagram sent a full load, and before draw.io reports it, is of the canvas being replaced (draw.io reports each load, in order). Until now it overwrote chartXMLRef: in the MCP shell, a late autosave of a one-page projection replaced the cached document, and a remount of an external draw.io then put the projection on the canvas as the whole document.
* fix(mcp-server): review fixes for the shell's commits and export timeout
A write taken in place that leaves the canvas as it is gets no autosave from draw.io, so the marker for its copy stayed armed and ate the user's next paper-size edit: arm it only when the write changed the document. The 15 s export timeout now retires the export's sequence number, so a result POST that answers late no longer restores the document a second time.
* ci: create the tarball directory before npm pack
npm pack does not create its --pack-destination; on a fresh runner the step failed with ENOENT before the packed shell tests ran.
* feat(mcp-server): history entries name their maker, and /api/history the entry on the canvas
Each History entry records who made it (a user edit, a recovering tab's
copy, a restored copy; none for the AI's writes), when, and its page
count. GET /api/history now also returns each entry's XML, the first entry
with the same content (a restore adds a copy of an older one), the state
the ids belong to, and the entry whose content the canvas shows, by the
rule restore_version uses. The shell's version cards read these; the
classic page keeps using index, id and svg.
* feat(mcp-server): version cards in the shell from the server's History
The shell's VersionsSource (shell/node-versions-source.ts) reads GET
/api/history through the sync and shows one version per distinct content
(a restore's copy folds into the entry it copies; the blank page is none),
numbered as they first appeared, with what changed since the one before.
The entry the server says is on the canvas marks the version; undo and
redo of the newest version restore the one before it, or it again, through
POST /api/restore, so hand edits stay as versions of their own. The cards
sit in a panel beside the canvas (toggle in the header); the strip and
Compare come from the shared canvas components. The sync tells listeners
once per server version, and when History changed without one, so the
list is read again only then.
* test(mcp-server): e2e of the shell's version cards
In a session of its own: three writes give three cards; undoing the newest
restores the one before on the server too, redo brings it back, a hand edit
turns the undo into a restore, and restoring the first version keeps that
edit as a version of its own, which restore_version also finds.
* feat(mcp-server): get_selection reads the cells the user selected in the shell
The server asks the preview tab for the selection the way it asks for an export (a random request id in GET /api/state, the answer in a POST with that id, 10 s to answer). The shell answers through the editor bridge with each cell's id, label, an edge's ends, a shape's geometry and the page on screen; without a same-origin editor it says so, and the tool names the external draw.io. The classic page cannot answer, so the tool says that at once. screenshot_diagram's description now says a page selector renders that page without changing the page on screen (PNG exports by pageId already did).
* test(mcp-server): selection requests, get_selection texts, and page screenshots that leave the view alone
Unit tests for the request plumbing (random id, one answer, timeout), the tool's texts (cells, nothing selected, external draw.io) and the shell's side (one answer per request, after draw.io is up, never during a projection); the wiring test starts a session with BROWSER=none to see the no-tab message. Shell e2e: cells selected in the editor reach get_selection; a PNG of another page differs from the page on screen, which stays.
* feat(mcp-server): the canvas shell is the default preview, the classic page behind DRAWIO_PREVIEW_UI=classic
* docs: the MCP preview is the web app's canvas; get_selection, DRAWIO_BASE_URL and the classic page
* chore(mcp-server): version 0.4.0; check-package requires the draw.io version stamp
* ci: an mcp-shell job builds the package, runs its tests, the draw.io file guard and the shell e2e
* fix(mcp-server): review fixes for the version cards and History
The shell's version cards (shell/node-versions-source.ts):
- a version's change and undo target are the state it replaced, the
History entry right before its first copy, not the card before it: after
a restore those differ, and undo went to the wrong version (and not
where restore_version steps_back=1 goes)
- a card restores the newest copy of its content, as restore_version
does, so page settings the user changed (a "user" copy) are kept
- a blank page after a drawing is a clear of the canvas, a version of its
own; only the blank page before any drawing is hidden
- numbers and changes are keyed by content, not by the first copy's id,
so a version keeps them when its first copy drops out of the server's
20-entry buffer; the caches start over for another server state (the
process restarted: entry ids name other content)
The server's History (src/history.ts):
- firstCopyIds compares each entry with the first of every group only: a
bare model matches any page name, so "same content" is not transitive,
and a card could show one document and restore another
- the time and pages fields had no reader; pages parsed every XML once
more on every write
Reading History (src/http-server.ts, shell/mcp-sync-core.ts):
- GET /api/state and a push's answer carry a History key (entry count,
newest id, the entry on the canvas); the shell reads History again only
when it changes, so a hand edit no longer downloads every entry's XML and
thumbnail
- a failed History read is told again at the next poll
- a History list from a state the poll has not seen yet is dropped
* fix(mcp-server): review fixes for get_selection
Server (src/http-server.ts, src/index.ts, src/selection.ts,
src/new-diagram.ts):
- overlapping get_selection calls take turns (readSelection, one slot per
session as the export slot) instead of replacing each other's request,
which left one of them with a false "tab not in front" timeout
- an answer is taken only while a request is pending (both ids undefined
compared equal)
- the tool sees the page start_session actually opens: with dist/shell
missing the classic page is in use, which never answers, so the tool
says so instead of timing out
- the result lists at most 100 cells and counts the rest: a whole large
diagram selected would fill the model's context
- every <diagram> the model sends without an id gets one, so the page id
the shell reports exists in the server's document
Shell (shell/mcp-sync-core.ts, shell/use-mcp-sync.ts,
contexts/diagram-context.tsx, lib/drawio/editor-bridge.ts):
- an answer whose POST failed is sent again at the next poll
- no answer while a full load has yet to reach the editor: it still shows
the previous document, whose cells and pages the answer would name
- a hidden tab (the same session open twice) answers a poll later, so the
tab in front answers first; alone, it still answers within the timeout
- a cell's container is reported by the model's isLayer, not by comparing
with the default parent, which is the group the user entered
* fix(mcp-server): review fixes for the shell page
- a download button in the header opens the web app's export dialog
(.drawio, .png, .svg, .drawio.svg), which the classic page had and the
shell lacked when it became the default
- the shell asks draw.io for the custom library menu (libraries=1), as
the classic page did; the web app keeps libraries=0
- the newest card no longer shows "Rendering preview" for good: the sync
takes the thumbnail of a diagram the server recovered from its file
(saved without pictures) while the canvas kept it, and of a write whose
picture was skipped because an edit came first, once the canvas shows
the write again
- e2e: the get_selection test covers a shape in a container the user
entered; a download test saves a .drawio file
* ci: the version bump reminder watches every path publish-mcp.yml does, and compares the version field
The reminder step left out the root lockfile and scripts/, which change
what is bundled into the shell and trigger the publish workflow; and it
took any change of packages/mcp-server/package.json (a dependency bump)
for a version bump. It now compares the version field between the two
commits.
* fix(mcp-server): get_selection lists every selected id, with detail for the first 100
* fix(mcp-server): a hidden tab's delayed selection answer checks the canvas again first
* fix(mcp-server): the version cards keep only the current History in memory, picture the newest copy, and keep a clear the buffer scrolled to
* fix(mcp-server): save who made each History entry with it, so the cards look the same after a restart
* fix(mcp-server): the download waits for a page export's projection to end, and the dialog's styles are bundled
* fix(mcp-server): bundle open.html and js/open.js, the picker of Open Library from > Browser
* fix(mcp-server): the shell shows the versions once, in the side panel
* test(mcp-server): get_selection wiring test expects the classic page's answer when the shell is not built
719 lines
43 KiB
JSON
719 lines
43 KiB
JSON
{
|
||
"common": {
|
||
"save": "保存",
|
||
"cancel": "キャンセル",
|
||
"close": "閉じる",
|
||
"clear": "クリア",
|
||
"edit": "編集",
|
||
"delete": "削除",
|
||
"loading": "読み込み中.."
|
||
},
|
||
"nav": {
|
||
"editor": "エディタ",
|
||
"newChat": "新しい図",
|
||
"github": "GitHub",
|
||
"settings": "設定",
|
||
"hidePanel": "チャットパネルを非表示",
|
||
"showPanel": "チャットパネルを表示",
|
||
"aiChat": "AI チャット"
|
||
},
|
||
"providers": {
|
||
"useServerDefault": "サーバーデフォルトを使用",
|
||
"openai": "OpenAI",
|
||
"anthropic": "Anthropic",
|
||
"google": "Google",
|
||
"azure": "Azure OpenAI",
|
||
"openrouter": "OpenRouter",
|
||
"deepseek": "DeepSeek",
|
||
"siliconflow": "SiliconFlow",
|
||
"modelscope": "ModelScope",
|
||
"minimax": "MiniMax",
|
||
"glm": "GLM",
|
||
"qwen": "Qwen",
|
||
"kimi": "Kimi",
|
||
"qiniu": "Qiniu",
|
||
"mimo": "MiMo (Xiaomi)"
|
||
},
|
||
"chat": {
|
||
"placeholder": "ダイアグラムを説明するか、ファイルをアップロード...",
|
||
"inputLabel": "チャット入力",
|
||
"send": "送信",
|
||
"stopGeneration": "生成を停止",
|
||
"sendMessage": "メッセージを送信",
|
||
"clearConversation": "会話をクリア",
|
||
"uploadFile": "ファイルをアップロード(画像、PDF、テキスト)",
|
||
"minimalStyle": "ミニマル",
|
||
"styledMode": "スタイル付き",
|
||
"minimalTooltip": "高速生成のためミニマルを使用(色なし)",
|
||
"regenerate": "応答を再生成",
|
||
"copyResponse": "応答をコピー",
|
||
"copied": "コピーしました!",
|
||
"failedToCopyDetail": "メッセージのコピーに失敗しました。手動でコピーするか、クリップボードの権限を確認してください。",
|
||
"goodResponse": "良い応答",
|
||
"badResponse": "悪い応答",
|
||
"clickToEdit": "クリックして編集",
|
||
"editMessage": "メッセージを編集",
|
||
"saveAndSubmit": "保存して送信",
|
||
"ExtractURL": "URLから抽出",
|
||
"attach": "追加",
|
||
"placeholderFollowUp": "変更したい内容を入力。図形を選んでから頼むこともできます",
|
||
"emptyThread": "キャンバスに直接描くか、下で描きたいものを伝えてください。",
|
||
"attachedImage": "添付画像",
|
||
"retry": "再試行"
|
||
},
|
||
"examples": {
|
||
"paperToDiagram": "論文を図に",
|
||
"paperDescription": ".pdf, .txt, .md, .json, .csv, .py, .js, .ts などをアップロード",
|
||
"animatedDiagram": "アニメーション図",
|
||
"animatedDescription": "アニメーションコネクタ付きの Transformer アーキテクチャを描画",
|
||
"awsArchitecture": "AWS 構成図",
|
||
"awsDescription": "AWS アイコンでクラウドアーキテクチャ図を作成",
|
||
"replicateFlowchart": "フローチャートを再現",
|
||
"replicateDescription": "既存のフローチャートをアップロードして複製",
|
||
"creativeDrawing": "自由なイラスト",
|
||
"creativeDescription": "楽しくてクリエイティブなものを描く",
|
||
"cachedNote": "例は保存済みの回答を使うので、すぐに表示され、AI を呼び出しません。",
|
||
"mcpServer": "MCP サーバー",
|
||
"mcpDescription": "Claude Desktop、VS Code、Cursor で使用"
|
||
},
|
||
"settings": {
|
||
"title": "設定",
|
||
"description": "アプリケーション設定を構成します。",
|
||
"accessCode": "アクセスコード",
|
||
"accessCodePlaceholder": "アクセスコードを入力",
|
||
"accessCodeDescription": "このアプリケーションを使用するために必要です。",
|
||
"aiProvider": "AI プロバイダー設定",
|
||
"aiProviderDescription": "独自の API キーを使用して使用制限を回避できます。キーはブラウザのローカルに保存され、サーバーには保存されません。",
|
||
"provider": "プロバイダー",
|
||
"modelId": "モデル ID",
|
||
"apiKey": "API キー",
|
||
"apiKeyPlaceholder": "あなたの API キー",
|
||
"baseUrl": "ベース URL(オプション)",
|
||
"customEndpoint": "カスタムエンドポイント URL",
|
||
"overrides": "上書き",
|
||
"clearSettings": "設定をクリア",
|
||
"useServerDefault": "サーバーデフォルトを使用",
|
||
"language": "言語",
|
||
"languageDescription": "インターフェース言語を選択します。",
|
||
"theme": "テーマ",
|
||
"themeDescription": "画面をライトにするかダークにするか。キャンバスも同じテーマになります。",
|
||
"diagramStyle": "図のスタイル",
|
||
"diagramStyleDescription": "AI が新しい図を描くときのスタイル。スタイル付きは色やアイコンを使い、ミニマルは素朴な図形だけにします。",
|
||
"sendShortcut": "送信のショートカット",
|
||
"sendShortcutDescription": "メッセージの送信方法を選択します。",
|
||
"enterToSend": "Enterで送信",
|
||
"ctrlEnterToSend": "Cmd/Ctrl+Enterで送信",
|
||
"diagramActions": "ダイアグラム操作",
|
||
"diagramActionsDescription": "ダイアグラムの履歴とエクスポートを管理",
|
||
"history": "履歴",
|
||
"download": "ダウンロード",
|
||
"proxy": "プロキシ設定",
|
||
"proxyDescription": "API リクエスト用の HTTP/HTTPS プロキシを設定(デスクトップ版のみ)",
|
||
"httpProxy": "HTTP プロキシ",
|
||
"httpsProxy": "HTTPS プロキシ",
|
||
"applyProxy": "適用",
|
||
"proxyApplied": "プロキシ設定が適用されました",
|
||
"diagramValidation": "スクリーンショットで図をチェック(実験的)",
|
||
"diagramValidationDescription": "描くたびに、画像を読めるモデルがスクリーンショットを確認し、修正を求めます。画像を読めるモデルが必要です。",
|
||
"customSystemMessage": "カスタム指示",
|
||
"customSystemMessageDescription": "AIのシステムプロンプトに追加されるカスタム指示を入力します。",
|
||
"customSystemMessagePlaceholder": "例:ダイアグラムには常に青色のカラースキームを使用...",
|
||
"maxOutputTokens": "出力トークン上限",
|
||
"maxOutputTokensDescription": "1回の応答の予算で、思考過程とダイアグラムの XML が共有します。AI が考え続けてダイアグラムが生成されない場合は大きくしてください。空欄ならデフォルト値を使います。",
|
||
"tabModels": "モデル",
|
||
"tabAbout": "このアプリについて",
|
||
"themeLight": "ライト",
|
||
"themeDarkMode": "ダーク",
|
||
"themeSystem": "システムに合わせる",
|
||
"accessCodeSaved": "アクセスコードを保存しました",
|
||
"proxyInvalid": "プロキシのアドレスは http:// または https:// で始めてください",
|
||
"proxyFailed": "プロキシ設定を適用できませんでした",
|
||
"appVersion": "バージョン",
|
||
"projectWebsite": "プロジェクトのサイト",
|
||
"tabGeneral": "一般",
|
||
"tabDrawing": "描画",
|
||
"sectionInterface": "表示",
|
||
"sectionAccess": "アクセス"
|
||
},
|
||
"save": {
|
||
"title": "図をエクスポート",
|
||
"description": "形式とファイル名を選んでください。",
|
||
"format": "形式",
|
||
"filename": "ファイル名",
|
||
"filenamePlaceholder": "ファイル名を入力",
|
||
"formats": {
|
||
"drawio": "draw.io ファイル",
|
||
"png": "PNG 画像",
|
||
"svg": "SVG 画像",
|
||
"xmlsvg": "編集できる SVG"
|
||
},
|
||
"savedSuccessfully": "エクスポートしました",
|
||
"hints": {
|
||
"drawio": "すべて編集できるまま保存",
|
||
"png": "スライドや文書向けの画像",
|
||
"svg": "拡大してもぼやけない画像",
|
||
"xmlsvg": "draw.io でも開ける画像"
|
||
}
|
||
},
|
||
"dialogs": {
|
||
"clearSuccess": "新しいチャットを開始しました"
|
||
},
|
||
"errors": {
|
||
"maxFiles": "ファイルが多すぎます。最大 {max} 個まで許可されています。",
|
||
"onlyMoreAllowed": "あと {slots} 個のファイルのみ許可されています",
|
||
"fileExceeds": "「{name}」は {size} です({max}MB を超えています)",
|
||
"unsupportedType": "「{name}」はサポートされていないファイルタイプです",
|
||
"filesRejected": "{count} 個のファイルが拒否されました:",
|
||
"andMore": "...およびさらに {count} 個",
|
||
"invalidAccessCode": "無効または欠落したアクセスコード。設定で入力してください。",
|
||
"networkError": "ネットワークエラー。接続を確認してください。",
|
||
"retryLimit": "自動再試行制限に達しました({max})。手動で再試行してください。",
|
||
"continuationRetryLimit": "継続再試行制限に達しました({max})。ダイアグラムが複雑すぎる可能性があります。",
|
||
"sessionCorrupted": "セッションデータが破損しました。最初からやり直します。",
|
||
"failedToSave": "localStorage へのメッセージの保存に失敗しました",
|
||
"failedToRestore": "localStorage からの復元に失敗しました",
|
||
"failedToPersist": "アンロード前の状態の永続化に失敗しました",
|
||
"failedToExport": "チャートデータの取得エラー",
|
||
"failedToLoadExample": "例の画像の読み込みエラー",
|
||
"failedToRecordFeedback": "フィードバックの記録に失敗しました。もう一度お試しください。",
|
||
"storageUpdateFailed": "チャットはクリアされましたが、ブラウザストレージを更新できませんでした",
|
||
"sessionSaveFailed": "このチャットを保存できませんでした。ブラウザのストレージがいっぱいの可能性があります。履歴から古いチャットを削除して、もう一度お試しください。",
|
||
"sessionSaveFailedLeave": "このチャットを保存できませんでした。ブラウザのストレージがいっぱいの可能性があります。保存せずに続けて、新しいチャットの一覧から古いチャットを削除できます。",
|
||
"continueWithoutSaving": "保存せずに続ける",
|
||
"notADiagramFile": "{name} は draw.io の図ではありません。",
|
||
"fileTooLong": "{name}:内容が上限の {limit}k 文字を超えています({size}k 文字)",
|
||
"fileReadFailed": "ファイルを読み込めませんでした:{name}",
|
||
"answerEndedEarly": "図を描き終える前に回答が終わりました。",
|
||
"attachmentsStillReading": "添付ファイルをまだ読み込んでいます。読み込みが終わってから送信してください。",
|
||
"sendInProgress": "前のメッセージを送信しています。少し待ってからもう一度お試しください。",
|
||
"answerInProgress": "回答をまだ受信しています。終わってからもう一度送信してください。",
|
||
"cannotResend": "このメッセージは送り直せません。送信時の図が保存されていません。",
|
||
"llm": {
|
||
"invalid_api_key": "プロバイダーが API キーを拒否しました。モデル設定で確認してください。",
|
||
"forbidden": "プロバイダーがリクエストを拒否しました。このキーにはこのモデルまたはリージョンの利用権限がない可能性があります。",
|
||
"server_key_forbidden": "本日の無料枠を使い切りました。明日になると自動的に回復します。モデル設定でご自身の API キーを入力すると、引き続きご利用いただけます。",
|
||
"model_not_found": "プロバイダーがこのモデルを認識できません。モデル設定でモデル ID を確認してください。",
|
||
"insufficient_quota": "プロバイダーのアカウントの残高または利用枠がなくなりました。",
|
||
"rate_limited": "プロバイダーがリクエスト数を制限しています。少し待ってから再試行してください。",
|
||
"context_too_long": "会話がこのモデルで扱える長さを超えています。新しいチャットを始めるか、より長いコンテキストに対応したモデルを選んでください。",
|
||
"images_unsupported": "このモデルは画像入力に対応していません。",
|
||
"tools_unsupported": "このモデルはツール呼び出しに対応していません。作図にはツール呼び出しが必要です。別のモデルを選んでください。",
|
||
"output_truncated": "ダイアグラムが完成する前に出力が途中で切れました。リクエストを簡単にするか、設定で出力上限を上げてください。",
|
||
"provider_unavailable": "プロバイダーで問題が発生しています。しばらくしてから再試行してください。",
|
||
"cannot_connect": "プロバイダーに接続できません。Base URL とネットワークを確認してください。",
|
||
"timeout": "プロバイダーから時間内に応答がありませんでした。",
|
||
"openModelSettings": "モデル設定を開く"
|
||
}
|
||
},
|
||
"quota": {
|
||
"dailyLimit": "1日の割当量に達しました",
|
||
"tokenLimit": "1日のトークン制限に達しました",
|
||
"tpmLimit": "レート制限",
|
||
"tpmMessage": "リクエストが多すぎます。しばらくお待ちください。",
|
||
"tpmMessageDetailed": "レート制限に達しました({limit}トークン/分)。{seconds}秒待ってからもう一度リクエストしてください。",
|
||
"messageApi": "今日のデモ利用上限に達したようです。楽しんでいただけて嬉しいです。皆様に公平にご利用いただくため、利用量に上限を設けています。",
|
||
"messageApiSelfHosted": null,
|
||
"messageToken": "今日のトークン利用上限に達したようです。楽しんでいただけて嬉しいです。皆様に公平にご利用いただくため、利用量に上限を設けています。",
|
||
"messageTokenSelfHosted": null,
|
||
"tip": "<strong>ヒント:</strong>独自の API キーを使用する(設定アイコンをクリック)か、プロジェクトをセルフホストしてこれらの制限を回避できます。",
|
||
"tipSelfHosted": "<strong>ヒント:</strong>設定で独自の API キーを設定することで、引き続きサービスをご利用いただけます。",
|
||
"reset": "制限は明日リセットされます。ご理解ありがとうございます。",
|
||
"configModel": "APIキーを使用",
|
||
"selfHost": "セルフホスト",
|
||
"sponsor": "スポンサー",
|
||
"learnMore": "詳細 →",
|
||
"usedOf": "{used}/{limit}"
|
||
},
|
||
"tools": {
|
||
"truncated": "切り捨て"
|
||
},
|
||
"file": {
|
||
"reading": "読み込み中...",
|
||
"chars": "文字",
|
||
"removeFile": "ファイルを削除"
|
||
},
|
||
"url": {
|
||
"title": "URLからコンテンツを抽出",
|
||
"description": "URLを貼り付けてそのコンテンツを抽出および分析します",
|
||
"Extracting": "抽出中...",
|
||
"extract": "抽出",
|
||
"Cancel": "キャンセル",
|
||
"enterUrl": "URLを入力してください",
|
||
"invalidFormat": "無効なURL形式です",
|
||
"failed": "このページを読み込めませんでした"
|
||
},
|
||
"reasoning": {
|
||
"thinking": "考え中...",
|
||
"thoughtFor": "{duration} 秒考えました",
|
||
"thoughtForOne": "1 秒考えました",
|
||
"thoughtBrief": "数秒考えました"
|
||
},
|
||
"dev": {
|
||
"title": "開発:XMLストリーミングシミュレーター",
|
||
"preset": "プリセット:",
|
||
"selectPreset": "プリセットを選択...",
|
||
"clear": "クリア",
|
||
"placeholder": "ここに mxCell XML を貼り付けるか、プリセットを選択...",
|
||
"interval": "間隔:",
|
||
"chars": "文字:",
|
||
"streaming": "ストリーミング中...",
|
||
"simulate": "シミュレート",
|
||
"stop": "停止",
|
||
"testQuotaToast": "クォータトーストをテスト",
|
||
"simulatingMessage": "[開発] XMLストリーミングをシミュレート中",
|
||
"successMessage": "ダイアグラムの表示に成功しました。"
|
||
},
|
||
"about": {
|
||
"modelChange": "モデル変更と利用制限について",
|
||
"walletCrying": "(別名:お財布が悲鳴を上げています)",
|
||
"seekingSponsorship": "スポンサー募集",
|
||
"contactMe": "お問い合わせ",
|
||
"usageNotice": "利用量の増加に伴い、コスト削減のためモデルを Claude から minimax-m2 に変更し、いくつかの利用制限を設けました。詳細は概要ページをご覧ください。"
|
||
},
|
||
"sessionHistory": {
|
||
"tooltip": "チャット履歴",
|
||
"newChat": "新しいチャット",
|
||
"empty": "まだ図はありません",
|
||
"emptyHint": "会話を始めてください",
|
||
"today": "今日",
|
||
"yesterday": "昨日",
|
||
"thisWeek": "今週",
|
||
"earlier": "それ以前",
|
||
"deleteTitle": "この図を削除しますか?",
|
||
"deleteDescription": "図とその会話は完全に削除されます。",
|
||
"justNow": "たった今",
|
||
"searchPlaceholder": "図を検索…",
|
||
"noResults": "チャットが見つかりません",
|
||
"rename": "名前を変更",
|
||
"busyHint": "回答が終わると選べます"
|
||
},
|
||
"validation": {
|
||
"title": "ダイアグラムを検証",
|
||
"capturing": "キャプチャ中",
|
||
"validating": "検証中",
|
||
"validatingWithAttempt": "検証中 ({attempt}/{max})",
|
||
"valid": "有効",
|
||
"validWithWarnings": "有効(警告あり)",
|
||
"issuesFound": "問題が見つかりました",
|
||
"error": "エラー",
|
||
"skipped": "スキップ",
|
||
"capturedScreenshot": "キャプチャした画像:",
|
||
"issuesFoundLabel": "検出された問題:",
|
||
"suggestions": "提案:",
|
||
"passedValidation": "ダイアグラムは視覚検証に合格しました - 問題は検出されませんでした。",
|
||
"improvementRequested": "改善リクエスト済み - 下の新しいダイアグラムを確認してください",
|
||
"improveWithSuggestions": "提案で改善",
|
||
"regenerateWithFeedback": "検証フィードバックを使用してダイアグラムを再生成"
|
||
},
|
||
"modelConfig": {
|
||
"configure": "設定",
|
||
"addProvider": "プロバイダーを追加",
|
||
"addModel": "モデルを追加",
|
||
"modelId": "モデルID",
|
||
"modelLabel": "表示名",
|
||
"streaming": "ストリーミングを有効",
|
||
"deleteProvider": "プロバイダーを削除",
|
||
"deleteModel": "モデルを削除",
|
||
"noModels": "モデルが設定されていません。モデルを追加してください。",
|
||
"validationError": "テストに失敗しました",
|
||
"addModelFirst": "先にモデルを追加してください。",
|
||
"displayName": "表示名",
|
||
"bedrockApiKey": "Bedrock API キー",
|
||
"bedrockApiKeyHint": "API キーを入力すれば、下のアクセスキーは不要です。",
|
||
"awsAccessKeyId": "AWS アクセスキー ID",
|
||
"awsSecretAccessKey": "AWS シークレットアクセスキー",
|
||
"awsRegion": "AWS リージョン",
|
||
"selectRegion": "リージョンを選択",
|
||
"apiKey": "API キー",
|
||
"enterApiKey": "API キーを入力",
|
||
"enterSecretKey": "シークレットアクセスキーを入力",
|
||
"baseUrl": "ベース URL",
|
||
"optional": "(オプション)",
|
||
"getApiKey": "API キーを取得",
|
||
"noTools": "ツール呼び出し非対応",
|
||
"mayNotDraw": "models.dev によると、このモデルはツール呼び出しに対応していないため、作図できない可能性があります。",
|
||
"requestUrl": "リクエスト先: {url}",
|
||
"baseUrlWithExample": "ベース URL(オプション、例: {example})",
|
||
"customEndpoint": "カスタムエンドポイント URL",
|
||
"minimaxBaseUrlHint": "/anthropic で Anthropic 互換 API(推奨)、または /v1 で OpenAI 互換 API を使用",
|
||
"mimoBaseUrlHint": "デフォルトは従量課金キー(sk-...)用です。Token Plan 加入者(tp-... キー)は https://token-plan-cn.xiaomimimo.com/v1 を設定してください",
|
||
"models": "モデル",
|
||
"customModelId": "カスタムモデル ID...",
|
||
"allAdded": "すべて追加済み",
|
||
"modelIdEmpty": "モデル ID は空にできません",
|
||
"modelIdExists": "このモデル ID は既に存在します",
|
||
"deleteConfirmDesc": "{name} を削除してもよろしいですか?設定されたすべてのモデルが削除され、元に戻せません。",
|
||
"typeToConfirm": "確認のため「{name}」と入力",
|
||
"typeProviderName": "プロバイダー名を入力...",
|
||
"requestFailed": "リクエストに失敗しました({status})",
|
||
"cancel": "キャンセル",
|
||
"delete": "削除",
|
||
"clickToChange": "(クリックして変更)",
|
||
"usingServerDefault": "サーバーデフォルトモデルを使用中",
|
||
"selectModel": "モデルを選択",
|
||
"searchModels": "モデルを検索...",
|
||
"noModelsFound": "モデルが見つかりません。",
|
||
"default": "デフォルト",
|
||
"serverDefault": "サーバーのモデル",
|
||
"serverModels": "サーバーモデル",
|
||
"userModels": "ユーザーモデル",
|
||
"configureModels": "モデルを設定...",
|
||
"serverDefaultModel": "サーバーデフォルトモデル",
|
||
"showValue": "値を表示",
|
||
"hideValue": "値を非表示",
|
||
"myProviders": "マイプロバイダー",
|
||
"inUse": "使用中",
|
||
"listSeparator": "、",
|
||
"serverModelsTitle": "このサーバーのモデル",
|
||
"serverDefaultSummary": "API キーは不要です。サーバーの既定のモデルを使います。",
|
||
"statusError": "{count} 個でエラー",
|
||
"statusIncomplete": "設定が終わっていません",
|
||
"statusUntested": "{count} 個が未テスト",
|
||
"statusOk": "{count} 個が使用可能",
|
||
"noModelsYet": "モデルはまだありません",
|
||
"keysStayLocal": "API キーはこの端末のブラウザーにだけ保存され、リクエストのときだけサーバーに送られます。",
|
||
"useOwnKey": "自分の API キーを使う",
|
||
"useOwnKeyHint": "プロバイダーを追加すると、チャットのモデル選択でそのモデルを使えます。まず一つ選んでください:",
|
||
"viewAllProviders": "{count} 個のプロバイダーをすべて表示",
|
||
"searchProviders": "プロバイダーを検索(例:DeepSeek、Qwen、Ollama)",
|
||
"noProvidersFound": "一致するプロバイダーはありません。",
|
||
"groupVendors": "モデル開発元",
|
||
"groupAggregators": "アグリゲーター",
|
||
"groupCloud": "クラウド",
|
||
"groupSelfHosted": "セルフホスト",
|
||
"noteBedrock": "AWS 認証情報",
|
||
"noteVertex": "Express モードのキー",
|
||
"noteAzure": "キーとリソース URL",
|
||
"noteEdgeone": "キー不要",
|
||
"noteOllama": "キーは任意",
|
||
"noteSglang": "サーバーの URL",
|
||
"added": "追加済み",
|
||
"awsCredentials": "AWS 認証情報",
|
||
"bedrockAuthApiKey": "Bedrock API キー",
|
||
"bedrockAuthAccessKey": "アクセスキー",
|
||
"moreOptions": "その他のオプション:ベース URL、表示名",
|
||
"moreOptionsName": "その他のオプション:表示名",
|
||
"keyRejected": "プロバイダーがこの API キーを拒否しました。上のキーが最後までコピーされているか確認してください。",
|
||
"modelNotFound": "プロバイダーがこのモデル ID を見つけられません。綴りを確認してください。",
|
||
"modelWorks": "使用可能",
|
||
"modelWorksTime": "使用可能 · {seconds} 秒",
|
||
"modelFailed": "エラー",
|
||
"modelUntested": "未テスト",
|
||
"needKey": "先に API キーを入力してください。",
|
||
"needAws": "先に AWS 認証情報とリージョンを入力してください。",
|
||
"needModel": "先にモデルを追加してください。",
|
||
"stepConnect": "接続",
|
||
"edgeoneNoKey": "EdgeOne Pages はこのサイトのデプロイに付属するモデルサービスを使うため、API キーは不要です。",
|
||
"stepModels": "モデル",
|
||
"fetchAllModels": "{name} から全モデルを取得",
|
||
"suggestedLabel": "おすすめ:",
|
||
"orTypeModelId": "または別のモデル ID を入力",
|
||
"add": "追加",
|
||
"browseModels": "モデル一覧",
|
||
"stepTest": "テスト",
|
||
"testHint": "各モデルに短いメッセージを送り、キーとモデルが使えるか確認します。",
|
||
"testOne": "{model} をテスト",
|
||
"testAll": "{count} 個のモデルをすべてテスト",
|
||
"testPassedOne": "{model} は使用できます",
|
||
"testPassedAll": "{count} 個のモデルすべてが使用できます",
|
||
"answeredIn": "(応答 {seconds} 秒)",
|
||
"useInChat": "チャットで {model} を使う",
|
||
"backToProviders": "プロバイダー一覧に戻る",
|
||
"deleteProviderOnly": "{name} を削除",
|
||
"addProviderEntry": "プロバイダーを追加…",
|
||
"awsKeysRejected": "AWS がこのアクセスキーを拒否しました。2 つとも最後までコピーされているか確認してください。",
|
||
"needAzure": "先に API キーと Azure リソースのベース URL を入力してください。",
|
||
"validationFailedCountOne": "{count} 個のモデルがテストに失敗しました",
|
||
"validationFailedCountOther": "{count} 個のモデルがテストに失敗しました",
|
||
"deleteProviderNamedOne": "{name} とそのモデルを削除",
|
||
"deleteProviderNamedOther": "{name} と {count} 個のモデルを削除",
|
||
"serverModelsSummaryOne": "API キーは不要です。{count} 個:{names}",
|
||
"serverModelsSummaryOther": "API キーは不要です。{count} 個:{names}",
|
||
"noModelsReturned": "プロバイダーからモデルが返されませんでした。",
|
||
"awsSessionToken": "AWS セッショントークン(任意)",
|
||
"awsSessionTokenHint": "一時的な認証情報(ASIA で始まるアクセスキー)の場合だけ必要です。",
|
||
"bedrockBothSaved": "このプロバイダーにはアクセスキーも保存されていますが、API キーがある間は使われません。",
|
||
"removeAccessKeys": "アクセスキーを削除"
|
||
},
|
||
"templates": {
|
||
"emptyTitle": "保存したプロンプトはまだありません",
|
||
"emptyDescription": "「…の AWS 構成図を描いて」のようによく使うプロンプトを保存すると、ここに表示されます。",
|
||
"createFirst": "最初のプロンプトを保存",
|
||
"neverUsed": "未使用",
|
||
"usedCount": "{count} 回使用",
|
||
"myTemplates": "保存したプロンプト",
|
||
"createTitle": "プロンプトを保存",
|
||
"createDescription": "あとで使えるようにプロンプトを保存します。",
|
||
"promptLabel": "プロンプト",
|
||
"promptPlaceholder": "作成するダイアグラムを説明してください...",
|
||
"promptRequired": "プロンプトは必須です",
|
||
"titleLabel": "タイトル",
|
||
"titlePlaceholder": "タイトルを入力",
|
||
"titleHint": "空欄の場合はプロンプトの最初の20文字が使用されます",
|
||
"descriptionLabel": "説明",
|
||
"descriptionPlaceholder": "このプロンプトの用途",
|
||
"pinnedLabel": "先頭に固定",
|
||
"pinnedHint": "固定したプロンプトはリストの先頭に表示されます",
|
||
"createButton": "保存",
|
||
"createFailed": "プロンプトを保存できませんでした。もう一度お試しください。",
|
||
"editTitle": "プロンプトを編集",
|
||
"editDescription": "プロンプトと設定を変更します。",
|
||
"updateFailed": "プロンプトを更新できませんでした。もう一度お試しください。",
|
||
"duplicate": "複製",
|
||
"copySuffix": "(コピー)",
|
||
"deleteTitle": "このプロンプトを削除しますか?",
|
||
"deleteDescription": "プロンプトは完全に削除されます。",
|
||
"confirmSendTitle": "現在の入力を置き換えますか?",
|
||
"confirmSendDescription": "入力欄に未送信の内容があります。このプロンプトを送ると置き換わります。",
|
||
"confirmSendButton": "送信",
|
||
"searchPlaceholder": "プロンプトを検索…",
|
||
"searchNoResults": "一致するプロンプトはありません",
|
||
"pin": "上部にピン留め",
|
||
"unpin": "ピン留め解除",
|
||
"saveAsTemplate": "このプロンプトを保存",
|
||
"exportTemplates": "プロンプトをエクスポート",
|
||
"importTemplates": "プロンプトをインポート",
|
||
"exportEmpty": "エクスポートするプロンプトがありません",
|
||
"exportSuccess": "{count} 件のプロンプトをエクスポートしました",
|
||
"importNoFile": "JSON ファイルを選択してください",
|
||
"importFailed": "インポートに失敗しました:{error}",
|
||
"importSuccess": "{imported} 件のプロンプトをインポートし、重複 {skipped} 件をスキップしました",
|
||
"saveDisabledHint": "先にプロンプトを入力してください"
|
||
},
|
||
"admin": {
|
||
"title": "管理者設定",
|
||
"loginPrompt": "管理者パスワード(環境変数 ADMIN_PASSWORD)を入力してください",
|
||
"password": "パスワード",
|
||
"signIn": "ログイン",
|
||
"signingIn": "ログイン中…",
|
||
"loginFailed": "ログインに失敗しました",
|
||
"precedence": "優先順位:このページ > 環境変数 > 既定値",
|
||
"notWritable": "この環境では設定を保存できず、表示のみです。環境変数で設定してください",
|
||
"settingGroups": "設定の分類",
|
||
"enabled": "オン",
|
||
"disabled": "オフ",
|
||
"enableGroup": "{group} をオンにする",
|
||
"unsavedChanges": "未保存の変更があります",
|
||
"saved": "保存しました。「再起動が必要」の項目以外はすぐに反映されます",
|
||
"saveFailed": "保存に失敗しました。接続を確認してもう一度お試しください",
|
||
"invalidSettings": "入力に誤りがある設定があります。項目の下の説明を確認してください",
|
||
"discard": "変更を破棄",
|
||
"saveChanges": "変更を保存",
|
||
"saving": "保存中…",
|
||
"sourceSaved": "このページ",
|
||
"sourceEnv": "環境変数",
|
||
"sourceSavedTitle": "このページで設定した値",
|
||
"sourceEnvTitle": "環境変数による設定",
|
||
"restartRequired": "再起動が必要",
|
||
"modified": "変更済み",
|
||
"notSet": "未設定",
|
||
"savedReplace": "保存済み({hint})。新しい値を入力すると置き換わります",
|
||
"showValue": "表示",
|
||
"hideValue": "非表示",
|
||
"removeValue": "クリア",
|
||
"removeValueTitle": "保存した値をクリア",
|
||
"resetToDefault": "デフォルトに戻す",
|
||
"models": "モデル",
|
||
"modelsDescription": "全ユーザーが使えるモデル。個人の API キーは不要です",
|
||
"addProviderHint": "プロバイダーを追加して、全ユーザーにモデルを提供します",
|
||
"selectProviderHint": "プロバイダーを選択または追加し、キーとモデルを入力します",
|
||
"addProviderToOfferModels": "モデルを 1 つ以上追加すると、ユーザーにこのプロバイダーが表示されます",
|
||
"managedViaEnv": "(環境変数)",
|
||
"envReadOnly": "AI_MODELS_CONFIG / ai-models.json で定義されています。ここでは表示のみで、変更はそちらで行ってください",
|
||
"defaultModel": "デフォルトモデル",
|
||
"noModelsConfigured": "モデルはまだありません",
|
||
"modelCount": "{count} 個のモデル",
|
||
"modelCountPlural": "{count} 個のモデル",
|
||
"default": "デフォルト",
|
||
"setAsDefault": "既定のプロバイダーにする",
|
||
"defaultProvider": "既定のプロバイダー",
|
||
"modelIdPlaceholder": "モデル ID…",
|
||
"addModel": "モデルを追加",
|
||
"suggested": "おすすめ",
|
||
"test": "テスト",
|
||
"testOk": "成功({ms} ms)",
|
||
"testFailed": "失敗",
|
||
"removeModel": "{model} を削除",
|
||
"deleteProviderTitle": "{name} を削除しますか?",
|
||
"deleteProviderDesc": "保存すると、このプロバイダーのキーとモデルがサーバーから削除されます",
|
||
"cancel": "キャンセル",
|
||
"delete": "削除",
|
||
"groups": {
|
||
"generation": {
|
||
"title": "応答の設定",
|
||
"description": "AI の応答のしかたを決めます。すべての会話に適用されます"
|
||
},
|
||
"access": {
|
||
"title": "アクセス権",
|
||
"description": "このサイトを使える人を制限します"
|
||
},
|
||
"features": {
|
||
"title": "オプション機能",
|
||
"description": "追加機能と安全のための設定"
|
||
},
|
||
"observability": {
|
||
"title": "呼び出し記録",
|
||
"description": "モデルの呼び出しを Langfuse に記録します"
|
||
},
|
||
"quota": {
|
||
"title": "使用量の制限",
|
||
"description": "IP ごとの制限。DynamoDB テーブルがあるときだけ有効です"
|
||
}
|
||
},
|
||
"settings": {
|
||
"TEMPERATURE": {
|
||
"label": "温度",
|
||
"description": "高いほどランダムになります。温度に対応しない推論モデルでは空にしてください"
|
||
},
|
||
"MAX_OUTPUT_TOKENS": {
|
||
"label": "出力トークン上限"
|
||
},
|
||
"ACCESS_CODE_LIST": {
|
||
"label": "アクセスコード",
|
||
"description": "複数はカンマ区切り。いずれかを入力しないと使えません。空なら制限なし"
|
||
},
|
||
"ENABLE_VLM_VALIDATION": {
|
||
"label": "図のチェック",
|
||
"description": "描画後、画像を読めるモデルがスクリーンショットをチェックします"
|
||
},
|
||
"VALIDATION_MODEL": {
|
||
"label": "チェック用モデル",
|
||
"description": "空なら既定のモデルを使います"
|
||
},
|
||
"VALIDATION_TIMEOUT": {
|
||
"label": "チェックのタイムアウト(ms)"
|
||
},
|
||
"ENABLE_HISTORY_XML_REPLACE": {
|
||
"label": "古い図を省略",
|
||
"description": "会話履歴の古い図は短い印だけ残します"
|
||
},
|
||
"ALLOW_PRIVATE_URLS": {
|
||
"label": "内部ネットワークへのアクセス",
|
||
"description": "オフにすると、ユーザーが指定するモデルの URL に内部アドレスを使えなくなり、安全です"
|
||
},
|
||
"LANGFUSE_PUBLIC_KEY": {
|
||
"label": "Langfuse Public Key"
|
||
},
|
||
"LANGFUSE_SECRET_KEY": {
|
||
"label": "Langfuse Secret Key"
|
||
},
|
||
"LANGFUSE_BASEURL": {
|
||
"label": "Langfuse の URL"
|
||
},
|
||
"DAILY_REQUEST_LIMIT": {
|
||
"label": "1 日のリクエスト数",
|
||
"description": "IP ごとの 1 日あたりのリクエスト数の上限"
|
||
},
|
||
"DAILY_TOKEN_LIMIT": {
|
||
"label": "1 日のトークン数",
|
||
"description": "IP ごとの 1 日あたりのトークン使用量の上限"
|
||
},
|
||
"TPM_LIMIT": {
|
||
"label": "1 分あたりのトークン数"
|
||
},
|
||
"DYNAMODB_QUOTA_TABLE": {
|
||
"label": "DynamoDB テーブル名",
|
||
"description": "空なら使用量を制限しません"
|
||
},
|
||
"DYNAMODB_REGION": {
|
||
"label": "DynamoDB リージョン"
|
||
},
|
||
"QUOTA_TIMEZONE": {
|
||
"label": "タイムゾーン",
|
||
"description": "1 日の使用量はこのタイムゾーンの 0 時にリセットされます"
|
||
}
|
||
}
|
||
},
|
||
"workspace": {
|
||
"export": "エクスポート",
|
||
"openFile": ".drawio ファイルを開く",
|
||
"canvasLoading": "キャンバスを読み込み中…",
|
||
"askAi": "ここを AI に直してもらう",
|
||
"untitled": "無題の図",
|
||
"mobileCanvas": "キャンバス",
|
||
"mobileChat": "チャット"
|
||
},
|
||
"selection": {
|
||
"one": "選択中:{label}",
|
||
"many": "{count} 個の図形を選択中",
|
||
"shape": "図形",
|
||
"connector": "コネクタ",
|
||
"remove": "選択した図形を送らない",
|
||
"placeholder": "選択した図形をどう変えたいか書いてください"
|
||
},
|
||
"versions": {
|
||
"strip": "バージョン",
|
||
"created": "図を描きました",
|
||
"edited": "図を修正しました",
|
||
"undone": "この変更は取り消しました",
|
||
"undo": "変更を取り消す",
|
||
"redo": "変更をやり直す",
|
||
"compare": "比較",
|
||
"compareTitle": "バージョンを比較",
|
||
"currentCanvas": "現在のキャンバス",
|
||
"versionLabel": "バージョン {n}",
|
||
"previous": "前のバージョン",
|
||
"next": "次のバージョン",
|
||
"rendering": "プレビューを作成中…",
|
||
"showCode": "XML を表示",
|
||
"hideCode": "XML を隠す",
|
||
"drawing": "図を描いています…",
|
||
"editing": "図を修正しています…",
|
||
"loadingLibrary": "図形ライブラリを読み込み中…",
|
||
"libraryLoaded": "図形ライブラリを読み込みました",
|
||
"failed": "今回はうまくいきませんでした",
|
||
"failedRetrying": "うまくいかなかったので再試行しています",
|
||
"stopped": "停止しました",
|
||
"truncatedHint": "図が完成する前に出力の上限に達しました。もっと簡単な図を頼むか、設定 > 描画 で最大出力トークン数を増やしてください。",
|
||
"noChanges": "目に見える変更はありません",
|
||
"listSeparator": "、",
|
||
"shapesAddedOne": "図形を 1 個追加",
|
||
"shapesAddedOther": "図形を {count} 個追加",
|
||
"edgesAddedOne": "コネクタを 1 本追加",
|
||
"edgesAddedOther": "コネクタを {count} 本追加",
|
||
"shapesChangedOne": "図形を 1 個変更",
|
||
"shapesChangedOther": "図形を {count} 個変更",
|
||
"edgesChangedOne": "コネクタを 1 本変更",
|
||
"edgesChangedOther": "コネクタを {count} 本変更",
|
||
"shapesRemovedOne": "図形を 1 個削除",
|
||
"shapesRemovedOther": "図形を {count} 個削除",
|
||
"edgesRemovedOne": "コネクタを 1 本削除",
|
||
"edgesRemovedOther": "コネクタを {count} 本削除",
|
||
"totals": "{shapes}、{edges}",
|
||
"shapesTotalOne": "図形 1 個",
|
||
"shapesTotalOther": "図形 {count} 個",
|
||
"edgesTotalOne": "コネクタ 1 本",
|
||
"edgesTotalOther": "コネクタ {count} 本",
|
||
"restoreVersion": "v{n} に戻す",
|
||
"restoredVersion": "v{n} に戻しました",
|
||
"undoRestore": "元に戻す",
|
||
"noPreview": "プレビューなし",
|
||
"compareSince": "バージョン {n} から現在までの変更:",
|
||
"isOnCanvas": "現在のキャンバスはこのバージョンと同じです。",
|
||
"differsElsewhere": "1 ページ目の図形と線はバージョン {n} と同じですが、重なり順、ほかのページ、またはページ設定が変わっています。"
|
||
},
|
||
"lobby": {
|
||
"title": "どんな図を描きますか?",
|
||
"lede": "図を説明するか、スクリーンショットや PDF をアップロードしてください。できあがるのは編集もエクスポートもできる draw.io の図です。",
|
||
"placeholder": "例:SMS 認証とリトライを含むログインのシーケンス図",
|
||
"recent": "最近の図",
|
||
"drawYourself": "白紙のキャンバスから始める",
|
||
"openFileHint": "手元の図の続きを編集"
|
||
},
|
||
"shell": {
|
||
"waiting": "MCP サーバーを待っています…",
|
||
"toggleTheme": "ライトとダークを切り替え",
|
||
"connected": "MCP サーバーに接続しました",
|
||
"offline": "MCP サーバーに接続できません",
|
||
"tooLarge": "この図は大きすぎて MCP サーバーに保存できません(10 MB 超)。",
|
||
"unreachable": "MCP サーバーに接続できません。変更は今のところこのタブにだけあります。",
|
||
"restoredFromFile": "図は保存済みファイルから復元されました。このタブに表示されていた内容は履歴にあります。",
|
||
"aiChanged": "編集中に AI が図を変更しました。最後の変更は履歴に保存されました。",
|
||
"historyChanged": "サーバー上の履歴が変わりました。もう一度開いてください。",
|
||
"restoreFailed": "復元に失敗しました。もう一度お試しください。",
|
||
"userEdit": "手で変更しました",
|
||
"showVersions": "バージョンを表示",
|
||
"hideVersions": "バージョンを隠す"
|
||
}
|
||
}
|