Files
breadcrumb-the-shire/modules/helpdesk/i18n/default_en.json
fs 792f706d9e feat(helpdesk): add ticket file download and inline image preview
New SOAP method getTicketFile() on BcSoapGateway calls BC's
GetTicketFile to retrieve file attachments as Base64, decodes in
memory and returns binary data without writing to disk.

New proxy endpoint helpdesk/ticket-file-data streams files directly
to the browser with correct MIME type. Images served inline, other
files as download attachment.

TicketCommunicationService now attaches file_entry_no and file_name
to file-type events. Frontend renders download links with bi-download
icon and inline image previews for jpg/png/gif attachments.

Works in both ticket detail and debitor detail communication feeds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-05 22:49:01 +02:00

310 lines
14 KiB
JSON

{
"Helpdesk": "Helpdesk",
"Helpdesk settings": "Helpdesk settings",
"Customers": "Customers",
"Debtor search": "Debtor search",
"Search debtors": "Search debtors",
"Search by name or debtor number...": "Search by name or debtor number...",
"Search": "Search",
"Please provide a customer number": "Please provide a customer number",
"Minimum 2 characters": "Minimum 2 characters",
"Please enter at least 2 characters.": "Please enter at least 2 characters.",
"No debtors found": "No debtors found",
"Try a different search term.": "Try a different search term.",
"Could not connect to Business Central.": "Could not connect to Business Central.",
"BC connection is not configured.": "BC connection is not configured.",
"BC connection is not configured. Please configure the connection in the settings.": "BC connection is not configured. Please configure the connection in the settings.",
"BC connection is not configured": "BC connection is not configured",
"Open settings": "Open settings",
"Debtor No.": "Debtor No.",
"Name": "Name",
"City": "City",
"Phone": "Phone",
"E-Mail": "E-Mail",
"Master data": "Master data",
"Contacts": "Contacts",
"Tickets": "Tickets",
"Debtor details": "Debtor details",
"Search name": "Search name",
"Address": "Address",
"Postal code": "Postal code",
"Salesperson": "Salesperson",
"No contacts found": "No contacts found",
"No contacts are linked to this debtor in Business Central.": "No contacts are linked to this debtor in Business Central.",
"No.": "No.",
"Type": "Type",
"Job title": "Job title",
"No tickets found": "No tickets found",
"No tickets are linked to this debtor in Business Central.": "No tickets are linked to this debtor in Business Central.",
"Ticket No.": "Ticket No.",
"Description": "Description",
"Status": "Status",
"Category": "Category",
"Contact": "Contact",
"Support": "Support",
"Sales": "Sales",
"Controlling": "Controlling",
"Ticket": "Ticket",
"Debtor": "Debtor",
"Debtor not found": "Debtor not found",
"Ticket not found": "Ticket not found",
"Back to search": "Back to search",
"Back": "Back",
"Settings": "Settings",
"Connection": "Connection",
"Save": "Save",
"Settings saved": "Settings saved",
"Configuration incomplete": "Configuration incomplete",
"OData connection": "OData connection",
"OData Base URL": "OData Base URL",
"Base URL without Company path segment": "Base URL without Company path segment",
"Company name": "Company name",
"BC company name (URL-encoded automatically)": "BC company name (URL-encoded automatically)",
"Authentication": "Authentication",
"Auth mode": "Auth mode",
"Basic Auth": "Basic Auth",
"OAuth2 (client credentials)": "OAuth2 (client credentials)",
"Basic Auth credentials": "Basic Auth credentials",
"Username": "Username",
"Password": "Password",
"Leave unchanged to keep current password": "Leave unchanged to keep current password",
"OAuth2 credentials": "OAuth2 credentials",
"Azure Tenant ID": "Azure Tenant ID",
"Client ID": "Client ID",
"Client Secret": "Client Secret",
"Token endpoint URL": "Token endpoint URL",
"Connection test": "Connection test",
"Test connection": "Test connection",
"Connection successful": "Connection successful",
"Connection failed": "Connection failed",
"Testing...": "Testing...",
"Form expired, please try again": "Form expired, please try again",
"OData Base URL must use HTTPS": "OData Base URL must use HTTPS",
"Address & contact": "Address & contact",
"Company": "Company",
"Company details": "Company details",
"Contact & dates": "Contact & dates",
"Could not load contacts.": "Could not load contacts.",
"Could not load tickets.": "Could not load tickets.",
"Last activity": "Last activity",
"Ticket details": "Ticket details",
"Overview": "Overview",
"Open tickets": "Open tickets",
"All tickets": "All tickets",
"All contacts": "All contacts",
"Recent activity": "Recent activity",
"Support info & master data": "Support info & master data",
"Support type": "Support type",
"Location": "Location",
"No open tickets": "No open tickets",
"No recent activity found.": "No recent activity found.",
"Total tickets": "Total tickets",
"Total contracts": "Total contracts",
"Critical (>48h)": "Critical (>48h)",
"Oldest open": "Oldest open",
"Ticket list": "Ticket list",
"Next actions": "Next actions",
"System recommendations": "System recommendations",
"Action": "Action",
"Age (h)": "Age (h)",
"No support actions required right now.": "No support actions are required right now.",
"No system recommendations right now.": "No system recommendations right now.",
"Contracts & products": "Contracts & products",
"No contracts found for this customer.": "No contracts found for this customer.",
"Contract No.": "Contract No.",
"Product type": "Product type",
"Next invoicing": "Next invoicing",
"Amount": "Amount",
"Active contracts": "Active contracts",
"Could not load contracts.": "Could not load contracts.",
"Escalations": "Escalations",
"Escalations are not available yet.": "Escalations are not available yet.",
"Escalated tickets": "Escalated tickets",
"No escalated tickets right now.": "No escalated tickets right now.",
"Could not load escalated tickets.": "Could not load escalated tickets.",
"Escalation code": "Escalation code",
"SLA target": "SLA target",
"Overdue by": "Overdue by",
"day": "day",
"days": "days",
"Ticket volume": "Ticket volume",
"Close rate": "Close rate",
"Avg. resolution": "Avg. resolution",
"Open backlog": "Open tickets",
"kpi_tooltip_close_rate": "Closed \u00f7 created tickets in period. Above 1\u00d7 = open ticket queue is shrinking.",
"kpi_tooltip_resolution": "Median processing time of all tickets closed in the selected period.",
"kpi_tooltip_backlog": "Current snapshot of all open tickets \u2013 independent of the selected period. Shows the pending queue.",
"Backlog shrinking": "Queue shrinking",
"Backlog growing": "Queue growing",
"unassigned": "unassigned",
"Ticket trend": "Ticket trend",
"Support efficiency": "Support efficiency",
"Contract metrics": "Contract metrics",
"Risk assessment": "Risk assessment",
"vs. prev. period": "vs. prev. period",
"Low": "Low",
"Medium": "Medium",
"High": "High",
"All checks passed": "All checks passed",
"of": "of",
"checks flagged": "checks flagged",
"Limit": "Limit",
"No controlling data available.": "No controlling data available.",
"Resolution time": "Resolution time",
"Oldest open ticket": "Oldest open ticket",
"Unassigned": "Unassigned",
"risk_desc_ticket_volume": "Change vs. previous period",
"risk_desc_resolution_time": "Median time to close",
"risk_desc_open_aging": "Since last activity",
"risk_desc_unassigned": "Share of open tickets without assignee",
"Ticket volume increase": "Ticket volume increase",
"High avg. resolution time": "High avg. resolution time",
"Open ticket aging": "Open ticket aging",
"Unassigned ticket ratio": "Unassigned ticket ratio",
"Could not load controlling dashboard.": "Could not load controlling dashboard.",
"Avg. open age": "Avg. open age",
"Without assignee": "Without assignee",
"30 days": "30 days",
"90 days": "90 days",
"6 months": "6 months",
"1 year": "1 year",
"Escalation rate": "Escalation rate",
"Threshold (%)": "Threshold (%)",
"Threshold (hours)": "Threshold (hours)",
"Controlling risk configuration was invalid. Defaults were applied.": "Controlling risk configuration was invalid. Defaults were applied.",
"Open ticket without activity for": "Open ticket without activity for",
"hours": "hours",
"Open ticket without assigned support user": "Open ticket without assigned support user",
"Follow up oldest open ticket": "Follow up oldest open ticket",
"System recommendation configuration was invalid. Defaults were applied.": "System recommendation configuration was invalid. Defaults were applied.",
"Maximum recommendations": "Maximum recommendations",
"Rule templates": "Rule templates",
"Enabled": "Enabled",
"Priority": "Priority",
"Thresholds": "Thresholds",
"Escalation overdue": "Escalation overdue",
"High-risk aging": "High-risk aging",
"Unassigned open": "Unassigned open",
"Stale open": "Stale open",
"Customer backlog": "Open tickets for customer",
"Minimum overdue (minutes)": "Minimum overdue (minutes)",
"High-risk codes (comma separated)": "High-risk codes (comma separated)",
"Minimum age (hours)": "Minimum age (hours)",
"Minimum open tickets": "Minimum open tickets",
"Escalation SLA exceeded by {overdue_hours}h ({escalation_code}).": "SLA exceeded by {overdue_hours}h ({escalation_code}) — escalate immediately or inform customer.",
"High-risk ticket ({escalation_code}) is open for {age_hours}h.": "Critical ticket ({escalation_code}) open for {age_hours}h — review priority and ensure progress.",
"Ticket is unassigned for {age_hours}h.": "Unassigned for {age_hours}h — assign to a team member urgently.",
"No activity for {age_hours}h.": "No activity for {age_hours}h — check if customer is waiting for a response.",
"Customer backlog: {open_tickets} open tickets.": "{open_tickets} open tickets — address oldest tickets first to reduce the queue.",
"Created": "Created",
"Loading...": "Loading...",
"Refresh data": "Refresh data",
"Mobile": "Mobile",
"Activity": "Activity",
"Activity timeline": "Activity timeline",
"Message": "Message",
"Status change": "Status change",
"No activity found.": "No activity found.",
"Could not load activity log.": "Could not load activity log.",
"Communication history": "Communication history",
"No communication found.": "No communication found.",
"Could not load communication history.": "Could not load communication history.",
"Live communication unavailable, showing activity fallback.": "Live communication unavailable, showing activity fallback.",
"Ticket communication": "Ticket communication",
"Last 5 tickets": "Last 5 tickets",
"Last 10 tickets": "Last 10 tickets",
"Some ticket communications could not be loaded completely.": "Some ticket communications could not be loaded completely.",
"Unknown user": "Unknown user",
"Unknown time": "Unknown time",
"Source": "Source",
"SOAP": "SOAP",
"Activity fallback": "Activity fallback",
"sent a message": "sent a message",
"changed status": "changed status",
"Forwarded": "forwarded the ticket",
"attached a file": "attached a file",
"logged an activity": "logged an activity",
"on": "on",
"Process": "Process",
"All": "All",
"Open": "Open",
"In Progress": "In Progress",
"Closed": "Closed",
"Monthly volume": "Monthly volume",
"Support hours": "Support hours",
"Contract overview": "Contract overview",
"No contract details available.": "No contract details available.",
"Could not load sales dashboard.": "Could not load sales dashboard.",
"Quantity": "Quantity",
"Unit price": "Unit price",
"Line amount": "Line amount",
"Line state": "Line state",
"Starting date": "Starting date",
"Invoicing period": "Invoicing period",
"positions": "positions",
"per month": "per month",
"Last invoicing": "Last invoicing",
"Analysis": "Analysis",
"New (30d)": "New (30d)",
"Resolved (30d)": "Resolved (30d)",
"Avg. age open": "Avg. age open",
"vs. prev. 30d": "vs. prev. 30d",
"net (30d)": "net (30d)",
"critical": "critical",
"Avg. contract value": "Avg. contract value",
"of {total} total": "of {total} total",
"in {days} days": "in {days} days",
"largest": "largest",
"Attention needed": "Attention needed",
"Recommendations": "Recommendations",
"Contract summary": "Contract summary",
"Contract trend": "Contract trend",
"New contracts": "New contracts",
"Ended contracts": "Ended contracts",
"active": "active",
"ended": "ended",
"Age": "Age",
"Period": "Period",
"Last 30 days": "Last 30 days",
"Last 90 days": "Last 90 days",
"Last 180 days": "Last 180 days",
"Last 365 days": "Last 365 days",
"Automation": "Automation",
"Risk monitoring": "Risk monitoring",
"rule_help_escalation_overdue": "Recommends action when SLA escalation deadlines are exceeded.",
"rule_help_high_risk_aging": "Detects critical tickets with specific escalation codes that have been open too long.",
"rule_help_unassigned_open": "Flags open tickets that are not assigned to any support agent.",
"rule_help_stale_open": "Marks open tickets without recent activity for follow-up.",
"rule_help_customer_backlog": "Warns when a customer has too many open tickets at once.",
"rule_help_ticket_volume": "Triggers when ticket volume rises significantly compared to the previous period.",
"rule_help_avg_resolution": "Warns when average resolution time exceeds the threshold.",
"rule_help_open_aging": "Detects open tickets that have been without activity for too long.",
"rule_help_unassigned_ratio": "Warns when too many open tickets lack an assigned agent.",
"Automation configuration was invalid. Defaults were applied.": "Automation configuration was invalid. Defaults were applied.",
"Advanced options": "Advanced options",
"Min. overdue": "Min. overdue",
"Min. age": "Min. age",
"Min. open": "Min. open",
"Team": "Team",
"Team dashboard": "Team dashboard",
"Team workload": "Team workload",
"Support agent": "Support agent",
"Open": "Open",
"Critical (>48h open)": "Critical (>48h open)",
"Avg. age (h)": "Avg. age (h)",
"Resolved in period": "Resolved in period",
"Not assigned": "Not assigned",
"Could not load team dashboard.": "Could not load team dashboard.",
"No team data available.": "No team data available.",
"Top customers": "Top customers",
"Top categories": "Top categories",
"Current": "Current",
"Performance": "Performance",
"Historical": "Historical",
"Queue": "Queue",
"trend_tooltip_up": "More tickets received than resolved in the period — backlog is growing.",
"trend_tooltip_down": "More tickets resolved than received in the period — backlog is shrinking.",
"Download file": "Download file",
"Trend based on last {days} days": "Trend based on last {days} days"
}