Files
ChatLab/electron/main/i18n/locales/en-US.ts
2026-04-06 22:24:49 +08:00

385 lines
21 KiB
TypeScript
Raw 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.
/**
* 主进程英文翻译
*/
export default {
// ===== Common =====
common: {
error: 'Error',
},
// ===== P0: Update dialogs =====
update: {
newVersionTitle: 'New version v{{version}} available',
newVersionMessage: 'New version v{{version}} available',
newVersionDetail: 'Would you like to download and install the new version?',
downloadNow: 'Download Now',
cancel: 'Cancel',
downloadComplete: 'Download Complete',
readyToInstall: 'The new version is ready. Install now?',
install: 'Install',
remindLater: 'Remind Later',
installOnQuit: 'Later (auto-install on quit)',
upToDate: 'You are up to date',
},
// ===== P0: File/directory dialogs =====
dialog: {
selectChatFile: 'Select Chat Record File',
chatRecords: 'Chat Records',
allFiles: 'All Files',
import: 'Import',
selectDirectory: 'Select Directory',
selectFolder: 'Select Folder',
selectFolderError: 'Error selecting folder: ',
},
// ===== P1: Database migrations =====
database: {
migrationV1Desc: 'Add owner_id field to meta table',
migrationV1Message: 'Support "Owner" feature to set your identity in the member list',
migrationV2Desc: 'Add roles, reply_to_message_id, platform_message_id fields',
migrationV2Message: 'Support member roles, message reply relationships and reply preview',
migrationV3Desc: 'Add session index tables (chat_session, message_context) and session_gap_threshold field',
migrationV3Message: 'Support session timeline browsing and AI-enhanced analysis',
migrationV4Desc: 'Create FTS5 full-text search index (message_fts) and build index data',
migrationV4Message: 'Enable full-text search for significantly faster keyword search',
integrityError:
'Database structure is incomplete: missing meta table. Please delete this database file and re-import.',
checkFailed: 'Database check failed: {{error}}',
},
// ===== Tool system =====
tools: {
notRegistered: 'Tool "{{toolName}}" is not registered',
},
// ===== P2: AI Tool definitions (Function Calling) =====
ai: {
tools: {
search_messages: {
desc: 'Search group chat records by keywords. Suitable for finding specific topics or keyword-related chat content. Can specify time range and sender to filter messages. Supports minute-level time queries.',
params: {
keywords:
'List of search keywords, using OR logic to match messages containing any keyword. Pass an empty array [] to filter by sender only',
sender_id:
'Sender member ID, used to filter messages from a specific member. Can be obtained via the get_members tool',
limit: 'Message count limit, default 1000, max 50000',
year: 'Filter messages by year, e.g. 2024',
month: 'Filter messages by month (1-12), use with year',
day: 'Filter messages by day (1-31), use with year and month',
hour: 'Filter messages by hour (0-23), use with year, month, and day',
start_time:
'Start time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 14:00". Overrides year/month/day/hour when specified',
end_time:
'End time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 18:30". Overrides year/month/day/hour when specified',
},
},
deep_search_messages: {
desc: 'Exact substring match search for chat records. Slower but never misses any message containing the keyword. Use when regular search (search_messages) results are insufficient, or when searching for partial words or single characters.',
params: {
keywords: 'List of search keywords, using substring match (LIKE). Returns messages matching any keyword',
sender_id: 'Sender member ID for filtering messages from a specific member',
limit: 'Message count limit, default 1000, max 50000',
year: 'Filter messages by year, e.g. 2024',
month: 'Filter messages by month (1-12), use with year',
day: 'Filter messages by day (1-31), use with year and month',
hour: 'Filter messages by hour (0-23), use with year, month, and day',
start_time: 'Start time, format "YYYY-MM-DD HH:mm". Overrides year/month/day/hour when specified',
end_time: 'End time, format "YYYY-MM-DD HH:mm". Overrides year/month/day/hour when specified',
},
},
get_recent_messages: {
desc: 'Get chat messages within a specified time period. Suitable for overview questions like "what has everyone been chatting about recently" or "what was discussed in month X". Supports minute-level time queries.',
params: {
limit: 'Message count limit, default 100 (saves tokens, can be increased as needed)',
year: 'Filter messages by year, e.g. 2024',
month: 'Filter messages by month (1-12), use with year',
day: 'Filter messages by day (1-31), use with year and month',
hour: 'Filter messages by hour (0-23), use with year, month, and day',
start_time:
'Start time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 14:00". Overrides year/month/day/hour when specified',
end_time:
'End time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 18:30". Overrides year/month/day/hour when specified',
},
},
get_chat_overview: {
desc: 'Get basic overview of the chat: name, platform, type, total messages, total members, time range, and top active members. Use this first to understand the data before deeper analysis.',
params: {
top_n: 'Return top N active members, default 10',
},
},
get_member_stats: {
desc: 'Get member activity statistics. Suitable for questions like "who is the most active" or "who sends the most messages".',
params: {
top_n: 'Return top N members, default 10',
},
},
get_time_stats: {
desc: 'Get time distribution statistics of chat activity. Suitable for questions like "when is the group most active" or "what time do people usually chat".',
params: {
type: 'Statistics type: hourly (by hour), weekday (by day of week), daily (by date)',
},
},
get_members: {
desc: 'Get group member list, including basic info, aliases, and message statistics. Suitable for queries like "who is in the group", "what is someone\'s alias", or "whose ID is xxx".',
params: {
search: 'Optional search keyword to filter by member nickname, alias, or platform ID',
limit: 'Member count limit, returns all by default',
},
},
get_member_name_history: {
desc: 'Get member name change history. Suitable for questions like "what was someone\'s previous name", "name changes", or "former names". Requires member ID from get_members tool first.',
params: {
member_id: 'Member database ID, can be obtained via get_members tool',
},
},
get_conversation_between: {
desc: 'Get conversation records between two group members. Suitable for questions like "what did A and B talk about" or "view the conversation between two people". Requires member IDs from get_members first. Supports minute-level time queries.',
params: {
member_id_1: 'Database ID of the first member',
member_id_2: 'Database ID of the second member',
limit: 'Message count limit, default 100',
start_time:
'Start time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 14:00". Overrides year/month/day/hour when specified',
end_time:
'End time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 18:30". Overrides year/month/day/hour when specified',
},
},
get_message_context: {
desc: 'Get surrounding context messages for a given message ID. Suitable for viewing what was discussed before and after a specific message. Supports single or batch message IDs.',
params: {
message_ids:
'List of message IDs to query context for. Can be single or multiple IDs. Message IDs can be obtained from search_messages and other tool results',
context_size: 'Context size, i.e. how many messages before and after to retrieve, default 20',
},
},
search_sessions: {
desc: 'Search chat sessions (conversation segments). Sessions are conversation units automatically split by message time intervals. Suitable for finding discussions on specific topics or understanding how many conversations occurred in a time period. Returns matching sessions with a 5-message preview each.',
params: {
keywords: 'Optional keyword list, only returns sessions containing these keywords (OR logic)',
limit: 'Session count limit, default 20',
year: 'Filter sessions by year, e.g. 2024',
month: 'Filter sessions by month (1-12), use with year',
day: 'Filter sessions by day (1-31), use with year and month',
start_time: 'Start time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 14:00"',
end_time: 'End time, format "YYYY-MM-DD HH:mm", e.g. "2024-03-15 18:30"',
},
},
get_session_messages: {
desc: 'Get the complete message list for a specific session. Used to get full context after finding a relevant session via search_sessions. Returns all messages and participant information.',
params: {
session_id: 'Session ID, can be obtained from search_sessions results',
limit: 'Message count limit, default 1000. Can be limited for very long sessions to save tokens',
},
},
get_session_summaries: {
desc: `Get session summary list to quickly understand discussion topics in chat history.
Use cases:
1. Understand what topics have been discussed recently
2. Search for discussed topics by keyword
3. Overview questions like "has the group discussed travel"
Returned summaries are brief descriptions of each session, helping quickly locate sessions of interest. Use get_session_messages for details.`,
params: {
keywords: 'Keyword list to search within summaries (OR logic)',
limit: 'Session count limit, default 20',
year: 'Filter sessions by year',
month: 'Filter sessions by month (1-12)',
day: 'Filter sessions by day (1-31)',
start_time: 'Start time, format "YYYY-MM-DD HH:mm"',
end_time: 'End time, format "YYYY-MM-DD HH:mm"',
},
},
// ===== SQL Analysis Tools =====
message_type_breakdown: {
desc: 'Break down message types over the last N days (text, image, voice, emoji, etc.). Useful for understanding communication preferences.',
params: { days: 'Number of recent days to analyze' },
rowTemplate: '{type_name}: {msg_count} messages ({percentage}%)',
summaryTemplate: 'Message type distribution ({rowCount} types):',
fallback: 'No messages found in this time range',
},
peak_chat_hours_by_member: {
desc: "Analyze a specific member's hourly message distribution over the last N days to find their most active hours. Requires member_id from get_members.",
params: {
member_id: 'Member ID (from get_members)',
days: 'Number of recent days to analyze',
},
rowTemplate: '{hour}:00 — {msg_count} messages',
summaryTemplate: 'Message volume by hour ({rowCount} active hours):',
fallback: 'This member has no messages in the specified time range',
},
member_activity_trend: {
desc: "View a specific member's daily message count trend over the last N days. Useful for observing whether someone is becoming more or less active. Requires member_id from get_members.",
params: {
member_id: 'Member ID (from get_members)',
days: 'Number of recent days to view',
},
rowTemplate: '{day}: {msg_count} messages',
summaryTemplate: 'This member was active on {rowCount} days:',
fallback: 'This member has no messages in the specified time range',
},
silent_members: {
desc: 'Detect "silent members" who haven\'t sent messages for more than N days. Useful for identifying at-risk users in community management.',
params: { days: 'Days of silence to qualify' },
rowTemplate: '{name} — silent for {silent_days} days',
summaryTemplate: 'Found {rowCount} silent members:',
fallback: 'No members found who have been silent for that long. Community engagement is healthy!',
},
reply_interaction_ranking: {
desc: 'Analyze reply interaction rankings in the group — who replies to whom the most. Useful for discovering core interaction relationships and key opinion leaders.',
params: {
days: 'Number of recent days to analyze',
limit: 'Number of top interaction pairs to return',
},
rowTemplate: '{replier_name} → {original_name}: {reply_count} replies',
summaryTemplate: 'Top {rowCount} reply interactions:',
fallback: 'No reply interactions found in this time range',
},
mutual_interaction_pairs: {
desc: 'Find the most frequently interacting member pairs, based on bidirectional message timing (if one person speaks and another responds within 5 minutes, it counts as an interaction). Useful for discovering close friendships.',
params: {
days: 'Number of recent days to analyze',
limit: 'Number of top pairs to return',
},
rowTemplate: '{member_a} ↔ {member_b}: {interaction_count} interactions',
summaryTemplate: 'Top {rowCount} most interactive pairs:',
fallback: 'No significant interaction patterns detected in this time range',
},
member_message_length_stats: {
desc: 'Analyze average message length per member (text messages only). Longer messages often indicate more thoughtful communication. Useful for finding deep communicators.',
params: {
days: 'Number of recent days to analyze',
top_n: 'Number of top members to return',
},
rowTemplate: '{name} — avg {avg_length} chars/msg ({msg_count} msgs, max {max_length} chars)',
summaryTemplate: 'Message length Top {rowCount} (longer = more thoughtful):',
fallback: 'Not enough text message data in this time range',
},
unanswered_messages: {
desc: 'Find messages in the last N days that may not have been replied to — potential unresolved customer issues. Only counts text messages over 10 characters (filters out short greetings).',
params: {
days: 'Number of recent days to search',
limit: 'Maximum number of results',
},
rowTemplate: '[{send_time}] {sender_name}: {content_preview}',
summaryTemplate: 'Found {rowCount} potentially unanswered messages:',
fallback: 'All messages have been replied to in this time range. Great service quality!',
},
daily_active_members: {
desc: 'Count daily unique active members (DAU) and message volume to observe community vitality trends. Useful for "how is the group activity trending" or "how many people are chatting recently".',
params: { days: 'Number of recent days to analyze' },
rowTemplate: '{day}: {active_members} active, {msg_count} messages',
summaryTemplate: 'Daily active members trend for {rowCount} days:',
fallback: 'No messages in this time range',
},
conversation_initiator_stats: {
desc: 'Count how many times each member initiated a conversation (was the first sender in a session). Requires session index to be generated.',
params: {
days: 'Number of recent days to analyze',
limit: 'Number of top members to return',
},
rowTemplate: '{name}: initiated {initiated_count} topics',
summaryTemplate: 'Topic initiator Top {rowCount}:',
fallback: 'No session records in this time range. Session index may need to be generated first.',
},
activity_heatmap: {
desc: 'Return a weekday × hour message count matrix for generating activity heatmaps. weekday: 0=Sun, 1=Mon, ..., 6=Sat.',
params: { days: 'Number of recent days to analyze' },
rowTemplate: 'Weekday {weekday} {hour}:00 — {msg_count} messages',
summaryTemplate: 'Activity heatmap data ({rowCount} time slots with messages):',
fallback: 'No messages in this time range',
},
response_time_analysis: {
desc: 'Analyze response times between messages, showing median and average reply speed per member. Useful for "how quickly do people reply" or "who replies the fastest".',
params: {
days: 'Number of recent days to analyze',
top_n: 'Number of top members to return',
},
},
keyword_frequency: {
desc: 'Segment text messages and rank high-frequency keywords. Supports Chinese, English, and Japanese. Useful for "what do people talk about most" or "what are the hot keywords".',
params: {
days: 'Number of recent days to analyze',
top_n: 'Number of top keywords to return',
},
},
},
// ===== AI Agent system prompts =====
agent: {
answerWithoutTools: 'Please answer based on the information already retrieved, do not call any more tools.',
toolError: 'Error: {{error}}',
currentDateIs: 'Current date is',
chatContext: {
private: 'conversation',
group: 'group chat',
},
ownerNote: `Current user identity:
- The user's identity in this {{chatContext}} is "{{displayName}}" (platformId: {{platformId}})
- When the user refers to "I" or "my", it refers to "{{displayName}}"
- When querying "my" messages, use the sender_id parameter to filter for this member
`,
memberNotePrivate: `Member query strategy:
- Private chats only have two participants, so the member list can be directly obtained
- When the user refers to "the other party" or "he/she", get the other participant's information via get_members
`,
memberNoteGroup: `Member query strategy:
- When the user refers to specific group members (e.g., "what did John say", "Mary's messages"), first call get_members to get the member list
- Group members have three names: accountName (original nickname), groupNickname (group nickname), aliases (user-defined aliases)
- The search parameter of get_members can be used for fuzzy searching these three names
- Once a member is found, use their id field as the sender_id parameter for search_messages to retrieve their messages
`,
mentionedMembersNote:
'Members explicitly @-selected by the user in this round (member_id can be used directly without another search):',
timeParamsIntro: 'Time parameters: use start_time/end_time to specify the range, format "YYYY-MM-DD HH:mm"',
defaultYearNote: 'When no time range is specified, queries default to all data. Current year is {{year}}.',
currentTask: 'Current Task',
skillPriorityNote:
'Note: When executing this task, prioritize the output format requirements below. This can override your usual response style.',
responseInstruction:
"Based on the user's question, select appropriate tools to retrieve data, then provide an answer based on the data.",
fallbackRoleDefinition: {
group: `You are a professional group chat analysis assistant.
Your task is to help users understand and analyze their group chat data.
## Response Requirements
1. Answer based on data returned by tools, do not fabricate information
2. If data is insufficient to answer, please state so
3. Keep answers concise and clear, use Markdown format`,
private: `You are a professional private chat analysis assistant.
Your task is to help users understand and analyze their private chat data.
## Response Requirements
1. Answer based on data returned by tools, do not fabricate information
2. If data is insufficient to answer, please state so
3. Keep answers concise and clear, use Markdown format`,
},
},
},
// ===== P3: LLM config =====
llm: {
notConfigured: 'LLM service not configured. Please set up an API Key in settings first.',
maxConfigs: 'Maximum of {{count}} configurations allowed',
configNotFound: 'Configuration not found',
noActiveConfig: 'No active configuration',
callFailed: 'LLM call failed. Please check your model configuration.',
genericProviderName: 'API provider',
rawErrorLabel: 'Raw error',
},
// ===== P4: Summary generation =====
summary: {
sessionNotFound: 'Session not found or database could not be opened',
tooFewMessages: 'Message count less than {{count}}, no need to generate summary',
tooFewValidMessages: 'Valid message count less than {{count}}, no need to generate summary',
sessionNotExist: 'Session not found',
messagesTooFew: 'Too few messages',
validMessagesTooFew: 'Too few valid messages',
systemPromptDirect: 'You are a conversation summarization expert. Summarize conversations concisely.',
systemPromptMerge:
'You are a conversation summarization expert skilled at merging multiple summaries into a coherent overview.',
},
}