diff --git a/src/DataTables/LogDataTable.php b/src/DataTables/LogDataTable.php index 69a96c27..5d23446a 100644 --- a/src/DataTables/LogDataTable.php +++ b/src/DataTables/LogDataTable.php @@ -59,6 +59,8 @@ use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Security\Core\Security; use Symfony\Contracts\Translation\TranslatorInterface; +use function Symfony\Component\Translation\t; + class LogDataTable implements DataTableTypeInterface { protected ElementTypeNameGenerator $elementTypeNameGenerator; @@ -182,17 +184,17 @@ class LogDataTable implements DataTableTypeInterface ]); $dataTable->add('id', TextColumn::class, [ - 'label' => $this->translator->trans('log.id'), + 'label' => 'log.id', 'visible' => false, ]); $dataTable->add('timestamp', LocaleDateTimeColumn::class, [ - 'label' => $this->translator->trans('log.timestamp'), + 'label' => 'log.timestamp', 'timeFormat' => 'medium', ]); $dataTable->add('type', TextColumn::class, [ - 'label' => $this->translator->trans('log.type'), + 'label' => 'log.type', 'propertyPath' => 'type', 'render' => function (string $value, AbstractLogEntry $context) { $text = $this->translator->trans('log.type.'.$value); @@ -209,7 +211,7 @@ class LogDataTable implements DataTableTypeInterface ]); $dataTable->add('level', TextColumn::class, [ - 'label' => $this->translator->trans('log.level'), + 'label' => 'log.level', 'visible' => 'system_log' === $options['mode'], 'propertyPath' => 'levelString', 'render' => function (string $value, AbstractLogEntry $context) { @@ -218,7 +220,7 @@ class LogDataTable implements DataTableTypeInterface ]); $dataTable->add('user', TextColumn::class, [ - 'label' => $this->translator->trans('log.user'), + 'label' => 'log.user', 'render' => function ($value, AbstractLogEntry $context) { $user = $context->getUser(); @@ -244,7 +246,7 @@ class LogDataTable implements DataTableTypeInterface ]); $dataTable->add('target_type', TextColumn::class, [ - 'label' => $this->translator->trans('log.target_type'), + 'label' => 'log.target_type', 'visible' => false, 'render' => function ($value, AbstractLogEntry $context) { $class = $context->getTargetClass(); @@ -257,12 +259,12 @@ class LogDataTable implements DataTableTypeInterface ]); $dataTable->add('target', LogEntryTargetColumn::class, [ - 'label' => $this->translator->trans('log.target'), + 'label' => 'log.target', 'show_associated' => 'element_history' !== $options['mode'], ]); $dataTable->add('extra', LogEntryExtraColumn::class, [ - 'label' => $this->translator->trans('log.extra'), + 'label' => 'log.extra', ]); $dataTable->add('timeTravel', IconLinkColumn::class, [ diff --git a/src/Services/LogSystem/LogEntryExtraFormatter.php b/src/Services/LogSystem/LogEntryExtraFormatter.php index e9bcf591..bfdaf379 100644 --- a/src/Services/LogSystem/LogEntryExtraFormatter.php +++ b/src/Services/LogSystem/LogEntryExtraFormatter.php @@ -154,7 +154,7 @@ class LogEntryExtraFormatter } if ($context instanceof ElementEditedLogEntry && $context->hasChangedFieldsInfo()) { - $array['log.element_edited.changed_fields'] = htmlspecialchars(implode(', ', $context->getChangedFields())); + $array['log.element_edited.changed_fields'] = $this->getChangedFieldsTranslated($context); } if ($context instanceof LegacyInstockChangedLogEntry) { @@ -200,4 +200,21 @@ class LogEntryExtraFormatter return $array; } + + private function getChangedFieldsTranslated(ElementEditedLogEntry $entry): string + { + $output = []; + + foreach($entry->getChangedFields() as $field) { + $key = 'log.element_edited.changed_fields.'.$field; + //If the key is not found, use the field name as a fallback + $tmp = $this->translator->trans($key); + if ($key === $tmp) { + $tmp = $field; + } + $output[] = htmlspecialchars($tmp); + } + + return implode(', ', $output); + } } diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index f3d893cc..2af4e8d6 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -6851,7 +6851,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can attachment_type.edit.filetype_filter - Allowed file extensions. + Allowed file extensions @@ -8653,7 +8653,7 @@ Element 3 - + tfa.provider.webauthn_two_factor_provider Security key @@ -9722,181 +9722,181 @@ Element 3 - + entity.info.parts_count_recursive Number of parts with this element or its subelements - + tools.server_infos.title Server Infos - + permission.preset.read_only Read-Only - + permission.preset.read_only.desc Only allow read operations on data - + permission.preset.all_inherit Inherit all - + permission.preset.all_inherit.desc Set all permissions to Inherit - + permission.preset.all_forbid Forbid all - + permission.preset.all_forbid.desc Set all permissions to Forbid - + permission.preset.all_allow Allow all - + permission.preset.all_allow.desc Set all permissions to allow - + perm.server_infos Server infos - + permission.preset.editor Editor - + permission.preset.editor.desc Allow to change parts and data structures - + permission.preset.admin Admin - + permission.preset.admin.desc Allow administrative actions - + permission.preset.button Apply preset - + perm.attachments.show_private Show private attachments - + perm.attachments.list_attachments Show list of all attachments - + user.edit.permission_success Permission preset applied successfully. Check if the new permissions fit your needs. - + perm.group.data Data - + part_list.action.action.group.needs_review Needs Review - + part_list.action.action.set_needs_review Set Needs Review Status - + part_list.action.action.unset_needs_review Unset Needs Review Status - + part.edit.ipn Internal Part Number (IPN) - + part.ipn.not_defined Not defined - + part.table.ipn IPN - + currency.edit.update_rate Retrieve exchange rate - + currency.edit.exchange_rate_update.unsupported_currency The currency is unsupported by the exchange rate provider. Check your exchange rate provider configuration. - + currency.edit.exchange_rate_update.generic_error Unable to retrieve the exchange rate. Check your exchange rate provider configuration. - + currency.edit.exchange_rate_updated.success Retrieved the exchange rate successfully. @@ -10418,39 +10418,447 @@ Element 3 - + part.edit.save_and_new Save and create new empty part - + homepage.first_steps.title First steps - + homepage.first_steps.introduction - Your database is still empty. You might want to read the <a href="%url%">documentation</a> or start to creating the following data structures: + documentation or start to creating the following data structures:]]> - + homepage.first_steps.create_part - Or you can directly <a href="%url%">create a new part</a>. + create a new part.]]> - + homepage.first_steps.hide_hint This box will hide as soon as you have created your first part. - - + + homepage.forum.text - For questions about Part-DB use the <a href="%href%" class="link-external" target="_blank">discussion forum</a> + discussion forum]]> + + + + + log.element_edited.changed_fields.category + Category + + + + + log.element_edited.changed_fields.footprint + Footprint + + + + + log.element_edited.changed_fields.manufacturer + Manufacturer + + + + + log.element_edited.changed_fields.value_typical + typ. value + + + + + log.element_edited.changed_fields.pw_reset_expires + Password reset + + + + + log.element_edited.changed_fields.comment + Notes + + + + + log.element_edited.changed_fields.supplierpartnr + Supplier part number + + + + + log.element_edited.changed_fields.supplier_product_url + Link to offer + + + + + log.element_edited.changed_fields.price + Price + + + + + log.element_edited.changed_fields.min_discount_quantity + Minimum discount amount + + + + + log.element_edited.changed_fields.original_filename + Original filename + + + + + log.element_edited.changed_fields.path + Filepath + + + + + log.element_edited.changed_fields.description + Description + + + + + log.element_edited.changed_fields.manufacturing_status + Manufacturing status + + + + + log.element_edited.changed_fields.options.barcode_type + Barcode type + + + + + log.element_edited.changed_fields.status + Status + + + + + log.element_edited.changed_fields.quantity + BOM Qty. + + + + + log.element_edited.changed_fields.mountnames + Mountnames + + + + + log.element_edited.changed_fields.name + Name + + + + + log.element_edited.changed_fields.part + Part + + + + + log.element_edited.changed_fields.price_currency + Currency of price + + + + + log.element_edited.changed_fields.partname_hint + Part name hint + + + + + log.element_edited.changed_fields.partname_regex + Name filter + + + + + log.element_edited.changed_fields.disable_footprints + Disable footprints + + + + + log.element_edited.changed_fields.disable_manufacturers + Disable manufacturers + + + + + log.element_edited.changed_fields.disable_autodatasheets + Disable automatic datasheet links + + + + + log.element_edited.changed_fields.disable_properties + Disable properties + + + + + log.element_edited.changed_fields.default_description + Default description + + + + + log.element_edited.changed_fields.default_comment + Default notes + + + + + log.element_edited.changed_fields.filetype_filter + Allowed file extensions + + + + + log.element_edited.changed_fields.not_selectable + Not selected + + + + + log.element_edited.changed_fields.parent + Parent element + + + + + log.element_edited.changed_fields.shipping_costs + Shipping costs + + + + + log.element_edited.changed_fields.default_currency + Default currency + + + + + log.element_edited.changed_fields.address + Address + + + + + log.element_edited.changed_fields.phone_number + Phone number + + + + + log.element_edited.changed_fields.fax_number + Fax number + + + + + log.element_edited.changed_fields.email_address + Email + + + + + log.element_edited.changed_fields.website + Website + + + + + log.element_edited.changed_fields.auto_product_url + Product URL + + + + + log.element_edited.changed_fields.is_full + Storelocation full + + + + + log.element_edited.changed_fields.limit_to_existing_parts + Limit to existing parts + + + + + log.element_edited.changed_fields.only_single_part + Only single part + + + + + log.element_edited.changed_fields.storage_type + Storage type + + + + + log.element_edited.changed_fields.footprint_3d + 3D model + + + + + log.element_edited.changed_fields.master_picture_attachment + Preview image + + + + + log.element_edited.changed_fields.exchange_rate + Exchange rate + + + + + log.element_edited.changed_fields.iso_code + Exchange rate + + + + + log.element_edited.changed_fields.unit + Unit symbol + + + + + log.element_edited.changed_fields.is_integer + Is integer + + + + + log.element_edited.changed_fields.use_si_prefix + Use SI prefix + + + + + log.element_edited.changed_fields.options.width + Width + + + + + log.element_edited.changed_fields.options.height + Height + + + + + log.element_edited.changed_fields.options.supported_element + Target type + + + + + log.element_edited.changed_fields.options.additional_css + Additional styles (CSS) + + + + + log.element_edited.changed_fields.options.lines + Content + + + + + log.element_edited.changed_fields.permissions.data + Permissions + + + + + log.element_edited.changed_fields.disabled + Disabled + + + + + log.element_edited.changed_fields.theme + Theme + + + + + log.element_edited.changed_fields.timezone + Timezone + + + + + log.element_edited.changed_fields.language + Language + + + + + log.element_edited.changed_fields.email + Email + + + + + log.element_edited.changed_fields.department + Department + + + + + log.element_edited.changed_fields.last_name + Last name + + + + + log.element_edited.changed_fields.first_name + First name + + + + + log.element_edited.changed_fields.group + Group + + + + + log.element_edited.changed_fields.currency + Preferred currency + + + + + log.element_edited.changed_fields.enforce2FA + Enforce 2FA