From d0aa2f17932e970aac6a18676eacc9a6a3b2d54d Mon Sep 17 00:00:00 2001 From: daniel Date: Sun, 25 Oct 2026 15:01:51 +0100 Subject: [PATCH 1/2] fix: translate status role and permission labels --- Modules/Clients/Enums/AddressType.php | 6 +- Modules/Clients/Enums/CommunicationType.php | 12 +- Modules/Clients/Enums/RelationType.php | 4 +- Modules/Core/Enums/AddressType.php | 6 +- Modules/Core/Enums/CommunicationType.php | 10 +- Modules/Core/Enums/CustomFieldType.php | 8 +- Modules/Core/Enums/EmailTemplateType.php | 8 +- Modules/Core/Enums/MailType.php | 4 +- Modules/Core/Enums/Permission.php | 2 +- Modules/Core/Enums/ReportBand.php | 10 +- Modules/Core/Enums/TaxRateType.php | 8 +- Modules/Core/Enums/UserRole.php | 10 +- Modules/Core/Enums/UserType.php | 4 +- .../Tests/Feature/EnumLocalizationTest.php | 40 ++++++ .../pages/role-permissions-page.blade.php | 2 +- Modules/Expenses/Enums/ExpenseStatus.php | 12 +- Modules/Expenses/Enums/ExpenseType.php | 12 +- Modules/Invoices/Enums/RecurringFrequency.php | 10 +- Modules/Payments/Enums/PaymentStatus.php | 10 +- Modules/Projects/Enums/ProjectStatus.php | 10 +- resources/lang/en/enums.php | 98 ++++++++++++++ resources/lang/en/permissions.php | 126 ++++++++++++++++++ 22 files changed, 338 insertions(+), 74 deletions(-) create mode 100644 Modules/Core/Tests/Feature/EnumLocalizationTest.php create mode 100644 resources/lang/en/enums.php create mode 100644 resources/lang/en/permissions.php diff --git a/Modules/Clients/Enums/AddressType.php b/Modules/Clients/Enums/AddressType.php index 53036a249..32ef8e5fd 100644 --- a/Modules/Clients/Enums/AddressType.php +++ b/Modules/Clients/Enums/AddressType.php @@ -18,9 +18,9 @@ public static function values(): array public function label(): string { return match ($this) { - self::BILLING => 'Billing', - self::SHIPPING => 'Shipping', - self::OFFICE => 'Office', + self::BILLING => trans('enums.address_type.billing'), + self::SHIPPING => trans('enums.address_type.shipping'), + self::OFFICE => trans('enums.address_type.office'), }; } diff --git a/Modules/Clients/Enums/CommunicationType.php b/Modules/Clients/Enums/CommunicationType.php index 76e0177ce..d5d1ff5f4 100644 --- a/Modules/Clients/Enums/CommunicationType.php +++ b/Modules/Clients/Enums/CommunicationType.php @@ -26,12 +26,12 @@ public static function ccTypes(): array public function label(): string { return match ($this) { - self::EMAIL => 'Email', - self::PHONE => 'Phone', - self::FAX => 'Fax', - self::MOBILE => 'Mobile', - self::WHATSAPP => 'Whatsapp', - self::INVOICE_CC => 'Invoice CC Email', + self::EMAIL => trans('enums.communication_type.email'), + self::PHONE => trans('enums.communication_type.phone'), + self::FAX => trans('enums.communication_type.fax'), + self::MOBILE => trans('enums.communication_type.mobile'), + self::WHATSAPP => trans('enums.communication_type.whatsapp'), + self::INVOICE_CC => trans('enums.communication_type.invoice_cc'), }; } diff --git a/Modules/Clients/Enums/RelationType.php b/Modules/Clients/Enums/RelationType.php index 15cf3804e..ed85b30e8 100644 --- a/Modules/Clients/Enums/RelationType.php +++ b/Modules/Clients/Enums/RelationType.php @@ -23,8 +23,8 @@ public function label(): string self::CUSTOMER => trans('ip.customer'), self::VENDOR => trans('ip.vendor'), self::PROSPECT => trans('ip.prospect'), - self::PARTNER => 'Partner', - self::LEAD => 'Lead', + self::PARTNER => trans('enums.relation_type.partner'), + self::LEAD => trans('enums.relation_type.lead'), }; } diff --git a/Modules/Core/Enums/AddressType.php b/Modules/Core/Enums/AddressType.php index 6f95cb12e..393b09ac4 100644 --- a/Modules/Core/Enums/AddressType.php +++ b/Modules/Core/Enums/AddressType.php @@ -18,9 +18,9 @@ public static function values(): array public function label(): string { return match ($this) { - self::BILLING => 'Billing', - self::SHIPPING => 'Shipping', - self::OFFICE => 'Office', + self::BILLING => trans('enums.address_type.billing'), + self::SHIPPING => trans('enums.address_type.shipping'), + self::OFFICE => trans('enums.address_type.office'), }; } diff --git a/Modules/Core/Enums/CommunicationType.php b/Modules/Core/Enums/CommunicationType.php index 38f400ea4..3c4945be2 100644 --- a/Modules/Core/Enums/CommunicationType.php +++ b/Modules/Core/Enums/CommunicationType.php @@ -20,11 +20,11 @@ public static function values(): array public function label(): string { return match ($this) { - self::EMAIL => 'Email', - self::PHONE => 'Phone', - self::FAX => 'Fax', - self::MOBILE => 'Mobile', - self::WHATSAPP => 'Whatsapp', + self::EMAIL => trans('enums.communication_type.email'), + self::PHONE => trans('enums.communication_type.phone'), + self::FAX => trans('enums.communication_type.fax'), + self::MOBILE => trans('enums.communication_type.mobile'), + self::WHATSAPP => trans('enums.communication_type.whatsapp'), }; } diff --git a/Modules/Core/Enums/CustomFieldType.php b/Modules/Core/Enums/CustomFieldType.php index e9419af7f..50e3c8748 100644 --- a/Modules/Core/Enums/CustomFieldType.php +++ b/Modules/Core/Enums/CustomFieldType.php @@ -19,10 +19,10 @@ public static function values(): array public function label(): string { return match ($this) { - self::TEXT => 'Single Line Text', - self::NUMBER => 'Multi Line Text', - self::DATE => 'Date Picker', - self::BOOLEAN => 'Boolean', + self::TEXT => trans('enums.custom_field_type.text'), + self::NUMBER => trans('enums.custom_field_type.number'), + self::DATE => trans('enums.custom_field_type.date'), + self::BOOLEAN => trans('enums.custom_field_type.boolean'), }; } diff --git a/Modules/Core/Enums/EmailTemplateType.php b/Modules/Core/Enums/EmailTemplateType.php index 59a1a500f..2cb52ca39 100644 --- a/Modules/Core/Enums/EmailTemplateType.php +++ b/Modules/Core/Enums/EmailTemplateType.php @@ -21,10 +21,10 @@ public static function values(): array public function label(): string { return match ($this) { - self::TEXT => 'Single Line Text', - self::NUMBER => 'Multi Line Text', - self::DATE => 'Date Picker', - self::BOOLEAN => 'Boolean', + self::TEXT => trans('enums.email_template_type.text'), + self::NUMBER => trans('enums.email_template_type.number'), + self::DATE => trans('enums.email_template_type.date'), + self::BOOLEAN => trans('enums.email_template_type.boolean'), }; } diff --git a/Modules/Core/Enums/MailType.php b/Modules/Core/Enums/MailType.php index cdeb18a2d..ce57b666d 100644 --- a/Modules/Core/Enums/MailType.php +++ b/Modules/Core/Enums/MailType.php @@ -17,8 +17,8 @@ public static function values(): array public function label(): string { return match ($this) { - self::REMINDER => 'Reminder', - self::SENT => 'Sent', + self::REMINDER => trans('enums.mail_type.reminder'), + self::SENT => trans('enums.mail_type.sent'), }; } diff --git a/Modules/Core/Enums/Permission.php b/Modules/Core/Enums/Permission.php index 3b185f667..dcd3f97a7 100644 --- a/Modules/Core/Enums/Permission.php +++ b/Modules/Core/Enums/Permission.php @@ -169,7 +169,7 @@ enum Permission: string implements LabeledEnum public function label(): string { - return str($this->value)->replace('-', ' ')->title()->toString(); + return trans('permissions.' . $this->value); } public function color(): string diff --git a/Modules/Core/Enums/ReportBand.php b/Modules/Core/Enums/ReportBand.php index 90e149cc3..fa69ab9d8 100644 --- a/Modules/Core/Enums/ReportBand.php +++ b/Modules/Core/Enums/ReportBand.php @@ -16,11 +16,11 @@ enum ReportBand: string public function getLabel(): string { return match ($this) { - self::HEADER => 'Header', - self::GROUP_HEADER => 'Group Header', - self::DETAILS => 'Details', - self::GROUP_FOOTER => 'Group Footer', - self::FOOTER => 'Footer', + self::HEADER => trans('enums.report_band.header'), + self::GROUP_HEADER => trans('enums.report_band.group_header'), + self::DETAILS => trans('enums.report_band.details'), + self::GROUP_FOOTER => trans('enums.report_band.group_footer'), + self::FOOTER => trans('enums.report_band.footer'), }; } diff --git a/Modules/Core/Enums/TaxRateType.php b/Modules/Core/Enums/TaxRateType.php index 77a1a59b1..e0344759c 100644 --- a/Modules/Core/Enums/TaxRateType.php +++ b/Modules/Core/Enums/TaxRateType.php @@ -19,10 +19,10 @@ public static function values(): array public function label(): string { return match ($this) { - self::EXCLUSIVE => 'Exclusive', - self::INCLUSIVE => 'Inclusive', - self::ZERO => 'Zero', - self::EXEMPT => 'Exempt', + self::EXCLUSIVE => trans('enums.tax_rate_type.exclusive'), + self::INCLUSIVE => trans('enums.tax_rate_type.inclusive'), + self::ZERO => trans('enums.tax_rate_type.zero'), + self::EXEMPT => trans('enums.tax_rate_type.exempt'), }; } diff --git a/Modules/Core/Enums/UserRole.php b/Modules/Core/Enums/UserRole.php index 76f8fcd69..0e01ce32a 100644 --- a/Modules/Core/Enums/UserRole.php +++ b/Modules/Core/Enums/UserRole.php @@ -37,11 +37,11 @@ public static function nonAdmin(): array public function label(): string { return match ($this) { - self::SUPER_ADMIN => 'Super Admin', - self::ADMIN => 'admin', - self::ASSIST => 'assist', - self::CUSTOMER_ADMIN => 'Client Admin', - self::CUSTOMER => 'client', + self::SUPER_ADMIN => trans('enums.user_role.super_admin'), + self::ADMIN => trans('enums.user_role.admin'), + self::ASSIST => trans('enums.user_role.assist'), + self::CUSTOMER_ADMIN => trans('enums.user_role.customer_admin'), + self::CUSTOMER => trans('enums.user_role.customer'), }; } diff --git a/Modules/Core/Enums/UserType.php b/Modules/Core/Enums/UserType.php index 700d8fa01..4a59467d0 100644 --- a/Modules/Core/Enums/UserType.php +++ b/Modules/Core/Enums/UserType.php @@ -19,8 +19,8 @@ enum UserType: int public function getLabel(): string { return match($this) { - self::ADMIN => 'ip.administrator', - self::CLIENT => 'ip.client', + self::ADMIN => trans('enums.user_type.admin'), + self::CLIENT => trans('enums.user_type.client'), }; } diff --git a/Modules/Core/Tests/Feature/EnumLocalizationTest.php b/Modules/Core/Tests/Feature/EnumLocalizationTest.php new file mode 100644 index 000000000..3c4fc8833 --- /dev/null +++ b/Modules/Core/Tests/Feature/EnumLocalizationTest.php @@ -0,0 +1,40 @@ +addLines(['enums.expense_status.draft' => 'Entwurf Test', 'enums.report_band.header' => 'Kopf Test'], 'de'); + app()->setLocale('en'); + $value = ExpenseStatus::DRAFT->value; + $this->assertSame('Draft', ExpenseStatus::DRAFT->label()); + app()->setLocale('de'); + $this->assertSame('Entwurf Test', ExpenseStatus::DRAFT->label()); + $this->assertSame('Kopf Test', ReportBand::HEADER->getLabel()); + $this->assertSame($value, ExpenseStatus::DRAFT->value); + app()->setLocale('en'); + $this->assertSame('Draft', ExpenseStatus::DRAFT->label()); + } + + #[Test] + public function it_translates_permissions_without_changing_the_permission_identifiers(): void + { + app('translator')->addLines(['permissions.view-invoices' => 'Rechnungen anzeigen Test'], 'de'); + app()->setLocale('en'); + $this->assertSame('View Invoices', Permission::VIEW_INVOICES->label()); + app()->setLocale('de'); + $this->assertSame('Rechnungen anzeigen Test', Permission::VIEW_INVOICES->label()); + $this->assertSame('view-invoices', Permission::VIEW_INVOICES->value); + } +} diff --git a/Modules/Core/resources/views/filament/admin/pages/role-permissions-page.blade.php b/Modules/Core/resources/views/filament/admin/pages/role-permissions-page.blade.php index d3c6009db..9a831ac4f 100644 --- a/Modules/Core/resources/views/filament/admin/pages/role-permissions-page.blade.php +++ b/Modules/Core/resources/views/filament/admin/pages/role-permissions-page.blade.php @@ -9,7 +9,7 @@ {{ trans('ip.permission') }} @foreach ($roles as $role) - {{ str($role->name)->replace('_', ' ')->title() }} + {{ \Modules\Core\Enums\UserRole::tryFrom($role->name)?->label() ?? str($role->name)->replace('_', ' ')->title() }} @endforeach diff --git a/Modules/Expenses/Enums/ExpenseStatus.php b/Modules/Expenses/Enums/ExpenseStatus.php index 8d24f79f9..06ebb9b4f 100644 --- a/Modules/Expenses/Enums/ExpenseStatus.php +++ b/Modules/Expenses/Enums/ExpenseStatus.php @@ -18,12 +18,12 @@ enum ExpenseStatus: string implements LabeledEnum public function label(): string { return match ($this) { - self::DRAFT => 'Draft', - self::SUBMITTED => 'Submitted', - self::APPROVED => 'Approved', - self::REIMBURSED => 'Reimbursed', - self::BILLED => 'Billed', - self::PAID => 'Paid', + self::DRAFT => trans('enums.expense_status.draft'), + self::SUBMITTED => trans('enums.expense_status.submitted'), + self::APPROVED => trans('enums.expense_status.approved'), + self::REIMBURSED => trans('enums.expense_status.reimbursed'), + self::BILLED => trans('enums.expense_status.billed'), + self::PAID => trans('enums.expense_status.paid'), }; } diff --git a/Modules/Expenses/Enums/ExpenseType.php b/Modules/Expenses/Enums/ExpenseType.php index df5eb62dd..4328d9e59 100644 --- a/Modules/Expenses/Enums/ExpenseType.php +++ b/Modules/Expenses/Enums/ExpenseType.php @@ -24,12 +24,12 @@ public static function values(): array public function label(): string { return match ($this) { - self::ONE_TIME => 'One Time', - self::RECURRING => 'Recurring', - self::TRAVEL => 'Travel', - self::UTILITY => 'Utility', - self::MAINTENANCE => 'Maintenance', - self::FIXED => 'Fixed', + self::ONE_TIME => trans('enums.expense_type.one_time'), + self::RECURRING => trans('enums.expense_type.recurring'), + self::TRAVEL => trans('enums.expense_type.travel'), + self::UTILITY => trans('enums.expense_type.utility'), + self::MAINTENANCE => trans('enums.expense_type.maintenance'), + self::FIXED => trans('enums.expense_type.fixed'), }; } diff --git a/Modules/Invoices/Enums/RecurringFrequency.php b/Modules/Invoices/Enums/RecurringFrequency.php index ec2dd42e0..8e778109d 100644 --- a/Modules/Invoices/Enums/RecurringFrequency.php +++ b/Modules/Invoices/Enums/RecurringFrequency.php @@ -20,11 +20,11 @@ public static function values(): array public function label(): string { return match ($this) { - self::DAILY => 'Daily', - self::WEEKLY => 'Weekly', - self::MONTHLY => 'Monthly', - self::YEARLY => 'Yearly', - self::QUARTERLY => 'Quarterly', + self::DAILY => trans('enums.recurring_frequency.daily'), + self::WEEKLY => trans('enums.recurring_frequency.weekly'), + self::MONTHLY => trans('enums.recurring_frequency.monthly'), + self::YEARLY => trans('enums.recurring_frequency.yearly'), + self::QUARTERLY => trans('enums.recurring_frequency.quarterly'), }; } diff --git a/Modules/Payments/Enums/PaymentStatus.php b/Modules/Payments/Enums/PaymentStatus.php index 381a52df5..81dac6eaf 100644 --- a/Modules/Payments/Enums/PaymentStatus.php +++ b/Modules/Payments/Enums/PaymentStatus.php @@ -24,11 +24,11 @@ public static function values(): array public function label(): string { return match ($this) { - self::COMPLETED => 'Completed', - self::FAILED => 'ip.failed', - self::PENDING => 'Pending', - self::REFUNDED => 'Refunded', - self::REFUNDED_PARTIALLY => 'ip.partially_refunded', + self::COMPLETED => trans('enums.payment_status.completed'), + self::FAILED => trans('enums.payment_status.failed'), + self::PENDING => trans('enums.payment_status.pending'), + self::REFUNDED => trans('enums.payment_status.refunded'), + self::REFUNDED_PARTIALLY => trans('enums.payment_status.refunded_partially'), }; } diff --git a/Modules/Projects/Enums/ProjectStatus.php b/Modules/Projects/Enums/ProjectStatus.php index 107ef41ea..778aeab8f 100644 --- a/Modules/Projects/Enums/ProjectStatus.php +++ b/Modules/Projects/Enums/ProjectStatus.php @@ -22,11 +22,11 @@ public static function values(): array public function label(): string { return match ($this) { - self::ON_HOLD => 'On Hold', - self::COMPLETED => 'Completed', - self::PLANNED => 'Planned', - self::ACTIVE => 'Active', - self::CANCELLED => 'Cancelled', + self::ON_HOLD => trans('enums.project_status.on_hold'), + self::COMPLETED => trans('enums.project_status.completed'), + self::PLANNED => trans('enums.project_status.planned'), + self::ACTIVE => trans('enums.project_status.active'), + self::CANCELLED => trans('enums.project_status.cancelled'), }; } diff --git a/resources/lang/en/enums.php b/resources/lang/en/enums.php new file mode 100644 index 000000000..a5f4060dd --- /dev/null +++ b/resources/lang/en/enums.php @@ -0,0 +1,98 @@ + [ + 'billing' => 'Billing', + 'shipping' => 'Shipping', + 'office' => 'Office', + ], + 'relation_type' => [ + 'partner' => 'Partner', + 'lead' => 'Lead', + ], + 'communication_type' => [ + 'email' => 'Email', + 'phone' => 'Phone', + 'fax' => 'Fax', + 'mobile' => 'Mobile', + 'whatsapp' => 'Whatsapp', + 'invoice_cc' => 'Invoice CC Email', + ], + 'payment_status' => [ + 'completed' => 'Completed', + 'failed' => 'Failed', + 'pending' => 'Pending', + 'refunded' => 'Refunded', + 'refunded_partially' => 'Partially Refunded', + ], + 'mail_type' => [ + 'reminder' => 'Reminder', + 'sent' => 'Sent', + ], + 'custom_field_type' => [ + 'text' => 'Single Line Text', + 'number' => 'Multi Line Text', + 'date' => 'Date Picker', + 'boolean' => 'Boolean', + ], + 'report_band' => [ + 'header' => 'Header', + 'group_header' => 'Group Header', + 'details' => 'Details', + 'group_footer' => 'Group Footer', + 'footer' => 'Footer', + ], + 'tax_rate_type' => [ + 'exclusive' => 'Exclusive', + 'inclusive' => 'Inclusive', + 'zero' => 'Zero', + 'exempt' => 'Exempt', + ], + 'user_type' => [ + 'admin' => 'Administrator', + 'client' => 'Client', + ], + 'user_role' => [ + 'super_admin' => 'Super Admin', + 'admin' => 'admin', + 'assist' => 'assist', + 'customer_admin' => 'Client Admin', + 'customer' => 'client', + ], + 'email_template_type' => [ + 'text' => 'Single Line Text', + 'number' => 'Multi Line Text', + 'date' => 'Date Picker', + 'boolean' => 'Boolean', + ], + 'recurring_frequency' => [ + 'daily' => 'Daily', + 'weekly' => 'Weekly', + 'monthly' => 'Monthly', + 'yearly' => 'Yearly', + 'quarterly' => 'Quarterly', + ], + 'expense_status' => [ + 'draft' => 'Draft', + 'submitted' => 'Submitted', + 'approved' => 'Approved', + 'reimbursed' => 'Reimbursed', + 'billed' => 'Billed', + 'paid' => 'Paid', + ], + 'expense_type' => [ + 'one_time' => 'One Time', + 'recurring' => 'Recurring', + 'travel' => 'Travel', + 'utility' => 'Utility', + 'maintenance' => 'Maintenance', + 'fixed' => 'Fixed', + ], + 'project_status' => [ + 'on_hold' => 'On Hold', + 'completed' => 'Completed', + 'planned' => 'Planned', + 'active' => 'Active', + 'cancelled' => 'Cancelled', + ], +]; diff --git a/resources/lang/en/permissions.php b/resources/lang/en/permissions.php new file mode 100644 index 000000000..431d37e6c --- /dev/null +++ b/resources/lang/en/permissions.php @@ -0,0 +1,126 @@ + 'View Relations', + 'create-relations' => 'Create Relations', + 'edit-relations' => 'Edit Relations', + 'delete-relations' => 'Delete Relations', + 'import-relations' => 'Import Relations', + 'export-relations' => 'Export Relations', + 'duplicate-relations' => 'Duplicate Relations', + 'merge-relations' => 'Merge Relations', + 'view-contacts' => 'View Contacts', + 'create-contacts' => 'Create Contacts', + 'edit-contacts' => 'Edit Contacts', + 'delete-contacts' => 'Delete Contacts', + 'view-expenses' => 'View Expenses', + 'create-expenses' => 'Create Expenses', + 'edit-expenses' => 'Edit Expenses', + 'delete-expenses' => 'Delete Expenses', + 'view-invoices' => 'View Invoices', + 'create-invoices' => 'Create Invoices', + 'edit-invoices' => 'Edit Invoices', + 'delete-invoices' => 'Delete Invoices', + 'view-companies' => 'View Companies', + 'create-companies' => 'Create Companies', + 'edit-companies' => 'Edit Companies', + 'delete-companies' => 'Delete Companies', + 'view-payments' => 'View Payments', + 'create-payments' => 'Create Payments', + 'edit-payments' => 'Edit Payments', + 'delete-payments' => 'Delete Payments', + 'view-permissions' => 'View Permissions', + 'create-permissions' => 'Create Permissions', + 'edit-permissions' => 'Edit Permissions', + 'delete-permissions' => 'Delete Permissions', + 'view-products' => 'View Products', + 'create-products' => 'Create Products', + 'edit-products' => 'Edit Products', + 'delete-products' => 'Delete Products', + 'view-projects' => 'View Projects', + 'create-projects' => 'Create Projects', + 'edit-projects' => 'Edit Projects', + 'delete-projects' => 'Delete Projects', + 'view-quotes' => 'View Quotes', + 'create-quotes' => 'Create Quotes', + 'edit-quotes' => 'Edit Quotes', + 'delete-quotes' => 'Delete Quotes', + 'view-reports' => 'View Reports', + 'create-reports' => 'Create Reports', + 'edit-reports' => 'Edit Reports', + 'delete-reports' => 'Delete Reports', + 'view-roles' => 'View Roles', + 'create-roles' => 'Create Roles', + 'edit-roles' => 'Edit Roles', + 'delete-roles' => 'Delete Roles', + 'view-settings' => 'View Settings', + 'create-settings' => 'Create Settings', + 'edit-settings' => 'Edit Settings', + 'delete-settings' => 'Delete Settings', + 'view-tasks' => 'View Tasks', + 'create-tasks' => 'Create Tasks', + 'edit-tasks' => 'Edit Tasks', + 'delete-tasks' => 'Delete Tasks', + 'view-tax-rates' => 'View Tax Rates', + 'create-tax-rates' => 'Create Tax Rates', + 'edit-tax-rates' => 'Edit Tax Rates', + 'delete-tax-rates' => 'Delete Tax Rates', + 'view-users' => 'View Users', + 'create-users' => 'Create Users', + 'edit-users' => 'Edit Users', + 'delete-users' => 'Delete Users', + 'view-email-templates' => 'View Email Templates', + 'create-email-templates' => 'Create Email Templates', + 'edit-email-templates' => 'Edit Email Templates', + 'delete-email-templates' => 'Delete Email Templates', + 'manage-customers' => 'Manage Customers', + 'approve-expenses' => 'Approve Expenses', + 'reject-expenses' => 'Reject Expenses', + 'import-expenses' => 'Import Expenses', + 'export-expenses' => 'Export Expenses', + 'duplicate-expenses' => 'Duplicate Expenses', + 'download-invoices' => 'Download Invoices', + 'duplicate-invoices' => 'Duplicate Invoices', + 'email-invoices' => 'Email Invoices', + 'mark-paid-invoices' => 'Mark Paid Invoices', + 'mark-sent-invoices' => 'Mark Sent Invoices', + 'print-invoices' => 'Print Invoices', + 'import-invoices' => 'Import Invoices', + 'export-invoices' => 'Export Invoices', + 'convert-to-quote-invoices' => 'Convert To Quote Invoices', + 'email-payments' => 'Email Payments', + 'refund-payments' => 'Refund Payments', + 'import-payments' => 'Import Payments', + 'export-payments' => 'Export Payments', + 'export-products' => 'Export Products', + 'import-products' => 'Import Products', + 'duplicate-products' => 'Duplicate Products', + 'manage-projects' => 'Manage Projects', + 'import-projects' => 'Import Projects', + 'export-projects' => 'Export Projects', + 'duplicate-projects' => 'Duplicate Projects', + 'archive-projects' => 'Archive Projects', + 'approve-quotes' => 'Approve Quotes', + 'convert-to-invoice-quotes' => 'Convert To Invoice Quotes', + 'download-quotes' => 'Download Quotes', + 'duplicate-quotes' => 'Duplicate Quotes', + 'email-quotes' => 'Email Quotes', + 'mark-sent-quotes' => 'Mark Sent Quotes', + 'print-quotes' => 'Print Quotes', + 'reject-quotes' => 'Reject Quotes', + 'import-quotes' => 'Import Quotes', + 'export-quotes' => 'Export Quotes', + 'archive-quotes' => 'Archive Quotes', + 'export-reports' => 'Export Reports', + 'manage-reports' => 'Manage Reports', + 'print-reports' => 'Print Reports', + 'manage-settings' => 'Manage Settings', + 'manage-roles' => 'Manage Roles', + 'impersonate-users' => 'Impersonate Users', + 'view-dashboard' => 'View Dashboard', + 'manage-company-settings' => 'Manage Company Settings', + 'import' => 'Import', + 'export' => 'Export', + 'backup' => 'Backup', + 'restore' => 'Restore', +]; From 50cb28971ff076e97de2cfa89c3cca4293f172bc Mon Sep 17 00:00:00 2001 From: daniel Date: Sun, 25 Oct 2026 17:12:52 +0100 Subject: [PATCH 2/2] test: structure enum localization checks as arrange-act-assert --- .../Tests/Feature/EnumLocalizationTest.php | 34 ++++++++++++++----- 1 file changed, 26 insertions(+), 8 deletions(-) diff --git a/Modules/Core/Tests/Feature/EnumLocalizationTest.php b/Modules/Core/Tests/Feature/EnumLocalizationTest.php index 3c4fc8833..56c49b136 100644 --- a/Modules/Core/Tests/Feature/EnumLocalizationTest.php +++ b/Modules/Core/Tests/Feature/EnumLocalizationTest.php @@ -15,26 +15,44 @@ class EnumLocalizationTest extends AbstractTestCase #[Test] public function it_resolves_enum_labels_in_the_current_locale_without_changing_storage_values(): void { + /* Arrange */ app('translator')->addLines(['enums.expense_status.draft' => 'Entwurf Test', 'enums.report_band.header' => 'Kopf Test'], 'de'); app()->setLocale('en'); $value = ExpenseStatus::DRAFT->value; - $this->assertSame('Draft', ExpenseStatus::DRAFT->label()); + + /* Act */ + $englishLabel = ExpenseStatus::DRAFT->label(); app()->setLocale('de'); - $this->assertSame('Entwurf Test', ExpenseStatus::DRAFT->label()); - $this->assertSame('Kopf Test', ReportBand::HEADER->getLabel()); - $this->assertSame($value, ExpenseStatus::DRAFT->value); + $germanLabel = ExpenseStatus::DRAFT->label(); + $headerLabel = ReportBand::HEADER->getLabel(); + $germanValue = ExpenseStatus::DRAFT->value; app()->setLocale('en'); - $this->assertSame('Draft', ExpenseStatus::DRAFT->label()); + $restoredEnglishLabel = ExpenseStatus::DRAFT->label(); + + /* Assert */ + $this->assertSame('Draft', $englishLabel); + $this->assertSame('Entwurf Test', $germanLabel); + $this->assertSame('Kopf Test', $headerLabel); + $this->assertSame($value, $germanValue); + $this->assertSame('Draft', $restoredEnglishLabel); } #[Test] public function it_translates_permissions_without_changing_the_permission_identifiers(): void { + /* Arrange */ app('translator')->addLines(['permissions.view-invoices' => 'Rechnungen anzeigen Test'], 'de'); app()->setLocale('en'); - $this->assertSame('View Invoices', Permission::VIEW_INVOICES->label()); + + /* Act */ + $englishLabel = Permission::VIEW_INVOICES->label(); app()->setLocale('de'); - $this->assertSame('Rechnungen anzeigen Test', Permission::VIEW_INVOICES->label()); - $this->assertSame('view-invoices', Permission::VIEW_INVOICES->value); + $germanLabel = Permission::VIEW_INVOICES->label(); + $permissionIdentifier = Permission::VIEW_INVOICES->value; + + /* Assert */ + $this->assertSame('View Invoices', $englishLabel); + $this->assertSame('Rechnungen anzeigen Test', $germanLabel); + $this->assertSame('view-invoices', $permissionIdentifier); } }