feat(i18n): add Japanese (ja-JP) language support (#450)

This commit is contained in:
Jun Endo 2026-01-22 11:49:44 +09:00 committed by GitHub
parent d8006ff5cb
commit 0436a851da
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
12 changed files with 978 additions and 6 deletions

View file

@ -63,7 +63,7 @@ In a world dominated by Artificial Intelligence, having the ability to think
- 🎙️ **Generate professional podcasts** - Advanced multi-speaker podcast generation
- 🔍 **Search intelligently** - Full-text and vector search across all your content
- 💬 **Chat with context** - AI conversations powered by your research
- 🌐 **Multi-language UI** - English, Portuguese, and Chinese (Simplified & Traditional) support
- 🌐 **Multi-language UI** - English, Portuguese, Chinese (Simplified & Traditional), and Japanese support
Learn more about our project at [https://www.open-notebook.ai](https://www.open-notebook.ai)

View file

@ -62,7 +62,7 @@ User interactions trigger mutations/queries via hooks, which communicate with th
- Ensures type safety across API calls and store mutations
#### `lib/locales/` — Internationalization (i18n)
- **Locale files** (`en-US/`, `pt-BR/`, `zh-CN/`, `zh-TW/`): Translation strings organized by feature
- **Locale files** (`en-US/`, `pt-BR/`, `zh-CN/`, `zh-TW/`, `ja-JP/`): Translation strings organized by feature
- **`i18n.ts`**: i18next configuration with language detection
- **`use-translation.ts`**: Custom hook with Proxy-based `t.section.key` access pattern
- **Pattern**: Components call `useTranslation()` hook; access strings via `t.common.save`, `t.notebooks.title`

View file

@ -58,6 +58,12 @@ export function LanguageToggle({ iconOnly = false }: LanguageToggleProps) {
>
<span>{t.common.portuguese}</span>
</DropdownMenuItem>
<DropdownMenuItem
onClick={() => setLanguage('ja-JP')}
className={currentLang === 'ja-JP' || currentLang.startsWith('ja') ? 'bg-accent' : ''}
>
<span>{t.common.japanese}</span>
</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)

View file

@ -17,7 +17,8 @@ lib/
├── en-US/index.ts # English translations
├── pt-BR/index.ts # Brazilian Portuguese translations
├── zh-CN/index.ts # Simplified Chinese translations
└── zh-TW/index.ts # Traditional Chinese translations
├── zh-TW/index.ts # Traditional Chinese translations
└── ja-JP/index.ts # Japanese translations
```
## Key Components

View file

@ -22,6 +22,7 @@ export const enUS = {
language: "Language",
english: "English",
chinese: "简体中文",
japanese: "日本語",
source: "Source",
notebook: "Notebook",
podcast: "Podcast",

View file

@ -2,6 +2,7 @@ import { describe, it, expect } from 'vitest'
import { enUS } from './en-US'
import { zhCN } from './zh-CN'
import { zhTW } from './zh-TW'
import { jaJP } from './ja-JP'
describe('Internationalization Locales Integrity', () => {
const getKeys = (obj: Record<string, unknown>, prefix = ''): string[] => {
@ -17,6 +18,7 @@ describe('Internationalization Locales Integrity', () => {
const enKeys = getKeys(enUS)
const zhCNKeys = getKeys(zhCN)
const zhTWKeys = getKeys(zhTW)
const jaJPKeys = getKeys(jaJP)
it('zh-CN should have the same keys as en-US', () => {
const missingInZhCN = enKeys.filter(key => !zhCNKeys.includes(key))
@ -33,4 +35,12 @@ describe('Internationalization Locales Integrity', () => {
expect(missingInZhTW, `Missing keys in zh-TW: ${missingInZhTW.join(', ')}`).toEqual([])
expect(extraInZhTW, `Extra keys in zh-TW: ${extraInZhTW.join(', ')}`).toEqual([])
})
it('ja-JP should have the same keys as en-US', () => {
const missingInJaJP = enKeys.filter(key => !jaJPKeys.includes(key))
const extraInJaJP = jaJPKeys.filter(key => !enKeys.includes(key))
expect(missingInJaJP, `Missing keys in ja-JP: ${missingInJaJP.join(', ')}`).toEqual([])
expect(extraInJaJP, `Extra keys in ja-JP: ${extraInJaJP.join(', ')}`).toEqual([])
})
})

View file

@ -2,17 +2,19 @@ import { zhCN } from './zh-CN';
import { enUS } from './en-US';
import { zhTW } from './zh-TW';
import { ptBR } from './pt-BR';
import { jaJP } from './ja-JP';
export const resources = {
'zh-CN': { translation: zhCN },
'en-US': { translation: enUS },
'zh-TW': { translation: zhTW },
'pt-BR': { translation: ptBR },
'ja-JP': { translation: jaJP },
} as const;
export type TranslationKeys = typeof enUS;
export type LanguageCode = 'zh-CN' | 'en-US' | 'zh-TW' | 'pt-BR';
export type LanguageCode = 'zh-CN' | 'en-US' | 'zh-TW' | 'pt-BR' | 'ja-JP';
export type Language = {
code: LanguageCode;
@ -24,6 +26,7 @@ export const languages: Language[] = [
{ code: 'zh-CN', label: '简体中文' },
{ code: 'zh-TW', label: '繁體中文' },
{ code: 'pt-BR', label: 'Português' },
{ code: 'ja-JP', label: '日本語' },
];
export { zhCN, enUS, zhTW, ptBR };
export { zhCN, enUS, zhTW, ptBR, jaJP };

View file

@ -0,0 +1,947 @@
export const jaJP = {
common: {
search: "検索...",
create: "新規",
new: "新規",
cancel: "キャンセル",
delete: "削除",
edit: "編集",
theme: "テーマ",
signOut: "サインアウト",
noMatches: "一致する結果がありません",
tryDifferentSearch: "別の検索ワードをお試しください。",
light: "ライト",
dark: "ダーク",
system: "システム",
loading: "読み込み中...",
note: "ノート",
insight: "インサイト",
newSource: "新規ソース",
newNotebook: "新規ノートブック",
newPodcast: "新規ポッドキャスト",
language: "言語",
english: "English",
chinese: "简体中文",
japanese: "日本語",
source: "ソース",
notebook: "ノートブック",
podcast: "ポッドキャスト",
quickActions: "クイックアクション",
quickActionsDesc: "ナビゲーション、検索、質問、テーマ",
appName: "Open Notebook",
add: "追加",
remove: "削除",
confirm: "確認",
warning: "警告",
error: "エラー",
success: "成功",
sessions: "セッション",
model: "モデル",
send: "送信",
back: "戻る",
next: "次へ",
done: "完了",
processing: "処理中...",
creating: "作成中...",
tokenCount: "トークン数",
charCount: "文字数",
linked: "リンク済み",
added: "{date}に追加",
adding: "追加中...",
addSelected: "選択項目を追加",
customModel: "カスタムモデル",
messages: "メッセージ",
failed: "失敗",
current: "現在",
save: "保存",
writeNote: "ノートを書く",
batchMode: "一括モード",
optional: "任意",
type: "種類",
title: "タイトル",
created: "{time}に作成",
updated: "{time}に更新",
actions: "アクション",
noResults: "結果なし",
references: "参照",
refreshPage: "ページを更新してください",
refresh: "更新",
aiGenerated: "AI生成",
human: "手動",
unknown: "不明",
notes: "ノート",
chat: "チャット",
details: "詳細",
deleteForever: "完全に削除",
connectionError: "接続エラー",
unableToConnect: "APIサーバーに接続できません",
retryConnection: "再接続",
diagnosticInfo: "診断情報",
version: "バージョン",
built: "ビルド日時",
apiUrl: "API URL",
frontendUrl: "フロントエンドURL",
checkConsoleLogs: "ブラウザコンソールで詳細ログを確認してください(🔧 [Config] メッセージを探してください)",
yes: "はい",
no: "いいえ",
simple: "シンプル",
saving: "保存中...",
description: "説明",
saveToNote: "ノートに保存",
copyToClipboard: "クリップボードにコピー",
close: "閉じる",
insights: "インサイト",
progress: "進捗",
deleting: "削除中...",
created_label: "作成日時",
updated_label: "更新日時",
download: "ダウンロード",
saveChanges: "変更を保存",
name: "名前",
default: "デフォルト",
nameRequired: "名前は必須です",
modelConfiguration: "モデル設定",
resetToDefault: "デフォルトに戻す",
notFound: "見つかりません",
reasoning: "推論",
searchTerms: "検索ワード",
strategy: "戦略",
individualAnswers: "個別回答({count}件)",
finalAnswer: "最終回答",
notebookLabel: "ノートブック: {name}",
itemNotFound: "この{type}は見つかりませんでした",
accessibility: {
navigation: "ナビゲーション",
transformationViews: "トランスフォーメーション表示",
searchKB: "ナレッジベースに質問・検索",
enterQuestion: "ナレッジベースへの質問を入力",
enterSearch: "検索クエリを入力",
searchKBBtn: "ナレッジベースを検索",
podcastViews: "ポッドキャスト表示",
chatSessions: "チャットセッション",
ytVideo: "YouTube動画",
askResponse: "質問への回答",
searchNotebooks: "ノートブックを検索",
},
url: "URL",
errorDetails: "エラー詳細",
editTransformation: "トランスフォーメーションを編集",
comingSoon: "近日公開",
retry: "再試行",
traditionalChinese: "繁體中文",
portuguese: "Português",
completed: "完了",
saveSuccess: "保存しました",
contextModes: {
off: "チャットに含めない",
insights: "インサイトのみ",
full: "全文",
clickToCycle: "クリックで切り替え",
},
clickToEdit: "クリックして編集",
},
apiErrors: {
notebookNotFound: "ノートブックが見つかりません",
sourceNotFound: "ソースが見つかりません",
transformationNotFound: "トランスフォーメーションが見つかりません",
fileUploadFailed: "ファイルのアップロードに失敗しました",
urlRequired: "リンクタイプにはURLが必要です",
contentRequired: "テキストタイプにはコンテンツが必要です",
invalidSourceType: "無効なソースタイプです",
processingFailed: "処理に失敗しました",
failedToQueue: "処理キューへの追加に失敗しました",
invalidSortBy: "ソートフィールドは'created'または'updated'である必要があります",
invalidSortOrder: "ソート順は'asc'または'desc'である必要があります",
accessDenied: "ファイルへのアクセスが拒否されました",
fileNotFoundOnServer: "サーバー上にファイルが見つかりません",
searchFailed: "検索に失敗しました",
askFailed: "質問の処理に失敗しました",
pleaseEnterQuestion: "質問を入力してください",
pleaseConfigureModels: "必要なモデルをすべて設定してください",
failedToCreateSession: "セッションの作成に失敗しました",
failedToUpdateSession: "セッションの更新に失敗しました",
failedToDeleteSession: "セッションの削除に失敗しました",
failedToSendMessage: "メッセージの送信に失敗しました",
unauthorized: "認証エラー。パスワードを確認してください",
invalidPassword: "パスワードが無効です",
missingAuth: "認証情報がありません",
embeddingModelRequired: "この機能にはEmbeddingモデルが必要です。モデルセクションで設定してください。",
strategyModelNotFound: "戦略モデルが見つかりません",
answerModelNotFound: "回答モデルが見つかりません",
finalAnswerModelNotFound: "最終回答モデルが見つかりません",
noAnswerGenerated: "回答を生成できませんでした",
genericError: "予期しないエラーが発生しました",
},
connectionErrors: {
apiTitle: "APIサーバーに接続できません",
apiDesc: "Open Notebook APIサーバーに到達できませんでした",
dbTitle: "データベース接続に失敗しました",
dbDesc: "APIサーバーは稼働していますが、データベースにアクセスできません",
troubleshooting: "考えられる原因:",
apiUnreachable1: "APIサーバーが起動していない",
apiUnreachable2: "APIサーバーが別のアドレスで動作している",
apiUnreachable3: "ネットワーク接続の問題",
dbFailed1: "SurrealDBが起動していない",
dbFailed2: "データベース接続設定が正しくない",
dbFailed3: "APIとデータベース間のネットワーク問題",
quickFixes: "解決方法:",
setApiUrl: "API_URL環境変数を設定:",
checkSurreal: "SurrealDBが起動しているか確認:",
seeDocumentation: "詳細なセットアップ手順はこちら:",
docLink: "Open Notebookドキュメント",
showTechnical: "技術的な詳細を表示",
attemptedUrl: "接続試行URL",
message: "メッセージ",
technicalDetails: "技術的な詳細",
stackTrace: "スタックトレース",
retryLabel: "再接続",
retryHint: "Rキーまたはボタンをクリックして再試行",
dockerLabel: "Docker環境の場合",
localDevLabel: "ローカル開発の場合",
},
auth: {
loginTitle: "Open Notebook",
loginDesc: "パスワードを入力してアプリケーションにアクセス",
passwordPlaceholder: "パスワード",
signingIn: "サインイン中...",
signIn: "サインイン",
unhandledError: "ログイン中に予期しないエラーが発生しました",
connectErrorHint: "サーバーに接続できません。APIが起動しているか確認してください。",
},
navigation: {
collect: "収集",
process: "処理",
create: "作成",
manage: "管理",
sources: "ソース",
notebooks: "ノートブック",
askAndSearch: "質問と検索",
podcasts: "ポッドキャスト",
models: "モデル",
transformations: "トランスフォーメーション",
transformation: "トランスフォーメーション",
settings: "設定",
advanced: "詳細設定",
nav: "ナビゲーション",
language: "言語を切り替え",
theme: "テーマ",
search: "検索",
ask: "質問",
},
notebooks: {
title: "ノートブック",
newNotebook: "新規ノートブック",
searchPlaceholder: "ノートブックを検索...",
archived: "アーカイブ済み",
archive: "アーカイブ",
unarchive: "アーカイブ解除",
deleteNotebook: "ノートブックを削除",
deleteNotebookDesc: "このノートブックを削除しますか?この操作は元に戻せません。",
activeNotebooks: "アクティブなノートブック",
archivedNotebooks: "アーカイブ済みノートブック",
emptyDescription: "最初のノートブックを作成してリサーチを整理しましょう。",
noActiveNotebooks: "アクティブなノートブックがありません",
noArchivedNotebooks: "アーカイブ済みノートブックがありません",
notFound: "ノートブックが見つかりません",
notFoundDesc: "指定されたノートブックは存在しません。",
noDescription: "説明なし...",
updated: "更新日時",
namePlaceholder: "ノートブック名",
addDescription: "説明を追加...",
noNotesYet: "ノートがまだありません",
deleteNote: "ノートを削除",
deleteNoteConfirm: "このノートを削除しますか?この操作は元に戻せません。",
noteCreatedSuccess: "ノートを作成しました",
failedToCreateNote: "ノートの作成に失敗しました",
noteUpdatedSuccess: "ノートを更新しました",
failedToUpdateNote: "ノートの更新に失敗しました",
noteDeletedSuccess: "ノートを削除しました",
failedToDeleteNote: "ノートの削除に失敗しました",
createNew: "新規ノートブックを作成",
createNewDesc: "名前と説明(任意)を入力してください。",
descPlaceholder: "このノートブックについての情報を追加...",
createSuccess: "ノートブックを作成しました",
updateSuccess: "ノートブックを更新しました",
deleteSuccess: "ノートブックを削除しました",
},
sources: {
title: "ソース",
add: "ソースを追加",
addNew: "新規ソースを追加",
addExisting: "既存ソースを追加",
empty: "ソースがまだありません",
emptyDesc: "最初のソースを追加してナレッジベースの構築を始めましょう。",
delete: "ソースを削除",
deleteMsg: "このソースを削除しますか?この操作は元に戻せません。",
statusPreparing: "準備中",
statusQueued: "キュー待ち",
statusProcessing: "処理中",
statusCompleted: "完了",
statusFailed: "失敗",
statusPreparingDesc: "処理の準備中",
statusQueuedDesc: "処理待ち",
statusProcessingDesc: "処理中",
statusCompletedDesc: "処理完了",
statusFailedDesc: "処理失敗",
failedToLoad: "ソースの読み込みに失敗しました",
allSourcesDesc: "すべてのソースを表示します。新しいソースの追加や既存ソースの管理ができます。",
allSources: "すべてのソース",
insights: "インサイト",
yes: "はい",
no: "いいえ",
loadingMore: "さらに読み込み中...",
noSourcesYet: "ソースがまだありません",
allSourcesDescShort: "すべてのソースを表示します。",
cannotSaveNoteNoNotebook: "ートを保存できませんートブックIDが利用できません",
createFirstSource: "最初のソースを追加してナレッジベースの構築を始めましょう。",
deleteSourceConfirm: "このソースを削除しますか?",
deleteConfirm: "削除しますか?",
deleteConfirmWithTitle: "「{title}」を削除しますか?",
deleteSuccess: "ソースを削除しました。注意:ストレージからファイルを削除するには、設定ページで「ファイルを削除」オプションを有効にする必要があります。",
failedToDelete: "ソースの削除に失敗しました",
sourceQueued: "ソースをキューに追加",
sourceQueuedDesc: "ソースをバックグラウンド処理に送信しました。ソース一覧で進捗を確認できます。",
sourceAddedSuccess: "ソースを追加しました",
failedToAddSource: "ソースの追加に失敗しました",
sourceUpdatedSuccess: "ソースを更新しました",
failedToUpdateSource: "ソースの更新に失敗しました",
sourceDeletedSuccess: "ソースを削除しました",
failedToDeleteSource: "ソースの削除に失敗しました",
fileUploadedSuccess: "ファイルをアップロードしました",
failedToUploadFile: "ファイルのアップロードに失敗しました",
sourceRequeued: "ソースの再処理をキューに追加",
sourceRequeuedDesc: "ソースを再処理キューに追加しました。",
failedToRetry: "再試行に失敗",
failedToRetryDesc: "ソースの再処理に失敗しました。もう一度お試しください。",
sourcesAddedToNotebook: "{count}件のソースをノートブックに追加しました",
failedToAddSourcesToNotebook: "ノートブックへのソース追加に失敗しました",
partialAddSuccess: "{success}件追加成功、{failed}件失敗",
sourceRemovedFromNotebook: "ノートブックからソースを削除しました",
failedToRemoveSourceFromNotebook: "ノートブックからのソース削除に失敗しました",
removeConfirm: "ノートブックからこのソースを削除しますか?",
checking: "確認中...",
untitledSource: "無題のソース",
maxItems: "最大{count}件",
insightsCount: "{count}件のインサイト",
details: "詳細",
detailsTitle: "ソース詳細",
content: "コンテンツ",
metadata: "メタデータ",
type: {
link: "リンク",
file: "ファイル",
text: "テキスト",
},
id: "ソースID",
topics: "トピック",
embedded: "Embedding済み",
notEmbedded: "未Embedding",
embedContent: "Embeddingを実行",
embedding: "Embedding中...",
alreadyEmbedded: "Embedding済み",
downloadFile: "ファイルをダウンロード",
fileUnavailable: "ファイルが利用できません",
preparing: "準備中...",
generateNewInsight: "新しいインサイトを生成",
selectTransformation: "トランスフォーメーションを選択...",
noInsightsYet: "インサイトがまだありません",
createFirstInsight: "上のトランスフォーメーションを使って最初のインサイトを作成しましょう",
viewInsight: "インサイトを表示",
deleteInsight: "インサイトを削除",
deleteInsightConfirm: "このインサイトを削除しますか?この操作は元に戻せません。",
deleteNoteConfirm: 'このノートを削除しますか?この操作は元に戻せません。',
editNote: 'ノートを編集',
createNote: 'ノートを作成',
addTitle: 'タイトルを追加...',
untitledNote: '無題のノート',
writeNotePlaceholder: 'ノートの内容をここに入力...',
saveNote: 'ノートを保存',
createNoteBtn: 'ノートを作成',
noNotesYet: "ノートがまだありません",
createFirstNote: "最初のノートを作成してインサイトや気づきを記録しましょう。",
deleteNote: "ノートを削除",
urlLabel: 'URL *',
fileLabel: 'ファイル *',
textContentLabel: 'テキストコンテンツ *',
enterUrlsPlaceholder: 'URLを1行ずつ入力\nhttps://example.com/article1\nhttps://example.com/article2',
batchUrlHint: '複数のURLを貼り付けて一括インポート1行に1つ',
invalidUrlsDetected: '無効なURLが検出されました:',
lineLabel: '{line}行目',
fixInvalidUrls: '無効なURLを修正または削除してください',
selectMultipleFilesHint: '複数ファイルを選択して一括インポート。対応形式ドキュメントPDF、DOC、DOCX、PPT、XLS、EPUB、TXT、MD、メディアMP4、MP3、WAV、M4A、画像JPG、PNG、アーカイブZIP',
selectedFiles: '選択されたファイル:',
textPlaceholder: 'コンテンツを貼り付けまたは入力...',
titlePlaceholder: 'ソースにわかりやすいタイトルを付けてください',
batchTitlesAuto: 'タイトルは各ソースごとに自動生成されます。',
batchCommonSettings: '同じノートブックとトランスフォーメーションがすべてのアイテムに適用されます。',
urlsCount: '{count}件のURL',
filesCount: '{count}件のファイル',
addSource: "ソースを追加",
notEmbeddedAlert: "コンテンツが未Embedding",
notEmbeddedDesc: "このコンテンツはベクトル検索用にEmbeddingされていません。Embeddingを行うと高度な検索機能やコンテンツの発見性が向上します。",
openOnYoutube: "YouTubeで開く",
urlCopied: "URLをクリップボードにコピーしました",
viewSource: "ソースを表示",
noInsightSelected: "インサイトが選択されていません",
sourceInsight: "ソースインサイト",
manageNotebooks: "ノートブックを管理",
manageNotebooksDesc: "このソースを含むノートブックを管理",
noNotebooksAvailable: "利用可能なノートブックがありません",
loadFailed: "ソース詳細の読み込みに失敗しました",
removeFromNotebook: "ノートブックから削除",
retryProcessing: "処理を再試行",
deleteSource: "ソースを削除",
retry: "再試行",
progress: "進捗",
addExistingTitle: "既存ソースを追加",
addExistingDesc: "すべてのノートブックから既存のソースを選択して現在のノートブックに追加します。",
searchPlaceholder: "名前またはURLでソースを検索...",
noNotebooksFound: "ノートブックが見つかりません。",
showingFirst100: "最初の100件を表示中。検索で特定のソースを探してください。",
selectedCount: "{count}件選択中",
added: "{date}に追加",
addUrl: "URLを追加",
uploadFile: "ファイルをアップロード",
enterText: "テキストを入力",
processDescription: "コンテンツはAIによって処理・分析されます。",
processingFiles: "ファイルを処理中...",
titleRequired: "テキストコンテンツにはタイトルが必要です",
titleGenerated: "空欄の場合、コンテンツからタイトルが自動生成されます",
batchCount: "{count}件の{type}が処理されます",
enableEmbedding: "検索用にEmbeddingを有効化",
embeddingDesc: "このソースをベクトル検索やAIクエリで見つけられるようにします",
embeddingAlways: "Embeddingは自動的に有効",
embeddingAlwaysDesc: "設定でベクトル検索用に常にEmbeddingするよう構成されています。",
embeddingNever: "Embeddingは無効",
embeddingNeverDesc: "設定でEmbeddingをスキップするよう構成されています。このソースではベクトル検索は利用できません。",
changeInSettings: "設定で変更できます",
notFound: "ソースが見つかりません",
noContent: "コンテンツがありません",
insightsDesc: "モデル分析から生成されたインサイト",
uploadedFile: "アップロードされたファイル",
fileUnavailableDesc: "ストレージシステムの理由により、このファイルは現在利用できません。",
batchSuccess: "{count}件のソースを作成しました",
batchFailed: "{count}件すべてのソース作成に失敗しました",
batchPartial: "{success}件成功、{failed}件失敗",
submittingSource: "ソースを処理に送信中...",
contentRequired: "選択したソースタイプに必要なコンテンツを入力してください",
titleRequiredForText: "テキストソースにはタイトルが必要です",
processingBatchSources: "{count}件のソースを処理中。しばらくお待ちください。",
processingSource: "ソースを処理中です。しばらくお待ちください。",
maxFilesAllowed: "一括処理は最大{count}件までです",
},
chat: {
sessions: "セッション",
sessionTitlePlaceholder: "タイトルを入力...",
noSessions: "チャットセッションがまだありません",
startChatting: "ソースについてチャットを始めましょう。",
deleteSession: "セッションを削除",
deleteSessionDesc: "このチャットセッションを削除しますか?この操作は元に戻せません。",
sendPlaceholder: "ソースについて何でも質問してください...",
newChat: "新規チャット",
sessionsTitle: "チャットセッション",
clearhistory: "履歴をクリア",
renameSession: "セッション名を変更",
noSourcesLinked: "リンクされたソースがありません",
thinking: "AIが考え中...",
chatWith: "{name}とチャット",
startConversation: "この{type}について会話を始めましょう",
askQuestions: "コンテンツをより深く理解するために質問してください",
pressToSend: "{key}を押して送信",
model: "モデル",
createToStart: 'セッションを作成して開始',
chatWithNotebook: 'ノートブックとチャット',
unableToLoadChat: 'チャットを読み込めません',
noDescription: '説明なし',
startByCreating: '最初のノートブックを作成してリサーチを整理しましょう。',
messagesCount: "{count}件のメッセージ",
sessionCreated: "チャットセッションを作成しました",
sessionUpdated: "セッションを更新しました",
sessionDeleted: "セッションを削除しました",
},
searchPage: {
askAndSearch: "質問と検索",
chooseAMode: "モードを選択",
askBeta: "質問(ベータ)",
search: "検索",
askYourKb: "ナレッジベースに質問(ベータ)",
askYourKbDesc: "LLMがナレッジベース内のドキュメントに基づいてクエリに回答します。",
question: "質問",
enterQuestionPlaceholder: "質問を入力...",
pressToSubmit: "Cmd/Ctrl+Enterで送信",
noEmbeddingModel: "Embeddingモデルが選択されていないため、この機能は使用できません。モデルページで設定してください。",
usingCustomModels: "カスタムモデルを使用中",
usingDefaultModels: "デフォルトモデルを使用中",
advanced: "詳細設定",
strategy: "戦略",
answer: "回答",
final: "最終",
ask: "質問する",
processing: "処理中...",
saveToNotebooks: "ノートブックに保存",
searchDesc: "特定のキーワードやコンセプトでナレッジベースを検索",
enterSearchPlaceholder: "検索クエリを入力...",
pressToSearch: "Enterで検索",
searchType: "検索タイプ",
vectorSearchWarning: "ベクトル検索にはEmbeddingモデルが必要です。テキスト検索のみ利用可能です。",
textSearch: "テキスト検索",
vectorSearch: "ベクトル検索",
searchIn: "検索対象",
searchSources: "ソースを検索",
searchNotes: "ノートを検索",
resultsFound: "{count}件の結果",
matches: "一致({count}件)",
noResultsFor: "「{query}」に一致する結果がありません",
notSet: "未設定",
saveToNotebook: "ノートブックに保存",
saveSuccess: "ノートブックに保存しました",
saveError: "ノートブックへの保存に失敗しました",
selectNotebook: "ノートブックを選択",
createNewNotebook: "新規ノートブックを作成",
cancel: "キャンセル",
searchAndAsk: "検索と質問",
searchResultsFor: "「{query}」の検索結果",
askAbout: "「{query}」について質問",
orSearchKb: "またはナレッジベースを検索",
saving: "保存中...",
advancedModelTitle: "詳細モデル選択",
advancedModelDesc: "質問処理の各段階で使用するモデルを選択",
strategyModel: "戦略モデル",
answerModel: "回答モデル",
finalAnswerModel: "最終回答モデル",
selectStrategyPlaceholder: "戦略モデルを選択",
selectAnswerPlaceholder: "回答モデルを選択",
selectFinalPlaceholder: "最終回答モデルを選択",
saveChanges: "変更を保存",
processingQuestion: "質問を処理中...",
},
podcasts: {
generateEpisode: "ポッドキャストエピソードを生成",
generateEpisodeDesc: "含めるコンテンツを選択し、新しいポッドキャストエピソードを生成する前にエピソードの詳細を設定してください。",
content: "コンテンツ",
contentDesc: "このエピソードに含めるノートブック、ソース、ノートを選択してください。",
itemsSelected: "{count}件選択中",
tokens: "{count}トークン",
chars: "{count}文字",
loadingNotebooks: "ノートブックを読み込み中...",
noNotebooksFoundInPodcasts: "ノートブックが見つかりません。ポッドキャストを生成する前にノートブックを作成してコンテンツを追加してください。",
noContentSelected: "コンテンツが選択されていません",
summary: "要約",
fullContent: "全文",
untitledSource: "無題のソース",
untitledNote: "無題のノート",
episodeSettings: "エピソード設定",
episodeProfile: "エピソードプロファイル",
episodeProfilePlaceholder: "エピソードプロファイルを選択",
episodeName: "エピソード名",
episodeNamePlaceholder: "例AIと仕事の未来",
additionalInstructions: "追加の指示",
instructionsPlaceholder: "エピソードブリーフィングに追加するアドバイス...",
generating: "生成中...",
generate: "生成",
hostPlaceholder: "ホスト{number}",
profileRequired: "エピソードプロファイルが必要です",
profileRequiredDesc: "ポッドキャストを生成する前にエピソードプロファイルを選択してください。",
nameRequired: "エピソード名が必要です",
nameRequiredDesc: "エピソード名を入力してください。",
addContext: "コンテキストを追加",
addContextDesc: "エピソードに含めるソースまたはートを少なくとも1つ選択してください。",
generationFailed: "ポッドキャスト生成に失敗しました",
speakerProfile: "スピーカープロファイル",
usesSpeakerProfile: "スピーカープロファイルを使用",
sources: "ソース",
notes: "ノート",
noSources: "このノートブックにはソースがありません。",
noNotes: "このノートブックにはノートがありません。",
selectMode: "モードを選択",
buildContextFailed: "コンテキストの構築に失敗しました。選択内容を確認してください。",
podcastTaskStarted: "ポッドキャストタスクを開始しました",
loadingProfiles: "エピソードプロファイルを読み込み中...",
noProfilesFound: "エピソードプロファイルが見つかりません。ポッドキャストを生成する前にエピソードプロファイルを作成してください。",
listTitle: "ポッドキャスト",
listDesc: "生成されたエピソードを追跡し、再利用可能なテンプレートを管理します。",
chooseAView: "表示を選択",
episodesTab: "エピソード",
templatesTab: "テンプレート",
overviewTitle: "エピソード概要",
overviewDesc: "ポッドキャスト生成ジョブを監視し、最終成果物を確認します。",
generateBtn: "ポッドキャストを生成",
total: "合計",
processingLabel: "処理中",
completedLabel: "完了",
failedLabel: "失敗",
pendingLabel: "保留中",
loadErrorTitle: "エピソードの読み込みに失敗しました",
loadErrorDesc: "最新のポッドキャストエピソードを取得できませんでした。しばらくしてから再試行してください。",
loadingEpisodes: "エピソードを読み込み中...",
noEpisodesYet: "ポッドキャストエピソードがまだありません。ノートブックまたはソースのチャットインターフェースから最初のエピソードを生成してください。",
statusRunningTitle: "処理中",
statusRunningDesc: "現在アセットを生成中のエピソード。",
statusPendingTitle: "キュー待ち / 保留中",
statusPendingDesc: "処理開始を待っている送信済みエピソード。",
statusCompletedTitle: "完了したエピソード",
statusCompletedDesc: "確認、ダウンロード、公開の準備が整っています。",
statusFailedTitle: "失敗したエピソード",
statusFailedDesc: "生成中に問題が発生したエピソード。",
templatesWorkspaceTitle: "テンプレートワークスペース",
templatesWorkspaceDesc: "高速なポッドキャスト制作のための再利用可能なエピソードおよびスピーカー設定を構築します。",
howTemplatesPowerTitle: "テンプレートがポッドキャスト生成を強化する仕組み",
howTemplatesPowerDesc: "テンプレートはポッドキャストワークフローを2つの再利用可能なビルディングブロックに分割します。新しいエピソードを生成する際に自由に組み合わせてください。",
episodeProfilesSetFormat: "エピソードプロファイルがフォーマットを設定",
episodeProfilesList1: "セグメント数とストーリーの流れを概説",
episodeProfilesList2: "ブリーフィング、アウトライン、スクリプト作成に使用する言語モデルを選択",
episodeProfilesList3: "デフォルトのブリーフィングを保存し、すべてのエピソードで一貫したトーンで開始",
speakerProfilesBringVoices: "スピーカープロファイルが声に命を吹き込む",
speakerProfilesList1: "音声合成プロバイダーとモデルを選択",
speakerProfilesList2: "スピーカーごとの個性、経歴、発音メモを記録",
speakerProfilesList3: "異なるエピソードフォーマットで同じホストやゲストの声を再利用",
recommendedWorkflow: "推奨ワークフロー",
workflowStep1: "必要な各声のスピーカープロファイルを作成",
workflowStep2: "それらのスピーカーを名前で参照するエピソードプロファイルを構築",
workflowStep3: "ストーリーに合ったエピソードプロファイルを選択してポッドキャストを生成",
workflowHint: "エピソードプロファイルはスピーカープロファイルを名前で参照するため、スピーカーから始めることで後の声の割り当て漏れを防ぎます。",
failedToLoadTemplates: "テンプレートデータの読み込みに失敗しました",
failedToLoadTemplatesDesc: "APIが実行中か確認して再試行してください。一部のセクションが不完全な場合があります。",
loadingTemplates: "テンプレートを読み込み中...",
speakerProfilesTitle: "スピーカープロファイル",
speakerProfilesDesc: "生成されるエピソードの声と個性を設定します。",
createSpeaker: "スピーカーを作成",
noSpeakerProfiles: "スピーカープロファイルがまだありません。エピソードテンプレートを利用するには作成してください。",
noDescription: "説明なし。",
usedByCount_one: "1つのエピソードで使用",
usedByCount_other: "{count}個のエピソードで使用",
usedByCount: "{count}個のエピソードで使用",
unused: "未使用",
voiceId: "Voice ID",
backstory: "バックストーリー",
personality: "パーソナリティ",
edit: "編集",
duplicate: "複製",
deleteSpeakerProfileTitle: "スピーカープロファイルを削除しますか?",
deleteSpeakerProfileDesc: "「{name}」を削除すると元に戻せません。",
deleteSpeakerDisabledHint: "削除する前にエピソードプロファイルからこのスピーカーを削除してください。",
deleting: "削除中...",
episodeProfilesTitle: "エピソードプロファイル",
episodeProfilesDesc: "番組用の再利用可能な生成設定を定義します。",
createProfile: "プロファイルを作成",
createSpeakerFirst: "エピソードプロファイルを追加する前にスピーカープロファイルを作成してください。",
noEpisodeProfiles: "エピソードプロファイルがまだありません。ポッドキャスト生成を開始するには作成してください。",
speakerCreated: "スピーカーを作成しました",
speakerCreatedDesc: "スピーカー「{name}」を追加しました。",
failedToCreateSpeaker: "スピーカープロファイルの作成に失敗しました",
speakerUpdated: "スピーカーを更新しました",
speakerUpdatedDesc: "スピーカー「{name}」を更新しました。",
failedToUpdateSpeaker: "スピーカープロファイルの更新に失敗しました",
speakerDeleted: "スピーカーを削除しました",
speakerDeletedDesc: "スピーカー「{name}」を削除しました。",
failedToDeleteSpeaker: "スピーカープロファイルの削除に失敗しました",
speakerDuplicated: "スピーカーを複製しました",
speakerDuplicatedDesc: "スピーカー「{name}」を複製しました。",
failedToDuplicateSpeaker: "スピーカープロファイルの複製に失敗しました",
generationStarted: "生成を開始しました",
generationStartedDesc: "ポッドキャスト生成がキューに追加されました。",
failedToStartGeneration: "生成の開始に失敗しました",
tryAgainMoment: "しばらくしてから再試行してください。",
deleteProfileTitle: "プロファイルを削除しますか?",
deleteProfileDesc: "「{name}」を削除します。既存のエピソードはデータを保持しますが、新しいエピソードはこの設定を使用できなくなります。",
profileCreated: "プロファイルを作成しました",
profileCreatedDesc: "エピソードプロファイル「{name}」を作成しました。",
failedToCreateProfile: "プロファイルの作成に失敗しました",
profileUpdated: "プロファイルを更新しました",
profileUpdatedDesc: "エピソードプロファイル「{name}」を更新しました。",
failedToUpdateProfile: "プロファイルの更新に失敗しました",
profileDeleted: "プロファイルを削除しました",
profileDeletedDesc: "エピソードプロファイル「{name}」を削除しました。",
failedToDeleteProfile: "プロファイルの削除に失敗しました",
failedToDeleteProfileDesc: "エピソードプロファイルの削除に失敗しました。",
profileDuplicated: "プロファイルを複製しました",
profileDuplicatedDesc: "エピソードプロファイル「{name}」を複製しました。",
failedToDuplicateProfile: "プロファイルの複製に失敗しました",
episodeDeleted: "エピソードを削除しました",
episodeDeletedDesc: "エピソードを削除しました。",
failedToDeleteEpisode: "エピソードの削除に失敗しました",
failedToDeleteSpeakerDesc: "スピーカープロファイルの削除に失敗しました。",
outlineModel: "アウトラインモデル",
transcriptModel: "トランスクリプトモデル",
segments: "セグメント",
defaultBriefingTitle: "デフォルトブリーフィング",
created: "{time}に作成",
details: "詳細",
summaryTab: "要約",
outlineTab: "アウトライン",
transcriptTab: "トランスクリプト",
briefing: "ブリーフィング",
noOutline: "アウトラインがありません。",
noTranscript: "トランスクリプトがありません。",
deleteEpisodeTitle: "エピソードを削除しますか?",
deleteEpisodeDesc: "「{name}」とその音声ファイルを完全に削除します。",
audioUnavailable: "音声が利用できません",
segment: "セグメント",
speaker: "スピーカー",
profile: "プロファイル",
link: "リンク",
file: "ファイル",
embedded: "Embedding済み",
notEmbedded: "未Embedding",
noSpeakerProfilesAvailable: "スピーカープロファイルがありません",
noLanguageModelsAvailable: "言語モデルがありません",
editEpisodeProfile: "エピソードプロファイルを編集",
createEpisodeProfile: "エピソードプロファイルを作成",
episodeProfileFormDesc: "エピソードの生成方法とデフォルトで使用するスピーカー設定を定義します。",
noSpeakerProfilesDesc: "エピソードプロファイルを設定する前にスピーカープロファイルを作成してください。",
noLanguageModelsDesc: "アウトラインとトランスクリプト生成を設定するにはモデルセクションで言語モデルを追加してください。",
profileName: "プロファイル名",
profileNamePlaceholder: "例:テックディスカッション",
descriptionPlaceholder: "このプロファイルを使用する場面の簡単な説明",
speakerConfig: "スピーカー設定",
selectSpeakerProfile: "スピーカープロファイルを選択",
outlineGeneration: "アウトライン生成",
transcriptGeneration: "トランスクリプト生成",
defaultBriefingPlaceholder: "このエピソードフォーマットの構成、トーン、目標を概説",
editSpeakerProfile: "スピーカープロファイルを編集",
createSpeakerProfile: "スピーカープロファイルを作成",
speakerProfileFormDesc: "音声合成設定を構成し、最大4人のスピーカーを定義します。",
noTtsModelsAvailable: "音声合成モデルがありません",
noTtsModelsDesc: "スピーカープロファイルを作成する前にモデルセクションでTTSモデルを追加してください。",
speakers: "スピーカー",
speakersDesc: "このプロファイルに1〜4人の声を設定します。",
addSpeaker: "スピーカーを追加",
speakerNumber: "スピーカー{number}",
backstoryPlaceholder: "スピーカーの短い経歴やコンテキスト",
personalityPlaceholder: "スタイルとトーンを説明",
outlineProviderRequired: "アウトラインプロバイダーは必須です",
outlineModelRequired: "アウトラインモデルは必須です",
transcriptProviderRequired: "トランスクリプトプロバイダーは必須です",
transcriptModelRequired: "トランスクリプトモデルは必須です",
defaultBriefingRequired: "デフォルトブリーフィングは必須です",
segmentsInteger: "整数である必要があります",
segmentsMin: "最低3セグメント",
segmentsMax: "最大20セグメント",
voiceIdRequired: "Voice IDは必須です",
backstoryRequired: "バックストーリーは必須です",
personalityRequired: "パーソナリティは必須です",
speakerCountMin: "最低1人のスピーカーが必要です",
speakerCountMax: "最大4人まで設定できます",
delete: "削除",
unknown: "不明",
deleteSuccess: "ポッドキャストを削除しました",
failedToDelete: "ポッドキャストの削除に失敗しました",
},
settings: {
contentProcessing: "コンテンツ処理",
contentProcessingDesc: "ドキュメントとURLの処理方法を設定",
docEngine: "ドキュメント処理エンジン",
docEnginePlaceholder: "ドキュメント処理エンジンを選択",
urlEngine: "URL処理エンジン",
urlEnginePlaceholder: "URL処理エンジンを選択",
autoRecommended: "自動(推奨)",
simple: "シンプル",
docling: "Docling",
helpMeChoose: "選び方",
docHelp: "・Doclingは少し遅いですが、特にテーブルや画像を含むドキュメントでより正確です。・シンプルはフォーマットせずにドキュメントからコンテンツを抽出します。・自動推奨はDoclingで処理を試み、失敗した場合はシンプルにフォールバックします。",
firecrawl: "Firecrawl",
jina: "Jina",
urlHelp: "・Firecrawlは有料サービス無料枠ありで非常に強力です。・Jinaも良いオプションで無料枠があります。・シンプルは基本的なHTTP抽出を使用し、JavaScriptベースのウェブサイトのコンテンツを取得できない場合があります。・自動推奨はFirecrawl、Jina、最後にシンプルの順で試みます。",
embeddingAndSearch: "Embeddingと検索",
embeddingAndSearchDesc: "検索とEmbeddingオプションを設定",
defaultEmbeddingOption: "デフォルトEmbeddingオプション",
embeddingOptionPlaceholder: "Embeddingオプションを選択",
ask: "確認する",
always: "常に実行",
never: "実行しない",
embeddingHelp: "コンテンツをEmbeddingすると、あなたやAIエージェントが見つけやすくなります。ローカルのEmbeddingモデルOllamaなどを使用している場合はコストを気にせずすべてをEmbeddingできます。",
fileManagement: "ファイル管理",
fileManagementDesc: "ファイルの処理とストレージオプションを設定",
autoDeleteFiles: "ファイル自動削除",
autoDeletePlaceholder: "自動削除オプションを選択",
filesHelp: "ファイルがアップロードされて処理されると、ファイル自体は不要になります。ほとんどのユーザーはOpen Notebookがアップロードフォルダから自動的にファイルを削除することを許可すべきです。",
loadFailed: "設定の読み込みに失敗しました",
},
advanced: {
title: "詳細ツール",
desc: "パワーユーザー向けの詳細ツールとユーティリティ",
systemInfo: "システム情報",
systemInfoDesc: "基盤システムコンポーネントのステータスを表示",
rebuildEmbeddings: "Embeddingを再構築",
rebuildEmbeddingsDesc: "すべてのソースのベクトル検索インデックスを再構築",
rebuildWarning: "このアクションはソース数によっては非常に時間がかかる場合があります。既存のベクトルインデックスをクリアし、すべてのEmbeddingを再生成します。",
startRebuild: "再構築を開始",
rebuilding: "再構築中...",
rebuildSuccess: "Embedding再構築を開始しました",
currentVersion: "現在のバージョン",
latestVersion: "最新バージョン",
status: "ステータス",
updateAvailable: "バージョン{version}が利用可能",
updateAvailableDesc: "Open Notebookの新しいバージョンが利用可能です。",
upToDate: "最新版です",
unknown: "不明",
viewOnGithub: "GitHubで表示",
updateCheckFailed: "更新を確認できません。GitHubに接続できない可能性があります。",
rebuild: {
mode: "再構築モード",
existing: "既存のみ",
all: "すべて",
existingDesc: "すでにEmbeddingがあるアイテムのみ再Embedding高速、モデル切り替え用",
allDesc: "既存アイテムの再EmbeddingEmbeddingがないアイテムも作成低速、包括的",
include: "再構築に含める",
selectOneError: "再構築するアイテムタイプを少なくとも1つ選択してください",
starting: "再構築を開始中...",
startBtn: "🚀 再構築を開始",
queued: "キュー待ち",
running: "実行中...",
completed: "完了!",
failed: "失敗",
leavePageHint: "バックグラウンドで実行されるため、このページを離れても構いません",
startNew: "新しい再構築を開始",
itemsProcessed: "{processed}/{total}件処理済み({percent}%",
failedItems: "{count}件のアイテムの処理に失敗しました",
time: "経過時間",
whenToRebuild: "いつEmbeddingを再構築すべき",
whenToRebuildAns: "モデルの切り替え時、バージョンアップ時、破損の修復時、または一括インポート後に再構築してください。",
howLong: "再構築にはどのくらい時間がかかる?",
howLongAns: "処理時間はアイテム数、モデル速度、APIレート制限によって異なります。ローカルモデルは通常非常に高速です。",
isSafe: "アプリ使用中に再構築しても安全?",
isSafeAns: "はい、再構築は安全ですコンテンツは削除されず、Embeddingのみが置き換えられ、エラーは適切に処理されます。",
},
},
transformations: {
title: "トランスフォーメーション",
desc: "トランスフォーメーションはLLMがソースを処理してインサイト、要約などを抽出するためのプロンプトです。",
workspace: "ワークスペースを選択",
playground: "プレイグラウンド",
defaultPrompt: "デフォルトトランスフォーメーションプロンプト",
defaultPromptDesc: "これはすべてのトランスフォーメーションプロンプトに追加されます",
defaultPromptPlaceholder: "デフォルトのトランスフォーメーション指示を入力...",
saveDefault: "デフォルトを保存",
listTitle: "カスタムトランスフォーメーション",
createNew: "新規作成",
testInPlayground: "プレイグラウンドでテスト",
inputLabel: "入力テキスト",
inputPlaceholder: '変換するテキストを入力...',
outputLabel: '出力',
runTest: 'トランスフォーメーションを実行',
running: '実行中...',
selectToStart: 'トランスフォーメーションを選択して開始',
name: '名前',
namePlaceholder: '一意の識別子、例: key_topics',
titlePlaceholder: '表示タイトル、空欄の場合は名前を使用',
promptPlaceholder: 'このトランスフォーメーションを実行するプロンプトを書いてください...',
descriptionPlaceholder: 'このトランスフォーメーションの機能を説明してください。',
suggestDefault: '新しいソースでデフォルトで提案',
promptHint: 'プロンプトはソースコンテンツを念頭に置いて書いてください。モデルに要約、インサイトの抽出、テーブルなどの構造化出力の生成を依頼できます。',
createSuccess: 'トランスフォーメーションを作成しました',
updateSuccess: 'トランスフォーメーションを更新しました',
deleteSuccess: 'トランスフォーメーションを削除しました',
noTransformations: "トランスフォーメーションがまだありません",
createOne: "開始するにはトランスフォーメーションを作成してください",
deleteDesc: "このトランスフォーメーションを削除すると元に戻せません。",
selectModel: "モデルを選択",
deleteConfirm: "このトランスフォーメーションを削除しますか?",
model: "モデル",
systemPrompt: "システムプロンプト",
type: "タイプ",
extraction: "抽出",
summary: "要約",
custom: "カスタム",
saveChanges: "変更を保存",
overrideModelDesc: "このチャットセッションのデフォルトモデルを上書きします。空欄の場合はシステムデフォルトを使用します。",
sessionUseReplacement: "このセッションはデフォルトモデルの代わりに{name}を使用します。",
systemDefault: "システムデフォルト",
},
models: {
title: "モデル管理",
desc: "Open Notebook全体で異なる目的に使用するAIモデルを設定",
failedToLoad: "モデルデータの読み込みに失敗しました",
language: "言語モデル",
embedding: "Embeddingモデル",
tts: "音声合成TTS",
stt: "音声認識STT",
providers: "プロバイダー",
defaultModels: "デフォルトモデル",
status: "ステータス",
notConfigured: "未設定",
active: "アクティブ",
inactive: "非アクティブ",
configure: "設定",
saveChanges: "変更を保存",
addModel: "モデルを追加",
modelName: "モデル名",
provider: "プロバイダー",
apiKey: "APIキー",
baseUrl: "ベースURL",
capabilities: "機能",
enabled: "有効",
disabled: "無効",
deleteConfirm: "このモデルを削除しますか?",
deleteSuccess: "モデルを削除しました",
saveSuccess: "モデルを保存しました",
providerStatus: "プロバイダーステータス",
connectionOk: "接続OK",
connectionFailed: "接続失敗",
changeEmbeddingWarning: "デフォルトのEmbeddingモデルを変更すると新しいソースに影響します。既存のソースは再インデックスが必要になる場合があります。",
changeEmbeddingTitle: "デフォルトEmbeddingモデルを変更しますか",
aiProviders: "AIプロバイダー",
providerConfigDesc: "環境変数を通じてプロバイダーを設定し、モデルを有効にしてください。",
configuredCount: "{total}件中{count}件設定済み",
noModels: "モデルなし",
learnMore: "プロバイダーの設定方法を見る →",
seeLess: "折りたたむ",
seeAll: "{count}件すべてのプロバイダーを表示",
language_models: "言語モデル",
embedding_models: "Embeddingモデル",
text_to_speech: "音声合成TTS",
speech_to_text: "音声認識STT",
languageDesc: "チャット、トランスフォーメーション、テキスト生成",
embeddingDesc: "セマンティック検索とベクトルEmbedding",
ttsDesc: "テキストから音声を生成",
sttDesc: "音声をテキストに書き起こし",
all: "すべて",
noModelsConfigured: "モデルが設定されていません",
noProviderModelsConfigured: "{provider}モデルが設定されていません",
showMore: "さらに{count}件表示",
deleteModel: "モデルを削除",
deleteModelDesc: "「{name}」を削除しますか?この操作は元に戻せません。",
defaultAssignments: "デフォルトモデル割り当て",
defaultAssignmentsDesc: "Open Notebook全体で異なる目的に使用するモデルを設定",
missingRequiredModels: "必須モデルがありません: {models}。これらがないとOpen Notebookが正しく機能しない可能性があります。",
selectModelPlaceholder: "モデルを選択",
requiredModelPlaceholder: "⚠️ 必須 - モデルを選択",
whichModelToChoose: "どのモデルを選ぶべき? →",
chatModelLabel: "チャットモデル",
chatModelDesc: "チャット会話に使用",
transformationModelLabel: "トランスフォーメーションモデル",
transformationModelDesc: "要約、インサイト、トランスフォーメーションに使用",
toolsModelLabel: "ツールモデル",
toolsModelDesc: "関数呼び出しに使用 - OpenAIまたはAnthropicを推奨",
largeContextModelLabel: "大規模コンテキストモデル",
largeContextModelDesc: "大きなドキュメントの処理に使用 - Geminiを推奨",
embeddingModelLabel: "Embeddingモデル",
embeddingModelDesc: "セマンティック検索とベクトルEmbeddingに使用",
ttsModelLabel: "音声合成モデル",
ttsModelDesc: "ポッドキャスト生成に使用",
sttModelLabel: "音声認識モデル",
sttModelDesc: "音声の書き起こしに使用",
addSpecificModel: "{type}を追加",
addSpecificModelDesc: "利用可能なプロバイダーから新しい{type}を設定します。",
noProvidersForType: "{type}用のプロバイダーがありません",
selectProviderPlaceholder: "プロバイダーを選択",
providerRequired: "プロバイダーは必須です",
modelNameRequired: "モデル名は必須です",
modelRequired: "モデルは必須です",
adding: "追加中...",
azureHint: "Azureの場合、デプロイメント名をモデル名として使用してください",
enterModelName: "モデル名を入力",
embeddingChangeTitle: "Embeddingモデルの変更",
embeddingChangeConfirm: "Embeddingモデルを{from}から{to}に変更しようとしています。",
rebuildRequired: "重要:再構築が必要",
rebuildReason: "Embeddingモデルを変更する場合、一貫性を維持するためにすべての既存Embeddingを再構築する必要があります。再構築しないと、検索結果が不正確または不完全になる可能性があります。",
whatHappensNext: "次に起こること:",
step1: "デフォルトのEmbeddingモデルが更新されます",
step2: "既存のEmbeddingは再構築するまで変更されません",
step3: "新しいコンテンツは新しいEmbeddingモデルを使用します",
step4: "できるだけ早くEmbeddingを再構築してください",
proceedToRebuildPrompt: "今すぐ詳細設定ページで再構築を開始しますか?",
changeModelOnly: "モデルのみ変更",
changeAndRebuild: "変更して再構築へ",
}
}

View file

@ -22,6 +22,7 @@ export const ptBR = {
language: "Idioma",
english: "English",
chinese: "简体中文",
japanese: "日本語",
source: "Fonte",
notebook: "Caderno",
podcast: "Podcast",

View file

@ -27,6 +27,7 @@ export const zhCN = {
language: "语言",
english: "English",
chinese: "简体中文",
japanese: "日本語",
source: "来源",
notebook: "笔记本",
podcast: "播客",

View file

@ -27,6 +27,7 @@ export const zhTW = {
language: "語言",
english: "English",
chinese: "簡體中文",
japanese: "日本語",
source: "來源",
notebook: "筆記本",
podcast: "播客",

View file

@ -1,4 +1,4 @@
import { zhCN, enUS, zhTW, ptBR, Locale } from 'date-fns/locale'
import { zhCN, enUS, zhTW, ptBR, ja, Locale } from 'date-fns/locale'
/**
* Mapping of language codes to date-fns locales.
@ -9,6 +9,7 @@ const LOCALE_MAP: Record<string, Locale> = {
'zh-TW': zhTW,
'en-US': enUS,
'pt-BR': ptBR,
'ja-JP': ja,
}
/**