Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,3 +15,6 @@ export * from './src/types.js'

// Re-export events
export * from './src/events/index.js'

// Re-export i18n support
export { t, setLocale, getLocale } from './src/support/i18n.js'
6 changes: 6 additions & 0 deletions providers/escalated_provider.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { ApplicationService } from '@adonisjs/core/types'
import type { EscalatedConfig } from '../src/types.js'
import { setLocale } from '../src/support/i18n.js'

export default class EscalatedProvider {
constructor(protected app: ApplicationService) {}
Expand Down Expand Up @@ -74,6 +75,11 @@ export default class EscalatedProvider {

// Store config globally for services that cannot inject the container
;(globalThis as any).__escalated_config = config

// Set locale from config if available
if (config.locale) {
setLocale(config.locale)
}
} catch {
// Config may not be available yet during testing
;(globalThis as any).__escalated_config = {}
Expand Down
84 changes: 84 additions & 0 deletions resources/lang/de/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"ticket": {
"reply_sent": "Antwort gesendet.",
"note_added": "Notiz hinzugef\u00fcgt.",
"assigned": "Ticket zugewiesen.",
"status_updated": "Status aktualisiert.",
"priority_updated": "Priorit\u00e4t aktualisiert.",
"tags_updated": "Tags aktualisiert.",
"department_updated": "Abteilung aktualisiert.",
"macro_applied": "Makro \":name\" angewendet.",
"unfollowed": "Ticket nicht mehr verfolgt.",
"following": "Ticket wird verfolgt.",
"note_pinned": "Notiz angepinnt.",
"note_unpinned": "Notiz losgel\u00f6st.",
"pin_notes_only": "Nur interne Notizen k\u00f6nnen angepinnt werden.",
"updated": "Ticket aktualisiert.",
"created": "Ticket erfolgreich erstellt.",
"closed": "Ticket geschlossen.",
"reopened": "Ticket wieder ge\u00f6ffnet.",
"customer_close_forbidden": "Kunden k\u00f6nnen Tickets nicht schlie\u00dfen."
},
"guest": {
"created": "Ticket erstellt. Speichern Sie diesen Link, um den Status Ihres Tickets zu \u00fcberpr\u00fcfen.",
"reply_sent": "Antwort gesendet.",
"ticket_closed": "Dieses Ticket ist geschlossen."
},
"bulk": {
"updated": ":count Ticket(s) aktualisiert."
},
"rating": {
"thank_you": "Vielen Dank f\u00fcr Ihr Feedback!",
"only_resolved_closed": "Sie k\u00f6nnen nur gel\u00f6ste oder geschlossene Tickets bewerten.",
"already_rated": "Dieses Ticket wurde bereits bewertet."
},
"admin": {
"department_created": "Abteilung erstellt.",
"department_updated": "Abteilung aktualisiert.",
"department_deleted": "Abteilung gel\u00f6scht.",
"sla_policy_created": "SLA-Richtlinie erstellt.",
"sla_policy_updated": "SLA-Richtlinie aktualisiert.",
"sla_policy_deleted": "SLA-Richtlinie gel\u00f6scht.",
"rule_created": "Regel erstellt.",
"rule_updated": "Regel aktualisiert.",
"rule_deleted": "Regel gel\u00f6scht.",
"canned_response_created": "Vorgefertigte Antwort erstellt.",
"canned_response_updated": "Vorgefertigte Antwort aktualisiert.",
"canned_response_deleted": "Vorgefertigte Antwort gel\u00f6scht.",
"macro_created": "Makro erstellt.",
"macro_updated": "Makro aktualisiert.",
"macro_deleted": "Makro gel\u00f6scht.",
"tag_created": "Tag erstellt.",
"tag_updated": "Tag aktualisiert.",
"tag_deleted": "Tag gel\u00f6scht.",
"settings_updated": "Einstellungen aktualisiert."
},
"middleware": {
"not_admin": "Sie sind nicht als Support-Administrator autorisiert.",
"not_agent": "Sie sind nicht als Support-Agent autorisiert."
},
"inbound": {
"disabled": "Eingehende E-Mail ist deaktiviert.",
"invalid_signature": "Ung\u00fcltige Signatur.",
"processing_failed": "Verarbeitung fehlgeschlagen."
},
"labels": {
"status": {
"open": "Offen",
"in_progress": "In Bearbeitung",
"waiting_on_customer": "Warten auf Kunde",
"waiting_on_agent": "Warten auf Agent",
"escalated": "Eskaliert",
"resolved": "Gel\u00f6st",
"closed": "Geschlossen",
"reopened": "Wieder ge\u00f6ffnet"
},
"priority": {
"low": "Niedrig",
"medium": "Mittel",
"high": "Hoch",
"urgent": "Dringend",
"critical": "Kritisch"
}
}
}
84 changes: 84 additions & 0 deletions resources/lang/en/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"ticket": {
"reply_sent": "Reply sent.",
"note_added": "Note added.",
"assigned": "Ticket assigned.",
"status_updated": "Status updated.",
"priority_updated": "Priority updated.",
"tags_updated": "Tags updated.",
"department_updated": "Department updated.",
"macro_applied": "Macro \":name\" applied.",
"unfollowed": "Unfollowed ticket.",
"following": "Following ticket.",
"note_pinned": "Note pinned.",
"note_unpinned": "Note unpinned.",
"pin_notes_only": "Only internal notes can be pinned.",
"updated": "Ticket updated.",
"created": "Ticket created successfully.",
"closed": "Ticket closed.",
"reopened": "Ticket reopened.",
"customer_close_forbidden": "Customers cannot close tickets."
},
"guest": {
"created": "Ticket created. Save this link to check your ticket status.",
"reply_sent": "Reply sent.",
"ticket_closed": "This ticket is closed."
},
"bulk": {
"updated": ":count ticket(s) updated."
},
"rating": {
"thank_you": "Thank you for your feedback!",
"only_resolved_closed": "You can only rate resolved or closed tickets.",
"already_rated": "This ticket has already been rated."
},
"admin": {
"department_created": "Department created.",
"department_updated": "Department updated.",
"department_deleted": "Department deleted.",
"sla_policy_created": "SLA Policy created.",
"sla_policy_updated": "SLA Policy updated.",
"sla_policy_deleted": "SLA Policy deleted.",
"rule_created": "Rule created.",
"rule_updated": "Rule updated.",
"rule_deleted": "Rule deleted.",
"canned_response_created": "Canned response created.",
"canned_response_updated": "Canned response updated.",
"canned_response_deleted": "Canned response deleted.",
"macro_created": "Macro created.",
"macro_updated": "Macro updated.",
"macro_deleted": "Macro deleted.",
"tag_created": "Tag created.",
"tag_updated": "Tag updated.",
"tag_deleted": "Tag deleted.",
"settings_updated": "Settings updated."
},
"middleware": {
"not_admin": "You are not authorized as a support administrator.",
"not_agent": "You are not authorized as a support agent."
},
"inbound": {
"disabled": "Inbound email is disabled.",
"invalid_signature": "Invalid signature.",
"processing_failed": "Processing failed."
},
"labels": {
"status": {
"open": "Open",
"in_progress": "In Progress",
"waiting_on_customer": "Waiting on Customer",
"waiting_on_agent": "Waiting on Agent",
"escalated": "Escalated",
"resolved": "Resolved",
"closed": "Closed",
"reopened": "Reopened"
},
"priority": {
"low": "Low",
"medium": "Medium",
"high": "High",
"urgent": "Urgent",
"critical": "Critical"
}
}
}
84 changes: 84 additions & 0 deletions resources/lang/es/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"ticket": {
"reply_sent": "Respuesta enviada.",
"note_added": "Nota agregada.",
"assigned": "Ticket asignado.",
"status_updated": "Estado actualizado.",
"priority_updated": "Prioridad actualizada.",
"tags_updated": "Etiquetas actualizadas.",
"department_updated": "Departamento actualizado.",
"macro_applied": "Macro \":name\" aplicada.",
"unfollowed": "Dejaste de seguir el ticket.",
"following": "Siguiendo el ticket.",
"note_pinned": "Nota fijada.",
"note_unpinned": "Nota desfijada.",
"pin_notes_only": "Solo las notas internas pueden ser fijadas.",
"updated": "Ticket actualizado.",
"created": "Ticket creado exitosamente.",
"closed": "Ticket cerrado.",
"reopened": "Ticket reabierto.",
"customer_close_forbidden": "Los clientes no pueden cerrar tickets."
},
"guest": {
"created": "Ticket creado. Guarde este enlace para consultar el estado de su ticket.",
"reply_sent": "Respuesta enviada.",
"ticket_closed": "Este ticket est\u00e1 cerrado."
},
"bulk": {
"updated": ":count ticket(s) actualizado(s)."
},
"rating": {
"thank_you": "\u00a1Gracias por sus comentarios!",
"only_resolved_closed": "Solo puede calificar tickets resueltos o cerrados.",
"already_rated": "Este ticket ya ha sido calificado."
},
"admin": {
"department_created": "Departamento creado.",
"department_updated": "Departamento actualizado.",
"department_deleted": "Departamento eliminado.",
"sla_policy_created": "Pol\u00edtica SLA creada.",
"sla_policy_updated": "Pol\u00edtica SLA actualizada.",
"sla_policy_deleted": "Pol\u00edtica SLA eliminada.",
"rule_created": "Regla creada.",
"rule_updated": "Regla actualizada.",
"rule_deleted": "Regla eliminada.",
"canned_response_created": "Respuesta predefinida creada.",
"canned_response_updated": "Respuesta predefinida actualizada.",
"canned_response_deleted": "Respuesta predefinida eliminada.",
"macro_created": "Macro creada.",
"macro_updated": "Macro actualizada.",
"macro_deleted": "Macro eliminada.",
"tag_created": "Etiqueta creada.",
"tag_updated": "Etiqueta actualizada.",
"tag_deleted": "Etiqueta eliminada.",
"settings_updated": "Configuraci\u00f3n actualizada."
},
"middleware": {
"not_admin": "No est\u00e1 autorizado como administrador de soporte.",
"not_agent": "No est\u00e1 autorizado como agente de soporte."
},
"inbound": {
"disabled": "El correo entrante est\u00e1 deshabilitado.",
"invalid_signature": "Firma inv\u00e1lida.",
"processing_failed": "El procesamiento fall\u00f3."
},
"labels": {
"status": {
"open": "Abierto",
"in_progress": "En Progreso",
"waiting_on_customer": "Esperando al Cliente",
"waiting_on_agent": "Esperando al Agente",
"escalated": "Escalado",
"resolved": "Resuelto",
"closed": "Cerrado",
"reopened": "Reabierto"
},
"priority": {
"low": "Baja",
"medium": "Media",
"high": "Alta",
"urgent": "Urgente",
"critical": "Cr\u00edtica"
}
}
}
84 changes: 84 additions & 0 deletions resources/lang/fr/messages.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
{
"ticket": {
"reply_sent": "R\u00e9ponse envoy\u00e9e.",
"note_added": "Note ajout\u00e9e.",
"assigned": "Ticket assign\u00e9.",
"status_updated": "Statut mis \u00e0 jour.",
"priority_updated": "Priorit\u00e9 mise \u00e0 jour.",
"tags_updated": "\u00c9tiquettes mises \u00e0 jour.",
"department_updated": "D\u00e9partement mis \u00e0 jour.",
"macro_applied": "Macro \u00ab :name \u00bb appliqu\u00e9e.",
"unfollowed": "Ticket d\u00e9sabonn\u00e9.",
"following": "Ticket suivi.",
"note_pinned": "Note \u00e9pingl\u00e9e.",
"note_unpinned": "Note d\u00e9s\u00e9pingl\u00e9e.",
"pin_notes_only": "Seules les notes internes peuvent \u00eatre \u00e9pingl\u00e9es.",
"updated": "Ticket mis \u00e0 jour.",
"created": "Ticket cr\u00e9\u00e9 avec succ\u00e8s.",
"closed": "Ticket ferm\u00e9.",
"reopened": "Ticket rouvert.",
"customer_close_forbidden": "Les clients ne peuvent pas fermer les tickets."
},
"guest": {
"created": "Ticket cr\u00e9\u00e9. Enregistrez ce lien pour suivre l'\u00e9tat de votre ticket.",
"reply_sent": "R\u00e9ponse envoy\u00e9e.",
"ticket_closed": "Ce ticket est ferm\u00e9."
},
"bulk": {
"updated": ":count ticket(s) mis \u00e0 jour."
},
"rating": {
"thank_you": "Merci pour votre retour !",
"only_resolved_closed": "Vous ne pouvez \u00e9valuer que les tickets r\u00e9solus ou ferm\u00e9s.",
"already_rated": "Ce ticket a d\u00e9j\u00e0 \u00e9t\u00e9 \u00e9valu\u00e9."
},
"admin": {
"department_created": "D\u00e9partement cr\u00e9\u00e9.",
"department_updated": "D\u00e9partement mis \u00e0 jour.",
"department_deleted": "D\u00e9partement supprim\u00e9.",
"sla_policy_created": "Politique SLA cr\u00e9\u00e9e.",
"sla_policy_updated": "Politique SLA mise \u00e0 jour.",
"sla_policy_deleted": "Politique SLA supprim\u00e9e.",
"rule_created": "R\u00e8gle cr\u00e9\u00e9e.",
"rule_updated": "R\u00e8gle mise \u00e0 jour.",
"rule_deleted": "R\u00e8gle supprim\u00e9e.",
"canned_response_created": "R\u00e9ponse pr\u00e9d\u00e9finie cr\u00e9\u00e9e.",
"canned_response_updated": "R\u00e9ponse pr\u00e9d\u00e9finie mise \u00e0 jour.",
"canned_response_deleted": "R\u00e9ponse pr\u00e9d\u00e9finie supprim\u00e9e.",
"macro_created": "Macro cr\u00e9\u00e9e.",
"macro_updated": "Macro mise \u00e0 jour.",
"macro_deleted": "Macro supprim\u00e9e.",
"tag_created": "\u00c9tiquette cr\u00e9\u00e9e.",
"tag_updated": "\u00c9tiquette mise \u00e0 jour.",
"tag_deleted": "\u00c9tiquette supprim\u00e9e.",
"settings_updated": "Param\u00e8tres mis \u00e0 jour."
},
"middleware": {
"not_admin": "Vous n'\u00eates pas autoris\u00e9 en tant qu'administrateur du support.",
"not_agent": "Vous n'\u00eates pas autoris\u00e9 en tant qu'agent de support."
},
"inbound": {
"disabled": "L'e-mail entrant est d\u00e9sactiv\u00e9.",
"invalid_signature": "Signature invalide.",
"processing_failed": "Le traitement a \u00e9chou\u00e9."
},
"labels": {
"status": {
"open": "Ouvert",
"in_progress": "En cours",
"waiting_on_customer": "En attente du client",
"waiting_on_agent": "En attente de l'agent",
"escalated": "Escalad\u00e9",
"resolved": "R\u00e9solu",
"closed": "Ferm\u00e9",
"reopened": "Rouvert"
},
"priority": {
"low": "Basse",
"medium": "Moyenne",
"high": "\u00c9lev\u00e9e",
"urgent": "Urgente",
"critical": "Critique"
}
}
}
7 changes: 4 additions & 3 deletions src/controllers/admin_canned_responses_controller.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { HttpContext } from '@adonisjs/core/http'
import CannedResponse from '../models/canned_response.js'
import { t } from '../support/i18n.js'

export default class AdminCannedResponsesController {
async index({ inertia }: HttpContext) {
Expand All @@ -18,7 +19,7 @@ export default class AdminCannedResponsesController {
createdBy: auth.user!.id,
})

session.flash('success', 'Canned response created.')
session.flash('success', t('admin.canned_response_created'))
return response.redirect().back()
}

Expand All @@ -34,14 +35,14 @@ export default class AdminCannedResponsesController {
})
await cannedResponse.save()

session.flash('success', 'Canned response updated.')
session.flash('success', t('admin.canned_response_updated'))
return response.redirect().back()
}

async destroy({ params, response, session }: HttpContext) {
const cannedResponse = await CannedResponse.findOrFail(params.cannedResponse || params.id)
await cannedResponse.delete()
session.flash('success', 'Canned response deleted.')
session.flash('success', t('admin.canned_response_deleted'))
return response.redirect().back()
}
}
Loading