Files
aurak/apply_cjk_translations.js
Developer 0a9588abb7 feat: implement QuestionBank CRUD with pagination and template query
- Add pagination support to findAll (page, limit query params)
- Add findByTemplateId method to service
- Add GET /by-template/:templateId endpoint to controller
- Service already includes CRUD for QuestionBank and QuestionBankItem
2026-04-23 17:19:11 +08:00

338 lines
20 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
const fs = require('fs');
const path = require('path');
const directories = ['d:/workspace/AuraK/web', 'd:/workspace/AuraK/server/src'];
const excludeDirs = ['node_modules', '.git', 'dist', '.next', 'dist-check', 'docs', 'data'];
const extensions = ['.ts', '.tsx', '.js', '.jsx'];
const translations = {
// ChatInterface.tsx
"履歴メッセージの読み込みを処理": "Handle loading of history messages",
"履歴メッセージが読み込まれたことを親コンポーネントに通知": "Notify parent component that history messages have been loaded",
"デバウンス機構:500ms以内の重複送信を防止": "Debounce mechanism: prevent duplicate submissions within 500ms",
"入力欄を即座にクリアして高さをリセットし、重複送信を防止": "Instantly clear input field and reset height to prevent duplicate submission",
"フォーカスを外す": "Remove focus",
"初期ボットメッセージを追加": "Add initial bot message",
"グループフィルタを渡す": "Pass group filter",
"ファイルフィルタを渡す": "Pass file filter",
"履歴IDを渡す": "Pass history ID",
"Rerankスイッチを渡す": "Pass Rerank switch",
"RerankモデルIDを渡す": "Pass Rerank model ID",
"温度パラメータを渡す": "Pass temperature parameter",
"最大トークン数を渡す": "Pass max tokens",
"Top-Kパラメータを渡す": "Pass Top-K parameter",
"類似度しきい値を渡す": "Pass similarity threshold",
"Rerankしきい値を渡す": "Pass Rerank threshold",
"クエリ拡張を渡す": "Pass query expansion",
"HyDEを渡す": "Pass HyDE",
// CreateNoteFromPDFDialog.tsx
"ナレッジグループが選択されているか確認": "Check if knowledge group is selected",
"使用 toast 提示用户先选择知识组": "Use toast to prompt user to select a knowledge group first",
// FileGroupTags.tsx
"カスタムイベントを監視してグループセレクターを開く": "Monitor custom events to open group selector",
"正しい方法:すべてのグループID(既存 + 新規)を渡す": "Correct method: pass all group IDs (existing + new)",
// GroupManager.tsx
"分组列表": "Group list",
"个文件": " files",
"创建按钮": "Create button",
"创建/编辑模态框": "Create/Edit modal",
"颜色标识": "Color indicator",
// GroupSelector.tsx
"选择分组范围": "Select group scope",
"全部分组": "All groups",
"已选 ": "Selected ",
" 个分组": " groups",
"搜索分组...": "Search groups...",
"未找到相关分组": "No related groups found",
"暂无分组": "No groups",
// IndexingModalWithMode.tsx
"ユーザーによる手動選択をマーク": "Mark manual selection by user",
// InputDrawer.tsx
"确定": "Confirm",
"取消": "Cancel",
// SidebarRail.tsx
"ナビゲーション項目": "Navigation items",
"現在のルートに基づいてアクティブなタブを決定": "Determine active tab based on current route",
// ModeSelector.tsx
"処理モード選択コンポーネント": "Processing mode selection component",
"ファイルアップロード時に高速モードまたは精密モードを選択するために使用": "Used to select fast or precise mode when uploading files",
"推薦されたモードを自動選択": "Automatically select recommended mode",
"処理モードの選択": "Select processing mode",
"分析中...": "Analyzing...",
"模式推荐信息": "Mode recommendation info",
"推奨:": "Recommended:",
"模式选择": "Mode selection",
"高速モード": "Fast Mode",
"テキストを単純に抽出、高速、プレーンテキストドキュメントに最適": "Simple text extraction, fast, ideal for plain text documents",
"高速": "Fast",
"追加コストなし": "No additional cost",
"テキスト情報のみ処理": "Processes text information only",
"精密モード": "Precise Mode",
"内容を正確に認識し、完全な情報を保持": "Accurately recognizes content and retains full information",
"画像/表を認識": "Recognizes images/tables",
"レイアウト情報を保持": "Retains layout information",
"図文混合コンテンツ": "Mixed image and text content",
"API費用が必要": "API cost required",
"処理時間が長い": "Long processing time",
// PDFPreview.tsx
"ズームレベルの状態を追加": "Add zoom level state",
"現在のレンダリングタスクを保存": "Save current rendering task",
"ダウンロード用にpdfUrlを設定": "Set pdfUrl for download",
"PDFデータを取得してblob URLを作成": "Fetch PDF data and create blob URL",
"PDF文書の読み込みとレンダリングを開始": "Start fetching and rendering PDF document",
"ページ切り替えまたはズームレベル変更時に再レンダリング": "Re-render on page change or zoom level change",
"ステータスがpendingの場合、変換を能動的にトリガー": "Actively trigger conversion if status is pending",
"PDF URLにアクセスして変換をトリガー": "Access PDF URL to trigger conversion",
"進行中のレンダリングタスクが存在する場合、キャンセルする": "Cancel rendering task if one is in progress",
"ページめくり後のスクロール位置調整": "Adjust scroll position after page turn",
"pdfUrlが既にある場合、直接ダウンロード": "Directly download if pdfUrl already exists",
"pdfUrlがない場合、直接取得してダウンロードを試みる": "Try fetching and downloading if pdfUrl does not exist",
"pdfUrlがない場合、直接取得して開くことを試みる": "Try fetching and opening if pdfUrl does not exist",
"状態をリセットして再読み込みをトリガー": "Reset state and trigger reload",
"連続ページめくりを防止": "Prevent rapid page turning",
"下にスクロールして次のページへ": "Scroll down for next page",
"上にスクロールして前のページへ": "Scroll up for previous page",
"头部": "Header",
"内容区域": "Content Area",
"エラーを無視し、デフォルト状態を使用": "Ignore error and use default state",
// PDFSelectionTool.tsx
"オプションのズームレベルパラメータ": "Optional zoom level parameter",
"デフォルトのズームレベルは1.0": "Default zoom level is 1.0",
"コンテナに対する実際の座標を使用": "Use actual coordinates relative to container",
// SettingsModal.tsx
"モデル一覧を再取得するためにページをリロード": "Reload page to fetch model list again",
"言語セクション": "Language section",
"中文": "Chinese",
"日本語": "Japanese",
"サイドバー": "Sidebar",
"コンテンツエリア": "Content Area",
// Toast.tsx
"等待动画完成": "Wait for animation to complete",
// ChatView.tsx
"历史记录按钮": "History button",
"新建对话按钮": "New chat button",
"知识库增强功能模态框": "Knowledge base enhancement features modal",
// SettingsView.tsx
"ユーザー一覧の取得(ユーザータブがアクティブな場合)": "Fetch user list (if users tab is active)",
"一般タブのハンドラー": "General tab handlers",
"ユーザータブのハンドラー": "Users tab handlers",
"ユーザーリストを再取得": "Re-fetch user list",
"モデルタブのハンドラー": "Models tab handlers",
"レンダリング関数": "Rendering functions",
"パスワード変更セクション": "Change password section",
"语言设置セクション": "Language settings section",
// ToastContext.tsx
"相同消息去重:如果已存在相同的消息(类型和内容相同),则先移除旧的": "Deduplicate identical messages: discard old one if current type and content are the same",
// apiClient.ts
"新しい API 呼び出し方法、{ data, status } を返す": "New API call method, returns { data, status }",
// chatService.ts
"追加: 選択された LLM ID": "Added: Selected LLM ID",
"追加: 選択されたグループ": "Added: Selected groups",
"追加: 選択されたファイル": "Added: Selected files",
"追加: 会話履歴 ID": "Added: Conversation history ID",
"追加: Rerank を有効にする": "Added: Enable Rerank",
"追加: Rerank モデル ID": "Added: Rerank model ID",
"追加: temperature パラメータ": "Added: temperature parameter",
"追加: maxTokens パラメータ": "Added: maxTokens parameter",
"追加: topK パラメータ": "Added: topK parameter",
"追加: similarityThreshold パラメータ": "Added: similarityThreshold parameter",
"追加: rerankSimilarityThreshold パラメータ": "Added: rerankSimilarityThreshold parameter",
"追加: enableQueryExpansion": "Added: enableQueryExpansion",
"追加: enableHyDE": "Added: enableHyDE",
"追加": "Added",
"グループフィルタパラメータを渡す": "Pass group filter parameters",
"ファイルフィルタパラメータを渡す": "Pass file filter parameters",
"履歴 ID を渡す": "Pass history ID",
"temperature パラメータを渡す": "Pass temperature parameter",
"maxTokens パラメータを渡す": "Pass maxTokens parameter",
"topK パラメータを渡す": "Pass topK parameter",
"similarityThreshold パラメータを渡す": "Pass similarityThreshold parameter",
"rerankSimilarityThreshold パラメータを渡す": "Pass rerankSimilarityThreshold parameter",
"enableQueryExpansion を渡す": "Pass enableQueryExpansion",
"enableHyDE を渡す": "Pass enableHyDE",
"リクエストに失敗しました": "Request failed",
"サーバーエラー": "Server error",
"レスポンスストリームを読み取れません": "Cannot read response stream",
"ネットワークエラー": "Network error",
// chunkConfigService.ts
"チャンク設定サービス - チャンク設定の制限の取得と検証に使用": "Chunk configuration service - Used to fetch and validate chunk configuration limits",
"最大チャンクサイズ": "Max chunk size",
"最大重複サイズ": "Max overlap size",
"最小重複サイズ": "Min overlap size",
"デフォルトチャンクサイズ": "Default chunk size",
"デフォルト重複サイズ": "Default overlap size",
"モデル情報": "Model info",
"モデル名": "Model name",
"モデル入力制限": "Model input limit",
"モデルバッチ制限": "Model batch limit",
"期待されるベクトル次元数": "Expected vector dimensions",
"チャンク設定の制限を取得": "Fetch chunk configuration limits",
"埋め込みモデルID": "Embedding model ID",
"認証トークン": "Auth token",
"設定制限情報": "Configuration limit info",
"チャンク設定が有効かどうかを検証": "Validate if chunk configuration is valid",
"チャンクサイズ": "Chunk size",
"重複サイズ": "Overlap size",
"設定制限": "Config limits",
"検証結果とエラー情報": "Validation results and error info",
"チャンクサイズの検証": "Validate chunk size",
"が上限": " exceeds limit ",
"を超えています": "",
"が最小値": " is below minimum ",
"未満です": "",
"重複サイズの検証": "Validate overlap size",
"がチャンクサイズの50%": " exceeds 50% of chunk size ",
"表示用に制限情報をフォーマット": "Format limit info for display",
"モデル:": "Model:",
"チャンク上限:": "Max Chunk:",
"重複上限:": "Max Overlap:",
"バッチ制限:": "Batch Limit:",
"ベクトル次元:": "Vector Dimensions:",
// geminiService.ts
"请始终使用中文回答。": "Please always answer in English.",
"常に日本語で答えてください。": "Please always answer in English.",
"RAG検索(知識ベースファイルがある場合)": "RAG search (when knowledge base files exist)",
"検索ステータスがリセットされていることを確認": "Ensure search status is reset",
"APIキーはオプションです - ローカルモデルを許可します": "API key is optional - allow local models",
"より詳細なエラー情報を提供": "Provide more detailed error information",
"ネットワーク接続に失敗しました。サーバーの状態を確認してください": "Network connection failed. Please check server status",
// knowledgeGroupService.ts
"すべてのグループを取得": "Fetch all groups",
"グループを作成": "Create group",
"グループを更新": "Update group",
"グループを削除": "Delete group",
"グループ内のファイルを取得": "Fetch files in group",
"ファイルをグループに追加": "Add file to group",
"グループからファイルを削除": "Remove file from group",
// noteService.ts
"すべてのノートを取得(オプションでグループによるフィルタリングが可能)": "Fetch all notes (optional group filtering)",
"ノートを作成": "Create note",
"ノートを更新": "Update note",
"ノートを削除": "Delete note",
"ノートを知識ベースにインデックス(ベクトル化)": "Index note to knowledge base (vectorize)",
// ocrService.ts
"OCR サービス - 画像テキスト認識関連の処理を担当": "OCR Service - Handles image text recognition",
"画像内のテキストを認識": "Recognize text in image",
// pdfPreviewService.ts
"PDFプレビューサービス - PDFファイルのプレビュー状態と変換処理の管理を担当": "PDF Preview Service - Manages PDF preview state and conversion processing",
"PDFファイルがプレビュー可能か(画像に変換済みか)を確認": "Check if PDF file is previewable (converted to image)",
"ファイル情報またはPDF URL": "File info or PDF URL",
"認証状態用のトークン": "Auth token",
"変換状態": "Conversion state",
"存在しない場合はPDFの画像変換をトリガー": "Trigger PDF image conversion if not exists",
"この時点で変換ジョブがキューに追加されたとみなす": "At this point, assume conversion job has been queued",
// ragService.ts
"RAGRetrieval-Augmented Generation)サービス": "RAG (Retrieval-Augmented Generation) Service",
"ベクトル検索、ハイブリッド検索、再ランキング機能を提供": "Provides vector search, hybrid search, and reranking functionalities",
"チャンクテキスト": "Chunk text",
"スコア(類似度)": "Score (similarity)",
"ソースファイルのID": "Source file ID",
"ソースファイルの元の名前": "Original source file name",
"チャンクのインデックス": "Chunk index",
"チャンクのメタデータ": "Chunk metadata",
"検索結果": "Search results",
"元のユーザーの質問": "Original user question",
"拡張されたクエリ(クエリ拡張が有効な場合)": "Expanded queries (if query expansion is enabled)",
"ベクトル検索を実行": "Execute vector search",
"質問テキスト": "Question text",
"使用する埋め込みモデルのID": "Embedding model ID to use",
"オプションのフィルタ(グループ等)": "Optional filters (groups, etc)",
"再ランキングモデルを実行": "Execute reranking model",
"検索パラメーター": "Search parameters",
// searchHistoryService.ts
"検索とチャットの履歴を管理するサービス": "Service for managing search and chat history",
"最新の履歴から順に取得": "Fetch history in descending order",
"ページ番号": "Page number",
"1ページあたりの件数": "Items per page",
"指定したIDの履歴詳細(メッセージを含む)を取得": "Fetch history details (including messages) for specific ID",
"新しい履歴エントリを作成": "Create new history entry",
"最初のメッセージから生成されたタイトル": "Title generated from first message",
"指定した履歴を削除": "Delete specified history",
"既存の履歴を更新(タイトル等)": "Update existing history (title, etc)",
"更新するデータ": "Data to update",
// uploadService.ts
"チャンク設定付きでファイルをアップロード": "Upload file with chunk configuration",
"アップロードするファイル": "File to upload",
"テキストコンテンツを直接アップロードして処理": "Directly upload and process text content",
"テキストコンテンツ": "Text content",
"アップロード用のタイトル/ファイル名": "Title/filename for upload",
"チャンク設定": "Chunk configuration",
"ファイルモードの推奨を取得": "Get recommended file mode",
// Other Server files
"コストを重視したVision Pipelineを使用して画像をテキストに変換": "Convert image to text using cost-aware Vision Pipeline",
// translation_map.json
" `💰 推定コスト: $${estimatedCost.toFixed(2)}, 推定時間: ${duration.toFixed(1)}s`\n )": " `💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`\n )",
" this.logger.log(`💰 推定コスト: $${estimatedCost.toFixed(2)}, 推定時間: ${duration.toFixed(1)}s`);": " this.logger.log(`💰 Estimated cost: $${estimatedCost.toFixed(2)}, Estimated time: ${duration.toFixed(1)}s`);",
"チャンクサイズ ${chunkSize} が上限 ${limits.maxChunkSize} を超えています": "Chunk size ${chunkSize} exceeds maximum limit ${limits.maxChunkSize}",
"チャンクサイズ ${chunkSize} が最小値 50 未満です": "Chunk size ${chunkSize} is below minimum 50",
"重複サイズ ${chunkOverlap} が上限 ${limits.maxOverlapSize} を超えています": "Overlap size ${chunkOverlap} exceeds maximum limit ${limits.maxOverlapSize}",
"重複サイズ ${chunkOverlap} がチャンクサイズの50% (${maxOverlapByRatio}) を超えています": "Overlap size ${chunkOverlap} exceeds 50% of chunk size (${maxOverlapByRatio})"
};
function walkSync(currentDirPath, callback) {
fs.readdirSync(currentDirPath).forEach((name) => {
const filePath = path.join(currentDirPath, name);
const stat = fs.statSync(filePath);
if (stat.isFile()) {
callback(filePath);
} else if (stat.isDirectory() && !excludeDirs.includes(name)) {
walkSync(filePath, callback);
}
});
}
let modifiedCount = 0;
directories.forEach(d => {
walkSync(d, (filePath) => {
if (extensions.some(ext => filePath.endsWith(ext))) {
try {
let content = fs.readFileSync(filePath, 'utf-8');
let originalContent = content;
for (const [key, value] of Object.entries(translations)) {
content = content.split(key).join(value);
}
if (content !== originalContent) {
fs.writeFileSync(filePath, content, 'utf-8');
console.log(`Updated: ${filePath}`);
modifiedCount++;
}
} catch (e) {
console.error(`Error reading ${filePath}: `, e);
}
}
});
});
console.log(`Updated ${modifiedCount} files`);