feat: add i18n support for Vietnamese and English
Some checks failed
Tests / PHP 8.3 (push) Has been cancelled
Tests / PHP 8.4 (push) Has been cancelled
Tests / PHP 8.5 (push) Has been cancelled

This commit is contained in:
2026-05-04 10:40:39 +00:00
parent 3a8db5cae6
commit 8c6b71cb8a
64 changed files with 4652 additions and 254 deletions

133
lang/en/app.php Normal file
View File

@@ -0,0 +1,133 @@
<?php
return [
// Navigation
'nav_customer_care' => 'Customer Care',
'nav_management' => 'Management',
// Resource labels
'resource_feedbacks' => 'Feedbacks',
'resource_products' => 'Products',
'resource_customers' => 'Customers',
'resource_contracts' => 'Contracts',
'resource_channels' => 'Channels',
'resource_tags' => 'Tags',
'resource_roles' => 'Roles',
'resource_users' => 'Users',
// Status
'status_pending' => 'Pending',
'status_processing' => 'Processing',
'status_resolved' => 'Resolved',
'status_closed' => 'Closed',
'status_active' => 'Active',
'status_inactive' => 'Inactive',
'status_sold_out' => 'Sold Out',
'status_completed' => 'Completed',
'status_cancelled' => 'Cancelled',
// General labels
'name' => 'Name',
'email' => 'Email',
'password' => 'Password',
'phone' => 'Phone',
'address' => 'Address',
'slug' => 'Slug',
'icon' => 'Icon',
'description' => 'Description',
'status' => 'Status',
'customer_product' => 'Customer & Product',
'select_customer_product' => 'Select the customer and their associated product',
'general_feedback' => 'General feedback (not related to a product)',
'product' => 'Product',
'contract' => 'Contract',
'feedback_details' => 'Feedback Details',
'describe_feedback' => 'Describe the customer feedback',
'assignment_status' => 'Assignment & Status',
'assign_handler' => 'Assign handler and set initial status',
'department' => 'Department',
'escalated' => 'Escalated',
'attachments' => 'Attachments',
'upload_files' => 'Upload files related to this feedback',
'collection' => 'Collection',
'collection_general' => 'General',
'collection_proof_of_resolution' => 'Proof of Resolution',
'collection_customer_evidence' => 'Customer Evidence',
'files' => 'Files',
'channel' => 'Channel',
'assigned_to' => 'Assigned To',
'created' => 'Created',
'general' => 'General',
'new_status' => 'New Status',
'assign_to' => 'Assign To',
'target_department' => 'Target Department',
'by' => 'By',
'details' => 'Details',
'unassigned' => 'Unassigned',
'role' => 'Role',
'role_name' => 'Role Name',
'permissions' => 'Permissions',
'color' => 'Color',
'customer_information' => 'Customer Information',
'owned_products' => 'Owned Products',
'icon_hint' => 'Heroicon name or emoji',
'feedbacks' => 'Feedbacks',
'used' => 'Used',
'owners' => 'Owners',
'tickets' => 'Tickets',
'signed' => 'Signed',
'interactions' => 'Interactions',
'services' => 'Services',
'handovers' => 'Handovers',
'contracts' => 'Contracts',
'collection_date' => 'Collection Date',
'remark' => 'Remark',
'handover_date' => 'Handover Date',
'start_date' => 'Start Date',
'end_date' => 'End Date',
'printed_at' => 'Print Date',
'signed_status' => 'Signed Status',
'contract_info' => 'Contract Information',
'feedback_history' => 'Feedback History',
'tab_all' => 'All',
'min' => 'min',
'na' => 'N/A',
// Widget labels
'widget_tickets_awaiting_closure' => 'Tickets Awaiting Closure',
'widget_tickets_awaiting_desc' => 'Tickets that have been resolved and are pending manager review for closure.',
'widget_ticket' => 'Ticket',
'widget_customer' => 'Customer',
'widget_handler' => 'Handler',
'widget_resolved' => 'Resolved',
'widget_resolved_tickets' => 'Resolved Tickets',
'widget_total_resolved_closed' => 'Total resolved/closed tickets',
'widget_avg_processing_time' => 'Avg Processing Time',
'widget_avg_time_desc' => 'Avg time from creation to resolution',
'widget_no_resolved_tickets' => 'No resolved tickets yet',
'widget_pending_tickets' => 'Pending Tickets',
'widget_still_in_progress' => 'Still in progress',
'widget_escalated' => 'Escalated',
'widget_escalated_desc' => 'Tickets marked as escalated',
'widget_avg_time_by_handler' => 'Avg Processing Time by Handler',
'widget_avg_time_by_handler_desc' => 'Average time from ticket creation to resolution, broken down by handler.',
'widget_avg_time_minutes' => 'Avg Time (minutes)',
'widget_unknown' => 'Unknown',
// Blade views
'blade_similar_cases' => 'Similar Cases',
'blade_matching_tags' => 'Matching tags:',
'blade_title' => 'Title',
'blade_customer' => 'Customer',
'blade_status' => 'Status',
'blade_handler' => 'Handler',
'blade_date' => 'Date',
'blade_no_attachments' => 'No attachments.',
'blade_proof_of_resolution' => 'Proof of Resolution',
'blade_customer_evidence' => 'Customer Evidence',
'blade_open' => 'Open',
'blade_links_expire' => 'Click to open. Links expire after 60 minutes.',
'blade_file_count' => ':count file(s)',
'blade_proof' => 'Proof',
'blade_evidence' => 'Evidence',
];

28
lang/en/enums.php Normal file
View File

@@ -0,0 +1,28 @@
<?php
return [
'handover' => [
'not_ready' => 'Not ready',
'ready' => 'Ready',
'handed_over' => 'Handed over',
'scheduled' => 'Scheduled',
],
'service' => [
'management_fee' => 'Management fee',
'gratitude' => 'Gratitude',
'self_business' => 'Self business',
],
'contract_status' => [
'active' => 'Active',
'expired' => 'Expired',
'liquidated' => 'Liquidated',
],
'contract_type' => [
'sale' => 'Sale contract',
'lease' => 'Lease contract',
'bcc' => 'Business cooperation contract (BCC)',
],
];

54
lang/en/feedback.php Normal file
View File

@@ -0,0 +1,54 @@
<?php
return [
// ClosingService
'already_closed' => 'This ticket has already been closed.',
'close_permission_denied' => 'Only department managers can close tickets.',
'close_department_only' => 'You can only close tickets in your managed department.',
'proof_required' => 'Proof of resolution is required to complete the process.',
'already_resolved' => 'This ticket has already been resolved or closed.',
// TransferService
'transfer_reason_required' => 'Please enter a transfer reason.',
// FileService
'file_type_not_allowed' => 'File type :type is not allowed. Allowed: jpg, png, pdf, mp4, mov.',
'file_size_exceeds' => 'File size exceeds :max KB.',
// EditFeedback page
'transfer_department' => 'Transfer Department',
'target_department' => 'Target Department',
'assign_to_optional' => 'Assign To (optional)',
'reason' => 'Reason',
'transferred_successfully' => 'Transferred successfully',
'close_ticket' => 'Close Ticket',
'close_confirm' => 'Are you sure you want to close this ticket? This action CANNOT be undone.',
'close_submit' => 'Close',
'closed_successfully' => 'Ticket closed successfully',
// InteractionsRelationManager
'interaction_history' => 'Interaction History',
'interaction_type_note' => 'Note',
'interaction_type_status_change' => 'Status Change',
'interaction_type_assignment' => 'Assignment / Forward',
'view_attachments' => 'View Attachments',
'add_interaction' => 'Add Interaction',
'assigned_successfully' => 'Feedback assigned successfully',
'status_updated' => 'Status updated successfully',
// Notifications
'notif_ticket_closed_subject' => 'Ticket #:id has been closed',
'notif_ticket_closed_ticket' => 'Ticket: :title',
'notif_ticket_closed_by' => 'Closed by: :name',
'notif_view_ticket' => 'View Ticket',
'notif_ticket_closed_message' => 'Ticket #:id ":title" has been closed by :actor.',
'notif_ticket_transferred_subject' => 'Ticket #:id has been transferred to your department',
'notif_ticket_transferred_by' => 'Transferred by: :name',
'notif_ticket_transferred_reason' => 'Reason: :reason',
'notif_ticket_transferred_message' => 'Ticket #:id ":title" has been transferred to your department by :sender.',
// CreateFeedback
'created_via' => 'Feedback created via :channel',
'unknown_channel' => 'unknown channel',
];

133
lang/vi/app.php Normal file
View File

@@ -0,0 +1,133 @@
<?php
return [
// Navigation
'nav_customer_care' => 'Chăm sóc khách hàng',
'nav_management' => 'Quản lý',
// Resource labels
'resource_feedbacks' => 'Phản ánh',
'resource_products' => 'Sản phẩm',
'resource_customers' => 'Khách hàng',
'resource_contracts' => 'Hợp đồng',
'resource_channels' => 'Kênh phản ánh',
'resource_tags' => 'Thẻ',
'resource_roles' => 'Vai trò',
'resource_users' => 'Người dùng',
// Status
'status_pending' => 'Chờ xử lý',
'status_processing' => 'Đang xử lý',
'status_resolved' => 'Đã xử lý',
'status_closed' => 'Đã đóng',
'status_active' => 'Hoạt động',
'status_inactive' => 'Không hoạt động',
'status_sold_out' => 'Hết hàng',
'status_completed' => 'Hoàn thành',
'status_cancelled' => 'Đã hủy',
// General labels
'name' => 'Tên',
'email' => 'Email',
'password' => 'Mật khẩu',
'phone' => 'Điện thoại',
'address' => 'Địa chỉ',
'slug' => 'Slug',
'icon' => 'Biểu tượng',
'description' => 'Mô tả',
'status' => 'Trạng thái',
'customer_product' => 'Khách hàng & Sản phẩm',
'select_customer_product' => 'Chọn khách hàng và sản phẩm liên quan',
'general_feedback' => 'Phản ánh chung (không liên quan đến sản phẩm)',
'product' => 'Sản phẩm',
'contract' => 'Hợp đồng',
'feedback_details' => 'Chi tiết phản ánh',
'describe_feedback' => 'Mô tả phản ánh của khách hàng',
'assignment_status' => 'Phân công & Trạng thái',
'assign_handler' => 'Phân công người xử lý và trạng thái ban đầu',
'department' => 'Phòng ban',
'escalated' => 'Khẩn cấp',
'attachments' => 'Tệp đính kèm',
'upload_files' => 'Tải lên tệp liên quan đến phản ánh này',
'collection' => 'Loại',
'collection_general' => 'Chung',
'collection_proof_of_resolution' => 'Bằng chứng giải quyết',
'collection_customer_evidence' => 'Bằng chứng khách hàng',
'files' => 'Tệp',
'channel' => 'Kênh',
'assigned_to' => 'Người xử lý',
'created' => 'Ngày tạo',
'general' => 'Chung',
'new_status' => 'Trạng thái mới',
'assign_to' => 'Chỉ định cho',
'target_department' => 'Phòng ban đích',
'by' => 'Người thực hiện',
'details' => 'Chi tiết',
'unassigned' => 'Chưa phân công',
'role' => 'Vai trò',
'role_name' => 'Tên vai trò',
'permissions' => 'Quyền',
'color' => 'Màu sắc',
'customer_information' => 'Thông tin khách hàng',
'owned_products' => 'Sản phẩm sở hữu',
'icon_hint' => 'Tên Heroicon hoặc emoji',
'feedbacks' => 'Phản ánh',
'used' => 'Đã dùng',
'owners' => 'Chủ sở hữu',
'tickets' => 'Phiếu',
'signed' => 'Đã ký',
'interactions' => 'Tương tác',
'services' => 'Dịch vụ',
'handovers' => 'Bàn giao',
'contracts' => 'Hợp đồng',
'collection_date' => 'Ngày thu',
'remark' => 'Ghi chú',
'handover_date' => 'Ngày bàn giao',
'start_date' => 'Ngày bắt đầu',
'end_date' => 'Ngày kết thúc',
'printed_at' => 'Ngày in HĐ',
'signed_status' => 'Tình trạng ký',
'contract_info' => 'Thông tin hợp đồng',
'feedback_history' => 'Lịch sử phản ánh',
'tab_all' => 'Tất cả',
'min' => 'phút',
'na' => 'N/A',
// Widget labels
'widget_tickets_awaiting_closure' => 'Phiếu chờ đóng',
'widget_tickets_awaiting_desc' => 'Các phiếu đã xử lý và đang chờ quản lý xem xét để đóng.',
'widget_ticket' => 'Phiếu',
'widget_customer' => 'Khách hàng',
'widget_handler' => 'Người xử lý',
'widget_resolved' => 'Đã xử lý',
'widget_resolved_tickets' => 'Phiếu đã xử lý',
'widget_total_resolved_closed' => 'Tổng phiếu đã xử lý/đã đóng',
'widget_avg_processing_time' => 'Thời gian xử lý TB',
'widget_avg_time_desc' => 'Thời gian TB từ khi tạo đến khi xử lý',
'widget_no_resolved_tickets' => 'Chưa có phiếu đã xử lý',
'widget_pending_tickets' => 'Phiếu đang chờ',
'widget_still_in_progress' => 'Đang xử lý',
'widget_escalated' => 'Khẩn cấp',
'widget_escalated_desc' => 'Phiếu được đánh dấu khẩn cấp',
'widget_avg_time_by_handler' => 'Thời gian xử lý TB theo người xử lý',
'widget_avg_time_by_handler_desc' => 'Thời gian trung bình từ khi tạo phiếu đến khi xử lý, phân theo người xử lý.',
'widget_avg_time_minutes' => 'Thời gian TB (phút)',
'widget_unknown' => 'Không xác định',
// Blade views
'blade_similar_cases' => 'Trường hợp tương tự',
'blade_matching_tags' => 'Thẻ trùng khớp:',
'blade_title' => 'Tiêu đề',
'blade_customer' => 'Khách hàng',
'blade_status' => 'Trạng thái',
'blade_handler' => 'Người xử lý',
'blade_date' => 'Ngày',
'blade_no_attachments' => 'Không có tệp đính kèm.',
'blade_proof_of_resolution' => 'Bằng chứng giải quyết',
'blade_customer_evidence' => 'Bằng chứng khách hàng',
'blade_open' => 'Mở',
'blade_links_expire' => 'Nhấn để mở. Liên kết hết hạn sau 60 phút.',
'blade_file_count' => ':count tệp',
'blade_proof' => 'Bằng chứng',
'blade_evidence' => 'Chứng cứ',
];

28
lang/vi/enums.php Normal file
View File

@@ -0,0 +1,28 @@
<?php
return [
'handover' => [
'not_ready' => 'Chưa đủ điều kiện',
'ready' => 'Đủ điều kiện',
'handed_over' => 'Đã bàn giao',
'scheduled' => 'Đã lên lịch',
],
'service' => [
'management_fee' => 'Phí quản lý',
'gratitude' => 'Tri ân',
'self_business' => 'Tự doanh',
],
'contract_status' => [
'active' => 'Đang hiệu lực',
'expired' => 'Hết hạn',
'liquidated' => 'Đã thanh lý',
],
'contract_type' => [
'sale' => 'HĐ Mua bán',
'lease' => 'HĐ Thuê',
'bcc' => 'HĐ Hợp tác kinh doanh (BCC)',
],
];

54
lang/vi/feedback.php Normal file
View File

@@ -0,0 +1,54 @@
<?php
return [
// ClosingService
'already_closed' => 'Phiếu này đã được đóng.',
'close_permission_denied' => 'Chỉ lãnh đạo cấp phòng mới có quyền đóng phiếu.',
'close_department_only' => 'Bạn chỉ có thể đóng phiếu thuộc phòng ban mình quản lý.',
'proof_required' => 'Yêu cầu cung cấp tài liệu bằng chứng để hoàn tất quy trình.',
'already_resolved' => 'Phiếu này đã được xử lý hoặc đóng.',
// TransferService
'transfer_reason_required' => 'Vui lòng nhập lý do chuyển tiếp.',
// FileService
'file_type_not_allowed' => 'Loại file :type không được phép. Cho phép: jpg, png, pdf, mp4, mov.',
'file_size_exceeds' => 'Kích thước file vượt quá :max KB.',
// EditFeedback page
'transfer_department' => 'Chuyển phòng ban',
'target_department' => 'Phòng ban đích',
'assign_to_optional' => 'Chỉ định người xử lý (tùy chọn)',
'reason' => 'Lý do',
'transferred_successfully' => 'Chuyển tiếp thành công',
'close_ticket' => 'Đóng phiếu',
'close_confirm' => 'Bạn có chắc muốn đóng phiếu này? Hành động này KHÔNG thể hoàn tác.',
'close_submit' => 'Đóng',
'closed_successfully' => 'Đóng phiếu thành công',
// InteractionsRelationManager
'interaction_history' => 'Lịch sử tương tác',
'interaction_type_note' => 'Ghi chú',
'interaction_type_status_change' => 'Thay đổi trạng thái',
'interaction_type_assignment' => 'Phân công / Chuyển tiếp',
'view_attachments' => 'Xem tệp đính kèm',
'add_interaction' => 'Thêm tương tác',
'assigned_successfully' => 'Phân công thành công',
'status_updated' => 'Cập nhật trạng thái thành công',
// Notifications
'notif_ticket_closed_subject' => 'Ticket #:id đã được đóng',
'notif_ticket_closed_ticket' => 'Ticket: :title',
'notif_ticket_closed_by' => 'Đóng bởi: :name',
'notif_view_ticket' => 'Xem Ticket',
'notif_ticket_closed_message' => 'Ticket #:id ":title" đã được đóng bởi :actor.',
'notif_ticket_transferred_subject' => 'Ticket #:id đã được chuyển đến phòng của bạn',
'notif_ticket_transferred_by' => 'Người chuyển: :name',
'notif_ticket_transferred_reason' => 'Lý do: :reason',
'notif_ticket_transferred_message' => 'Ticket #:id ":title" đã được chuyển đến phòng của bạn bởi :sender.',
// CreateFeedback
'created_via' => 'Phản ánh được tạo qua :channel',
'unknown_channel' => 'kênh không xác định',
];