feat: harden support, localize knowledge and add operator availability [skip ci]
Source-only publication of reviewed commit 64e96a7f423673dc29ad56485be9fc79bce8af1c.
Passed in isolation: focused frontend/backend tests, race checks, TypeScript typecheck, lint, Go compilation, Flowgram build, and deterministic SDK build/tests.
Not accepted as a production release: Next.js export/native assembly remains blocked by environment memory limits; browser interaction and MySQL staging acceptance remain unverified. No production server, database/schema, runtime configuration, deployment, release tag, or workflow execution was performed.
Expected source tree: 0a4a7528e9.
This commit is contained in:
@@ -26,7 +26,11 @@
|
||||
"actions": "Actions",
|
||||
"name": "Name",
|
||||
"saving": "Saving...",
|
||||
"reset": "Reset"
|
||||
"reset": "Reset",
|
||||
"operationFailed": "The operation failed. Please try again.",
|
||||
"loadFailed": "Could not load data. Please try again.",
|
||||
"enabled": "Enabled",
|
||||
"disabled": "Disabled"
|
||||
},
|
||||
"language": {
|
||||
"enUS": "English",
|
||||
@@ -531,9 +535,9 @@
|
||||
"messageSummary": "[Message]",
|
||||
"closedTitle": "Conversation ended",
|
||||
"closedDescription": "This support conversation has been closed. Thanks for chatting with us.",
|
||||
"connecting": "Connecting",
|
||||
"connected": "Online support",
|
||||
"disconnected": "Disconnected",
|
||||
"connecting": "Connecting chat",
|
||||
"connected": "Chat connected",
|
||||
"disconnected": "Chat disconnected",
|
||||
"retry": "Reconnect",
|
||||
"moreActions": "More actions",
|
||||
"minimize": "Minimize window",
|
||||
@@ -583,7 +587,12 @@
|
||||
"startFirstRequest": "Start your first request",
|
||||
"openRequestCount": "{open} open of {total}",
|
||||
"loadConversationsFailed": "Could not load your requests",
|
||||
"createConversationFailed": "Could not create the request"
|
||||
"createConversationFailed": "Could not create the request",
|
||||
"dismissedTitle": "Chat window closed",
|
||||
"dismissedDescription": "Your support request has not been ended. You can return to continue the conversation.",
|
||||
"returnToChat": "Return to chat",
|
||||
"sendUnavailable": "This conversation is unavailable. Return to it or retry before sending.",
|
||||
"sendInProgress": "A message is already being sent."
|
||||
},
|
||||
"dashboardHome": {
|
||||
"rangeToday": "Today",
|
||||
@@ -2493,7 +2502,23 @@
|
||||
"debugAnswer": "Debug Answer",
|
||||
"answerResult": "Answer Result",
|
||||
"searchHits": "Search Hits",
|
||||
"hitsSummary": "{count} hits · {latency}ms"
|
||||
"hitsSummary": "{count} hits · {latency}ms",
|
||||
"unknownType": "Unknown type",
|
||||
"unknownStatus": "Unknown status",
|
||||
"indexFailureSummary": "Indexing failed. Check the indexing configuration and try again.",
|
||||
"requestId": "Request ID",
|
||||
"rerank": "Reranking",
|
||||
"topScore": "Top score",
|
||||
"promptTokens": "Input tokens",
|
||||
"completionTokens": "Output tokens",
|
||||
"traceData": "Trace data",
|
||||
"chunkNumber": "Chunk #{number}",
|
||||
"providerValue": "Strategy: {value}",
|
||||
"scoreValue": "Score: {value}",
|
||||
"rerankValue": "Rerank score: {value}",
|
||||
"historyRecordedNotice": "Historical answers and excerpts are shown as recorded. Changing the interface language does not rewrite them.",
|
||||
"faqNumber": "FAQ #{number}",
|
||||
"documentNumber": "Document #{number}"
|
||||
},
|
||||
"scaffold": {
|
||||
"moduleBoard": "Module Delivery Board",
|
||||
@@ -3370,8 +3395,8 @@
|
||||
"statusReady": "Ready to Receive Requests",
|
||||
"statusNeedsSetup": "Setup Incomplete ({ready}/{total} steps ready)",
|
||||
"stepsProgress": "{ready} of {total} steps ready",
|
||||
"quickSetupAll": "Configure Everything in 1 Click",
|
||||
"quickSetupRunning": "Applying setup...",
|
||||
"quickSetupAll": "Review missing defaults",
|
||||
"quickSetupRunning": "Preparing preview...",
|
||||
"quickFixSuccess": "Configuration updated and routing re-checked",
|
||||
"refresh": "Re-check Readiness",
|
||||
"openSettings": "Open Settings",
|
||||
@@ -3394,12 +3419,12 @@
|
||||
"description": "At least one active operator team is required to group agents and define shift schedules."
|
||||
},
|
||||
"schedules": {
|
||||
"title": "Shift Schedules (Active Now)",
|
||||
"description": "Teams require an active schedule covering the current time; off-hours requests stay in queue."
|
||||
"title": "Active support hours",
|
||||
"description": "Teams need an active support calendar now, using their selected dated-shift or recurring-hours mode. Off-hours requests remain queued."
|
||||
},
|
||||
"operators": {
|
||||
"title": "Operator Profiles & Capacity",
|
||||
"description": "Operators must have an enabled profile, belong to an active team, have auto-assign on, be idle, and have free capacity."
|
||||
"description": "Operators need an enabled account and profile, an active team calendar, a live platform connection, a ready working status, no active vacation, automatic assignment enabled, and available capacity."
|
||||
},
|
||||
"ai_agents": {
|
||||
"title": "AI Agents & Human Handoff",
|
||||
@@ -3433,7 +3458,15 @@
|
||||
"channel_no_agent": "Channel is not connected to an AI agent.",
|
||||
"channel_agent_disabled": "Channel points to a disabled or missing AI agent.",
|
||||
"channel_zero_rollout": "Channel has a 0% AI agent rollout rate.",
|
||||
"no_end_to_end_path": "No channel can successfully route to an available human operator right now."
|
||||
"no_end_to_end_path": "No channel can successfully route to an available human operator right now.",
|
||||
"agent_unpublished": "The agent has no published revision. Publish it in agent settings before using it for a channel.",
|
||||
"channel_agent_unpublished": "The channel points to an unpublished agent. Publish the agent or deliberately choose a published one.",
|
||||
"operator_offline": "The operator has no active connection to the support platform.",
|
||||
"operator_break": "The operator is on break and cannot receive new assignments.",
|
||||
"operator_unavailable": "The operator is unavailable for new assignments.",
|
||||
"operator_vacation": "The operator is currently on scheduled vacation.",
|
||||
"operator_outside_hours": "The operator is outside scheduled working hours.",
|
||||
"operator_availability_unavailable": "The operator’s current availability could not be determined."
|
||||
},
|
||||
"operatorBlockers": {
|
||||
"not_authenticated": "You are not signed in.",
|
||||
@@ -3443,25 +3476,31 @@
|
||||
"team_off_hours": "Your team is currently off-hours (no active shift schedule).",
|
||||
"auto_assign_disabled": "Automatic conversation assignment is disabled for your profile.",
|
||||
"status_busy": "Your status is set to Busy.",
|
||||
"at_capacity": "You have reached your maximum active conversation limit."
|
||||
"at_capacity": "You have reached your maximum active conversation limit.",
|
||||
"offline": "No active connection to the support platform.",
|
||||
"break": "On break: new assignments are paused.",
|
||||
"unavailable": "Unavailable for new assignments.",
|
||||
"vacation": "Scheduled vacation is active.",
|
||||
"availability_unavailable": "Current availability could not be determined.",
|
||||
"user_disabled": "The account is disabled or deleted."
|
||||
},
|
||||
"quickFixLabels": {
|
||||
"quick_setup_all": "Configure Everything in 1 Click",
|
||||
"ensure_team_and_schedule": "Create/Enable Team & 24/7 Schedule",
|
||||
"quick_setup_all": "Review missing defaults",
|
||||
"ensure_team_and_schedule": "Review team setup",
|
||||
"enable_my_operator_profile": "Enable My Reception & Set Idle",
|
||||
"fix_ai_agent_handoff": "Fix AI Agent Handoff & Bind Teams",
|
||||
"ensure_default_channel": "Create/Fix Default Web Channel"
|
||||
},
|
||||
"simulator": {
|
||||
"title": "Operator Route Simulator",
|
||||
"description": "Simulate what happens when a customer sends a message on a channel and see every decision hop in real time.",
|
||||
"description": "Read-only check of current human-only routing eligibility. AI behavior and partial rollout are not simulated, and no message is sent.",
|
||||
"selectChannelPlaceholder": "Select a channel to simulate...",
|
||||
"runSimulation": "Simulate Dispatch",
|
||||
"running": "Simulating...",
|
||||
"outcomeSuccess": "Request WILL reach operator: {operator}",
|
||||
"outcomeBlocked": "Request WILL NOT reach an operator",
|
||||
"outcomeSuccess": "Eligible operator now: {operator}",
|
||||
"outcomeBlocked": "Operator delivery not confirmed",
|
||||
"outcomes": {
|
||||
"assigned_to_operator": "Success: The conversation is assigned to an idle operator.",
|
||||
"assigned_to_operator": "Human-only routing currently has an eligible operator. This is a read-only check, not a delivery guarantee.",
|
||||
"blocked_no_channel": "Blocked: No channels exist or the requested channel was not found.",
|
||||
"blocked_channel_disabled": "Blocked: This channel is disabled.",
|
||||
"blocked_zero_rollout": "Blocked: Channel AI agent rollout rate is set to 0%.",
|
||||
@@ -3469,7 +3508,10 @@
|
||||
"blocked_ai_only_mode": "Blocked: AI agent is set to AI-Only mode and never hands off to human operators.",
|
||||
"blocked_agent_no_teams": "Blocked: AI agent has no valid operator teams assigned for handoff.",
|
||||
"queued_off_hours_no_schedule": "Queued: Target teams have no active shift schedule right now (Off-Hours).",
|
||||
"queued_no_eligible_operator": "Queued: Shift is active, but no idle operators with available capacity are online."
|
||||
"queued_no_eligible_operator": "Queued: Shift is active, but no idle operators with available capacity are online.",
|
||||
"ai_execution_not_simulated": "AI behavior is not simulated; operator delivery is unverified.",
|
||||
"partial_rollout_not_simulated": "Partial rollout is not simulated; operator delivery is unverified.",
|
||||
"blocked_agent_unpublished": "Operator routing is not verified for an unpublished agent. Publish the agent first."
|
||||
},
|
||||
"hops": {
|
||||
"channel": "Channel",
|
||||
@@ -3491,7 +3533,10 @@
|
||||
"blocked_agent_no_teams": "No active teams assigned to this agent",
|
||||
"queued_off_hours_no_schedule": "No active shift schedule covers the current time (Off-Hours)",
|
||||
"queued_no_eligible_operator": "No idle operators with available capacity in active teams",
|
||||
"assigned_to_operator": "Assigned to eligible operator"
|
||||
"assigned_to_operator": "Assigned to eligible operator",
|
||||
"ai_execution_not_simulated": "AI behavior is not simulated; operator delivery is unverified.",
|
||||
"partial_rollout_not_simulated": "Partial rollout is not simulated; operator delivery is unverified.",
|
||||
"blocked_agent_unpublished": "Operator routing is not verified for an unpublished agent. Publish the agent first."
|
||||
},
|
||||
"candidateTableTitle": "Evaluated Operator Candidates",
|
||||
"colOperator": "Operator",
|
||||
@@ -3505,12 +3550,19 @@
|
||||
"eligibleBadge": "Eligible",
|
||||
"skipReasons": {
|
||||
"profile_disabled": "Profile disabled",
|
||||
"user_disabled": "User account disabled",
|
||||
"user_disabled": "The account is disabled or deleted.",
|
||||
"team_not_in_agent": "Team not in agent scope",
|
||||
"team_off_hours": "Team off-hours",
|
||||
"auto_assign_off": "Auto-assign disabled",
|
||||
"status_busy": "Status is Busy",
|
||||
"at_capacity": "At maximum capacity"
|
||||
"at_capacity": "At maximum capacity",
|
||||
"offline": "No active connection to the support platform.",
|
||||
"break": "On break: new assignments are paused.",
|
||||
"unavailable": "Unavailable for new assignments.",
|
||||
"vacation": "Scheduled vacation is active.",
|
||||
"availability_unavailable": "Current availability could not be determined.",
|
||||
"auto_assign_disabled": "Automatic assignment is disabled.",
|
||||
"no_team": "No enabled team is assigned."
|
||||
}
|
||||
},
|
||||
"banner": {
|
||||
@@ -3520,6 +3572,185 @@
|
||||
"headerIndicator": {
|
||||
"readyLabel": "Ready for Chats",
|
||||
"blockedLabel": "Routing Blocked ({count})"
|
||||
},
|
||||
"preview": {
|
||||
"review": "Review setup changes",
|
||||
"title": "Review exact changes before applying",
|
||||
"description": "Only the named records and fields below will change. No shifts are added. Unlisted configurations and rollout percentages remain unchanged. Applying may dispatch pending conversations after the changes commit.",
|
||||
"noChanges": "No safe automatic changes are available. Use the relevant settings to choose a team, route or working hours.",
|
||||
"apply": "Apply reviewed changes",
|
||||
"create": "Create",
|
||||
"update": "Update",
|
||||
"notApplied": "The reviewed changes were not applied.",
|
||||
"manageSchedules": "Manage explicit working hours"
|
||||
},
|
||||
"repairFields": {
|
||||
"name": "Name",
|
||||
"leader_user_id": "Team leader ID",
|
||||
"status": "Enabled status (0 enabled, 1 disabled)",
|
||||
"user_id": "User ID",
|
||||
"team_id": "Team ID / new team name",
|
||||
"team_ids": "Routing teams",
|
||||
"service_status": "Availability (0 idle, 1 busy)",
|
||||
"auto_assign_enabled": "Automatic assignment",
|
||||
"max_concurrent_count": "Concurrent conversation limit",
|
||||
"priority_level": "Assignment priority",
|
||||
"receive_offline_message": "Receive offline messages",
|
||||
"service_mode": "Service mode (1 AI only, 2 human only, 3 AI first)",
|
||||
"rollout_percent": "Agent rollout (%)",
|
||||
"handoff_mode": "Handoff mode (2 team queue)",
|
||||
"fallback_mode": "Fallback mode",
|
||||
"auto_handoff_on_failure": "Automatic handoff on failure",
|
||||
"reply_timeout_seconds": "Reply timeout (seconds)",
|
||||
"max_steps": "Maximum AI steps",
|
||||
"channel_id": "Channel identifier",
|
||||
"channel_type": "Channel type",
|
||||
"ai_agent_id": "Agent ID / new agent name",
|
||||
"ai_agent_rollout_percent": "Channel rollout (%)",
|
||||
"config_json": "Channel configuration"
|
||||
},
|
||||
"repairWarnings": {
|
||||
"schedules_unchanged": "Working hours were not changed. Configure shifts explicitly; being off duty is not a setup error.",
|
||||
"active_team_required": "Select or enable a team in team settings before linking new records.",
|
||||
"disabled_configuration_preserved": "The selected configuration is disabled or has zero rollout and was left unchanged.",
|
||||
"agent_team_selection_required": "Choose the agent’s intended teams in agent settings; no teams were added automatically.",
|
||||
"channel_selection_required": "Choose the intended agent and rollout in channel settings. Existing channel routing was preserved.",
|
||||
"existing_configuration_preserved": "Existing configuration was preserved. Review any remaining readiness issues in the relevant settings.",
|
||||
"dispatch_failed": "Changes were saved, but pending conversation dispatch failed. Review the queue; do not reapply the repair.",
|
||||
"readiness_refresh_failed": "The readiness refresh failed. Reload diagnostics to see the current state; committed changes are not rolled back.",
|
||||
"agent_publication_required": "Publish the intended agent in agent settings before creating a channel. Setup does not publish agents or bypass the publication requirement."
|
||||
}
|
||||
},
|
||||
"supportAvailability": {
|
||||
"title": "Support availability",
|
||||
"description": "Configure support hours and timezones. Connection, working status, and eligibility are separate.",
|
||||
"loading": "Loading availability…",
|
||||
"myStatus": "My availability",
|
||||
"retryStatus": "Status unavailable. Retry",
|
||||
"operatorStatus": "Availability: {name}",
|
||||
"presenceHelp": "Online means an active connection to the support platform, across tabs and devices. It does not mean the operator is accepting new requests.",
|
||||
"online": "On the platform",
|
||||
"offline": "Not connected",
|
||||
"workingStatus": "Working status",
|
||||
"statusHelp": "Your status is saved across sessions. Busy, break, unavailable, and active vacation stop new assignments; signing in does not reset them.",
|
||||
"statusSaved": "Availability saved",
|
||||
"saveFailed": "Could not save changes. Your input is preserved.",
|
||||
"loadFailed": "Could not load availability",
|
||||
"saveStatus": "Save status",
|
||||
"saving": "Saving…",
|
||||
"cancel": "Cancel",
|
||||
"retry": "Retry",
|
||||
"refresh": "Refresh",
|
||||
"discardTitle": "Discard unsaved changes?",
|
||||
"discardDescription": "Your changes have not been saved. Leave without saving them?",
|
||||
"discard": "Discard changes",
|
||||
"vacationStart": "Vacation starts",
|
||||
"vacationEnd": "Vacation ends (exclusive)",
|
||||
"vacationTimezone": "Enter dates in your browser timezone: {timezone}.",
|
||||
"vacationExact": "Exact UTC interval: {start} → {end}.",
|
||||
"vacationHelp": "During this interval, new assignments stop even if you sign in. Outside the interval, the saved return status applies: {status}. Existing conversations are not transferred automatically.",
|
||||
"cancelVacationHelp": "Saving a different status cancels the scheduled vacation.",
|
||||
"invalidVacation": "Enter valid start and end times, with the end after the start. Times skipped by daylight saving are not valid.",
|
||||
"calendar": "Support calendar",
|
||||
"editCalendar": "Edit calendar",
|
||||
"saveCalendar": "Save calendar",
|
||||
"calendarSaved": "Support calendar saved",
|
||||
"readOnly": "You have read-only access.",
|
||||
"deploymentDefault": "Deployment defaults",
|
||||
"selectScope": "Select default or team",
|
||||
"deploymentTimezone": "Default IANA timezone",
|
||||
"teamTimezone": "Team timezone override",
|
||||
"timezoneHelp": "Use an IANA name, such as Europe/Moscow or America/New_York, not a fixed UTC offset.",
|
||||
"inheritTimezoneHelp": "Leave blank to inherit the deployment timezone. A timezone override does not change stored dated shifts.",
|
||||
"effectiveTimezone": "Effective timezone: {timezone}",
|
||||
"scheduleMode": "Calendar mode",
|
||||
"legacy": "Existing dated shifts",
|
||||
"recurring": "Weekly hours and exceptions",
|
||||
"legacyHelp": "Existing dated shifts are preserved and are not reinterpreted in the new timezone. Weekly hours apply only after explicitly selecting and saving the recurring mode.",
|
||||
"viewDatedShifts": "View dated shifts",
|
||||
"legacyActive": "Existing dated shifts remain the source of working hours. No weekly hours are silently created.",
|
||||
"confirmCalendarTitle": "Apply this support calendar?",
|
||||
"confirmRecurring": "Switch to weekly hours and date exceptions for this scope? Existing dated shifts will remain stored but will no longer determine availability in this mode.",
|
||||
"confirmCalendar": "These settings change when new requests can be assigned. Teams inheriting the default timezone are affected by a default timezone change. Dated shifts remain unchanged.",
|
||||
"weeklyHours": "Weekly hours",
|
||||
"hoursHelp": "Add multiple periods for split shifts. An end earlier than the start continues into the next day. Equal start and end is invalid. Days without periods are closed. Use 00:00–24:00 for a full day.",
|
||||
"noWeeklyHours": "No weekly hours. In recurring mode, only explicit open-date exceptions can open support.",
|
||||
"addPeriod": "Add period",
|
||||
"removePeriod": "Remove period",
|
||||
"day": "Day",
|
||||
"start": "Start",
|
||||
"end": "End",
|
||||
"exceptions": "Holidays and date exceptions",
|
||||
"exceptionsHelp": "A date exception replaces that local day's weekly hours. Closed dates block the whole day, including an overnight period from the previous day.",
|
||||
"noExceptions": "No date exceptions",
|
||||
"addException": "Add date exception",
|
||||
"removeException": "Remove date exception",
|
||||
"date": "Date",
|
||||
"closedDay": "Closed all day",
|
||||
"preview": "Calendar preview",
|
||||
"previewHelp": "Preview the current form without saving it. Enter the check time in your browser timezone ({timezone}), or leave it blank for now. Results use the calendar timezone.",
|
||||
"previewAt": "Check time (optional)",
|
||||
"runPreview": "Check calendar",
|
||||
"previewing": "Checking…",
|
||||
"previewFailed": "Could not preview the calendar",
|
||||
"previewStale": "The form changed. Run the preview again.",
|
||||
"scheduleOpen": "The schedule is open at this time.",
|
||||
"scheduleClosed": "The schedule is closed at this time.",
|
||||
"nextOpening": "Next scheduled opening: {time}",
|
||||
"noNextOpening": "No scheduled opening found in the preview window.",
|
||||
"notPresencePromise": "Scheduled hours do not guarantee that an operator will be connected or available.",
|
||||
"invalidTimezone": "Enter a valid IANA timezone. Deployment defaults cannot be blank.",
|
||||
"invalidHours": "Use valid HH:mm intervals with different start and end times. An open exception needs at least one interval.",
|
||||
"invalidExceptionDate": "Each exception needs a valid, unique date.",
|
||||
"invalidPreviewTime": "Enter a valid check time in your browser timezone.",
|
||||
"noPermission": "You do not have permission to view calendar settings. You can still manage your own working status.",
|
||||
"noTeams": "No teams are available for calendar configuration.",
|
||||
"publicChecking": "Checking human support availability…",
|
||||
"publicNextOpening": "Next scheduled opening: {time}. Operator presence is not guaranteed.",
|
||||
"offlineDeprecated": "Legacy setting, retained for compatibility. It does not allow new assignments to disconnected operators.",
|
||||
"manageStatus": "Manage availability",
|
||||
"statusSeparate": "Working status and scheduled vacation are managed separately from the operator profile.",
|
||||
"status": {
|
||||
"ready": "Ready to accept",
|
||||
"busy": "Busy",
|
||||
"break": "On break",
|
||||
"unavailable": "Unavailable",
|
||||
"vacation": "On vacation",
|
||||
"unknown": "Unknown status"
|
||||
},
|
||||
"reason": {
|
||||
"eligible": "Eligible for new assignments",
|
||||
"profile_disabled": "Operator profile is administratively disabled",
|
||||
"user_disabled": "Account is disabled",
|
||||
"team_disabled": "Team is disabled",
|
||||
"outside_hours": "Outside scheduled working hours",
|
||||
"offline": "No active connection to the support platform",
|
||||
"busy": "Busy: new assignments are paused",
|
||||
"break": "On break: new assignments are paused",
|
||||
"unavailable": "Unavailable for new assignments",
|
||||
"vacation": "Scheduled vacation is active",
|
||||
"auto_assign_disabled": "Automatic assignment is disabled",
|
||||
"capacity": "Concurrent conversation limit reached",
|
||||
"unknown": "Eligibility could not be determined"
|
||||
},
|
||||
"public": {
|
||||
"available": "Human support is available now",
|
||||
"outside_hours": "Human support is outside scheduled hours",
|
||||
"temporarily_absent": "No operator is currently available for a new request",
|
||||
"capacity": "Operators are currently at capacity",
|
||||
"unknown": "Human support availability is unknown"
|
||||
},
|
||||
"weekday": {
|
||||
"1": "Monday",
|
||||
"2": "Tuesday",
|
||||
"3": "Wednesday",
|
||||
"4": "Thursday",
|
||||
"5": "Friday",
|
||||
"6": "Saturday",
|
||||
"7": "Sunday"
|
||||
},
|
||||
"dstOccurrence": "{field}: this time occurs twice. Choose the exact UTC instant.",
|
||||
"chooseOccurrence": "Choose occurrence",
|
||||
"datedShiftsNotice": "These dated shifts affect availability only for teams using the existing dated-shift mode. In weekly mode they remain stored but inactive; switching back reactivates them unchanged."
|
||||
}
|
||||
}
|
||||
|
||||
2
web/messages/en-US.json.license
Normal file
2
web/messages/en-US.json.license
Normal file
@@ -0,0 +1,2 @@
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
SPDX-FileComment: Modified in the independent hardening fork. See docs/hardening/README.md and MODIFIED_FILES.md for source attribution and change notes.
|
||||
@@ -26,7 +26,11 @@
|
||||
"actions": "Действия",
|
||||
"name": "Название",
|
||||
"saving": "Сохранение...",
|
||||
"reset": "Сбросить"
|
||||
"reset": "Сбросить",
|
||||
"operationFailed": "Не удалось выполнить операцию. Повторите попытку.",
|
||||
"loadFailed": "Не удалось загрузить данные. Повторите попытку.",
|
||||
"enabled": "Включено",
|
||||
"disabled": "Отключено"
|
||||
},
|
||||
"language": {
|
||||
"enUS": "English",
|
||||
@@ -531,9 +535,9 @@
|
||||
"messageSummary": "[Сообщение]",
|
||||
"closedTitle": "Диалог завершён",
|
||||
"closedDescription": "Этот диалог поддержки закрыт. Спасибо, что обратились к нам.",
|
||||
"connecting": "Подключение",
|
||||
"connected": "Поддержка на связи",
|
||||
"disconnected": "Нет связи",
|
||||
"connecting": "Подключение чата",
|
||||
"connected": "Чат подключён",
|
||||
"disconnected": "Чат отключён",
|
||||
"retry": "Переподключиться",
|
||||
"moreActions": "Другие действия",
|
||||
"minimize": "Свернуть окно",
|
||||
@@ -583,7 +587,12 @@
|
||||
"startFirstRequest": "Создайте первое обращение",
|
||||
"openRequestCount": "Открыто {open} из {total}",
|
||||
"loadConversationsFailed": "Не удалось загрузить список обращений",
|
||||
"createConversationFailed": "Не удалось создать обращение"
|
||||
"createConversationFailed": "Не удалось создать обращение",
|
||||
"dismissedTitle": "Окно чата закрыто",
|
||||
"dismissedDescription": "Ваше обращение не завершено. Вы можете вернуться и продолжить разговор.",
|
||||
"returnToChat": "Вернуться в чат",
|
||||
"sendUnavailable": "Диалог недоступен. Вернитесь к нему или повторите попытку перед отправкой.",
|
||||
"sendInProgress": "Сообщение уже отправляется."
|
||||
},
|
||||
"dashboardHome": {
|
||||
"rangeToday": "Сегодня",
|
||||
@@ -2493,7 +2502,23 @@
|
||||
"debugAnswer": "Отладочный ответ",
|
||||
"answerResult": "Результат ответа",
|
||||
"searchHits": "Совпадения поиска",
|
||||
"hitsSummary": "Совпадений: {count} · {latency}мс"
|
||||
"hitsSummary": "Совпадений: {count} · {latency}мс",
|
||||
"unknownType": "Неизвестный тип",
|
||||
"unknownStatus": "Неизвестный статус",
|
||||
"indexFailureSummary": "Не удалось выполнить индексацию. Проверьте настройки индексации и повторите попытку.",
|
||||
"requestId": "Идентификатор запроса",
|
||||
"rerank": "Переранжирование",
|
||||
"topScore": "Лучшая оценка",
|
||||
"promptTokens": "Входные токены",
|
||||
"completionTokens": "Выходные токены",
|
||||
"traceData": "Данные трассировки",
|
||||
"chunkNumber": "Фрагмент №{number}",
|
||||
"providerValue": "Стратегия: {value}",
|
||||
"scoreValue": "Оценка: {value}",
|
||||
"rerankValue": "Оценка переранжирования: {value}",
|
||||
"historyRecordedNotice": "Прошлые ответы и фрагменты показаны в исходном виде. Смена языка интерфейса не изменяет историю.",
|
||||
"faqNumber": "FAQ №{number}",
|
||||
"documentNumber": "Документ №{number}"
|
||||
},
|
||||
"scaffold": {
|
||||
"moduleBoard": "Доска поставки модулей",
|
||||
@@ -3370,8 +3395,8 @@
|
||||
"statusReady": "Готово к приёму обращений",
|
||||
"statusNeedsSetup": "Требуется настройка (готово {ready} из {total} шагов)",
|
||||
"stepsProgress": "Готово {ready} из {total} шагов",
|
||||
"quickSetupAll": "Настроить всё в 1 клик",
|
||||
"quickSetupRunning": "Применение настроек...",
|
||||
"quickSetupAll": "Проверить недостающие настройки",
|
||||
"quickSetupRunning": "Подготовка плана...",
|
||||
"quickFixSuccess": "Настройки применены, проверка маршрутизации обновлена",
|
||||
"refresh": "Проверить снова",
|
||||
"openSettings": "Открыть настройки",
|
||||
@@ -3394,12 +3419,12 @@
|
||||
"description": "Требуется как минимум одна активная команда для объединения операторов и привязки расписания смен."
|
||||
},
|
||||
"schedules": {
|
||||
"title": "Расписания смен (активны сейчас)",
|
||||
"description": "Команде нужно активное расписание на текущее время, иначе обращения остаются в очереди нерабочих часов."
|
||||
"title": "Рабочее время поддержки",
|
||||
"description": "У команды сейчас должно быть рабочее время по выбранному календарю: датированным сменам или недельному расписанию. Вне рабочих часов обращения остаются в очереди."
|
||||
},
|
||||
"operators": {
|
||||
"title": "Профили операторов и доступная емкость",
|
||||
"description": "Операторы должны быть активны, состоять в команде, включить автоназначение, иметь статус «Свободен» и доступный лимит диалогов."
|
||||
"description": "Для назначения нужны активные учётная запись и профиль, рабочее время команды, подключение к платформе, готовность принимать обращения, отсутствие действующего отпуска и включённое автоназначение. Лимит одновременных обращений не должен быть достигнут."
|
||||
},
|
||||
"ai_agents": {
|
||||
"title": "AI-агенты и передача человеку",
|
||||
@@ -3433,7 +3458,15 @@
|
||||
"channel_no_agent": "Канал не подключен к AI-агенту.",
|
||||
"channel_agent_disabled": "Канал указывает на отключенного или удаленного AI-агента.",
|
||||
"channel_zero_rollout": "У канала охват AI-агента равен 0%.",
|
||||
"no_end_to_end_path": "Ни один канал не может доставить запрос до доступного оператора прямо сейчас."
|
||||
"no_end_to_end_path": "Ни один канал не может доставить запрос до доступного оператора прямо сейчас.",
|
||||
"agent_unpublished": "У агента нет опубликованной версии. Опубликуйте его в настройках перед использованием в канале.",
|
||||
"channel_agent_unpublished": "Канал связан с неопубликованным агентом. Опубликуйте его или выберите опубликованного агента.",
|
||||
"operator_offline": "У оператора нет активного подключения к платформе поддержки.",
|
||||
"operator_break": "Оператор на перерыве и не может получать новые назначения.",
|
||||
"operator_unavailable": "Оператор недоступен для новых назначений.",
|
||||
"operator_vacation": "У оператора сейчас действует запланированный отпуск.",
|
||||
"operator_outside_hours": "Оператор сейчас вне рабочего времени по расписанию.",
|
||||
"operator_availability_unavailable": "Не удалось определить текущую доступность оператора."
|
||||
},
|
||||
"operatorBlockers": {
|
||||
"not_authenticated": "Вы не вошли в систему.",
|
||||
@@ -3443,25 +3476,31 @@
|
||||
"team_off_hours": "Ваша команда сейчас не на смене (нет активного расписания).",
|
||||
"auto_assign_disabled": "Автоматическое назначение диалогов выключено в вашем профиле.",
|
||||
"status_busy": "Ваш статус установлен в «Занят».",
|
||||
"at_capacity": "Вы достигли лимита одновременных диалогов."
|
||||
"at_capacity": "Вы достигли лимита одновременных диалогов.",
|
||||
"offline": "Нет активного подключения к платформе поддержки.",
|
||||
"break": "Перерыв: новые назначения приостановлены.",
|
||||
"unavailable": "Недоступен для новых назначений.",
|
||||
"vacation": "Действует запланированный отпуск.",
|
||||
"availability_unavailable": "Не удалось определить текущую доступность.",
|
||||
"user_disabled": "Учётная запись отключена или удалена."
|
||||
},
|
||||
"quickFixLabels": {
|
||||
"quick_setup_all": "Настроить всё в 1 клик",
|
||||
"ensure_team_and_schedule": "Создать/включить команду и расписание 24/7",
|
||||
"quick_setup_all": "Проверить недостающие настройки",
|
||||
"ensure_team_and_schedule": "Проверить настройку группы",
|
||||
"enable_my_operator_profile": "Включить мой приём и статус «Свободен»",
|
||||
"fix_ai_agent_handoff": "Настроить передачу оператору и привязать команды",
|
||||
"ensure_default_channel": "Создать/исправить веб-канал по умолчанию"
|
||||
},
|
||||
"simulator": {
|
||||
"title": "Симулятор маршрутизации к оператору",
|
||||
"description": "Протестируйте путь входящего сообщения клиента через канал и узнайте результат на каждом узле маршрутизации.",
|
||||
"description": "Проверка текущей доступности маршрута только с оператором без изменений. Поведение ИИ и частичный запуск не моделируются; сообщения не отправляются.",
|
||||
"selectChannelPlaceholder": "Выберите канал для симуляции...",
|
||||
"runSimulation": "Запустить симуляцию",
|
||||
"running": "Симуляция...",
|
||||
"outcomeSuccess": "Запрос ДОЙДЁТ до оператора: {operator}",
|
||||
"outcomeBlocked": "Запрос НЕ ДОЙДЁТ до оператора",
|
||||
"outcomeSuccess": "Сейчас доступен оператор: {operator}",
|
||||
"outcomeBlocked": "Передача оператору не подтверждена",
|
||||
"outcomes": {
|
||||
"assigned_to_operator": "Успех: обращение назначено свободному оператору.",
|
||||
"assigned_to_operator": "Для маршрута только с оператором сейчас есть подходящий сотрудник. Это проверка без изменений, не гарантия доставки.",
|
||||
"blocked_no_channel": "Заблокировано: каналы не созданы или запрошенный канал не найден.",
|
||||
"blocked_channel_disabled": "Заблокировано: данный канал отключен.",
|
||||
"blocked_zero_rollout": "Заблокировано: охват AI-агента в канале равен 0%.",
|
||||
@@ -3469,7 +3508,10 @@
|
||||
"blocked_ai_only_mode": "Заблокировано: AI-агент работает в режиме «Только ИИ» и не переключает на человека.",
|
||||
"blocked_agent_no_teams": "Заблокировано: у AI-агента не указаны активные команды для перевода.",
|
||||
"queued_off_hours_no_schedule": "В очереди: у команд сейчас нет активного расписания смен (нерабочие часы).",
|
||||
"queued_no_eligible_operator": "В очереди: смена активна, но нет свободных операторов с доступной емкостью."
|
||||
"queued_no_eligible_operator": "В очереди: смена активна, но нет свободных операторов с доступной емкостью.",
|
||||
"ai_execution_not_simulated": "Поведение ИИ не моделируется; передача оператору не подтверждена.",
|
||||
"partial_rollout_not_simulated": "Частичный запуск не моделируется; передача оператору не подтверждена.",
|
||||
"blocked_agent_unpublished": "Маршрутизация к оператору не подтверждена для неопубликованного агента. Сначала опубликуйте его."
|
||||
},
|
||||
"hops": {
|
||||
"channel": "Канал",
|
||||
@@ -3491,7 +3533,10 @@
|
||||
"blocked_agent_no_teams": "Агенту не назначены активные команды",
|
||||
"queued_off_hours_no_schedule": "Нет активного расписания на текущее время (нерабочие часы)",
|
||||
"queued_no_eligible_operator": "В активных командах нет свободных операторов с доступной емкостью",
|
||||
"assigned_to_operator": "Назначено подходящему оператору"
|
||||
"assigned_to_operator": "Назначено подходящему оператору",
|
||||
"ai_execution_not_simulated": "Поведение ИИ не моделируется; передача оператору не подтверждена.",
|
||||
"partial_rollout_not_simulated": "Частичный запуск не моделируется; передача оператору не подтверждена.",
|
||||
"blocked_agent_unpublished": "Маршрутизация к оператору не подтверждена для неопубликованного агента. Сначала опубликуйте его."
|
||||
},
|
||||
"candidateTableTitle": "Оценка кандидатов-операторов",
|
||||
"colOperator": "Оператор",
|
||||
@@ -3505,12 +3550,19 @@
|
||||
"eligibleBadge": "Подходит",
|
||||
"skipReasons": {
|
||||
"profile_disabled": "Профиль отключен",
|
||||
"user_disabled": "Аккаунт пользователя отключен",
|
||||
"user_disabled": "Учётная запись отключена или удалена.",
|
||||
"team_not_in_agent": "Команда не входит в настройки агента",
|
||||
"team_off_hours": "Вне расписания команды",
|
||||
"auto_assign_off": "Автоназначение выключено",
|
||||
"status_busy": "Статус «Занят»",
|
||||
"at_capacity": "Лимит диалогов исчерпан"
|
||||
"at_capacity": "Лимит диалогов исчерпан",
|
||||
"offline": "Нет активного подключения к платформе поддержки.",
|
||||
"break": "Перерыв: новые назначения приостановлены.",
|
||||
"unavailable": "Недоступен для новых назначений.",
|
||||
"vacation": "Действует запланированный отпуск.",
|
||||
"availability_unavailable": "Не удалось определить текущую доступность.",
|
||||
"auto_assign_disabled": "Автоматическое назначение отключено.",
|
||||
"no_team": "Нет назначенной активной команды."
|
||||
}
|
||||
},
|
||||
"banner": {
|
||||
@@ -3520,6 +3572,185 @@
|
||||
"headerIndicator": {
|
||||
"readyLabel": "Приём включен",
|
||||
"blockedLabel": "Приём заблокирован ({count})"
|
||||
},
|
||||
"preview": {
|
||||
"review": "Просмотреть изменения",
|
||||
"title": "Проверка изменений перед применением",
|
||||
"description": "Изменятся только указанные записи и поля. Смены не добавляются. Остальные настройки и доли запуска сохранятся. После сохранения ожидающие диалоги могут быть распределены.",
|
||||
"noChanges": "Безопасных автоматических изменений нет. Выберите группу, маршрут или рабочие часы в соответствующих настройках.",
|
||||
"apply": "Применить проверенные изменения",
|
||||
"create": "Создать",
|
||||
"update": "Изменить",
|
||||
"notApplied": "Проверенные изменения не были применены.",
|
||||
"manageSchedules": "Настроить рабочие часы"
|
||||
},
|
||||
"repairFields": {
|
||||
"name": "Название",
|
||||
"leader_user_id": "ID руководителя группы",
|
||||
"status": "Статус (0 включён, 1 отключён)",
|
||||
"user_id": "ID пользователя",
|
||||
"team_id": "ID группы / название новой группы",
|
||||
"team_ids": "Группы маршрутизации",
|
||||
"service_status": "Доступность (0 свободен, 1 занят)",
|
||||
"auto_assign_enabled": "Автоматическое назначение",
|
||||
"max_concurrent_count": "Лимит одновременных диалогов",
|
||||
"priority_level": "Приоритет назначения",
|
||||
"receive_offline_message": "Принимать сообщения офлайн",
|
||||
"service_mode": "Режим (1 только ИИ, 2 только оператор, 3 сначала ИИ)",
|
||||
"rollout_percent": "Доля запуска агента (%)",
|
||||
"handoff_mode": "Режим передачи (2 очередь группы)",
|
||||
"fallback_mode": "Резервный режим",
|
||||
"auto_handoff_on_failure": "Передавать оператору при сбое",
|
||||
"reply_timeout_seconds": "Тайм-аут ответа (сек.)",
|
||||
"max_steps": "Максимум шагов ИИ",
|
||||
"channel_id": "Идентификатор канала",
|
||||
"channel_type": "Тип канала",
|
||||
"ai_agent_id": "ID агента / название нового агента",
|
||||
"ai_agent_rollout_percent": "Доля запуска канала (%)",
|
||||
"config_json": "Настройки канала"
|
||||
},
|
||||
"repairWarnings": {
|
||||
"schedules_unchanged": "Рабочие часы не изменены. Настройте смены явно: время вне смены не является ошибкой настройки.",
|
||||
"active_team_required": "Выберите или включите группу в настройках перед связыванием новых записей.",
|
||||
"disabled_configuration_preserved": "Выбранная конфигурация отключена или имеет нулевую долю запуска и оставлена без изменений.",
|
||||
"agent_team_selection_required": "Выберите нужные группы в настройках агента. Группы не добавлялись автоматически.",
|
||||
"channel_selection_required": "Выберите агента и долю запуска в настройках канала. Существующая маршрутизация сохранена.",
|
||||
"existing_configuration_preserved": "Существующие настройки сохранены. Проверьте оставшиеся проблемы готовности в соответствующих настройках.",
|
||||
"dispatch_failed": "Изменения сохранены, но распределение ожидающих диалогов не удалось. Проверьте очередь, не применяйте исправление повторно.",
|
||||
"readiness_refresh_failed": "Не удалось обновить диагностику. Загрузите её снова: сохранённые изменения не отменены.",
|
||||
"agent_publication_required": "Опубликуйте нужного агента в его настройках перед созданием канала. Мастер не публикует агентов и не обходит это требование."
|
||||
}
|
||||
},
|
||||
"supportAvailability": {
|
||||
"title": "Доступность поддержки",
|
||||
"description": "Настройте часы работы и часовые пояса. Подключение, рабочий статус и возможность принимать обращения учитываются отдельно.",
|
||||
"loading": "Загрузка доступности…",
|
||||
"myStatus": "Моя доступность",
|
||||
"retryStatus": "Статус неизвестен. Повторить",
|
||||
"operatorStatus": "Доступность: {name}",
|
||||
"presenceHelp": "«На платформе» означает активное подключение к платформе поддержки с учётом вкладок и устройств. Это не означает готовность принимать новые обращения.",
|
||||
"online": "На платформе",
|
||||
"offline": "Не подключён",
|
||||
"workingStatus": "Рабочий статус",
|
||||
"statusHelp": "Статус сохраняется между сеансами. Занятость, перерыв, недоступность и действующий отпуск блокируют новые назначения. Вход в систему их не сбрасывает.",
|
||||
"statusSaved": "Доступность сохранена",
|
||||
"saveFailed": "Не удалось сохранить изменения. Введённые данные сохранены в форме.",
|
||||
"loadFailed": "Не удалось загрузить доступность",
|
||||
"saveStatus": "Сохранить статус",
|
||||
"saving": "Сохранение…",
|
||||
"cancel": "Отмена",
|
||||
"retry": "Повторить",
|
||||
"refresh": "Обновить",
|
||||
"discardTitle": "Отменить несохранённые изменения?",
|
||||
"discardDescription": "Изменения ещё не сохранены. Выйти без сохранения?",
|
||||
"discard": "Отменить изменения",
|
||||
"vacationStart": "Начало отпуска",
|
||||
"vacationEnd": "Окончание отпуска (не включительно)",
|
||||
"vacationTimezone": "Введите даты в часовом поясе браузера: {timezone}.",
|
||||
"vacationExact": "Точный интервал UTC: {start} → {end}.",
|
||||
"vacationHelp": "В этот период новые назначения отключены, даже если вы войдёте в систему. Вне периода действует сохранённый статус: {status}. Текущие обращения автоматически не передаются.",
|
||||
"cancelVacationHelp": "Сохранение другого статуса отменит запланированный отпуск.",
|
||||
"invalidVacation": "Укажите корректные начало и окончание, причём окончание должно быть позже начала. Время, пропущенное при переводе часов, недопустимо.",
|
||||
"calendar": "Календарь поддержки",
|
||||
"editCalendar": "Изменить календарь",
|
||||
"saveCalendar": "Сохранить календарь",
|
||||
"calendarSaved": "Календарь поддержки сохранён",
|
||||
"readOnly": "У вас доступ только для просмотра.",
|
||||
"deploymentDefault": "Настройки по умолчанию",
|
||||
"selectScope": "Выберите общие настройки или команду",
|
||||
"deploymentTimezone": "Часовой пояс IANA по умолчанию",
|
||||
"teamTimezone": "Часовой пояс команды",
|
||||
"timezoneHelp": "Используйте имя IANA, например Europe/Moscow или America/New_York, а не фиксированное смещение UTC.",
|
||||
"inheritTimezoneHelp": "Оставьте пустым для наследования общего часового пояса. Переопределение не меняет сохранённые датированные смены.",
|
||||
"effectiveTimezone": "Применяемый часовой пояс: {timezone}",
|
||||
"scheduleMode": "Режим календаря",
|
||||
"legacy": "Существующие датированные смены",
|
||||
"recurring": "Недельное расписание и исключения",
|
||||
"legacyHelp": "Существующие датированные смены сохраняются и не пересчитываются в новый часовой пояс. Недельное расписание применяется только после явного выбора и сохранения этого режима.",
|
||||
"viewDatedShifts": "Открыть датированные смены",
|
||||
"legacyActive": "Часы работы по-прежнему определяются существующими датированными сменами. Недельное расписание автоматически не создаётся.",
|
||||
"confirmCalendarTitle": "Применить календарь поддержки?",
|
||||
"confirmRecurring": "Переключить выбранную область на недельное расписание и исключения? Датированные смены останутся сохранёнными, но в этом режиме не будут определять доступность.",
|
||||
"confirmCalendar": "Эти настройки меняют время назначения новых обращений. Изменение общего часового пояса затронет команды, которые его наследуют. Датированные смены останутся без изменений.",
|
||||
"weeklyHours": "Недельное расписание",
|
||||
"hoursHelp": "Добавьте несколько интервалов для смен с перерывом. Окончание раньше начала означает переход на следующий день. Одинаковые начало и конец недопустимы. Дни без интервалов закрыты. Для полного дня используйте 00:00–24:00.",
|
||||
"noWeeklyHours": "Недельных интервалов нет. В этом режиме поддержка открывается только по явно заданным исключениям.",
|
||||
"addPeriod": "Добавить интервал",
|
||||
"removePeriod": "Удалить интервал",
|
||||
"day": "День",
|
||||
"start": "Начало",
|
||||
"end": "Окончание",
|
||||
"exceptions": "Праздники и исключения по датам",
|
||||
"exceptionsHelp": "Исключение заменяет недельное расписание на эту местную дату. Закрытая дата блокирует весь день, включая ночной интервал с предыдущего дня.",
|
||||
"noExceptions": "Исключений по датам нет",
|
||||
"addException": "Добавить исключение",
|
||||
"removeException": "Удалить исключение",
|
||||
"date": "Дата",
|
||||
"closedDay": "Закрыто весь день",
|
||||
"preview": "Проверка календаря",
|
||||
"previewHelp": "Проверьте форму без сохранения. Введите момент проверки в часовом поясе браузера ({timezone}) или оставьте пустым для текущего момента. Результат показан в часовом поясе календаря.",
|
||||
"previewAt": "Момент проверки (необязательно)",
|
||||
"runPreview": "Проверить календарь",
|
||||
"previewing": "Проверка…",
|
||||
"previewFailed": "Не удалось проверить календарь",
|
||||
"previewStale": "Форма изменилась. Повторите проверку.",
|
||||
"scheduleOpen": "В этот момент расписание открыто.",
|
||||
"scheduleClosed": "В этот момент расписание закрыто.",
|
||||
"nextOpening": "Следующее открытие по расписанию: {time}",
|
||||
"noNextOpening": "В периоде проверки не найдено следующего открытия.",
|
||||
"notPresencePromise": "Часы по расписанию не гарантируют подключение или доступность оператора.",
|
||||
"invalidTimezone": "Укажите корректный часовой пояс IANA. Общий часовой пояс не может быть пустым.",
|
||||
"invalidHours": "Используйте интервалы ЧЧ:мм с разными началом и окончанием. Для открытого исключения нужен хотя бы один интервал.",
|
||||
"invalidExceptionDate": "Для каждого исключения нужна корректная, неповторяющаяся дата.",
|
||||
"invalidPreviewTime": "Укажите корректное время проверки в часовом поясе браузера.",
|
||||
"noPermission": "У вас нет прав на просмотр календаря. Свой рабочий статус можно изменить отдельно.",
|
||||
"noTeams": "Нет команд для настройки календаря.",
|
||||
"publicChecking": "Проверяем доступность операторов…",
|
||||
"publicNextOpening": "Следующее открытие по расписанию: {time}. Наличие оператора не гарантируется.",
|
||||
"offlineDeprecated": "Устаревшая настройка сохранена для совместимости. Она не разрешает новые назначения отключённым операторам.",
|
||||
"manageStatus": "Изменить доступность",
|
||||
"statusSeparate": "Рабочий статус и отпуск настраиваются отдельно от профиля оператора.",
|
||||
"status": {
|
||||
"ready": "Готов принимать",
|
||||
"busy": "Занят",
|
||||
"break": "Перерыв",
|
||||
"unavailable": "Недоступен",
|
||||
"vacation": "В отпуске",
|
||||
"unknown": "Неизвестный статус"
|
||||
},
|
||||
"reason": {
|
||||
"eligible": "Может принимать новые назначения",
|
||||
"profile_disabled": "Профиль оператора отключён администратором",
|
||||
"user_disabled": "Учётная запись отключена",
|
||||
"team_disabled": "Команда отключена",
|
||||
"outside_hours": "Вне рабочего времени по расписанию",
|
||||
"offline": "Нет активного подключения к платформе поддержки",
|
||||
"busy": "Занят: новые назначения приостановлены",
|
||||
"break": "Перерыв: новые назначения приостановлены",
|
||||
"unavailable": "Недоступен для новых назначений",
|
||||
"vacation": "Действует запланированный отпуск",
|
||||
"auto_assign_disabled": "Автоматическое назначение отключено",
|
||||
"capacity": "Достигнут лимит одновременных обращений",
|
||||
"unknown": "Не удалось определить возможность назначения"
|
||||
},
|
||||
"public": {
|
||||
"available": "Операторы сейчас доступны",
|
||||
"outside_hours": "Сейчас нерабочее время поддержки",
|
||||
"temporarily_absent": "Сейчас нет оператора для нового обращения",
|
||||
"capacity": "Операторы сейчас полностью загружены",
|
||||
"unknown": "Доступность операторов неизвестна"
|
||||
},
|
||||
"weekday": {
|
||||
"1": "Понедельник",
|
||||
"2": "Вторник",
|
||||
"3": "Среда",
|
||||
"4": "Четверг",
|
||||
"5": "Пятница",
|
||||
"6": "Суббота",
|
||||
"7": "Воскресенье"
|
||||
},
|
||||
"dstOccurrence": "{field}: это время встречается дважды. Выберите точный момент UTC.",
|
||||
"chooseOccurrence": "Выберите вариант времени",
|
||||
"datedShiftsNotice": "Эти датированные смены определяют доступность только в режиме существующих смен. В недельном режиме они сохраняются, но не действуют. При возврате они вновь применяются без изменений."
|
||||
}
|
||||
}
|
||||
|
||||
2
web/messages/ru-RU.json.license
Normal file
2
web/messages/ru-RU.json.license
Normal file
@@ -0,0 +1,2 @@
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
SPDX-FileComment: Modified in the independent hardening fork. See docs/hardening/README.md and MODIFIED_FILES.md for source attribution and change notes.
|
||||
@@ -26,7 +26,11 @@
|
||||
"actions": "操作",
|
||||
"name": "名称",
|
||||
"saving": "保存中...",
|
||||
"reset": "重置"
|
||||
"reset": "重置",
|
||||
"operationFailed": "操作失败,请重试。",
|
||||
"loadFailed": "加载数据失败,请重试。",
|
||||
"enabled": "启用",
|
||||
"disabled": "禁用"
|
||||
},
|
||||
"language": {
|
||||
"enUS": "English (英文)",
|
||||
@@ -531,9 +535,9 @@
|
||||
"messageSummary": "[消息]",
|
||||
"closedTitle": "会话已结束",
|
||||
"closedDescription": "当前客服会话已关闭,感谢您的使用。",
|
||||
"connecting": "连接中",
|
||||
"connected": "在线服务",
|
||||
"disconnected": "连接已断开",
|
||||
"connecting": "聊天连接中",
|
||||
"connected": "聊天已连接",
|
||||
"disconnected": "聊天已断开",
|
||||
"retry": "重新连接",
|
||||
"moreActions": "更多操作",
|
||||
"minimize": "收起窗口",
|
||||
@@ -583,7 +587,12 @@
|
||||
"startFirstRequest": "开始第一个请求",
|
||||
"openRequestCount": "进行中 {open} / 共 {total}",
|
||||
"loadConversationsFailed": "加载请求列表失败",
|
||||
"createConversationFailed": "创建请求失败"
|
||||
"createConversationFailed": "创建请求失败",
|
||||
"dismissedTitle": "聊天窗口已关闭",
|
||||
"dismissedDescription": "您的支持请求尚未结束,您可以返回继续对话。",
|
||||
"returnToChat": "返回聊天",
|
||||
"sendUnavailable": "当前对话不可用,请返回对话或重试后再发送。",
|
||||
"sendInProgress": "正在发送消息,请稍候。"
|
||||
},
|
||||
"dashboardHome": {
|
||||
"rangeToday": "今天",
|
||||
@@ -2493,7 +2502,23 @@
|
||||
"debugAnswer": "调试问答",
|
||||
"answerResult": "回答结果",
|
||||
"searchHits": "检索命中",
|
||||
"hitsSummary": "命中 {count} 条 · {latency}ms"
|
||||
"hitsSummary": "命中 {count} 条 · {latency}ms",
|
||||
"unknownType": "未知类型",
|
||||
"unknownStatus": "未知状态",
|
||||
"indexFailureSummary": "索引失败。请检查索引配置后重试。",
|
||||
"requestId": "请求 ID",
|
||||
"rerank": "重排序",
|
||||
"topScore": "最高得分",
|
||||
"promptTokens": "输入 Token",
|
||||
"completionTokens": "输出 Token",
|
||||
"traceData": "追踪数据",
|
||||
"chunkNumber": "分块 #{number}",
|
||||
"providerValue": "策略:{value}",
|
||||
"scoreValue": "得分:{value}",
|
||||
"rerankValue": "重排序得分:{value}",
|
||||
"historyRecordedNotice": "历史回答和片段按记录时的原文显示。切换界面语言不会改写历史。",
|
||||
"faqNumber": "FAQ #{number}",
|
||||
"documentNumber": "文档 #{number}"
|
||||
},
|
||||
"scaffold": {
|
||||
"moduleBoard": "模块推进看板",
|
||||
@@ -3370,8 +3395,8 @@
|
||||
"statusReady": "已就绪,可正常接待请求",
|
||||
"statusNeedsSetup": "配置未就绪(已完成 {ready}/{total} 步)",
|
||||
"stepsProgress": "已就绪 {ready} / {total} 步",
|
||||
"quickSetupAll": "一键完成全部基础配置",
|
||||
"quickSetupRunning": "正在应用配置...",
|
||||
"quickSetupAll": "预览缺失的默认配置",
|
||||
"quickSetupRunning": "正在准备预览…",
|
||||
"quickFixSuccess": "配置已自动修复并重新检测",
|
||||
"refresh": "重新检测",
|
||||
"openSettings": "前往设置",
|
||||
@@ -3394,12 +3419,12 @@
|
||||
"description": "至少需要一个处于启用状态的人工客服组,用于聚合坐席人员并配置值班排班。"
|
||||
},
|
||||
"schedules": {
|
||||
"title": "实时值班排班",
|
||||
"description": "客服组必须拥有覆盖当前时段的有效值班排班;非工作时间段的请求将排队等待。"
|
||||
"title": "当前支持工作时间",
|
||||
"description": "团队当前必须处于所选日历的工作时间内,可使用日期班次或每周时间模式。非工作时间的请求保留在队列中。"
|
||||
},
|
||||
"operators": {
|
||||
"title": "坐席档案与服务容量",
|
||||
"description": "坐席需启用档案、归属有效客服组、开启自动分配、处于空闲状态且并发会话未达上限。"
|
||||
"description": "接待人员需要已启用的账户和资料、处于团队工作时间内、与平台保持活动连接、状态为可接待、未处于休假期间、启用自动分配且有可用容量。"
|
||||
},
|
||||
"ai_agents": {
|
||||
"title": "AI 智能体与人工转接",
|
||||
@@ -3433,7 +3458,15 @@
|
||||
"channel_no_agent": "接入渠道未关联 AI 智能体。",
|
||||
"channel_agent_disabled": "接入渠道关联的 AI 智能体已被禁用或不存在。",
|
||||
"channel_zero_rollout": "接入渠道的 AI 智能体分流比例为 0%。",
|
||||
"no_end_to_end_path": "当前没有任何渠道能成功连通到空闲可用的人工坐席。"
|
||||
"no_end_to_end_path": "当前没有任何渠道能成功连通到空闲可用的人工坐席。",
|
||||
"agent_unpublished": "Agent 尚无已发布版本,请先在 Agent 设置中发布后再用于渠道。",
|
||||
"channel_agent_unpublished": "渠道指向未发布的 Agent。请发布该 Agent,或明确选择已发布的 Agent。",
|
||||
"operator_offline": "接待人员没有与支持平台的活动连接。",
|
||||
"operator_break": "接待人员正在休息,无法接收新分配。",
|
||||
"operator_unavailable": "接待人员无法接收新分配。",
|
||||
"operator_vacation": "接待人员当前处于计划休假期间。",
|
||||
"operator_outside_hours": "接待人员当前不在计划工作时间内。",
|
||||
"operator_availability_unavailable": "无法确定接待人员当前的可用性。"
|
||||
},
|
||||
"operatorBlockers": {
|
||||
"not_authenticated": "您尚未登录系统。",
|
||||
@@ -3443,25 +3476,31 @@
|
||||
"team_off_hours": "您所在的客服组当前处于非工作时段(无生效排班)。",
|
||||
"auto_assign_disabled": "您的坐席档案未开启自动分配。",
|
||||
"status_busy": "您的服务状态为「忙碌」。",
|
||||
"at_capacity": "您的当前接待会话量已达上限。"
|
||||
"at_capacity": "您的当前接待会话量已达上限。",
|
||||
"offline": "没有与支持平台的活动连接。",
|
||||
"break": "休息中,已暂停新分配。",
|
||||
"unavailable": "不可接收新分配。",
|
||||
"vacation": "处于计划休假期间。",
|
||||
"availability_unavailable": "无法确定当前可用性。",
|
||||
"user_disabled": "账户已禁用或删除。"
|
||||
},
|
||||
"quickFixLabels": {
|
||||
"quick_setup_all": "一键完成全部基础配置",
|
||||
"ensure_team_and_schedule": "创建/启用客服组及 24/7 排班",
|
||||
"quick_setup_all": "预览缺失的默认配置",
|
||||
"ensure_team_and_schedule": "预览客服组设置",
|
||||
"enable_my_operator_profile": "启用我的坐席并设为空闲",
|
||||
"fix_ai_agent_handoff": "修复 AI 转人工模式并绑定客服组",
|
||||
"ensure_default_channel": "创建/修复默认 Web 渠道"
|
||||
},
|
||||
"simulator": {
|
||||
"title": "人工坐席路由模拟器",
|
||||
"description": "模拟客户通过指定渠道进线后的完整路由流转过程,逐级查看每个节点的调度决策。",
|
||||
"description": "只读检查当前仅人工路由的接待条件。不模拟 AI 行为或部分灰度,不会发送消息。",
|
||||
"selectChannelPlaceholder": "选择要模拟的渠道...",
|
||||
"runSimulation": "开始模拟分发",
|
||||
"running": "正在模拟...",
|
||||
"outcomeSuccess": "请求将成功分配给坐席:{operator}",
|
||||
"outcomeBlocked": "请求无法到达人工坐席",
|
||||
"outcomeSuccess": "当前符合条件的客服:{operator}",
|
||||
"outcomeBlocked": "未确认可送达人工客服",
|
||||
"outcomes": {
|
||||
"assigned_to_operator": "成功:会话将分配给处于空闲状态的就绪坐席。",
|
||||
"assigned_to_operator": "仅人工路由当前有符合条件的客服。这是只读检查,不保证实际送达。",
|
||||
"blocked_no_channel": "受阻:系统中没有可用渠道或指定的渠道不存在。",
|
||||
"blocked_channel_disabled": "受阻:该接入渠道已被禁用。",
|
||||
"blocked_zero_rollout": "受阻:该渠道的 AI 智能体分流比例为 0%。",
|
||||
@@ -3469,7 +3508,10 @@
|
||||
"blocked_ai_only_mode": "受阻:AI 智能体为纯 AI 模式,禁止转接人工。",
|
||||
"blocked_agent_no_teams": "受阻:AI 智能体未配置有效的转接客服组。",
|
||||
"queued_off_hours_no_schedule": "排队中:目标客服组当前无生效排班(非工作时间)。",
|
||||
"queued_no_eligible_operator": "排队中:当前处于工作排班内,但暂无可接待空闲坐席。"
|
||||
"queued_no_eligible_operator": "排队中:当前处于工作排班内,但暂无可接待空闲坐席。",
|
||||
"ai_execution_not_simulated": "未模拟 AI 行为,无法确认是否到达人工客服。",
|
||||
"partial_rollout_not_simulated": "未模拟部分灰度,无法确认是否到达人工客服。",
|
||||
"blocked_agent_unpublished": "未确认未发布 Agent 的人工路由,请先发布 Agent。"
|
||||
},
|
||||
"hops": {
|
||||
"channel": "接入渠道",
|
||||
@@ -3491,7 +3533,10 @@
|
||||
"blocked_agent_no_teams": "AI 智能体未关联有效客服组",
|
||||
"queued_off_hours_no_schedule": "当前时刻无生效中的工作排班(非工作时段)",
|
||||
"queued_no_eligible_operator": "当前客服组内暂无空闲且容量充足的坐席",
|
||||
"assigned_to_operator": "成功分配给符合条件的坐席"
|
||||
"assigned_to_operator": "成功分配给符合条件的坐席",
|
||||
"ai_execution_not_simulated": "未模拟 AI 行为,无法确认是否到达人工客服。",
|
||||
"partial_rollout_not_simulated": "未模拟部分灰度,无法确认是否到达人工客服。",
|
||||
"blocked_agent_unpublished": "未确认未发布 Agent 的人工路由,请先发布 Agent。"
|
||||
},
|
||||
"candidateTableTitle": "参评候选坐席明细",
|
||||
"colOperator": "坐席",
|
||||
@@ -3505,12 +3550,19 @@
|
||||
"eligibleBadge": "符合条件",
|
||||
"skipReasons": {
|
||||
"profile_disabled": "档案已停用",
|
||||
"user_disabled": "账号已停用",
|
||||
"user_disabled": "账户已禁用或删除。",
|
||||
"team_not_in_agent": "客服组未在智能体转接范围内",
|
||||
"team_off_hours": "客服组处于非值班时段",
|
||||
"auto_assign_off": "自动分配已关闭",
|
||||
"status_busy": "处于忙碌状态",
|
||||
"at_capacity": "接待量已达上限"
|
||||
"at_capacity": "接待量已达上限",
|
||||
"offline": "没有与支持平台的活动连接。",
|
||||
"break": "休息中,已暂停新分配。",
|
||||
"unavailable": "不可接收新分配。",
|
||||
"vacation": "处于计划休假期间。",
|
||||
"availability_unavailable": "无法确定当前可用性。",
|
||||
"auto_assign_disabled": "自动分配已禁用。",
|
||||
"no_team": "未分配已启用的团队。"
|
||||
}
|
||||
},
|
||||
"banner": {
|
||||
@@ -3520,6 +3572,185 @@
|
||||
"headerIndicator": {
|
||||
"readyLabel": "接单就绪",
|
||||
"blockedLabel": "接单受阻 ({count})"
|
||||
},
|
||||
"preview": {
|
||||
"review": "预览设置更改",
|
||||
"title": "应用前确认具体更改",
|
||||
"description": "仅更改下列具名记录和字段,不会添加排班。未列出的配置及灰度比例保持不变。更改提交后可能分配等待中的会话。",
|
||||
"noChanges": "没有可安全自动应用的更改。请在对应设置中选择客服组、路由或工作时段。",
|
||||
"apply": "应用已确认的更改",
|
||||
"create": "创建",
|
||||
"update": "更新",
|
||||
"notApplied": "未应用已确认的更改。",
|
||||
"manageSchedules": "管理明确的工作时段"
|
||||
},
|
||||
"repairFields": {
|
||||
"name": "名称",
|
||||
"leader_user_id": "组长 ID",
|
||||
"status": "启用状态(0 启用,1 禁用)",
|
||||
"user_id": "用户 ID",
|
||||
"team_id": "客服组 ID / 新组名称",
|
||||
"team_ids": "路由客服组",
|
||||
"service_status": "接待状态(0 空闲,1 忙碌)",
|
||||
"auto_assign_enabled": "自动分配",
|
||||
"max_concurrent_count": "并发会话上限",
|
||||
"priority_level": "分配优先级",
|
||||
"receive_offline_message": "接收离线消息",
|
||||
"service_mode": "服务模式(1 仅 AI,2 仅人工,3 AI 优先)",
|
||||
"rollout_percent": "Agent 灰度比例(%)",
|
||||
"handoff_mode": "转人工模式(2 客服组队列)",
|
||||
"fallback_mode": "回退模式",
|
||||
"auto_handoff_on_failure": "失败时自动转人工",
|
||||
"reply_timeout_seconds": "回复超时(秒)",
|
||||
"max_steps": "AI 最大步骤数",
|
||||
"channel_id": "渠道标识",
|
||||
"channel_type": "渠道类型",
|
||||
"ai_agent_id": "Agent ID / 新 Agent 名称",
|
||||
"ai_agent_rollout_percent": "渠道灰度比例(%)",
|
||||
"config_json": "渠道配置"
|
||||
},
|
||||
"repairWarnings": {
|
||||
"schedules_unchanged": "未更改工作时段。请明确配置排班;非值班时段不是配置错误。",
|
||||
"active_team_required": "请先在客服组设置中选择或启用客服组,再关联新记录。",
|
||||
"disabled_configuration_preserved": "所选配置已禁用或灰度比例为零,已保持不变。",
|
||||
"agent_team_selection_required": "请在 Agent 设置中选择目标客服组;未自动添加任何组。",
|
||||
"channel_selection_required": "请在渠道设置中选择目标 Agent 和灰度比例。已保留现有渠道路由。",
|
||||
"existing_configuration_preserved": "已保留现有配置。请在对应设置中检查剩余的就绪问题。",
|
||||
"dispatch_failed": "更改已保存,但等待会话分配失败。请检查队列,不要重复应用修复。",
|
||||
"readiness_refresh_failed": "就绪状态刷新失败。请重新加载诊断以查看当前状态;已提交的更改未回滚。",
|
||||
"agent_publication_required": "创建渠道前,请先在 Agent 设置中发布目标 Agent。设置向导不会发布 Agent 或绕过发布要求。"
|
||||
}
|
||||
},
|
||||
"supportAvailability": {
|
||||
"title": "支持可用性",
|
||||
"description": "配置支持时间和时区。连接、工作状态和接待资格分别计算。",
|
||||
"loading": "正在加载可用性…",
|
||||
"myStatus": "我的可用性",
|
||||
"retryStatus": "状态不可用,请重试",
|
||||
"operatorStatus": "可用性:{name}",
|
||||
"presenceHelp": "在线表示至少一个标签页或设备仍与支持平台连接,并不表示可以接待新请求。",
|
||||
"online": "平台在线",
|
||||
"offline": "未连接",
|
||||
"workingStatus": "工作状态",
|
||||
"statusHelp": "状态在会话间保留。忙碌、休息、不可用和休假期间停止新分配,登录不会重置状态。",
|
||||
"statusSaved": "可用性已保存",
|
||||
"saveFailed": "无法保存更改,表单输入已保留。",
|
||||
"loadFailed": "无法加载可用性",
|
||||
"saveStatus": "保存状态",
|
||||
"saving": "正在保存…",
|
||||
"cancel": "取消",
|
||||
"retry": "重试",
|
||||
"refresh": "刷新",
|
||||
"discardTitle": "放弃未保存的更改?",
|
||||
"discardDescription": "更改尚未保存。是否放弃并离开?",
|
||||
"discard": "放弃更改",
|
||||
"vacationStart": "休假开始",
|
||||
"vacationEnd": "休假结束(不含结束时刻)",
|
||||
"vacationTimezone": "请按浏览器时区输入日期:{timezone}。",
|
||||
"vacationExact": "精确 UTC 时段:{start} → {end}。",
|
||||
"vacationHelp": "此时段内即使登录也不会收到新分配。时段外恢复已保存的状态:{status}。现有会话不会自动转移。",
|
||||
"cancelVacationHelp": "保存其他状态将取消已安排的休假。",
|
||||
"invalidVacation": "请输入有效的开始和结束时间,结束时间必须晚于开始时间。夏令时跳过的时间无效。",
|
||||
"calendar": "支持日历",
|
||||
"editCalendar": "编辑日历",
|
||||
"saveCalendar": "保存日历",
|
||||
"calendarSaved": "支持日历已保存",
|
||||
"readOnly": "您只有查看权限。",
|
||||
"deploymentDefault": "部署默认设置",
|
||||
"selectScope": "选择默认设置或团队",
|
||||
"deploymentTimezone": "默认 IANA 时区",
|
||||
"teamTimezone": "团队时区覆盖",
|
||||
"timezoneHelp": "请使用 Europe/Moscow 或 America/New_York 等 IANA 名称,而不是固定 UTC 偏移量。",
|
||||
"inheritTimezoneHelp": "留空以继承部署时区。时区覆盖不会修改已保存的日期班次。",
|
||||
"effectiveTimezone": "生效时区:{timezone}",
|
||||
"scheduleMode": "日历模式",
|
||||
"legacy": "现有日期班次",
|
||||
"recurring": "每周时间和例外",
|
||||
"legacyHelp": "现有日期班次会保留,不会按新时区重新解释。只有明确选择并保存每周模式后,每周时间才会生效。",
|
||||
"viewDatedShifts": "查看日期班次",
|
||||
"legacyActive": "工作时间仍由现有日期班次决定,不会自动创建每周时间。",
|
||||
"confirmCalendarTitle": "应用此支持日历?",
|
||||
"confirmRecurring": "将此范围切换到每周时间和日期例外?现有日期班次会保留,但在此模式下不再决定可用性。",
|
||||
"confirmCalendar": "这些设置会改变新请求可分配的时间。默认时区变更会影响继承该时区的团队,日期班次保持不变。",
|
||||
"weeklyHours": "每周工作时间",
|
||||
"hoursHelp": "分段班次可添加多个时段。结束早于开始表示跨到次日。起止时间不能相同,没有时段的日期为休息日。 全天请使用 00:00–24:00。",
|
||||
"noWeeklyHours": "没有每周工作时间。在每周模式下,仅明确设为开放的日期例外可开放支持。",
|
||||
"addPeriod": "添加时段",
|
||||
"removePeriod": "删除时段",
|
||||
"day": "星期",
|
||||
"start": "开始",
|
||||
"end": "结束",
|
||||
"exceptions": "节假日和日期例外",
|
||||
"exceptionsHelp": "日期例外替代该本地日期的每周时间。关闭日期会阻止全天接待,包括前一天跨夜延续的时段。",
|
||||
"noExceptions": "没有日期例外",
|
||||
"addException": "添加日期例外",
|
||||
"removeException": "删除日期例外",
|
||||
"date": "日期",
|
||||
"closedDay": "全天关闭",
|
||||
"preview": "日历预览",
|
||||
"previewHelp": "无需保存即可预览表单。按浏览器时区({timezone})输入检查时间,留空则使用当前时间。结果按日历时区显示。",
|
||||
"previewAt": "检查时间(可选)",
|
||||
"runPreview": "检查日历",
|
||||
"previewing": "正在检查…",
|
||||
"previewFailed": "无法预览日历",
|
||||
"previewStale": "表单已更改,请重新预览。",
|
||||
"scheduleOpen": "此时日历处于开放时段。",
|
||||
"scheduleClosed": "此时日历处于关闭时段。",
|
||||
"nextOpening": "下次计划开放时间:{time}",
|
||||
"noNextOpening": "预览范围内未找到下次计划开放时间。",
|
||||
"notPresencePromise": "计划工作时间不保证届时有接待人员在线或可用。",
|
||||
"invalidTimezone": "请输入有效的 IANA 时区。部署默认时区不能为空。",
|
||||
"invalidHours": "请使用有效的 HH:mm 时段,起止时间不能相同。开放日期例外至少需要一个时段。",
|
||||
"invalidExceptionDate": "每个例外必须有有效且不重复的日期。",
|
||||
"invalidPreviewTime": "请按浏览器时区输入有效的检查时间。",
|
||||
"noPermission": "您无权查看日历设置,但仍可管理自己的工作状态。",
|
||||
"noTeams": "没有可配置日历的团队。",
|
||||
"publicChecking": "正在检查人工支持可用性…",
|
||||
"publicNextOpening": "下次计划开放时间:{time},不保证届时有接待人员在线。",
|
||||
"offlineDeprecated": "此旧设置为兼容性而保留,不允许向未连接的接待人员分配新请求。",
|
||||
"manageStatus": "管理可用性",
|
||||
"statusSeparate": "工作状态和计划休假与接待人员资料分别管理。",
|
||||
"status": {
|
||||
"ready": "可接待",
|
||||
"busy": "忙碌",
|
||||
"break": "休息中",
|
||||
"unavailable": "不可用",
|
||||
"vacation": "休假中",
|
||||
"unknown": "未知状态"
|
||||
},
|
||||
"reason": {
|
||||
"eligible": "可接收新分配",
|
||||
"profile_disabled": "接待人员资料已被管理员禁用",
|
||||
"user_disabled": "账户已禁用",
|
||||
"team_disabled": "团队已禁用",
|
||||
"outside_hours": "不在计划工作时间内",
|
||||
"offline": "没有与支持平台的活动连接",
|
||||
"busy": "忙碌:已暂停新分配",
|
||||
"break": "休息中:已暂停新分配",
|
||||
"unavailable": "不可接收新分配",
|
||||
"vacation": "处于计划休假期间",
|
||||
"auto_assign_disabled": "自动分配已禁用",
|
||||
"capacity": "已达到同时接待会话上限",
|
||||
"unknown": "无法确定接待资格"
|
||||
},
|
||||
"public": {
|
||||
"available": "人工支持当前可用",
|
||||
"outside_hours": "当前不在人工支持计划工作时间内",
|
||||
"temporarily_absent": "当前没有接待人员可处理新请求",
|
||||
"capacity": "接待人员当前已满负荷",
|
||||
"unknown": "人工支持可用性未知"
|
||||
},
|
||||
"weekday": {
|
||||
"1": "星期一",
|
||||
"2": "星期二",
|
||||
"3": "星期三",
|
||||
"4": "星期四",
|
||||
"5": "星期五",
|
||||
"6": "星期六",
|
||||
"7": "星期日"
|
||||
},
|
||||
"dstOccurrence": "{field}:此时间出现两次。请选择准确的 UTC 时刻。",
|
||||
"chooseOccurrence": "选择时间实例",
|
||||
"datedShiftsNotice": "这些日期班次仅对使用现有日期班次模式的团队生效。在每周模式下它们会保留但不生效;切回后将原样重新生效。"
|
||||
}
|
||||
}
|
||||
|
||||
2
web/messages/zh-CN.json.license
Normal file
2
web/messages/zh-CN.json.license
Normal file
@@ -0,0 +1,2 @@
|
||||
SPDX-License-Identifier: Apache-2.0
|
||||
SPDX-FileComment: Modified in the independent hardening fork. See docs/hardening/README.md and MODIFIED_FILES.md for source attribution and change notes.
|
||||
Reference in New Issue
Block a user