+
+
sortedDefinitions.value.length === 0
description: t('profile_fields', 'Select a field from the list, or create a new one.'),
})
const configuredFieldsCountLabel = computed(() => n('profile_fields', 'field configured', 'fields configured', definitions.value.length, { count: definitions.value.length }))
+// TRANSLATORS "\u00A0" keeps the ellipsis attached to the previous word for correct typography and avoids awkward line breaks.
const saveActionLabel = computed(() => isSaving.value ? t('profile_fields', 'Saving changes\u00A0…') : (isEditing.value ? t('profile_fields', 'Save changes') : t('profile_fields', 'Create field')))
const editFieldAriaLabel = (label: string) => t('profile_fields', 'Edit field {label}', { label })
const actionsForLabel = (label: string) => t('profile_fields', 'Actions for {label}', { label })
From 2d53ef751c1d10b3c5a112840a5711671b5768f8 Mon Sep 17 00:00:00 2001
From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Date: Tue, 14 Apr 2026 13:13:12 -0300
Subject: [PATCH 15/18] docs(l10n): justify NBSP note in personal settings
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
---
src/views/PersonalSettings.vue | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/views/PersonalSettings.vue b/src/views/PersonalSettings.vue
index 9d8e649..64e8891 100644
--- a/src/views/PersonalSettings.vue
+++ b/src/views/PersonalSettings.vue
@@ -151,6 +151,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later
/>
+
{{ isSaving(field.definition.id) ? t('profile_fields', 'Saving changes\u00A0…') : t('profile_fields', 'Save changes') }}
From 201a750ecbd8b9c6e4aac844ad7e49c009f1f230 Mon Sep 17 00:00:00 2001
From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Date: Tue, 14 Apr 2026 13:13:12 -0300
Subject: [PATCH 16/18] docs(l10n): justify NBSP note in workflow placeholder
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
---
src/workflow.ts | 1 +
1 file changed, 1 insertion(+)
diff --git a/src/workflow.ts b/src/workflow.ts
index d24e739..4c79c48 100644
--- a/src/workflow.ts
+++ b/src/workflow.ts
@@ -535,6 +535,7 @@ class WorkflowProfileFieldElement extends HTMLElement {
const placeholder = document.createElement('option')
placeholder.value = ''
+ // TRANSLATORS "\u00A0" keeps the ellipsis attached to the previous word for correct typography and avoids awkward line breaks.
placeholder.textContent = definitions.length === 0
? t('profile_fields', 'Loading profile fields\u00A0…')
: t('profile_fields', 'Choose a profile field')
From c743d1a3348491e6b1cc29e566c6cdd18e022cd1 Mon Sep 17 00:00:00 2001
From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Date: Tue, 14 Apr 2026 13:25:04 -0300
Subject: [PATCH 17/18] test(e2e): sync success toast expectations
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
---
playwright/e2e/profile-fields.spec.ts | 16 ++++++++--------
1 file changed, 8 insertions(+), 8 deletions(-)
diff --git a/playwright/e2e/profile-fields.spec.ts b/playwright/e2e/profile-fields.spec.ts
index 2b532e6..a6018f0 100644
--- a/playwright/e2e/profile-fields.spec.ts
+++ b/playwright/e2e/profile-fields.spec.ts
@@ -95,18 +95,18 @@ test('admin can create, update, and delete a field definition', async ({ page })
await page.locator('#profile-fields-admin-label').fill(createdLabel)
await page.getByTestId('profile-fields-admin-save').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created.')
await expect(page.getByTestId(`profile-fields-admin-definition-${fieldKey}`)).toBeVisible()
await page.locator('#profile-fields-admin-label').fill(updatedLabel)
await page.getByTestId('profile-fields-admin-save').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field updated successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field updated.')
await expect(page.getByTestId(`profile-fields-admin-definition-${fieldKey}`)).toContainText(updatedLabel)
await page.getByTestId('profile-fields-admin-delete').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field deleted successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field deleted.')
await expect(page.getByTestId(`profile-fields-admin-definition-${fieldKey}`)).toHaveCount(0)
await deleteDefinitionByFieldKey(page.request, fieldKey)
})
@@ -152,7 +152,7 @@ test('admin uses a modal editor on compact layout', async ({ page }) => {
await createDialog.locator('#profile-fields-admin-label').fill(createdLabel)
await createDialog.getByTestId('profile-fields-admin-save').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created.')
await expect(page.getByTestId(`profile-fields-admin-definition-${createdFieldKey}`)).toBeVisible()
await expect(createDialog).toBeHidden()
} finally {
@@ -301,7 +301,7 @@ test('admin gets an initial select option row and can remove empty rows by keybo
await expect(page.getByTestId('profile-fields-admin-option-handle-0')).toBeVisible()
await page.getByTestId('profile-fields-admin-save').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created.')
await deleteDefinitionByFieldKey(page.request, fieldKey)
})
@@ -336,7 +336,7 @@ test('admin can bulk add select options from multiple lines', async ({ page }) =
}
await page.getByTestId('profile-fields-admin-save').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field created.')
await deleteDefinitionByFieldKey(page.request, fieldKey)
})
@@ -400,7 +400,7 @@ test('admin reuses the empty select option row on repeated Enter', async ({ page
await expect(page.getByTestId('profile-fields-admin-option-row-4')).toHaveCount(0)
await page.getByTestId('profile-fields-admin-save').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field updated successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field updated.')
await page.reload()
await openSelectDefinitionEditor(page, fieldKey, label)
@@ -451,7 +451,7 @@ test('admin can reorder select options from the handle menu and drag handle', as
await expect(optionInput(page, 3)).toHaveValue('Gamma')
await page.getByTestId('profile-fields-admin-save').click()
- await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field updated successfully.')
+ await expect(page.getByTestId('profile-fields-admin-success')).toContainText('Field updated.')
await page.reload()
await openSelectDefinitionEditor(page, fieldKey, label)
From 51be8464023583b879604c10f4b8f49ae48a3f89 Mon Sep 17 00:00:00 2001
From: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
Date: Tue, 14 Apr 2026 13:32:03 -0300
Subject: [PATCH 18/18] docs(l10n): clarify field key translator context scope
Signed-off-by: Vitor Mattos <1079143+vitormattos@users.noreply.github.com>
---
src/views/AdminSettings.vue | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/views/AdminSettings.vue b/src/views/AdminSettings.vue
index 956035d..90eb421 100644
--- a/src/views/AdminSettings.vue
+++ b/src/views/AdminSettings.vue
@@ -149,7 +149,7 @@ SPDX-License-Identifier: AGPL-3.0-or-later
-
+