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