use serde::{Deserialize, Serialize}; #[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Serialize, Deserialize)] #[serde(rename_all = "kebab-case")] pub enum Lang { #[default] En, ZhCn, ZhTw, Ja, Ko, Es, De, Fr, Pt, Ar, } impl Lang { pub fn from_str_lossy(s: &str) -> Self { match s { "en" => Lang::En, "zh-cn" | "zh-CN" | "zh_CN" => Lang::ZhCn, "zh-tw" | "zh-TW" | "zh_TW" => Lang::ZhTw, "ja" => Lang::Ja, "ko" => Lang::Ko, "es" => Lang::Es, "de" => Lang::De, "fr" => Lang::Fr, "pt" => Lang::Pt, "ar" => Lang::Ar, _ => Lang::En, } } } // ── Event messages ── pub fn turn_complete_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "会话完成", Lang::ZhTw => "對話完成", Lang::Ja => "セッション完了", Lang::Ko => "세션 완료", Lang::Es => "Sesión completada", Lang::De => "Sitzung abgeschlossen", Lang::Fr => "Session terminée", Lang::Pt => "Sessão concluída", Lang::Ar => "اكتملت الجلسة", Lang::En => "Turn Complete", } } pub fn turn_complete_body(lang: Lang, agent_type: &str) -> String { match lang { Lang::ZhCn => format!("{agent_type} 会话已完成"), Lang::ZhTw => format!("{agent_type} 對話已完成"), Lang::Ja => format!("{agent_type} セッションが完了しました"), Lang::Ko => format!("{agent_type} 세션이 완료되었습니다"), Lang::Es => format!("{agent_type} sesión completada"), Lang::De => format!("{agent_type} Sitzung abgeschlossen"), Lang::Fr => format!("Session {agent_type} terminée"), Lang::Pt => format!("Sessão {agent_type} concluída"), Lang::Ar => format!("اكتملت جلسة {agent_type}"), Lang::En => format!("{agent_type} session completed"), } } pub fn stop_reason_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "结束原因", Lang::ZhTw => "結束原因", Lang::Ja => "終了理由", Lang::Ko => "종료 사유", Lang::Es => "Motivo de fin", Lang::De => "Beendigungsgrund", Lang::Fr => "Raison de fin", Lang::Pt => "Motivo do término", Lang::Ar => "سبب الانتهاء", Lang::En => "Stop Reason", } } pub fn stop_reason_end_turn(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "正常结束", Lang::ZhTw => "正常結束", Lang::Ja => "正常終了", Lang::Ko => "정상 종료", Lang::Es => "Finalizado", Lang::De => "Normal beendet", Lang::Fr => "Terminé normalement", Lang::Pt => "Finalizado", Lang::Ar => "انتهى بشكل طبيعي", Lang::En => "Completed", } } pub fn stop_reason_cancelled(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "已取消", Lang::ZhTw => "已取消", Lang::Ja => "キャンセル", Lang::Ko => "취소됨", Lang::Es => "Cancelado", Lang::De => "Abgebrochen", Lang::Fr => "Annulé", Lang::Pt => "Cancelado", Lang::Ar => "تم الإلغاء", Lang::En => "Cancelled", } } pub fn agent_error_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "代理错误", Lang::ZhTw => "代理錯誤", Lang::Ja => "エージェントエラー", Lang::Ko => "에이전트 오류", Lang::Es => "Error del agente", Lang::De => "Agent-Fehler", Lang::Fr => "Erreur de l'agent", Lang::Pt => "Erro do agente", Lang::Ar => "خطأ في الوكيل", Lang::En => "Agent Error", } } pub fn agent_error_body(lang: Lang, agent_type: &str) -> String { match lang { Lang::ZhCn => format!("{agent_type} 发生错误"), Lang::ZhTw => format!("{agent_type} 發生錯誤"), Lang::Ja => format!("{agent_type} でエラーが発生しました"), Lang::Ko => format!("{agent_type}에서 오류 발생"), Lang::Es => format!("{agent_type} encontró un error"), Lang::De => format!("{agent_type} hat einen Fehler"), Lang::Fr => format!("{agent_type} a rencontré une erreur"), Lang::Pt => format!("{agent_type} encontrou um erro"), Lang::Ar => format!("حدث خطأ في {agent_type}"), Lang::En => format!("{agent_type} encountered an error"), } } pub fn error_message_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "错误信息", Lang::ZhTw => "錯誤訊息", Lang::Ja => "エラーメッセージ", Lang::Ko => "오류 메시지", Lang::Es => "Mensaje de error", Lang::De => "Fehlermeldung", Lang::Fr => "Message d'erreur", Lang::Pt => "Mensagem de erro", Lang::Ar => "رسالة الخطأ", Lang::En => "Error Message", } } // ── Daily report ── pub fn daily_report_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "每日编码报告", Lang::ZhTw => "每日編碼報告", Lang::Ja => "日次コーディングレポート", Lang::Ko => "일일 코딩 보고서", Lang::Es => "Informe diario de codificación", Lang::De => "Täglicher Coding-Bericht", Lang::Fr => "Rapport de codage quotidien", Lang::Pt => "Relatório diário de codificação", Lang::Ar => "تقرير البرمجة اليومي", Lang::En => "Daily Coding Report", } } pub fn daily_report_summary(lang: Lang, date: &str) -> String { match lang { Lang::ZhCn => format!("今日编码活动汇总 ({date})"), Lang::ZhTw => format!("今日編碼活動匯總 ({date})"), Lang::Ja => format!("本日のコーディング活動まとめ ({date})"), Lang::Ko => format!("오늘의 코딩 활동 요약 ({date})"), Lang::Es => format!("Resumen de actividad de codificación ({date})"), Lang::De => format!("Coding-Aktivitätszusammenfassung ({date})"), Lang::Fr => format!("Résumé de l'activité de codage ({date})"), Lang::Pt => format!("Resumo da atividade de codificação ({date})"), Lang::Ar => format!("ملخص نشاط البرمجة ({date})"), Lang::En => format!("Daily coding activity summary ({date})"), } } pub fn total_sessions(lang: Lang, count: u32) -> String { match lang { Lang::ZhCn => format!("会话总数: {count}"), Lang::ZhTw => format!("對話總數: {count}"), Lang::Ja => format!("セッション合計: {count}"), Lang::Ko => format!("총 세션: {count}"), Lang::Es => format!("Total de sesiones: {count}"), Lang::De => format!("Sitzungen gesamt: {count}"), Lang::Fr => format!("Sessions totales : {count}"), Lang::Pt => format!("Total de sessões: {count}"), Lang::Ar => format!("إجمالي الجلسات: {count}"), Lang::En => format!("Total sessions: {count}"), } } pub fn by_agent_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "按代理分布:", Lang::ZhTw => "按代理分佈:", Lang::Ja => "エージェント別:", Lang::Ko => "에이전트별:", Lang::Es => "Por agente:", Lang::De => "Nach Agent:", Lang::Fr => "Par agent :", Lang::Pt => "Por agente:", Lang::Ar => "حسب الوكيل:", Lang::En => "By agent:", } } pub fn agent_session_count(lang: Lang, agent: &str, count: u32) -> String { match lang { Lang::ZhCn => format!("{agent} - {count} 个会话"), Lang::ZhTw => format!("{agent} - {count} 個對話"), Lang::Ja => format!("{agent} - {count} セッション"), Lang::Ko => format!("{agent} - {count}개 세션"), Lang::Es => format!("{agent} - {count} sesiones"), Lang::De => format!("{agent} - {count} Sitzungen"), Lang::Fr => format!("{agent} - {count} sessions"), Lang::Pt => format!("{agent} - {count} sessões"), Lang::Ar => format!("{agent} - {count} جلسات"), Lang::En => format!("{agent} - {count} sessions"), } } pub fn projects_label(lang: Lang, projects: &str) -> String { match lang { Lang::ZhCn => format!("涉及项目: {projects}"), Lang::ZhTw => format!("涉及專案: {projects}"), Lang::Ja => format!("関連プロジェクト: {projects}"), Lang::Ko => format!("관련 프로젝트: {projects}"), Lang::Es => format!("Proyectos: {projects}"), Lang::De => format!("Projekte: {projects}"), Lang::Fr => format!("Projets : {projects}"), Lang::Pt => format!("Projetos: {projects}"), Lang::Ar => format!("المشاريع: {projects}"), Lang::En => format!("Projects: {projects}"), } } pub fn key_activities_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "主要活动:", Lang::ZhTw => "主要活動:", Lang::Ja => "主な活動:", Lang::Ko => "주요 활동:", Lang::Es => "Actividades clave:", Lang::De => "Wichtige Aktivitäten:", Lang::Fr => "Activités principales :", Lang::Pt => "Atividades principais:", Lang::Ar => "الأنشطة الرئيسية:", Lang::En => "Key activities:", } } // ── Command responses ── pub fn query_failed_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "查询失败", Lang::ZhTw => "查詢失敗", Lang::Ja => "クエリ失敗", Lang::Ko => "조회 실패", Lang::Es => "Error de consulta", Lang::De => "Abfrage fehlgeschlagen", Lang::Fr => "Échec de la requête", Lang::Pt => "Falha na consulta", Lang::Ar => "فشل الاستعلام", Lang::En => "Query Failed", } } pub fn untitled(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "(无标题)", Lang::ZhTw => "(無標題)", Lang::Ja => "(無題)", Lang::Ko => "(제목 없음)", Lang::Es => "(Sin título)", Lang::De => "(Ohne Titel)", Lang::Fr => "(Sans titre)", Lang::Pt => "(Sem título)", Lang::Ar => "(بدون عنوان)", Lang::En => "(Untitled)", } } pub fn search_no_results(lang: Lang, keyword: &str) -> String { match lang { Lang::ZhCn => format!("未找到包含 \"{keyword}\" 的会话"), Lang::ZhTw => format!("未找到包含 \"{keyword}\" 的對話"), Lang::Ja => format!("\"{keyword}\" を含むセッションが見つかりません"), Lang::Ko => format!("\"{keyword}\"을(를) 포함하는 대화를 찾을 수 없습니다"), Lang::Es => format!("No se encontraron conversaciones con \"{keyword}\""), Lang::De => format!("Keine Sitzungen mit \"{keyword}\" gefunden"), Lang::Fr => format!("Aucune session trouvée avec \"{keyword}\""), Lang::Pt => format!("Nenhuma sessão encontrada com \"{keyword}\""), Lang::Ar => format!("لم يتم العثور على جلسات تحتوي على \"{keyword}\""), Lang::En => format!("No conversations found matching \"{keyword}\""), } } pub fn search_results_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "搜索结果", Lang::ZhTw => "搜尋結果", Lang::Ja => "検索結果", Lang::Ko => "검색 결과", Lang::Es => "Resultados", Lang::De => "Suchergebnisse", Lang::Fr => "Résultats", Lang::Pt => "Resultados", Lang::Ar => "نتائج البحث", Lang::En => "Search Results", } } pub fn search_results_count_title(lang: Lang, keyword: &str, count: usize) -> String { match lang { Lang::ZhCn => format!("搜索 \"{keyword}\" - {count} 条结果"), Lang::ZhTw => format!("搜尋 \"{keyword}\" - {count} 條結果"), Lang::Ja => format!("\"{keyword}\" の検索 - {count} 件"), Lang::Ko => format!("\"{keyword}\" 검색 - {count}건"), Lang::Es => format!("Buscar \"{keyword}\" - {count} resultados"), Lang::De => format!("Suche \"{keyword}\" - {count} Ergebnisse"), Lang::Fr => format!("Recherche \"{keyword}\" - {count} résultats"), Lang::Pt => format!("Busca \"{keyword}\" - {count} resultados"), Lang::Ar => format!("بحث \"{keyword}\" - {count} نتائج"), Lang::En => format!("Search \"{keyword}\" - {count} results"), } } pub fn no_activity_today(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "今日暂无编码活动", Lang::ZhTw => "今日暫無編碼活動", Lang::Ja => "本日のコーディング活動はありません", Lang::Ko => "오늘 코딩 활동이 없습니다", Lang::Es => "Sin actividad de codificación hoy", Lang::De => "Heute keine Coding-Aktivität", Lang::Fr => "Aucune activité de codage aujourd'hui", Lang::Pt => "Nenhuma atividade de codificação hoje", Lang::Ar => "لا يوجد نشاط برمجة اليوم", Lang::En => "No coding activity today", } } pub fn today_activity_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "今日活动", Lang::ZhTw => "今日活動", Lang::Ja => "本日の活動", Lang::Ko => "오늘의 활동", Lang::Es => "Actividad de hoy", Lang::De => "Heutige Aktivität", Lang::Fr => "Activité du jour", Lang::Pt => "Atividade de hoje", Lang::Ar => "نشاط اليوم", Lang::En => "Today's Activity", } } pub fn today_activity_date_title(lang: Lang, date: &str) -> String { match lang { Lang::ZhCn => format!("今日活动 ({date})"), Lang::ZhTw => format!("今日活動 ({date})"), Lang::Ja => format!("本日の活動 ({date})"), Lang::Ko => format!("오늘의 활동 ({date})"), Lang::Es => format!("Actividad de hoy ({date})"), Lang::De => format!("Heutige Aktivität ({date})"), Lang::Fr => format!("Activité du jour ({date})"), Lang::Pt => format!("Atividade de hoje ({date})"), Lang::Ar => format!("نشاط اليوم ({date})"), Lang::En => format!("Today's Activity ({date})"), } } pub fn agent_count(lang: Lang, agent: &str, count: u32) -> String { match lang { Lang::ZhCn => format!("{agent} - {count} 个"), Lang::ZhTw => format!("{agent} - {count} 個"), Lang::Ja => format!("{agent} - {count} 件"), Lang::Ko => format!("{agent} - {count}개"), Lang::Es | Lang::De | Lang::Fr | Lang::Pt | Lang::Ar | Lang::En => { format!("{agent} - {count}") } } } pub fn recent_activity_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "最近活动:", Lang::ZhTw => "最近活動:", Lang::Ja => "最近の活動:", Lang::Ko => "최근 활동:", Lang::Es => "Actividad reciente:", Lang::De => "Letzte Aktivität:", Lang::Fr => "Activité récente :", Lang::Pt => "Atividade recente:", Lang::Ar => "النشاط الأخير:", Lang::En => "Recent activity:", } } pub fn no_active_channels(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "暂无活跃渠道", Lang::ZhTw => "暫無活躍頻道", Lang::Ja => "アクティブなチャンネルなし", Lang::Ko => "활성 채널 없음", Lang::Es => "Sin canales activos", Lang::De => "Keine aktiven Kanäle", Lang::Fr => "Aucun canal actif", Lang::Pt => "Nenhum canal ativo", Lang::Ar => "لا توجد قنوات نشطة", Lang::En => "No active channels", } } pub fn channel_status_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "渠道状态", Lang::ZhTw => "頻道狀態", Lang::Ja => "チャンネル状況", Lang::Ko => "채널 상태", Lang::Es => "Estado de canales", Lang::De => "Kanalstatus", Lang::Fr => "Statut des canaux", Lang::Pt => "Status dos canais", Lang::Ar => "حالة القنوات", Lang::En => "Channel Status", } } pub fn help_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "Codeg Bot 帮助", Lang::ZhTw => "Codeg Bot 幫助", Lang::Ja => "Codeg Bot ヘルプ", Lang::Ko => "Codeg Bot 도움말", Lang::Es => "Ayuda de Codeg Bot", Lang::De => "Codeg Bot Hilfe", Lang::Fr => "Aide Codeg Bot", Lang::Pt => "Ajuda do Codeg Bot", Lang::Ar => "مساعدة Codeg Bot", Lang::En => "Codeg Bot Help", } } pub fn help_body(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!( "{prefix}folder - 选择工作目录\n\ {prefix}agent - 选择 Agent\n\ {prefix}task <描述> - 创建会话并执行任务\n\ {prefix}sessions - 当前目录的活跃会话\n\ {prefix}resume [ID] - 最近会话 / 恢复指定会话\n\ {prefix}cancel - 取消当前任务\n\ {prefix}approve [always] - 批准权限请求\n\ {prefix}deny - 拒绝权限请求\n\ \n\ {prefix}search <关键词> - 搜索会话\n\ {prefix}today - 今日活动汇总\n\ {prefix}status - 渠道连接状态\n\ {prefix}help - 显示帮助\n\ \n\ 有活跃会话时,直接发文本即可继续对话" ), Lang::ZhTw => format!( "{prefix}folder - 選擇工作目錄\n\ {prefix}agent - 選擇 Agent\n\ {prefix}task <描述> - 建立對話並執行任務\n\ {prefix}sessions - 當前目錄的活躍對話\n\ {prefix}resume [ID] - 最近對話 / 恢復指定對話\n\ {prefix}cancel - 取消當前任務\n\ {prefix}approve [always] - 批准權限請求\n\ {prefix}deny - 拒絕權限請求\n\ \n\ {prefix}search <關鍵字> - 搜尋對話\n\ {prefix}today - 今日活動匯總\n\ {prefix}status - 頻道連線狀態\n\ {prefix}help - 顯示幫助\n\ \n\ 有活躍對話時,直接發文字即可繼續對話" ), Lang::Ja => format!( "{prefix}folder - 作業フォルダを選択\n\ {prefix}agent - エージェントを選択\n\ {prefix}task <説明> - セッションを作成してタスクを実行\n\ {prefix}sessions - フォルダ内のアクティブセッション\n\ {prefix}resume [ID] - 最近のセッション / セッションを再開\n\ {prefix}cancel - 現在のタスクをキャンセル\n\ {prefix}approve [always] - 権限を承認\n\ {prefix}deny - 権限を拒否\n\ \n\ {prefix}search <キーワード> - セッション検索\n\ {prefix}today - 本日の活動まとめ\n\ {prefix}status - チャンネル接続状況\n\ {prefix}help - ヘルプを表示\n\ \n\ セッションがアクティブな場合、テキストを送信するだけで会話を続けられます" ), Lang::Ko => format!( "{prefix}folder - 작업 폴더 선택\n\ {prefix}agent - 에이전트 선택\n\ {prefix}task <설명> - 세션 생성 및 작업 실행\n\ {prefix}sessions - 폴더 내 활성 세션\n\ {prefix}resume [ID] - 최근 대화 / 세션 재개\n\ {prefix}cancel - 현재 작업 취소\n\ {prefix}approve [always] - 권한 승인\n\ {prefix}deny - 권한 거부\n\ \n\ {prefix}search <키워드> - 대화 검색\n\ {prefix}today - 오늘의 활동 요약\n\ {prefix}status - 채널 연결 상태\n\ {prefix}help - 도움말 표시\n\ \n\ 세션이 활성화된 경우 텍스트를 보내면 대화를 계속할 수 있습니다" ), Lang::Es => format!( "{prefix}folder - Seleccionar carpeta de trabajo\n\ {prefix}agent - Seleccionar agente\n\ {prefix}task - Crear sesion y ejecutar tarea\n\ {prefix}sessions - Sesiones activas en la carpeta\n\ {prefix}resume [ID] - Recientes / reanudar una sesion\n\ {prefix}cancel - Cancelar tarea actual\n\ {prefix}approve [always] - Aprobar permiso\n\ {prefix}deny - Denegar permiso\n\ \n\ {prefix}search - Buscar conversaciones\n\ {prefix}today - Resumen de hoy\n\ {prefix}status - Estado de canales\n\ {prefix}help - Mostrar ayuda\n\ \n\ Cuando hay una sesion activa, simplemente escriba texto para continuar" ), Lang::De => format!( "{prefix}folder - Arbeitsordner auswahlen\n\ {prefix}agent - Agent auswahlen\n\ {prefix}task - Sitzung erstellen und Aufgabe ausfuhren\n\ {prefix}sessions - Aktive Sitzungen im Ordner\n\ {prefix}resume [ID] - Neueste Sitzungen / Sitzung fortsetzen\n\ {prefix}cancel - Aktuelle Aufgabe abbrechen\n\ {prefix}approve [always] - Berechtigung genehmigen\n\ {prefix}deny - Berechtigung verweigern\n\ \n\ {prefix}search - Sitzungen suchen\n\ {prefix}today - Heutige Zusammenfassung\n\ {prefix}status - Kanalstatus\n\ {prefix}help - Hilfe anzeigen\n\ \n\ Bei aktiver Sitzung einfach Text eingeben, um das Gesprach fortzusetzen" ), Lang::Fr => format!( "{prefix}folder - Selectionner le dossier de travail\n\ {prefix}agent - Selectionner l'agent\n\ {prefix}task - Creer une session et executer une tache\n\ {prefix}sessions - Sessions actives dans le dossier\n\ {prefix}resume [ID] - Sessions recentes / reprendre une session\n\ {prefix}cancel - Annuler la tache en cours\n\ {prefix}approve [always] - Approuver la permission\n\ {prefix}deny - Refuser la permission\n\ \n\ {prefix}search - Rechercher des sessions\n\ {prefix}today - Resume du jour\n\ {prefix}status - Statut des canaux\n\ {prefix}help - Afficher l'aide\n\ \n\ Lorsqu'une session est active, envoyez du texte pour continuer la conversation" ), Lang::Pt => format!( "{prefix}folder - Selecionar pasta de trabalho\n\ {prefix}agent - Selecionar agente\n\ {prefix}task - Criar sessao e executar tarefa\n\ {prefix}sessions - Sessoes ativas na pasta\n\ {prefix}resume [ID] - Recentes / retomar uma sessao\n\ {prefix}cancel - Cancelar tarefa atual\n\ {prefix}approve [always] - Aprovar permissao\n\ {prefix}deny - Negar permissao\n\ \n\ {prefix}search - Buscar sessoes\n\ {prefix}today - Resumo de hoje\n\ {prefix}status - Status dos canais\n\ {prefix}help - Mostrar ajuda\n\ \n\ Quando uma sessao esta ativa, basta digitar texto para continuar a conversa" ), Lang::Ar => format!( "{prefix}folder - اختيار مجلد العمل\n\ {prefix}agent - اختيار الوكيل\n\ {prefix}task <وصف> - انشاء جلسة وتنفيذ مهمة\n\ {prefix}sessions - الجلسات النشطة في المجلد\n\ {prefix}resume [ID] - الجلسات الاخيرة / استئناف جلسة\n\ {prefix}cancel - الغاء المهمة الحالية\n\ {prefix}approve [always] - الموافقة على الاذن\n\ {prefix}deny - رفض الاذن\n\ \n\ {prefix}search <كلمة> - البحث في الجلسات\n\ {prefix}today - ملخص اليوم\n\ {prefix}status - حالة القنوات\n\ {prefix}help - عرض المساعدة\n\ \n\ عندما تكون الجلسة نشطة، ارسل نصا لمتابعة المحادثة" ), Lang::En => format!( "{prefix}folder - Select working folder\n\ {prefix}agent - Select agent\n\ {prefix}task - Create session & run task\n\ {prefix}sessions - Active sessions in folder\n\ {prefix}resume [ID] - Recent conversations / resume a session\n\ {prefix}cancel - Cancel current task\n\ {prefix}approve [always] - Approve permission\n\ {prefix}deny - Deny permission\n\ \n\ {prefix}search - Search conversations\n\ {prefix}today - Today's activity summary\n\ {prefix}status - Channel connection status\n\ {prefix}help - Show help\n\ \n\ When a session is active, just type text to continue the conversation" ), } } // ── Command dispatcher messages ── pub fn invalid_args_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "参数错误", Lang::ZhTw => "參數錯誤", Lang::Ja => "引数エラー", Lang::Ko => "인수 오류", Lang::Es => "Argumentos inválidos", Lang::De => "Ungültige Argumente", Lang::Fr => "Arguments invalides", Lang::Pt => "Argumentos inválidos", Lang::Ar => "وسيطات غير صالحة", Lang::En => "Invalid Arguments", } } pub fn search_usage(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("用法: {prefix}search <关键词>"), Lang::ZhTw => format!("用法: {prefix}search <關鍵字>"), Lang::Ja => format!("使い方: {prefix}search <キーワード>"), Lang::Ko => format!("사용법: {prefix}search <키워드>"), Lang::Es => format!("Uso: {prefix}search "), Lang::De => format!("Verwendung: {prefix}search "), Lang::Fr => format!("Utilisation : {prefix}search "), Lang::Pt => format!("Uso: {prefix}search "), Lang::Ar => format!("الاستخدام: {prefix}search <كلمة>"), Lang::En => format!("Usage: {prefix}search "), } } pub fn unknown_command(lang: Lang, prefix: &str, command: &str) -> String { match lang { Lang::ZhCn => format!("未知命令: {prefix}{command}\n输入 {prefix}help 查看可用命令"), Lang::ZhTw => format!("未知命令: {prefix}{command}\n輸入 {prefix}help 查看可用命令"), Lang::Ja => format!("不明なコマンド: {prefix}{command}\n{prefix}help でヘルプを表示"), Lang::Ko => format!("알 수 없는 명령: {prefix}{command}\n{prefix}help 로 도움말 보기"), Lang::Es => format!( "Comando desconocido: {prefix}{command}\nEscriba {prefix}help para ver los comandos" ), Lang::De => { format!("Unbekannter Befehl: {prefix}{command}\n{prefix}help für Hilfe eingeben") } Lang::Fr => { format!("Commande inconnue : {prefix}{command}\nTapez {prefix}help pour l'aide") } Lang::Pt => { format!("Comando desconhecido: {prefix}{command}\nDigite {prefix}help para ajuda") } Lang::Ar => format!("أمر غير معروف: {prefix}{command}\nاكتب {prefix}help لعرض المساعدة"), Lang::En => { format!("Unknown command: {prefix}{command}\nType {prefix}help for available commands") } } } pub fn unknown_command_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "未知命令", Lang::ZhTw => "未知命令", Lang::Ja => "不明なコマンド", Lang::Ko => "알 수 없는 명령", Lang::Es => "Comando desconocido", Lang::De => "Unbekannter Befehl", Lang::Fr => "Commande inconnue", Lang::Pt => "Comando desconhecido", Lang::Ar => "أمر غير معروف", Lang::En => "Unknown Command", } } // ── Session command messages ── // Folder (/folder) pub fn folder_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "工作目录", Lang::ZhTw => "工作目錄", Lang::Ja => "作業フォルダ", Lang::Ko => "작업 폴더", Lang::Es => "Carpeta de trabajo", Lang::De => "Arbeitsordner", Lang::Fr => "Dossier de travail", Lang::Pt => "Pasta de trabalho", Lang::Ar => "مجلد العمل", Lang::En => "Working Folder", } } pub fn no_folders_found(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "没有找到项目目录。", Lang::ZhTw => "沒有找到專案目錄。", Lang::Ja => "フォルダが見つかりません。", Lang::Ko => "폴더를 찾을 수 없습니다.", Lang::Es => "No se encontraron carpetas.", Lang::De => "Keine Ordner gefunden.", Lang::Fr => "Aucun dossier trouvé.", Lang::Pt => "Nenhuma pasta encontrada.", Lang::Ar => "لم يتم العثور على مجلدات.", Lang::En => "No folders found.", } } pub fn folder_select_hint(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("回复 {prefix}folder <数字> 选择目录。"), Lang::ZhTw => format!("回覆 {prefix}folder <數字> 選擇目錄。"), Lang::Ja => format!("{prefix}folder <番号> で選択してください。"), Lang::Ko => format!("{prefix}folder <번호>로 선택하세요."), Lang::Es => format!("Responde {prefix}folder para seleccionar."), Lang::De => format!("Antworte {prefix}folder zur Auswahl."), Lang::Fr => format!("Répondez {prefix}folder pour sélectionner."), Lang::Pt => format!("Responda {prefix}folder para selecionar."), Lang::Ar => format!("أجب بـ {prefix}folder <رقم> للاختيار."), Lang::En => format!("Reply {prefix}folder to select."), } } pub fn index_starts_from_one(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "序号从 1 开始。", Lang::ZhTw => "序號從 1 開始。", Lang::Ja => "インデックスは 1 から始まります。", Lang::Ko => "인덱스는 1부터 시작합니다.", Lang::Es => "El índice empieza desde 1.", Lang::De => "Index beginnt bei 1.", Lang::Fr => "L'index commence à 1.", Lang::Pt => "O índice começa em 1.", Lang::Ar => "يبدأ الفهرس من 1.", Lang::En => "Index starts from 1.", } } pub fn folder_index_out_of_range(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("序号超出范围,请使用 {prefix}folder 查看列表。"), Lang::ZhTw => format!("序號超出範圍,請使用 {prefix}folder 查看列表。"), Lang::Ja => { format!("インデックスが範囲外です。{prefix}folder でリストを確認してください。") } Lang::Ko => format!("인덱스가 범위를 벗어났습니다. {prefix}folder로 목록을 확인하세요."), Lang::Es => format!("Índice fuera de rango. Usa {prefix}folder para ver la lista."), Lang::De => { format!("Index außerhalb des Bereichs. {prefix}folder verwenden, um aufzulisten.") } Lang::Fr => format!("Index hors limites. Utilisez {prefix}folder pour lister."), Lang::Pt => format!("Índice fora de intervalo. Use {prefix}folder para listar."), Lang::Ar => format!("الفهرس خارج النطاق. استخدم {prefix}folder لعرض القائمة."), Lang::En => format!("Index out of range. Use {prefix}folder to list."), } } pub fn folder_selected_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "已选择目录", Lang::ZhTw => "已選擇目錄", Lang::Ja => "フォルダを選択しました", Lang::Ko => "폴더 선택됨", Lang::Es => "Carpeta seleccionada", Lang::De => "Ordner ausgewählt", Lang::Fr => "Dossier sélectionné", Lang::Pt => "Pasta selecionada", Lang::Ar => "تم اختيار المجلد", Lang::En => "Folder Selected", } } pub fn folder_not_found(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "目录不存在。", Lang::ZhTw => "目錄不存在。", Lang::Ja => "フォルダが見つかりません。", Lang::Ko => "폴더를 찾을 수 없습니다.", Lang::Es => "Carpeta no encontrada.", Lang::De => "Ordner nicht gefunden.", Lang::Fr => "Dossier introuvable.", Lang::Pt => "Pasta não encontrada.", Lang::Ar => "المجلد غير موجود.", Lang::En => "Folder not found.", } } pub fn folder_not_found_with_hint(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("目录不存在,请使用 {prefix}folder 重新选择。"), Lang::ZhTw => format!("目錄不存在,請使用 {prefix}folder 重新選擇。"), Lang::Ja => format!("フォルダが見つかりません。{prefix}folder で選択してください。"), Lang::Ko => format!("폴더를 찾을 수 없습니다. {prefix}folder로 선택하세요."), Lang::Es => format!("Carpeta no encontrada. Usa {prefix}folder para seleccionar."), Lang::De => format!("Ordner nicht gefunden. {prefix}folder verwenden, um auszuwählen."), Lang::Fr => format!("Dossier introuvable. Utilisez {prefix}folder pour sélectionner."), Lang::Pt => format!("Pasta não encontrada. Use {prefix}folder para selecionar."), Lang::Ar => format!("المجلد غير موجود. استخدم {prefix}folder للاختيار."), Lang::En => format!("Folder not found. Use {prefix}folder to select."), } } pub fn no_folder_selected(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("未选择工作目录,请先使用 {prefix}folder 选择。"), Lang::ZhTw => format!("未選擇工作目錄,請先使用 {prefix}folder 選擇。"), Lang::Ja => { format!("フォルダが選択されていません。先に {prefix}folder を使用してください。") } Lang::Ko => format!("폴더가 선택되지 않았습니다. 먼저 {prefix}folder를 사용하세요."), Lang::Es => format!("Ninguna carpeta seleccionada. Usa {prefix}folder primero."), Lang::De => format!("Kein Ordner ausgewählt. Zuerst {prefix}folder verwenden."), Lang::Fr => format!("Aucun dossier sélectionné. Utilisez d'abord {prefix}folder."), Lang::Pt => format!("Nenhuma pasta selecionada. Use {prefix}folder primeiro."), Lang::Ar => format!("لم يتم اختيار مجلد. استخدم {prefix}folder أولاً."), Lang::En => format!("No folder selected. Use {prefix}folder first."), } } // Agent (/agent) pub fn agent_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "选择 Agent", Lang::ZhTw => "選擇 Agent", Lang::Ja => "エージェント選択", Lang::Ko => "에이전트 선택", Lang::Es => "Selección de agente", Lang::De => "Agent-Auswahl", Lang::Fr => "Sélection d'agent", Lang::Pt => "Seleção de agente", Lang::Ar => "اختيار الوكيل", Lang::En => "Agent Selection", } } pub fn agent_select_hint(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("回复 {prefix}agent <数字> 或 {prefix}agent <名称> 选择。"), Lang::ZhTw => format!("回覆 {prefix}agent <數字> 或 {prefix}agent <名稱> 選擇。"), Lang::Ja => { format!("{prefix}agent <番号> または {prefix}agent <名前> で選択してください。") } Lang::Ko => format!("{prefix}agent <번호> 또는 {prefix}agent <이름>으로 선택하세요."), Lang::Es => { format!("Responde {prefix}agent o {prefix}agent para seleccionar.") } Lang::De => { format!("Antworte {prefix}agent oder {prefix}agent zur Auswahl.") } Lang::Fr => { format!("Répondez {prefix}agent ou {prefix}agent pour sélectionner.") } Lang::Pt => { format!("Responda {prefix}agent ou {prefix}agent para selecionar.") } Lang::Ar => format!("أجب بـ {prefix}agent <رقم> أو {prefix}agent <اسم> للاختيار."), Lang::En => format!("Reply {prefix}agent or {prefix}agent to select."), } } pub fn agent_index_out_of_range(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("序号超出范围,请使用 {prefix}agent 查看列表。"), Lang::ZhTw => format!("序號超出範圍,請使用 {prefix}agent 查看列表。"), Lang::Ja => format!("インデックスが範囲外です。{prefix}agent でリストを確認してください。"), Lang::Ko => format!("인덱스가 범위를 벗어났습니다. {prefix}agent로 목록을 확인하세요."), Lang::Es => format!("Índice fuera de rango. Usa {prefix}agent para ver la lista."), Lang::De => { format!("Index außerhalb des Bereichs. {prefix}agent verwenden, um aufzulisten.") } Lang::Fr => format!("Index hors limites. Utilisez {prefix}agent pour lister."), Lang::Pt => format!("Índice fora de intervalo. Use {prefix}agent para listar."), Lang::Ar => format!("الفهرس خارج النطاق. استخدم {prefix}agent لعرض القائمة."), Lang::En => format!("Index out of range. Use {prefix}agent to list."), } } pub fn agent_selected_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "已选择 Agent", Lang::ZhTw => "已選擇 Agent", Lang::Ja => "エージェントを選択しました", Lang::Ko => "에이전트 선택됨", Lang::Es => "Agente seleccionado", Lang::De => "Agent ausgewählt", Lang::Fr => "Agent sélectionné", Lang::Pt => "Agente selecionado", Lang::Ar => "تم اختيار الوكيل", Lang::En => "Agent Selected", } } pub fn unknown_agent_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "未知 Agent: ", Lang::ZhTw => "未知 Agent: ", Lang::Ja => "不明なエージェント: ", Lang::Ko => "알 수 없는 에이전트: ", Lang::Es => "Agente desconocido: ", Lang::De => "Unbekannter Agent: ", Lang::Fr => "Agent inconnu : ", Lang::Pt => "Agente desconhecido: ", Lang::Ar => "وكيل غير معروف: ", Lang::En => "Unknown agent: ", } } // Task (/task) pub fn task_usage(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("用法: {prefix}task <任务描述>"), Lang::ZhTw => format!("用法: {prefix}task <任務描述>"), Lang::Ja => format!("使い方: {prefix}task <タスク説明>"), Lang::Ko => format!("사용법: {prefix}task <작업 설명>"), Lang::Es => format!("Uso: {prefix}task "), Lang::De => format!("Verwendung: {prefix}task "), Lang::Fr => format!("Usage : {prefix}task "), Lang::Pt => format!("Uso: {prefix}task "), Lang::Ar => format!("الاستخدام: {prefix}task <الوصف>"), Lang::En => format!("Usage: {prefix}task "), } } pub fn no_agent_selected(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("未选择 Agent,请先使用 {prefix}agent 选择,或在工作目录上设置默认 Agent。"), Lang::ZhTw => format!("未選擇 Agent,請先使用 {prefix}agent 選擇,或在工作目錄上設定預設 Agent。"), Lang::Ja => format!("エージェントが選択されていません。{prefix}agent で選択するか、フォルダにデフォルトエージェントを設定してください。"), Lang::Ko => format!("에이전트가 선택되지 않았습니다. {prefix}agent로 선택하거나 폴더에 기본 에이전트를 설정하세요."), Lang::Es => format!("Ningún agente seleccionado. Usa {prefix}agent para elegir uno o define uno por defecto en la carpeta."), Lang::De => format!("Kein Agent ausgewählt. {prefix}agent verwenden oder Standard im Ordner festlegen."), Lang::Fr => format!("Aucun agent sélectionné. Utilisez {prefix}agent ou définissez un agent par défaut sur le dossier."), Lang::Pt => format!("Nenhum agente selecionado. Use {prefix}agent para escolher ou defina um padrão na pasta."), Lang::Ar => format!("لم يتم اختيار وكيل. استخدم {prefix}agent لاختيار واحد أو حدد وكيلًا افتراضيًا للمجلد."), Lang::En => format!("No agent selected. Use {prefix}agent to pick one or set a default on the folder."), } } pub fn failed_to_start_agent_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "启动 Agent 失败: ", Lang::ZhTw => "啟動 Agent 失敗: ", Lang::Ja => "エージェントの起動に失敗しました: ", Lang::Ko => "에이전트 시작 실패: ", Lang::Es => "Error al iniciar el agente: ", Lang::De => "Agent konnte nicht gestartet werden: ", Lang::Fr => "Échec du démarrage de l'agent : ", Lang::Pt => "Falha ao iniciar o agente: ", Lang::Ar => "فشل بدء الوكيل: ", Lang::En => "Failed to start agent: ", } } pub fn task_started_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "任务已启动", Lang::ZhTw => "任務已啟動", Lang::Ja => "タスク開始", Lang::Ko => "작업 시작됨", Lang::Es => "Tarea iniciada", Lang::De => "Aufgabe gestartet", Lang::Fr => "Tâche démarrée", Lang::Pt => "Tarefa iniciada", Lang::Ar => "تم بدء المهمة", Lang::En => "Task Started", } } // Sessions (/sessions) pub fn sessions_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "会话列表", Lang::ZhTw => "對話列表", Lang::Ja => "セッション一覧", Lang::Ko => "세션 목록", Lang::Es => "Sesiones", Lang::De => "Sitzungen", Lang::Fr => "Sessions", Lang::Pt => "Sessões", Lang::Ar => "الجلسات", Lang::En => "Sessions", } } pub fn no_active_sessions_in_folder(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "当前目录没有进行中的会话。", Lang::ZhTw => "當前目錄沒有進行中的對話。", Lang::Ja => "このフォルダにアクティブなセッションはありません。", Lang::Ko => "이 폴더에 활성 세션이 없습니다.", Lang::Es => "No hay sesiones activas en esta carpeta.", Lang::De => "Keine aktiven Sitzungen in diesem Ordner.", Lang::Fr => "Aucune session active dans ce dossier.", Lang::Pt => "Nenhuma sessão ativa nesta pasta.", Lang::Ar => "لا توجد جلسات نشطة في هذا المجلد.", Lang::En => "No active sessions in this folder.", } } pub fn sessions_resume_hint(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("回复 {prefix}resume <会话ID> 继续会话。"), Lang::ZhTw => format!("回覆 {prefix}resume <對話ID> 繼續對話。"), Lang::Ja => format!("{prefix}resume で続行してください。"), Lang::Ko => format!("{prefix}resume 로 계속하세요."), Lang::Es => format!("Responde {prefix}resume para continuar."), Lang::De => format!("Antworte {prefix}resume zum Fortfahren."), Lang::Fr => format!("Répondez {prefix}resume pour continuer."), Lang::Pt => format!("Responda {prefix}resume para continuar."), Lang::Ar => format!("أجب بـ {prefix}resume <المعرف> للاستمرار."), Lang::En => format!("Reply {prefix}resume to continue."), } } // Resume (/resume) pub fn conversation_not_found(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "会话不存在。", Lang::ZhTw => "對話不存在。", Lang::Ja => "会話が見つかりません。", Lang::Ko => "대화를 찾을 수 없습니다.", Lang::Es => "Conversación no encontrada.", Lang::De => "Konversation nicht gefunden.", Lang::Fr => "Conversation introuvable.", Lang::Pt => "Conversa não encontrada.", Lang::Ar => "المحادثة غير موجودة.", Lang::En => "Conversation not found.", } } pub fn session_resumed_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "会话已恢复", Lang::ZhTw => "對話已恢復", Lang::Ja => "セッション再開", Lang::Ko => "세션 재개됨", Lang::Es => "Sesión reanudada", Lang::De => "Sitzung fortgesetzt", Lang::Fr => "Session reprise", Lang::Pt => "Sessão retomada", Lang::Ar => "تم استئناف الجلسة", Lang::En => "Session Resumed", } } pub fn no_conversations_found(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "暂无会话记录。", Lang::ZhTw => "暫無對話記錄。", Lang::Ja => "会話記録がありません。", Lang::Ko => "대화 기록이 없습니다.", Lang::Es => "No hay conversaciones.", Lang::De => "Keine Konversationen vorhanden.", Lang::Fr => "Aucune conversation trouvée.", Lang::Pt => "Nenhuma conversa encontrada.", Lang::Ar => "لا توجد محادثات.", Lang::En => "No conversations found.", } } pub fn recent_conversations_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "最近会话", Lang::ZhTw => "最近對話", Lang::Ja => "最近の会話", Lang::Ko => "최근 대화", Lang::Es => "Conversaciones recientes", Lang::De => "Letzte Konversationen", Lang::Fr => "Conversations récentes", Lang::Pt => "Conversas recentes", Lang::Ar => "المحادثات الأخيرة", Lang::En => "Recent Conversations", } } pub fn recent_resume_hint(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("回复 {prefix}resume <会话ID> 恢复会话。"), Lang::ZhTw => format!("回覆 {prefix}resume <對話ID> 恢復對話。"), Lang::Ja => format!("{prefix}resume でセッションを再開してください。"), Lang::Ko => format!("{prefix}resume 로 세션을 재개하세요."), Lang::Es => format!("Responde {prefix}resume para reanudar una sesión."), Lang::De => format!("Antworte {prefix}resume zum Fortsetzen einer Sitzung."), Lang::Fr => format!("Répondez {prefix}resume pour reprendre une session."), Lang::Pt => format!("Responda {prefix}resume para retomar uma sessão."), Lang::Ar => format!("أجب بـ {prefix}resume <المعرف> لاستئناف الجلسة."), Lang::En => format!("Reply {prefix}resume to resume a session."), } } // Cancel (/cancel) pub fn no_active_session_to_cancel(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "没有进行中的任务可取消。", Lang::ZhTw => "沒有進行中的任務可取消。", Lang::Ja => "キャンセルできるアクティブなセッションはありません。", Lang::Ko => "취소할 활성 세션이 없습니다.", Lang::Es => "No hay sesión activa para cancelar.", Lang::De => "Keine aktive Sitzung zum Abbrechen.", Lang::Fr => "Aucune session active à annuler.", Lang::Pt => "Nenhuma sessão ativa para cancelar.", Lang::Ar => "لا توجد جلسة نشطة للإلغاء.", Lang::En => "No active session to cancel.", } } pub fn task_cancelled_body(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "当前任务已取消。", Lang::ZhTw => "當前任務已取消。", Lang::Ja => "現在のタスクをキャンセルしました。", Lang::Ko => "현재 작업이 취소되었습니다.", Lang::Es => "La tarea actual ha sido cancelada.", Lang::De => "Aktuelle Aufgabe wurde abgebrochen.", Lang::Fr => "La tâche en cours a été annulée.", Lang::Pt => "A tarefa atual foi cancelada.", Lang::Ar => "تم إلغاء المهمة الحالية.", Lang::En => "Current task has been cancelled.", } } pub fn task_cancelled_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "任务已取消", Lang::ZhTw => "任務已取消", Lang::Ja => "タスクをキャンセルしました", Lang::Ko => "작업 취소됨", Lang::Es => "Tarea cancelada", Lang::De => "Aufgabe abgebrochen", Lang::Fr => "Tâche annulée", Lang::Pt => "Tarefa cancelada", Lang::Ar => "تم إلغاء المهمة", Lang::En => "Task Cancelled", } } // Permission (/approve, /deny) pub fn no_active_session(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "没有活跃的会话。", Lang::ZhTw => "沒有活躍的對話。", Lang::Ja => "アクティブなセッションがありません。", Lang::Ko => "활성 세션이 없습니다.", Lang::Es => "No hay sesión activa.", Lang::De => "Keine aktive Sitzung.", Lang::Fr => "Aucune session active.", Lang::Pt => "Nenhuma sessão ativa.", Lang::Ar => "لا توجد جلسة نشطة.", Lang::En => "No active session.", } } pub fn no_active_session_found(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "未找到活跃的会话。", Lang::ZhTw => "未找到活躍的對話。", Lang::Ja => "アクティブなセッションが見つかりません。", Lang::Ko => "활성 세션을 찾을 수 없습니다.", Lang::Es => "No se encontró sesión activa.", Lang::De => "Keine aktive Sitzung gefunden.", Lang::Fr => "Aucune session active trouvée.", Lang::Pt => "Nenhuma sessão ativa encontrada.", Lang::Ar => "لم يتم العثور على جلسة نشطة.", Lang::En => "No active session found.", } } pub fn no_pending_permission(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "没有待处理的权限请求。", Lang::ZhTw => "沒有待處理的權限請求。", Lang::Ja => "保留中の権限要求はありません。", Lang::Ko => "대기 중인 권한 요청이 없습니다.", Lang::Es => "No hay solicitudes de permiso pendientes.", Lang::De => "Keine ausstehende Berechtigungsanfrage.", Lang::Fr => "Aucune demande d'autorisation en attente.", Lang::Pt => "Nenhuma solicitação de permissão pendente.", Lang::Ar => "لا توجد طلبات أذونات معلقة.", Lang::En => "No pending permission request.", } } pub fn no_valid_permission_option(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "未找到有效的权限选项。", Lang::ZhTw => "未找到有效的權限選項。", Lang::Ja => "有効な権限オプションが見つかりません。", Lang::Ko => "유효한 권한 옵션을 찾을 수 없습니다.", Lang::Es => "No se encontró una opción de permiso válida.", Lang::De => "Keine gültige Berechtigungsoption gefunden.", Lang::Fr => "Aucune option d'autorisation valide trouvée.", Lang::Pt => "Nenhuma opção de permissão válida encontrada.", Lang::Ar => "لم يتم العثور على خيار أذونات صالح.", Lang::En => "No valid permission option found.", } } pub fn failed_permission_response_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "权限响应失败: ", Lang::ZhTw => "權限回應失敗: ", Lang::Ja => "権限応答に失敗しました: ", Lang::Ko => "권한 응답 실패: ", Lang::Es => "Error al responder al permiso: ", Lang::De => "Berechtigungsantwort fehlgeschlagen: ", Lang::Fr => "Échec de la réponse à l'autorisation : ", Lang::Pt => "Falha ao responder à permissão: ", Lang::Ar => "فشل الاستجابة للإذن: ", Lang::En => "Failed to respond to permission: ", } } pub fn approved_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "已批准", Lang::ZhTw => "已批准", Lang::Ja => "承認済み", Lang::Ko => "승인됨", Lang::Es => "Aprobado", Lang::De => "Genehmigt", Lang::Fr => "Approuvé", Lang::Pt => "Aprovado", Lang::Ar => "تمت الموافقة", Lang::En => "Approved", } } pub fn denied_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "已拒绝", Lang::ZhTw => "已拒絕", Lang::Ja => "拒否", Lang::Ko => "거부됨", Lang::Es => "Denegado", Lang::De => "Abgelehnt", Lang::Fr => "Refusé", Lang::Pt => "Negado", Lang::Ar => "تم الرفض", Lang::En => "Denied", } } pub fn auto_approve_enabled(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "已启用自动批准。", Lang::ZhTw => "已啟用自動批准。", Lang::Ja => "このセッションで自動承認を有効にしました。", Lang::Ko => "이 세션에 자동 승인을 활성화했습니다.", Lang::Es => "Aprobación automática activada para esta sesión.", Lang::De => "Automatische Genehmigung für diese Sitzung aktiviert.", Lang::Fr => "Approbation automatique activée pour cette session.", Lang::Pt => "Aprovação automática ativada para esta sessão.", Lang::Ar => "تم تفعيل الموافقة التلقائية لهذه الجلسة.", Lang::En => "Auto-approve enabled for this session.", } } pub fn permission_response_title(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "权限响应", Lang::ZhTw => "權限回應", Lang::Ja => "権限応答", Lang::Ko => "권한 응답", Lang::Es => "Respuesta de permiso", Lang::De => "Berechtigungsantwort", Lang::Fr => "Réponse d'autorisation", Lang::Pt => "Resposta de permissão", Lang::Ar => "استجابة الإذن", Lang::En => "Permission Response", } } // Follow-up pub fn no_active_session_use_task(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("没有活跃的会话,请使用 {prefix}task 开始新任务。"), Lang::ZhTw => format!("沒有活躍的對話,請使用 {prefix}task 開始新任務。"), Lang::Ja => { format!("アクティブなセッションがありません。{prefix}task で開始してください。") } Lang::Ko => format!("활성 세션이 없습니다. {prefix}task로 시작하세요."), Lang::Es => format!("No hay sesión activa. Usa {prefix}task para iniciar una."), Lang::De => format!("Keine aktive Sitzung. {prefix}task zum Starten verwenden."), Lang::Fr => format!("Aucune session active. Utilisez {prefix}task pour en démarrer une."), Lang::Pt => format!("Nenhuma sessão ativa. Use {prefix}task para iniciar uma."), Lang::Ar => format!("لا توجد جلسة نشطة. استخدم {prefix}task لبدء واحدة."), Lang::En => format!("No active session. Use {prefix}task to start one."), } } pub fn session_connection_lost(lang: Lang, prefix: &str) -> String { match lang { Lang::ZhCn => format!("会话连接已断开,请使用 {prefix}task 开始新任务。"), Lang::ZhTw => format!("對話連線已斷開,請使用 {prefix}task 開始新任務。"), Lang::Ja => { format!("セッション接続が切断されました。{prefix}task で新しく開始してください。") } Lang::Ko => format!("세션 연결이 끊어졌습니다. {prefix}task로 새로 시작하세요."), Lang::Es => format!("Conexión de sesión perdida. Usa {prefix}task para iniciar una nueva."), Lang::De => { format!("Sitzungsverbindung verloren. {prefix}task für neue Sitzung verwenden.") } Lang::Fr => format!( "Connexion de session perdue. Utilisez {prefix}task pour en démarrer une nouvelle." ), Lang::Pt => format!("Conexão da sessão perdida. Use {prefix}task para iniciar uma nova."), Lang::Ar => format!("انقطع اتصال الجلسة. استخدم {prefix}task لبدء جلسة جديدة."), Lang::En => format!("Session connection lost. Use {prefix}task to start a new one."), } } pub fn failed_to_send_message_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "发送消息失败: ", Lang::ZhTw => "發送訊息失敗: ", Lang::Ja => "メッセージの送信に失敗しました: ", Lang::Ko => "메시지 전송 실패: ", Lang::Es => "Error al enviar el mensaje: ", Lang::De => "Nachricht konnte nicht gesendet werden: ", Lang::Fr => "Échec de l'envoi du message : ", Lang::Pt => "Falha ao enviar mensagem: ", Lang::Ar => "فشل إرسال الرسالة: ", Lang::En => "Failed to send message: ", } } pub fn message_sent(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "消息已发送。", Lang::ZhTw => "訊息已發送。", Lang::Ja => "メッセージを送信しました。", Lang::Ko => "메시지를 보냈습니다.", Lang::Es => "Mensaje enviado.", Lang::De => "Nachricht gesendet.", Lang::Fr => "Message envoyé.", Lang::Pt => "Mensagem enviada.", Lang::Ar => "تم إرسال الرسالة.", Lang::En => "Message sent.", } } // Internal error labels pub fn failed_to_list_folders_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "列出目录失败: ", Lang::ZhTw => "列出目錄失敗: ", Lang::Ja => "フォルダ一覧の取得に失敗しました: ", Lang::Ko => "폴더 목록 조회 실패: ", Lang::Es => "Error al listar carpetas: ", Lang::De => "Auflisten der Ordner fehlgeschlagen: ", Lang::Fr => "Échec de la liste des dossiers : ", Lang::Pt => "Falha ao listar pastas: ", Lang::Ar => "فشل عرض المجلدات: ", Lang::En => "Failed to list folders: ", } } pub fn failed_to_add_folder_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "添加目录失败: ", Lang::ZhTw => "新增目錄失敗: ", Lang::Ja => "フォルダの追加に失敗しました: ", Lang::Ko => "폴더 추가 실패: ", Lang::Es => "Error al agregar carpeta: ", Lang::De => "Ordner konnte nicht hinzugefügt werden: ", Lang::Fr => "Échec de l'ajout du dossier : ", Lang::Pt => "Falha ao adicionar pasta: ", Lang::Ar => "فشل إضافة المجلد: ", Lang::En => "Failed to add folder: ", } } pub fn failed_to_load_context_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "加载上下文失败: ", Lang::ZhTw => "載入上下文失敗: ", Lang::Ja => "コンテキストの読み込みに失敗しました: ", Lang::Ko => "컨텍스트 로드 실패: ", Lang::Es => "Error al cargar contexto: ", Lang::De => "Kontext konnte nicht geladen werden: ", Lang::Fr => "Échec du chargement du contexte : ", Lang::Pt => "Falha ao carregar contexto: ", Lang::Ar => "فشل تحميل السياق: ", Lang::En => "Failed to load context: ", } } pub fn failed_to_create_conversation_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "创建会话失败: ", Lang::ZhTw => "建立對話失敗: ", Lang::Ja => "会話の作成に失敗しました: ", Lang::Ko => "대화 생성 실패: ", Lang::Es => "Error al crear conversación: ", Lang::De => "Konversation konnte nicht erstellt werden: ", Lang::Fr => "Échec de la création de la conversation : ", Lang::Pt => "Falha ao criar conversa: ", Lang::Ar => "فشل إنشاء المحادثة: ", Lang::En => "Failed to create conversation: ", } } pub fn failed_to_list_sessions_label(lang: Lang) -> &'static str { match lang { Lang::ZhCn => "列出会话失败: ", Lang::ZhTw => "列出對話失敗: ", Lang::Ja => "セッション一覧の取得に失敗しました: ", Lang::Ko => "세션 목록 조회 실패: ", Lang::Es => "Error al listar sesiones: ", Lang::De => "Auflisten der Sitzungen fehlgeschlagen: ", Lang::Fr => "Échec de la liste des sessions : ", Lang::Pt => "Falha ao listar sessões: ", Lang::Ar => "فشل عرض الجلسات: ", Lang::En => "Failed to list sessions: ", } } // ── Session progress messages ── pub fn agent_responding(lang: Lang, agent_label: &str) -> String { match lang { Lang::ZhCn => format!("{agent_label} 正在响应中..."), Lang::ZhTw => format!("{agent_label} 正在回應中..."), Lang::Ja => format!("{agent_label} が応答中..."), Lang::Ko => format!("{agent_label} 응답 중..."), Lang::Es => format!("{agent_label} respondiendo..."), Lang::De => format!("{agent_label} antwortet..."), Lang::Fr => format!("{agent_label} en cours de réponse..."), Lang::Pt => format!("{agent_label} respondendo..."), // FSI/PDI (U+2068/U+2069) isolate Latin agent name inside the Arabic RTL run so // bidi reordering stays predictable across Telegram/Lark/WeiXin clients. Lang::Ar => format!("\u{2068}{agent_label}\u{2069} يستجيب..."), Lang::En => format!("{agent_label} is responding..."), } }