diff --git a/studio/frontend/src/i18n/check-parity.ts b/studio/frontend/src/i18n/check-parity.ts index 9808fd0e3..8c027f9ce 100644 --- a/studio/frontend/src/i18n/check-parity.ts +++ b/studio/frontend/src/i18n/check-parity.ts @@ -10,6 +10,7 @@ import { en } from "./locales/en.ts"; import { zhCN } from "./locales/zh-CN.ts"; +import { ja } from "./locales/ja.ts"; type Tree = { readonly [k: string]: string | Tree }; @@ -87,7 +88,10 @@ function checkExtras( } } -const overlays: Record = { "zh-CN": zhCN as unknown as Tree }; +const overlays: Record = { + "zh-CN": zhCN as unknown as Tree, + "ja": ja as unknown as Tree, +}; let anyError = false; for (const [locale, overlay] of Object.entries(overlays)) { diff --git a/studio/frontend/src/i18n/locales/ja.ts b/studio/frontend/src/i18n/locales/ja.ts new file mode 100644 index 000000000..f2020f3cf --- /dev/null +++ b/studio/frontend/src/i18n/locales/ja.ts @@ -0,0 +1,832 @@ +// SPDX-License-Identifier: AGPL-3.0-only +// Copyright 2026-present the Unsloth AI Inc. team. All rights reserved. +// See /studio/LICENSE.AGPL-3.0 + +export const ja = { + common: { + cancel: "キャンセル", + close: "閉じる", + delete: "削除", + done: "完了", + error: "エラー", + export: "エクスポート", + help: "ヘルプ", + loading: "読み込み中...", + new: "新規", + rename: "名前変更", + save: "保存", + saving: "保存中...", + search: "検索", + shutdown: "シャットダウン", + }, + shell: { + beta: "BETA", + brand: "unsloth", + product: "Unsloth Studio", + accountMenu: "{name} のアカウントメニュー", + updateAvailable: "アップデートが利用可能です", + aria: { + home: "Unsloth ホーム", + closeSidebar: "サイドバーを閉じる", + openSidebar: "サイドバーを開く", + chatOptions: "チャットオプション", + runOptions: "実行オプション", + }, + navigation: { + newChat: "新規チャット", + returnToChat: "チャットに戻る", + compare: "比較", + search: "検索", + hub: "ハブ", + train: "トレイン", + recipes: "レシピ", + export: "エクスポート", + recents: "履歴", + settings: "設定", + api: "API", + lightMode: "ライトモード", + darkMode: "ダークモード", + guidedTour: "ガイドツアー", + help: "ヘルプ", + logOut: "ログアウト", + shutdown: "シャットダウン", + }, + notFound: { + title: "ページが見つかりません", + description: "{path} は存在しません。", + backToChat: "チャットに戻る", + }, + dialog: { + deleteChat: { + title: "チャットの削除", + description: '本当にこのチャット "{name}" を削除しますか?', + }, + deleteRun: { + title: "トレーニング実行の削除", + description: '本当にこの実行 "{name}" を削除しますか?', + }, + renameChat: { + title: "チャット名の変更", + placeholder: "チャットのタイトル", + }, + renameRun: { + title: "実行名の変更", + placeholder: "実行名", + }, + }, + toast: { + cannotDeleteRunningRun: "実行中のトレーニングは削除できません", + failedToDeleteChat: "チャットの削除に失敗しました", + failedToDeleteRun: "実行の削除に失敗しました", + failedToRenameChat: "チャット名の変更に失敗しました", + failedToRenameRun: "実行名の変更に失敗しました", + }, + }, + settings: { + title: "設定", + dialog: { + title: "設定", + description: "Unsloth の環境設定を管理します。", + closeAriaLabel: "設定を閉じる", + }, + tabs: { + general: "一般", + profile: "プロフィール", + appearance: "外観", + chat: "チャット", + connections: "接続", + apiKeys: "API", + about: "情報", + }, + general: { + title: "一般", + description: "Unsloth の全体的な設定。", + account: "アカウント", + huggingFaceToken: "Hugging Face トークン", + huggingFaceTokenDescription: "ゲート付きモデルの読み込みや、アーティファクトのプッシュに使用されます。", + hideToken: "トークンを非表示", + showToken: "トークンを表示", + tokenSaved: "トークンを保存しました", + password: "パスワード", + passwordDescription: "この Studio アカウントのパスワードを変更します。", + passwordDialog: { + trigger: "パスワード変更", + title: "パスワード変更", + description: "現在のパスワードと新しいパスワード(最低 {minLength} 文字)を入力してください。", + currentPassword: "現在のパスワード", + newPassword: "新しいパスワード", + confirmPassword: "新しいパスワード(確認)", + currentTooShort: "現在のパスワードは最低 {minLength} 文字である必要があります。", + newTooShort: "新しいパスワードは最低 {minLength} 文字である必要があります。", + mismatch: "パスワードが一致しません。", + samePassword: "新しいパスワードは現在のパスワードと異なる必要があります。", + update: "パスワードを更新", + updating: "更新中...", + updated: "パスワードを更新しました。", + updateFailed: "パスワードの更新に失敗しました。", + }, + chatDefaults: "チャットのデフォルト設定", + autoTitleNewChats: "新規チャットのタイトル自動生成", + autoTitleNewChatsDescription: "最初のメッセージから短いタイトルを自動生成します。", + helperLlm: { + sectionTitle: "Helper LLM", + preloadOnStartup: "起動時に Helper LLM をプリキャッシュする", + preloadOnStartupDescription: "起動時にバックグラウンドで AI アシスト用の Helper モデルをダウンロードします。デフォルトはオフですが、AI アシストが必要に応じてオンデマンドで取得できます。", + disabledByEnv: "バックエンド環境の UNSLOTH_HELPER_MODEL_DISABLE によって無効化されています。", + loadError: "Helper LLM 設定の読み込みに失敗しました。", + saveError: "Helper LLM 設定の保存に失敗しました。", + }, + previewSharing: { + sectionTitle: "プレビュー共有", + enableLabel: "公開プレビューリンク", + enableDescription: "署名付きリンクを持つ人なら誰でも、ログインなしで完了したモデルとチャットできるようになります。オフにすると公開プレビュー画面がオフラインになり、共有リンクが機能しなくなります。", + loadError: "プレビュー共有設定の読み込みに失敗しました。", + saveError: "プレビュー共有設定の保存に失敗しました。", + revokeLabel: "すべてのプレビューリンクを失効", + revokeDescription: "署名シークレットをローテーションして、共有したすべてのリンクを即座に機能不全にします。新しくコピーしたリンクは引き続き機能します。", + revokeAction: "リンクを失効", + revoking: "失効中...", + revokeConfirmTitle: "すべてのプレビューリンクを失効させますか?", + revokeConfirmDescription: "共有したすべてのプレビューリンクが即座に機能しなくなります。この操作は取り消せません。", + revokeConfirmAction: "すべてのリンクを失効", + revoked: "すべてのプレビューリンクを失効させました", + revokeError: "プレビューリンクを失効させることができませんでした", + }, + notifications: { + sectionTitle: "通知", + showLlamaUpdates: "llama.cpp のアップデート通知", + showLlamaUpdatesDescription: "新しいモデルを実行するための新しい llama.cpp ビルドが利用可能になったときに通知します。トレーニングのみを行う場合はオフにしてください。", + }, + gettingStarted: "はじめに", + startOnboarding: "オンボーディングを開始", + startOnboardingDescription: "アカウントを変更せずにセットアップウィザードを再開します。", + startOnboardingAction: "オンボーディングを開始", + uploads: { + sectionTitle: "アップロード", + maxUploadSize: "トレーニングデータセットのアップロード容量制限", + maxUploadSizeDescription: "デフォルトは {defaultSize} MB です。", + }, + storage: { + sectionTitle: "ストレージ", + modelsFolder: "モデルフォルダ", + modelsFolderDescription: "ダウンロードしたモデルの保存先。", + openAction: "開く", + copyAction: "パスをコピー", + copied: "パスをコピーしました", + openError: "フォルダを開けませんでした", + copyError: "パスをコピーできませんでした", + }, + resetPreferences: { + sectionTitle: "危険ゾーン", + label: "すべてのローカル設定をリセット", + description: "ローカル限定の設定を消去します。チャット、APIアクセス、DBに保存された設定は保持されます。", + action: "設定をリセット", + confirmTitle: "すべてのローカル設定をリセットしますか?", + confirmDescription: "ローカル限定の設定を消去し、Unsloth を再読み込みします。チャット、APIアクセス、DBに保存された設定は保持されます。", + confirmAction: "リセットして再読み込み", + }, + }, + profile: { + title: "プロフィール", + description: "Unsloth 内でのプロフィールの表示方法。", + changePicture: "プロフィール写真を変更", + displayName: "表示名", + nickname: "Unsloth での呼び名", + nicknamePlaceholder: "ニックネーム", + nicknameSaved: "希望する名前を保存しました", + avatarShape: "プロフィール写真の形状", + avatarShapeCircle: "円形", + avatarShapeRounded: "角丸", + chooseSloth: "またはナマケモノを選択", + nameSaved: "プロフィール名を保存しました", + namePersistErrorTitle: "プロフィール名を永続化できませんでした", + namePersistErrorDescription: "名前はこのセッション用に更新されましたが、再読み込み後に保持されない可能性があります。", + photoUpdated: "プロフィール写真を更新しました", + photoPersistErrorTitle: "プロフィール写真を永続化できませんでした", + photoPersistErrorDescription: "写真はこのセッション用に更新されましたが、再読み込み後に保持されない可能性があります。", + photoUpdateErrorTitle: "プロフィール写真を更新できませんでした", + imageUseError: "この画像は使用できませんでした。", + }, + appearance: { + title: "外観", + description: "このデバイスでの Unsloth Studio の見た目。", + theme: { + title: "テーマ", + label: "カラー構成", + description: "ライト、ダーク、またはシステム設定に従います。", + system: "システム", + light: "ライト", + dark: "ダーク", + }, + language: { + title: "言語", + label: "表示言語", + description: "Unsloth で使用される言語。", + }, + layout: { + title: "レイアウト", + compactSidebar: "デフォルトでサイドバーを固定", + compactSidebarDescription: "サイドバーをアイコンに折りたたまず、展開したままにします。", + }, + }, + chat: { + title: "チャット", + description: "このデバイスに保存されているチャット履歴を管理します。", + modelDisclaimer: "モデルの免責事項を表示", + modelDisclaimerDescription: 'チャットボックスの下に "LLMs can make mistakes" と表示します。', + artifacts: { + title: "Canvas", + collapseHtmlBlocks: "HTMLブロックを折りたたむ", + collapseHtmlBlocksDescription: "CanvasモードではフルHTMLを自動的に折りたたみます。CanvasがオフのときにもフェンスされたHTMLドキュメントを折りたたむには、これをオンにします。", + allowNetworkAccess: "Canvas のネットワークアクセスを許可", + allowNetworkAccessDescription: "CanvasのプレビューがCDNからスクリプト、スタイル、フォント、メディア、ネットワークリソースを読み込むことを許可します。完全にオフラインでプレビューする場合はオフのままにしてください。", + }, + data: "データ", + exportHistory: "チャット履歴をエクスポート", + exportHistoryDescription: "すべてのチャットとメッセージを JSON としてダウンロードします。", + exportAction: "エクスポート", + exportingAction: "エクスポート中...", + exportConversations: "履歴とプロジェクトをエクスポート", + exportConversationsDescription: "履歴、または履歴とプロジェクトのチャットを、生の JSONL、CSV、または ShareGPT JSONL として、一括またはチャットごとにダウンロードします。", + exportConversationsAction: "エクスポート", + exportScopeRecents: "履歴", + exportScopeAll: "履歴 + プロジェクト", + exportCombinedSuffix: "(一括)", + exportPerChatSuffix: "(チャットごと)", + importChats: "チャットをインポート", + importChatsDescription: "JSONL、NDJSON、または CSV のエクスポートファイルを履歴にインポートします。", + importChatsAction: "インポート", + importNoConversations: "ファイル内に会話が見つかりませんでした。", + importedOneChat: "1 件の会話を履歴にインポートしました。", + importedChatCount: "{count} 件の会話を履歴にインポートしました。", + importFailed: "インポートに失敗しました。", + clearHistory: "チャット履歴を消去", + clearHistoryDescription: "このデバイスからチャット履歴を削除します。", + clearAction: "消去", + clearAllChats: "すべてのチャットを消去", + clearAllChatsDescription: "このデバイスのすべてのチャットを永久に削除します。", + noChatsToClear: "消去するチャットがありません。", + clearOneChatDescription: "このデバイスにある唯一のチャットを永久に削除します。", + clearChatCountDescription: "このデバイスにあるすべての {count} 件のチャットを永久に削除します。", + clearChatsAction: "チャットを消去", + clearOneChatTitle: "1 件のチャットを消去しますか?", + clearChatsTitle: "{count} 件のチャットを消去しますか?", + clearChatsConfirmDescription: "このデバイスのすべてのチャットを永久に削除します。この操作は取り消せません。", + clearingAction: "消去中...", + clearOneChatAction: "1 件のチャットを消去", + clearChatCountAction: "{count} 件のチャットを消去", + clearedAllChats: "すべてのチャットを消去しました", + clearedOneChat: "1 件のチャットを消去しました", + clearedChatCount: "{count} 件のチャットを消去しました", + someChatsCouldNotBeCleared: "一部のチャットを消去できませんでした", + chatsClearedRemainOne: "{clearedCount} 件のチャットを消去しました。1 件のチャットが残っています。もう一度お試しください。", + chatsClearedRemain: "{clearedCount} 件のチャットを消去しました。{remainingCount} 件のチャットが残っています。もう一度お試しください。", + oneChatClearedRemain: "1 件のチャットを消去しました。{remainingCount} 件のチャットが残っています。もう一度お試しください。", + oneChatClearedRemainOne: "1 件のチャットを消去しました。1 件のチャットが残っています。もう一度お試しください。", + storageClearFailedOne: "ストレージの消去に失敗しました。1 件のチャットが残っている可能性があります。もう一度お試しください。", + storageClearFailed: "ストレージの消去に失敗しました。{count} 件のチャットが残っている可能性があります。もう一度お試しください。", + failedToClearChats: "チャットの消去に失敗しました", + }, + connections: { + title: "接続", + description: "プロバイダーと外部接続を管理します。", + }, + apiKeys: { + title: "API", + description: "OpenAI互換 API を介して Unsloth にアクセスします。", + readDocs: "API ドキュメントを読む", + noAccess: "まだ API アクセス権がありません。", + newBadge: "新規", + accessTokens: "アクセストークン", + loadError: "API アクセス権を読み込めませんでした。", + createError: "アクセストークンを作成できませんでした。", + revokeError: "アクセストークンを失効させることができませんでした。", + never: "なし", + tokenNamePlaceholder: "トークン名 (例: production)", + newAccessTokenName: "新規アクセストークン名", + createToken: "トークンを作成", + creating: "作成中...", + newTokenCreated: "新規アクセストークンが作成されました", + accessTokenCopied: "アクセストークンをコピーしました", + copyAccessToken: "アクセストークンをコピー", + copyNow: "今すぐコピーしてください - これは二度と表示されません。", + usageExamples: "使用例", + usageTools: "ツール", + exampleCurlTools: "curl + ツール", + examplePythonTools: "Python + ツール", + exampleCurlAdvanced: "curl + 高度な設定", + examplePythonAdvanced: "Python + 高度な設定", + osUnix: "Linux / macOS / WSL", + osWindows: "Windows", + secureHttps: "セキュア HTTPS", + secureHttpsHint: "0.0.0.0 ポートは依然としてグローバルにアクセス可能です。完全なセキュリティを確保するには、Unsloth Studio を --secure 付きで起動し、この HTTPS リンクのみを公開してください。", + copyTunnelUrl: "トンネル URL をコピー", + copySnippet: "スニペットをコピー", + copy: "コピー", + copied: "コピーしました", + setupDocs: "セットアップドキュメント:", + relativeNever: "なし", + relativeJustNow: "たった今", + relativeHoursAgo: "{count}時間前", + relativeDaysAgo: "{count}日前", + relativeMonthsAgo: "{count}ヶ月前", + relativeYearsAgo: "{count}年前", + expired: "期限切れ", + today: "今日", + inDays: "{count}日後", + created: "作成日時 {value}", + used: "使用日時 {value}", + expires: "有効期限 {value}", + actionsFor: "{name} のアクション", + copyPrefix: "プレフィックスをコピー", + revokeToken: "トークンを失効", + revokeTitle: 'アクセストークン "{name}" を失効させますか?', + revokeDescription: "このトークンを使用しているアプリはすぐにアクセスできなくなります。この操作は取り消せません。", + revokeAction: '"{name}" を失効', + revoking: "失効中...", + }, + about: { + title: "情報", + description: "ドキュメント、リリースノート、フィードバック、およびビルド情報。", + studioVersion: "Unsloth バージョン", + packageVersion: "パッケージバージョン", + llamaCppVersion: "llama.cpp バージョン", + hardware: "ハードウェア", + gpu: "GPU", + cuda: "CUDA", + rocm: "ROCm", + updates: "アップデート", + help: "ヘルプ", + documentation: "ドキュメント", + releaseNotes: "リリースノート", + whatsNew: "新機能", + feedback: "フィードバック", + reportIssue: "問題を報告", + license: { + sectionTitle: "ライセンス", + studioLabel: "Unsloth Studio", + studioLicense: "AGPL-3.0", + studioDescription: "GNU AGPL v3.0 の下でオープンソース化されています。", + libraryLabel: "Unsloth Core", + libraryLicense: "Apache-2.0", + libraryDescription: "Apache 2.0 ライセンスの下で提供されています。", + }, + dangerZone: "危険ゾーン", + shutDownStudio: "Unsloth Studio をシャットダウン", + shutDownStudioDescription: "Unsloth サーバーを停止し、セッションを終了します。", + shutDown: "シャットダウン", + update: { + title: "Unsloth Studio のアップデート", + commandText: "{label} テキスト", + copied: "コピーしました", + copyCommand: "コマンドをコピー", + commandCopied: "{label} をコピーしました", + copyNamedCommand: "{label} をコピー", + checkingInstall: "Unsloth がどのようにインストールされたかを確認中...", + installIntro: "Unsloth のインストールまたはアップデート方法:", + localUpdateHeading: "ローカルアップデート", + installCommandUnix: "macOS/Linux インストールコマンド", + installCommandWindows: "Windows インストールコマンド", + localInstallDetected: "ローカルインストールが検出されました。PyPI で上書きされるのを防ぐため、元のリポジトリからアップデートしてください。", + pullThenUpdate: "最新の変更をプルしてから、ローカルインストーラーを実行してください:", + gitPullCommand: "git pull コマンド", + localInstallerCommand: "ローカルインストーラーコマンド", + sourceInstallDetected: "ソース or VCS パッケージのインストールが検出されました。元のローカルパスまたは Git URL から再インストールしてください。", + repoCheckoutFallback: "リポジトリが手元に残っている場合は、そこからローカルインストーラーを実行してください:", + restartAfterUpdate: "アップデート後に Unsloth を再起動してください。", + desktopManaged: "デスクトップアプリは同梱されているバックエンドを自動的に最新に保ち、新しいバージョンが利用可能になると通知します。", + unknownInstall: "Unsloth がどのようにインストールされたか検出できませんでした。インストーラーまたは PyPI インストールの場合は、上記のコマンドを使用してください。", + localCheckout: "ローカルインストールの場合は、そのリポジトリからローカルインストーラーを実行してください:", + docs: "インストールガイド:", + docsInstall: "インストール", + docsUpdating: "アップデート方法", + docsMac: "Mac", + docsWindows: "Windows", + }, + }, + }, + studio: { + routeTitle: "トレイン", + title: "Fine-tuning Studio", + subtitles: { + configure: "設定とトレーニングの開始", + trainingInProgress: "トレーニング進行中", + viewPastRuns: "過去のトレーニング実行を表示", + viewingPastRun: "過去の実行を表示中", + }, + tabs: { + configure: "設定", + currentRun: "現在の実行", + history: "履歴", + }, + loadingRuntime: "トレーニングランタイムを読み込み中...", + backToHistory: "履歴に戻る", + sections: { + model: "モデル", + dataset: "データセット", + params: "パラメーター", + training: "トレーニング", + charts: "チャート", + progress: "トレーニング進捗", + }, + configure: { + title: "設定", + description: "モデル、データセット、およびトレーニング設定を選択します。", + startTraining: "トレーニング開始", + starting: "開始中...", + loadingModel: "モデルを読み込み中...", + checkingDataset: "データセットを確認中...", + trainingConfig: "トレーニング構成", + }, + model: { + title: "モデル", + description: "ベースモデルとトレーニング方法の選択", + fasterTrainingBadge: "トレーニング速度2倍", + baseModel: "ベースモデル", + localModel: "ローカルモデル", + localModelTooltip: "ローカルにダウンロードされたモデルのパス、またはカスタム HF リポジトリ。", + scanningLocalAndCachedModels: "ローカルおよびキャッシュされたモデルをスキャン中...", + scanning: "スキャン中...", + scanningLocalModels: "ローカルモデルをスキャン中...", + noLocalModelsFound: "ローカルモデルが見つかりません", + noLocalModelsFoundManual: "ローカルモデルが見つかりません。パスを手動を入力してください。", + failedToLoadLocalModels: "ローカルモデルの読み込みに失敗しました", + hfCache: "HF キャッシュ", + customFolders: "カスタムフォルダ", + localDir: "ローカルディレクトリ", + huggingFaceModel: "Hugging Face モデル", + huggingFaceModelTooltip: "Hugging Face モデルを検索するか、推奨リストから選択します。", + searchModels: "モデルを検索...", + searching: "検索中...", + noModelsFound: "モデルが見つかりません", + needsVram: "約 {vram}GB VRAM が必要 (GPU: {gpu}GB)", + tightVram: "約 {vram}GB VRAM (GPU {gpu}GB ではギリギリです)", + vramEstimate: "約 {vram}GB VRAM", + method: "手法", + methodTooltip: "QLoRA は 4-bit 量子化を使用して VRAM 使用量を最小限に抑えます。LoRA は 16-bit を使用します。Full はすべての重みを更新します。CPT (Continued Pretraining) は、チャット形式を適用せずに生のテキストでトレーニングし、モデルを新しいドメインに適応させます。", + readMore: "詳細を読む", + fullFineTune: "フルファインチューニング", + checkingToken: "トークンを確認中...", + getOrUpdateToken: "トークンの取得または更新", + huggingFaceTokenOptional: "Hugging Face トークン (オプション)", + continuedPretraining: "継続事前学習 (CPT)", + localModels: "ローカルモデル", + localModelsFound: "{count} 個のローカル/キャッシュされたモデルが見つかりました", + loadingLocalModels: "ローカルモデルを読み込み中...", + }, + dataset: { + title: "データセット", + description: "トレーニングデータの選択またはアップロード", + source: "データセットのソース", + chooseDataset: "データセットを選択", + chooseDatasetTooltip: "ポップアップのタブを使って、Hugging Face とローカルのレシピ出力を切り替えます。", + localTab: "ローカル", + searchHuggingFaceDatasets: "Hugging Face データセットを検索...", + searchLocalDatasets: "ローカルデータセットを検索...", + searching: "検索中...", + noDatasetsFound: "データセットが見つかりません", + loadingLocalDatasets: "ローカルデータセットを読み込み中...", + failedToLoadLocalDatasets: "ローカルデータセットの読み込みに失敗しました。", + noLocalDatasetsYet: "ローカルデータセットがまだありません。", + noLocalDatasetsMatchSearch: "検索に一致するローカルデータセットがありません。", + openDataRecipes: "データレシピを開く", + browsingSource: "{browsing} を閲覧中。現在の選択は {current} のままです。", + localDatasets: "ローカルデータセット", + localDataset: "ローカルデータセット", + localDatasetRows: " / {count} 行", + huggingFaceDataset: "Hugging Face データセット", + localDatasetMetadata: "ローカルデータセットのメタデータ", + dataRecipeOutput: "データレシピの出力。", + rows: "行数", + columns: "列数", + batches: "バッチ数", + updated: "更新日時", + evalDataset: "評価データセット", + uploading: "アップロード中...", + upload: "アップロード", + uploadEvalFile: "評価ファイルをアップロード", + evalDatasetDescription: "オプション。提供されない場合は、トレーニングデータから一部が自動的に分割されます。", + advanced: "高度な設定", + targetFormat: "ターゲットフォーマット", + targetFormatTooltip: "トレーニングデータのフォーマット。ほとんどのデータセットで自動検出が機能します。", + auto: "自動", + rawText: "生テキスト", + trainSplitStart: "トレーニング分割の開始行", + trainSplitStartTooltip: "開始行のインデックス(0から始まる包含的なインデックス)を指定して、データセットの一部のみをトレーニングします。最初の行から開始する場合は空のままにしてください。", + trainSplitEnd: "トレーニング分割の終了行", + trainSplitEndTooltip: "データセットに含める最後の行のインデックス(0から始まる包含的なインデックス)。たとえば、開始を0、終了を99に設定すると、最初の100行をトレーニングします。残りのすべての行を使用する場合は空のままにしてください。", + endPlaceholder: "終了行", + clear: "クリア", + dropFileOrClick: "ここにファイルをドロップするか、クリックしてアップロード", + viewDataset: "データセットを表示", + uploadFailed: "アップロードに失敗しました", + unknownError: "不明なエラー", + unsupportedFileType: "サポートされていないファイル形式です", + uploadOneFileType: "{types} ファイルを1つアップロードしてください。", + datasetUploaded: "データセットをアップロードしました", + evalDatasetUploaded: "評価データセットをアップロードしました", + uploadOneFileAtATime: "一度に1つのファイルのみアップロードできます", + uploadSingleFileDescription: "トレーニングデータセットのアップロードは単一のファイルのみ受け付けます。", + checkingToken: "トークンを確認中...", + getOrUpdateToken: "トークンの取得または更新", + preview: "データセットのプレビュー", + split: "分割", + subset: "サブセット", + s3: { + title: "S3 構成", + description: "Amazon S3 から .parquet, .json, .jsonl, または .csv データセットを読み込みます", + bucket: "バケット名", + bucketPlaceholder: "my-training-data-bucket", + region: "AWS リージョン", + regionPlaceholder: "us-east-1", + prefix: "パスプレフィックス", + prefixPlaceholder: "datasets/whisper/", + prefixTooltip: "オプション。バケット内のデータセットファイルへのパス", + accessKeyId: "アクセスキー ID", + accessKeyIdPlaceholder: "AKIAIOSFODNN7EXAMPLE", + secretAccessKey: "シークレットアクセスキー", + secretAccessKeyPlaceholder: "AWS シークレットアクセスキーを入力してください", + useIamRole: "IAM ロールを使用", + useIamRoleTooltip: "アクセスキーの代わりに IAM ロールの資格情報を使用します(EC2/SageMaker で推奨)", + testConnection: "接続をテスト", + connectionSuccess: "S3 バケットへの接続に成功しました", + connectionFailed: "S3 バケットへの接続に失敗しました", + comingSoon: "S3 統合は近日公開予定", + comingSoonDescription: "S3 データセットの読み込みには boto3 が必要です。この機能は現在開発中です。", + }, + }, + params: { + title: "パラメーター", + description: "トレーニングのハイパーパラメーターを設定します", + projectName: "プロジェクト名", + optional: "オプション", + projectNameDescription: "トレーニング出力フォルダ名、エクスポートのデフォルト値、および履歴で使用されます。", + loraSettings: "LoRA 設定", + trainingHyperparameters: "トレーニングハイパーパラメーター", + maxSteps: "最大ステップ数", + epochs: "エポック数", + useMaxSteps: "最大ステップ数を使用", + useEpochs: "エポック数を使用", + maxStepsTooltip: "オプティマイザーの総ステップ数を上書きします。", + epochsTooltip: "データセット全体の完全な学習回数。", + epochsDescription: "各エポックは、データセットを丸ごと1回学習することを意味します。", + maxStepsDescription: "トレーニングを固定のオプティマイザーステップ数に制限します。", + contextLength: "コンテキスト長", + contextLengthTooltip: "トレーニングサンプルあたりの最大トークン数。", + customContextLength: "カスタム値を入力", + contextLengthDescription: "トレーニングサンプルの最大シーケンス長", + learningRate: "学習率", + learningRateTooltip: "重み更新のステップサイズ。低い値ほど学習は遅くなりますが安定します。", + learningRateDescription: "推奨値: LoRAは2e-4、CPTは5e-5、フルファインチューニングは2e-5", + embeddingLearningRate: "埋め込み学習率", + embeddingLearningRateTooltip: "CPT が embed_tokens をトレーニングする場合にのみ使用されます。埋め込みは LoRA の重みよりも不安定になりやすいため、通常はより小さな学習率が必要です。空のままにすると lr/10 が使用されます。一般的な範囲はメインの学習率の2倍から10倍小さい値です。語彙やドメイン固有トークンの適応が遅すぎる場合にのみ増やしてください。", + embeddingLearningRateDescription: "空欄にすると lr/10 が使用されます(推奨)。一般的な範囲はメインの学習率の 2倍〜10倍小さい値です。", + rank: "Rank", + rankTooltip: "低ランク行列の次元数。高いほど表現能力が向上します。", + alpha: "Alpha", + alphaTooltip: "LoRA 更新のスクール係数。通常は rank の 2 倍に設定します。", + dropout: "Dropout", + dropoutTooltip: "過学習を抑えるための LoRA レイヤーのドロップアウト確率。", + visionLayers: "ビジョンレイヤー", + languageLayers: "言語レイヤー", + attentionModules: "Attention モジュール", + mlpModules: "MLP モジュール", + targetModules: "Target Modules", + enableLora: "LoRA を有効化", + trainWithLora: "LoRA でトレーニング", + stableRank: "Stable Rank", + memoryEfficient: "メモリ効率化", + optimization: "最適化", + schedule: "スケジュール", + memory: "メモリ", + optimizer: "オプティマイザー", + optimizerTooltip: "最適化アルゴリズム。8-bit 版はメモリ使用量を削減します。ビジョンモデルには Fused が推奨されます。", + lrScheduler: "学習率スケジューラー", + lrSchedulerTooltip: "トレーニング中に学習率をどのように変化させるか。Linear は一定の割合で減少させ、Cosine は緩やかな曲線を描いて減少させます。", + optimizerOptions: { + adamw8bit: "AdamW 8-bit", + pagedAdamw8bit: "Paged AdamW 8-bit", + adamwBnb8bit: "AdamW BNB 8-bit", + pagedAdamw32bit: "Paged AdamW 32-bit", + adamwTorch: "AdamW (PyTorch)", + adamwTorchFused: "AdamW (PyTorch Fused)", + }, + lrSchedulerOptions: { + linear: "Linear", + cosine: "Cosine", + }, + batchSize: "バッチサイズ", + batchSizeTooltip: "ステップごとに処理されるサンプル数。高いほど多くの VRAM を使用します。", + gradAccum: "勾配累積", + gradAccumTooltip: "VRAM を追加消費せずに、疑似的に大きなバッチサイズをシミュレートします。", + weightDecay: "Weight Decay", + weightDecayTooltip: "過学習を防ぐための L2 正則化。", + warmupSteps: "ウォームアップステップ数", + warmupStepsTooltip: "安定性の向上を目的として、トレーニング開始時に学習率を徐々に増加させます。", + scheduleEpochsTooltip: "データセット全体の完全な学習回数。0 に設定すると最大ステップ数に基づいて実行されます。", + saveSteps: "保存ステップ間隔", + saveStepsTooltip: "N ステップごとにチェックポイントを保存します。0 で無効化します。", + evalSteps: "評価ステップ間隔", + evalStepsTooltip: "評価を行う総トレーニングステップ of 割合 (0-1)。0 に設定すると評価が無効になります。例: 0.01 = ステップの 1% ごとに評価を実行。", + seed: "シード値", + seedTooltip: "再現性のための乱数シード。", + gradCheckpoint: "勾配チェックポイント", + gradCheckpointTooltip: "アクティベーションを再計算することで、計算量と引き換えにメモリを節約します。", + none: "なし", + standard: "標準", + enablePacking: "パッキングを有効化", + assistantCompletionsOnly: "アシスタントの応答のみ学習", + readMore: "詳細を読む", + }, + training: { + title: "トレーニング", + description: "トレーニングの監視と制御", + chartNoDataTitle: "トレーニングデータがまだありません", + chartNoDataDescription: "トレーニングを開始すると、Loss の推移が表示されます", + startTraining: "トレーニング開始", + starting: "開始中...", + loadingModel: "モデルを読み込み中...", + checkingDataset: "データセットを確認中...", + configLabel: "トレーニング構成", + upload: "アップロード", + uploadConfigTooltip: "保存された YAML 構成を読み込みます", + save: "保存", + saveConfigTooltip: "現在の構成を YAML としてダウンロードします", + reset: "リセット", + resetConfigTooltip: "モデルのデフォルト値にリセットします", + configLoaded: "構成を読み込みました", + failedToLoadConfig: "構成の読み込みに失敗しました", + invalidYamlFile: "無効な YAML ファイルです", + failedToReadFile: "ファイルの読み込みに失敗しました", + parametersReset: "パラメーターをモデルのデフォルト値にリセットしました", + audioIncompatible: "このモデルはオーディオをサポートしていません。オーディオ対応のモデルに切り替えるか、オーディオ以外のデータセットを選択してください。", + visionIncompatible: "テキストモデルはマルチモーダルデータセットと互換性がありません。ビジョンモデルに切り替えるか、テキストのみのデータセットを選択してください。", + cancelTitle: "トレーニングを取り消し", + cancelDescription: "現在のトレーニング実行を取り消しますか?", + continueAction: "トレーニングを続行", + cancelAction: "トレーニングを取り消し", + stopTitle: "トレーニングを停止", + stopDescription: "現在のトレーニング実行をどのように停止するか選択してください。", + stopAction: "停止", + stopping: "停止中...", + stopAndSave: "停止して保存", + compareInChat: "チャットで比較", + exportModel: "モデルをエクスポート", + milestone: "マイルストーン", + halfwayDone: "半分完了しました。トレーニングの進捗が 50% を超えました。", + doneNextStep: "トレーニングが完了しました。次のステップ: ベースモデルとファインチューニング後の出力を比較します。", + }, + history: { + title: "履歴", + emptyTitle: "トレーニング実行がまだありません", + emptyDescription: "トレーニング実行がまだありません。「設定」タブで最初のトレーニングを開始してください。", + loadError: "トレーニング実行の読み込みに失敗しました", + deleteError: "トレーニング実行の削除に失敗しました。もう一度お試しください。", + retry: "再試行", + loadMore: "さらに読み込む", + loading: "読み込み中...", + loadingRun: "トレーニング実行を読み込み中...", + runNotFound: "実行が見つかりません", + deleteTitle: "トレーニング実行を削除しますか?", + deleteDescription: "これにより、このトレーニング実行とすべてのメトリクスが永久に削除されます。この操作は取り消せません。", + runCount: "{count} 件の実行", + oneRun: "1 件の実行", + resume: "再開", + resumeTraining: "トレーニングを再開", + resuming: "再開中...", + deleteRun: "実行を削除", + loss: "Loss", + steps: "ステップ数", + lossTrendSparkline: "Loss トレンドスパークライン", + relativeJustNow: "たった今", + relativeMinutesAgo: "{count}分前", + relativeHoursAgo: "{count}時間前", + relativeDaysAgo: "{count}日前", + status: { + completed: "完了", + stopped: "停止", + error: "エラー", + running: "実行中", + continued: "継続", + }, + message: { + completed: "トレーニングが完了しました", + stopped: "トレーニングが停止しました", + running: "トレーニング進行中", + errored: "トレーニングでエラーが発生しました", + }, + copyPreviewLink: "プレビューリンクをコピー", + previewLinkCopied: "プレビューリンクをコピーしました", + previewLinkCopyFailed: "リンクをコピーできませんでした", + }, + charts: { + settings: "チャート設定", + settingsDescription: "トレーニングを実行したまま、チャートの表示を微調整します。", + openSettings: "チャート設定を開く", + viewWindow: "表示ウィンドウ", + viewWindowDescription: "最新のステップのみを表示するか、全履歴を表示するか選択します。", + window: "ウィンドウ", + all: "すべて", + trainingLoss: "トレーニング Loss", + trainingLossDescription: "オーバーレイと EMA スムージングを制御します。", + smoothing: "スムージング", + smoothingDescription: "右に動かすほど滑らかになります。`0` は生データです。", + showRawLoss: "生の Loss を表示", + showSmoothedLoss: "スムージングされた Loss を表示", + showAverageLine: "平均線を表示", + scaleAndCleanup: "スケールとクリーンアップ", + linear: "Linear", + log: "Log", + noClip: "クリップなし", + clipP99: "p99 でクリップ", + clipP95: "p95 でクリップ", + lossAxis: "Loss 軸", + gradientNormAxis: "勾配ノルム軸", + learningRateAxis: "学習率軸", + resetDefaults: "デフォルトにリセット", + loss: "Loss", + smoothed: "スムージング済み", + evalLoss: "評価 Loss", + learningRate: "学習率", + lr: "LR", + gradNorm: "Grad Norm", + gradientNorm: "勾配ノルム", + step: "ステップ {step}", + averageValue: "平均 {value}", + waitingForFirstEvaluationStep: "最初の評価ステップを待機中...", + evaluationNotConfigured: "評価が設定されていません", + evalChartWillAppear: "eval_steps に達するとチャートが表示されます", + setEvalDatasetAndSteps: "評価 Loss を追跡するには、評価データセットと eval_steps を設定してください", + }, + progress: { + title: "トレーニング進捗", + liveMetrics: "リアルタイムトレーニングメトリクス", + exportGguf: "GGUF へエクスポート", + openConfig: "トレーニング構成を開く", + configLabel: "トレーニング構成", + hyperparams: "ハイパーパラメーター", + epochs: "エポック数", + batchSize: "バッチサイズ", + learningRate: "学習率", + optimizer: "オプティマイザー", + maxSteps: "最大ステップ数", + contextLength: "コンテキスト長", + warmupSteps: "ウォームアップステップ数", + rank: "Rank", + alpha: "Alpha", + dropout: "Dropout", + variant: "バリアント", + epoch: "エポック {value}", + percentComplete: "{percent}% 完了", + stepProgress: "ステップ {current} / {total}", + loss: "Loss", + lr: "LR", + gradNorm: "Grad Norm", + project: "プロジェクト", + model: "モデル", + method: "手法", + elapsed: "経過時間: {value}", + eta: "残り時間 (ETA): {value}", + stepsPerSecond: "{value} ステップ/秒", + noStepsPerSecond: "-- ステップ/秒", + tokens: "トークン数: {value}", + gpuMonitor: "GPU モニター", + live: "ライブ", + utilization: "使用率", + temperature: "温度", + vram: "VRAM", + power: "電力", + phase: { + idle: "アイドル", + downloadingModel: "モデルをダウンロード中", + downloadingDataset: "データセットをダウンロード中", + loadingModel: "モデルを読み込み中", + loadingDataset: "データセットを読み込み中", + configuring: "構成中", + training: "トレーニング中", + completed: "完了", + error: "エラー", + stopped: "停止", + }, + }, + trainingStart: { + ready: "準備完了", + downloading: "ダウンロード中", + preparing: "準備中", + left: "残り {eta}", + downloaded: "{size} ダウンロード済み", + terminalStart: "> unsloth トレーニングを開始します...", + preparingResources: "> モデルとデータセットを準備中...", + gettingReady: "> 実行の準備を整えています...", + waitingForFirstStep: "> {message} | 最初のステップを待機中... ({step})", + resumingTraining: "トレーニングを再開しています...", + startingTraining: "トレーニングを開始しています...", + dataset: "データセット", + datasetStreaming: "データセット: ストリーミング(完全なダウンロードなし)", + modelWeights: "モデルの重み", + }, + tour: { + guidedTour: "ガイドツアー", + }, + }, +} as const; diff --git a/studio/frontend/src/i18n/messages.ts b/studio/frontend/src/i18n/messages.ts index e75faf697..ef58ca23f 100644 --- a/studio/frontend/src/i18n/messages.ts +++ b/studio/frontend/src/i18n/messages.ts @@ -4,17 +4,19 @@ import { getLocale } from "./locale-store"; import { en } from "./locales/en"; import { zhCN } from "./locales/zh-CN"; +import { ja } from "./locales/ja"; import type { InterpolationValues, MessageKey } from "./types"; export const LOCALES = { en: { label: "English", nativeLabel: "English" }, "zh-CN": { label: "Chinese (Simplified)", nativeLabel: "简体中文" }, + ja: { label: "Japanese", nativeLabel: "日本語" }, } as const; export type Locale = keyof typeof LOCALES; export type TranslationKey = MessageKey; -export const messages = { en, "zh-CN": zhCN } as const; +export const messages = { en, "zh-CN": zhCN, ja } as const; const PLACEHOLDER_PATTERN = /\{([a-zA-Z0-9_]+)\}/g;