From aa21b4e442d2486170061aac916603eec13e5fb2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bal=C3=A1zs=20=C3=9Ar?= Date: Tue, 24 Feb 2026 15:07:05 +0100 Subject: [PATCH] fix: made Contact's page titles and table headers translatable (#7313) Co-authored-by: Dhruwang --- apps/web/i18n.lock | 3 +++ apps/web/locales/de-DE.json | 3 +++ apps/web/locales/en-US.json | 3 +++ apps/web/locales/es-ES.json | 3 +++ apps/web/locales/fr-FR.json | 3 +++ apps/web/locales/hu-HU.json | 3 +++ apps/web/locales/ja-JP.json | 3 +++ apps/web/locales/nl-NL.json | 3 +++ apps/web/locales/pt-BR.json | 3 +++ apps/web/locales/pt-PT.json | 3 +++ apps/web/locales/ro-RO.json | 3 +++ apps/web/locales/ru-RU.json | 3 +++ apps/web/locales/sv-SE.json | 3 +++ apps/web/locales/zh-Hans-CN.json | 3 +++ apps/web/locales/zh-Hant-TW.json | 3 +++ apps/web/modules/ee/contacts/attributes/page.tsx | 5 +++-- .../contacts/components/contact-table-column.tsx | 14 ++++++++------ .../ee/contacts/components/contacts-table.tsx | 2 +- .../segments/components/segment-table-columns.tsx | 9 +++++---- .../contacts/segments/components/segment-table.tsx | 2 +- apps/web/modules/ee/contacts/segments/page.tsx | 2 +- 21 files changed, 64 insertions(+), 15 deletions(-) diff --git a/apps/web/i18n.lock b/apps/web/i18n.lock index 1214d2a415..b3993cca3d 100644 --- a/apps/web/i18n.lock +++ b/apps/web/i18n.lock @@ -199,6 +199,7 @@ checksums: common/failed_to_load_organizations: 512808a2b674c7c28bca73f8f91fd87e common/failed_to_load_workspaces: 6ee3448097394517dc605074cd4e6ea4 common/finish: ffa7a10f71182b48fefed7135bee24fa + common/first_name: cf040a5d6a9fd696be400380cc99f54b common/follow_these: 3a730b242bb17a3f95e01bf0dae86885 common/formbricks_version: d9967c797f3e49ca0cae78bc0ebd19cb common/full_name: f45991923345e8322c9ff8cd6b7e2b16 @@ -211,6 +212,7 @@ checksums: common/hidden_field: 3ed5c58d0ed359e558cdf7bd33606d2d common/hidden_fields: 3de6cfd308293a826cb8679fd1d49972 common/hide_column: 23ce94db148f2d8e4a0923defead6cf1 + common/id: c8886d38aeea2ed5f785aba4fc96784b common/image: 048ba7a239de0fbd883ade8558415830 common/images: 9305827c28694866f49db42b4c51831f common/import: 348b8ab981de5b7f1fca6d7302263bbd @@ -228,6 +230,7 @@ checksums: common/key: 3d1065ab98a1c2f1210507fd5c7bf515 common/label: a5c71bf158481233f8215dbd38cc196b common/language: 277fd1a41cc237a437cd1d5e4a80463b + common/last_name: 2c9a7de7738ca007ba9023c385149c26 common/learn_more: e598091d132f890c37a6d4ed94f6d794 common/license_expired: 7af13535e320e4197989472c01387d2c common/light_overlay: 0499907ea7b8405f4267b117998b5a78 diff --git a/apps/web/locales/de-DE.json b/apps/web/locales/de-DE.json index b86851c335..bfc8278bbd 100644 --- a/apps/web/locales/de-DE.json +++ b/apps/web/locales/de-DE.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Fehler beim Laden der Organisationen", "failed_to_load_workspaces": "Projekte konnten nicht geladen werden", "finish": "Fertigstellen", + "first_name": "Vorname", "follow_these": "Folge diesen", "formbricks_version": "Formbricks Version", "full_name": "Name", @@ -238,6 +239,7 @@ "hidden_field": "Verstecktes Feld", "hidden_fields": "Versteckte Felder", "hide_column": "Spalte ausblenden", + "id": "ID", "image": "Bild", "images": "Bilder", "import": "Importieren", @@ -255,6 +257,7 @@ "key": "Schlüssel", "label": "Bezeichnung", "language": "Sprache", + "last_name": "Nachname", "learn_more": "Mehr erfahren", "license_expired": "License Expired", "light_overlay": "Helle Überlagerung", diff --git a/apps/web/locales/en-US.json b/apps/web/locales/en-US.json index 8a1df0a108..d66a2142d0 100644 --- a/apps/web/locales/en-US.json +++ b/apps/web/locales/en-US.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Failed to load organizations", "failed_to_load_workspaces": "Failed to load workspaces", "finish": "Finish", + "first_name": "First Name", "follow_these": "Follow these", "formbricks_version": "Formbricks Version", "full_name": "Full name", @@ -238,6 +239,7 @@ "hidden_field": "Hidden field", "hidden_fields": "Hidden fields", "hide_column": "Hide column", + "id": "ID", "image": "Image", "images": "Images", "import": "Import", @@ -255,6 +257,7 @@ "key": "Key", "label": "Label", "language": "Language", + "last_name": "Last Name", "learn_more": "Learn more", "license_expired": "License Expired", "light_overlay": "Light overlay", diff --git a/apps/web/locales/es-ES.json b/apps/web/locales/es-ES.json index 372a36e184..3e33088d67 100644 --- a/apps/web/locales/es-ES.json +++ b/apps/web/locales/es-ES.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Error al cargar organizaciones", "failed_to_load_workspaces": "Error al cargar los proyectos", "finish": "Finalizar", + "first_name": "Nombre", "follow_these": "Sigue estos", "formbricks_version": "Versión de Formbricks", "full_name": "Nombre completo", @@ -238,6 +239,7 @@ "hidden_field": "Campo oculto", "hidden_fields": "Campos ocultos", "hide_column": "Ocultar columna", + "id": "ID", "image": "Imagen", "images": "Imágenes", "import": "Importar", @@ -255,6 +257,7 @@ "key": "Clave", "label": "Etiqueta", "language": "Idioma", + "last_name": "Apellido", "learn_more": "Saber más", "license_expired": "License Expired", "light_overlay": "Superposición clara", diff --git a/apps/web/locales/fr-FR.json b/apps/web/locales/fr-FR.json index b67672827e..afb7e6e8a5 100644 --- a/apps/web/locales/fr-FR.json +++ b/apps/web/locales/fr-FR.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Échec du chargement des organisations", "failed_to_load_workspaces": "Échec du chargement des projets", "finish": "Terminer", + "first_name": "Prénom", "follow_these": "Suivez ceci", "formbricks_version": "Version de Formbricks", "full_name": "Nom complet", @@ -238,6 +239,7 @@ "hidden_field": "Champ caché", "hidden_fields": "Champs cachés", "hide_column": "Cacher la colonne", + "id": "ID", "image": "Image", "images": "Images", "import": "Importer", @@ -255,6 +257,7 @@ "key": "Clé", "label": "Étiquette", "language": "Langue", + "last_name": "Nom de famille", "learn_more": "En savoir plus", "license_expired": "License Expired", "light_overlay": "Claire", diff --git a/apps/web/locales/hu-HU.json b/apps/web/locales/hu-HU.json index 9f036047e1..3bfafb56d8 100644 --- a/apps/web/locales/hu-HU.json +++ b/apps/web/locales/hu-HU.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Nem sikerült betölteni a szervezeteket", "failed_to_load_workspaces": "Nem sikerült a munkaterületek betöltése", "finish": "Befejezés", + "first_name": "Keresztnév", "follow_these": "Ezek követése", "formbricks_version": "Formbricks verziója", "full_name": "Teljes név", @@ -238,6 +239,7 @@ "hidden_field": "Rejtett mező", "hidden_fields": "Rejtett mezők", "hide_column": "Oszlop elrejtése", + "id": "ID", "image": "Kép", "images": "Képek", "import": "Importálás", @@ -255,6 +257,7 @@ "key": "Kulcs", "label": "Címke", "language": "Nyelv", + "last_name": "Vezetéknév", "learn_more": "Tudjon meg többet", "license_expired": "A licenc lejárt", "light_overlay": "Világos rávetítés", diff --git a/apps/web/locales/ja-JP.json b/apps/web/locales/ja-JP.json index d58b333bdf..621f4d244a 100644 --- a/apps/web/locales/ja-JP.json +++ b/apps/web/locales/ja-JP.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "組織の読み込みに失敗しました", "failed_to_load_workspaces": "ワークスペースの読み込みに失敗しました", "finish": "完了", + "first_name": "名", "follow_these": "こちらの手順に従って", "formbricks_version": "Formbricksバージョン", "full_name": "氏名", @@ -238,6 +239,7 @@ "hidden_field": "非表示フィールド", "hidden_fields": "非表示フィールド", "hide_column": "列を非表示", + "id": "ID", "image": "画像", "images": "画像", "import": "インポート", @@ -255,6 +257,7 @@ "key": "キー", "label": "ラベル", "language": "言語", + "last_name": "姓", "learn_more": "詳細を見る", "license_expired": "License Expired", "light_overlay": "明るいオーバーレイ", diff --git a/apps/web/locales/nl-NL.json b/apps/web/locales/nl-NL.json index a4b0cf3801..f6d137759b 100644 --- a/apps/web/locales/nl-NL.json +++ b/apps/web/locales/nl-NL.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Laden van organisaties mislukt", "failed_to_load_workspaces": "Laden van werkruimtes mislukt", "finish": "Finish", + "first_name": "Voornaam", "follow_these": "Volg deze", "formbricks_version": "Formbricks-versie", "full_name": "Volledige naam", @@ -238,6 +239,7 @@ "hidden_field": "Verborgen veld", "hidden_fields": "Verborgen velden", "hide_column": "Kolom verbergen", + "id": "ID", "image": "Afbeelding", "images": "Afbeeldingen", "import": "Importeren", @@ -255,6 +257,7 @@ "key": "Sleutel", "label": "Label", "language": "Taal", + "last_name": "Achternaam", "learn_more": "Meer informatie", "license_expired": "License Expired", "light_overlay": "Lichte overlay", diff --git a/apps/web/locales/pt-BR.json b/apps/web/locales/pt-BR.json index 09f633b3be..50b7edcc56 100644 --- a/apps/web/locales/pt-BR.json +++ b/apps/web/locales/pt-BR.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Falha ao carregar organizações", "failed_to_load_workspaces": "Falha ao carregar projetos", "finish": "Terminar", + "first_name": "Primeiro nome", "follow_these": "Siga esses", "formbricks_version": "Versão do Formbricks", "full_name": "Nome completo", @@ -238,6 +239,7 @@ "hidden_field": "Campo oculto", "hidden_fields": "Campos ocultos", "hide_column": "Ocultar coluna", + "id": "ID", "image": "imagem", "images": "Imagens", "import": "importar", @@ -255,6 +257,7 @@ "key": "Chave", "label": "Etiqueta", "language": "Língua", + "last_name": "Sobrenome", "learn_more": "Saiba mais", "license_expired": "License Expired", "light_overlay": "sobreposição leve", diff --git a/apps/web/locales/pt-PT.json b/apps/web/locales/pt-PT.json index 66f80ca3aa..689e5f1b46 100644 --- a/apps/web/locales/pt-PT.json +++ b/apps/web/locales/pt-PT.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Falha ao carregar organizações", "failed_to_load_workspaces": "Falha ao carregar projetos", "finish": "Concluir", + "first_name": "Primeiro nome", "follow_these": "Siga estes", "formbricks_version": "Versão do Formbricks", "full_name": "Nome completo", @@ -238,6 +239,7 @@ "hidden_field": "Campo oculto", "hidden_fields": "Campos ocultos", "hide_column": "Ocultar coluna", + "id": "ID", "image": "Imagem", "images": "Imagens", "import": "Importar", @@ -255,6 +257,7 @@ "key": "Chave", "label": "Etiqueta", "language": "Idioma", + "last_name": "Apelido", "learn_more": "Saiba mais", "license_expired": "License Expired", "light_overlay": "Sobreposição leve", diff --git a/apps/web/locales/ro-RO.json b/apps/web/locales/ro-RO.json index 35bbb0eb5e..d52510c152 100644 --- a/apps/web/locales/ro-RO.json +++ b/apps/web/locales/ro-RO.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Nu s-a reușit încărcarea organizațiilor", "failed_to_load_workspaces": "Nu s-au putut încărca workspaces", "finish": "Finalizează", + "first_name": "Prenume", "follow_these": "Urmați acestea", "formbricks_version": "Versiunea Formbricks", "full_name": "Nume complet", @@ -238,6 +239,7 @@ "hidden_field": "Câmp ascuns", "hidden_fields": "Câmpuri ascunse", "hide_column": "Ascunde coloana", + "id": "ID", "image": "Imagine", "images": "Imagini", "import": "Import", @@ -255,6 +257,7 @@ "key": "Cheie", "label": "Etichetă", "language": "Limba", + "last_name": "Nume de familie", "learn_more": "Află mai multe", "license_expired": "License Expired", "light_overlay": "Suprapunere ușoară", diff --git a/apps/web/locales/ru-RU.json b/apps/web/locales/ru-RU.json index cce50b5716..0f0c1886f0 100644 --- a/apps/web/locales/ru-RU.json +++ b/apps/web/locales/ru-RU.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Не удалось загрузить организации", "failed_to_load_workspaces": "Не удалось загрузить рабочие пространства", "finish": "Завершить", + "first_name": "Имя", "follow_these": "Выполните следующие действия", "formbricks_version": "Версия Formbricks", "full_name": "Полное имя", @@ -238,6 +239,7 @@ "hidden_field": "Скрытое поле", "hidden_fields": "Скрытые поля", "hide_column": "Скрыть столбец", + "id": "ID", "image": "Изображение", "images": "Изображения", "import": "Импорт", @@ -255,6 +257,7 @@ "key": "Ключ", "label": "Метка", "language": "Язык", + "last_name": "Фамилия", "learn_more": "Подробнее", "license_expired": "License Expired", "light_overlay": "Светлый оверлей", diff --git a/apps/web/locales/sv-SE.json b/apps/web/locales/sv-SE.json index b4ef9ca25f..cbc9663731 100644 --- a/apps/web/locales/sv-SE.json +++ b/apps/web/locales/sv-SE.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "Misslyckades att ladda organisationer", "failed_to_load_workspaces": "Det gick inte att ladda arbetsytor", "finish": "Slutför", + "first_name": "Förnamn", "follow_these": "Följ dessa", "formbricks_version": "Formbricks-version", "full_name": "Fullständigt namn", @@ -238,6 +239,7 @@ "hidden_field": "Dolt fält", "hidden_fields": "Dolda fält", "hide_column": "Dölj kolumn", + "id": "ID", "image": "Bild", "images": "Bilder", "import": "Importera", @@ -255,6 +257,7 @@ "key": "Nyckel", "label": "Etikett", "language": "Språk", + "last_name": "Efternamn", "learn_more": "Läs mer", "license_expired": "License Expired", "light_overlay": "Ljust överlägg", diff --git a/apps/web/locales/zh-Hans-CN.json b/apps/web/locales/zh-Hans-CN.json index 291f005dc7..6dd6d5ad93 100644 --- a/apps/web/locales/zh-Hans-CN.json +++ b/apps/web/locales/zh-Hans-CN.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "加载组织失败", "failed_to_load_workspaces": "加载工作区失败", "finish": "完成", + "first_name": "名字", "follow_these": "遵循 这些", "formbricks_version": "Formbricks 版本", "full_name": "全名", @@ -238,6 +239,7 @@ "hidden_field": "隐藏 字段", "hidden_fields": "隐藏 字段", "hide_column": "隐藏 列", + "id": "ID", "image": "图片", "images": "图片", "import": "导入", @@ -255,6 +257,7 @@ "key": "键", "label": "标签", "language": "语言", + "last_name": "姓", "learn_more": "了解 更多", "license_expired": "License Expired", "light_overlay": "浅色遮罩层", diff --git a/apps/web/locales/zh-Hant-TW.json b/apps/web/locales/zh-Hant-TW.json index b5369f21eb..3b52c6d926 100644 --- a/apps/web/locales/zh-Hant-TW.json +++ b/apps/web/locales/zh-Hant-TW.json @@ -226,6 +226,7 @@ "failed_to_load_organizations": "無法載入組織", "failed_to_load_workspaces": "載入工作區失敗", "finish": "完成", + "first_name": "名字", "follow_these": "按照這些步驟", "formbricks_version": "Formbricks 版本", "full_name": "全名", @@ -238,6 +239,7 @@ "hidden_field": "隱藏欄位", "hidden_fields": "隱藏欄位", "hide_column": "隱藏欄位", + "id": "ID", "image": "圖片", "images": "圖片", "import": "匯入", @@ -255,6 +257,7 @@ "key": "金鑰", "label": "標籤", "language": "語言", + "last_name": "姓氏", "learn_more": "瞭解更多", "license_expired": "License Expired", "light_overlay": "淺色覆蓋", diff --git a/apps/web/modules/ee/contacts/attributes/page.tsx b/apps/web/modules/ee/contacts/attributes/page.tsx index 100e2457b2..8165e795dc 100644 --- a/apps/web/modules/ee/contacts/attributes/page.tsx +++ b/apps/web/modules/ee/contacts/attributes/page.tsx @@ -1,4 +1,5 @@ import { getLocale } from "@/lingodotdev/language"; +import { getTranslate } from "@/lingodotdev/server"; import { ContactsPageLayout } from "@/modules/ee/contacts/components/contacts-page-layout"; import { getContactAttributeKeys } from "@/modules/ee/contacts/lib/contact-attribute-keys"; import { getIsContactsEnabled } from "@/modules/ee/license-check/lib/utils"; @@ -13,7 +14,7 @@ export const AttributesPage = async ({ }) => { const params = await paramsProps; const locale = await getLocale(); - + const t = await getTranslate(); const [{ isReadOnly }, contactAttributeKeys] = await Promise.all([ getEnvironmentAuth(params.environmentId), getContactAttributeKeys(params.environmentId), @@ -23,7 +24,7 @@ export const AttributesPage = async ({ return ( [] => { const userColumn: ColumnDef = { id: "contactsTableUser", accessorKey: "contactsTableUser", - header: "ID", + header: t("common.id"), cell: ({ row }) => { const contactId = row.original.id; return ; @@ -25,7 +27,7 @@ export const generateContactTableColumns = ( const userIdColumn: ColumnDef = { id: "userId", accessorKey: "userId", - header: "User ID", + header: t("common.user_id"), cell: ({ row }) => { const userId = row.original.userId; return ; @@ -35,7 +37,7 @@ export const generateContactTableColumns = ( const emailColumn: ColumnDef = { id: "email", accessorKey: "email", - header: "Email", + header: t("common.email"), cell: ({ row }) => { const email = row.original.email; if (email) { @@ -47,7 +49,7 @@ export const generateContactTableColumns = ( const firstNameColumn: ColumnDef = { id: "firstName", accessorKey: "firstName", - header: "First Name", + header: t("common.first_name"), cell: ({ row }) => { const firstName = row.original.firstName; return ; @@ -57,7 +59,7 @@ export const generateContactTableColumns = ( const lastNameColumn: ColumnDef = { id: "lastName", accessorKey: "lastName", - header: "Last Name", + header: t("common.last_name"), cell: ({ row }) => { const lastName = row.original.lastName; return ; diff --git a/apps/web/modules/ee/contacts/components/contacts-table.tsx b/apps/web/modules/ee/contacts/components/contacts-table.tsx index 296b850413..600086bfb5 100644 --- a/apps/web/modules/ee/contacts/components/contacts-table.tsx +++ b/apps/web/modules/ee/contacts/components/contacts-table.tsx @@ -71,7 +71,7 @@ export const ContactsTable = ({ // Generate columns const columns = useMemo(() => { - return generateContactTableColumns(searchValue, data, isReadOnly); + return generateContactTableColumns(searchValue, data, isReadOnly, t); }, [searchValue, data, isReadOnly]); // Load saved settings from localStorage diff --git a/apps/web/modules/ee/contacts/segments/components/segment-table-columns.tsx b/apps/web/modules/ee/contacts/segments/components/segment-table-columns.tsx index 119d0a4afc..685d6f48c7 100644 --- a/apps/web/modules/ee/contacts/segments/components/segment-table-columns.tsx +++ b/apps/web/modules/ee/contacts/segments/components/segment-table-columns.tsx @@ -2,14 +2,15 @@ import { ColumnDef } from "@tanstack/react-table"; import { format, formatDistanceToNow } from "date-fns"; +import { TFunction } from "i18next"; import { UsersIcon } from "lucide-react"; import { TSegmentWithSurveyNames } from "@formbricks/types/segment"; -export const generateSegmentTableColumns = (): ColumnDef[] => { +export const generateSegmentTableColumns = (t: TFunction): ColumnDef[] => { const titleColumn: ColumnDef = { id: "title", accessorKey: "title", - header: "Title", + header: t("common.title"), cell: ({ row }) => { return (
@@ -30,7 +31,7 @@ export const generateSegmentTableColumns = (): ColumnDef = { id: "updatedAt", accessorKey: "updatedAt", - header: "Updated", + header: t("common.updated_at"), cell: ({ row }) => { return ( @@ -43,7 +44,7 @@ export const generateSegmentTableColumns = (): ColumnDef = { id: "createdAt", accessorKey: "createdAt", - header: "Created", + header: t("common.created_at"), cell: ({ row }) => { return ( {format(row.original.createdAt, "do 'of' MMMM, yyyy")} diff --git a/apps/web/modules/ee/contacts/segments/components/segment-table.tsx b/apps/web/modules/ee/contacts/segments/components/segment-table.tsx index 0cda8bfd5a..16b2fed651 100644 --- a/apps/web/modules/ee/contacts/segments/components/segment-table.tsx +++ b/apps/web/modules/ee/contacts/segments/components/segment-table.tsx @@ -26,7 +26,7 @@ export function SegmentTable({ const [editingSegment, setEditingSegment] = useState(null); const columns = useMemo(() => { - return generateSegmentTableColumns(); + return generateSegmentTableColumns(t); }, []); const table = useReactTable({ diff --git a/apps/web/modules/ee/contacts/segments/page.tsx b/apps/web/modules/ee/contacts/segments/page.tsx index 0f9ba44c65..96de6bb7fa 100644 --- a/apps/web/modules/ee/contacts/segments/page.tsx +++ b/apps/web/modules/ee/contacts/segments/page.tsx @@ -32,7 +32,7 @@ export const SegmentsPage = async ({ return (