diff --git a/packages/twenty-server/lingui.config.js b/packages/twenty-server/lingui.config.js index a98f314e0..91d346db4 100644 --- a/packages/twenty-server/lingui.config.js +++ b/packages/twenty-server/lingui.config.js @@ -1,5 +1,4 @@ import { defineConfig } from '@lingui/cli'; -import { formatter } from '@lingui/format-po'; export default defineConfig({ sourceLocale: 'en', @@ -7,9 +6,6 @@ export default defineConfig({ extractorParserOptions: { tsExperimentalDecorators: true, }, - format: formatter({ - explicitIdAsDefault: true, - }), catalogs: [ { path: '/src/engine/core-modules/i18n/locales/{locale}', diff --git a/packages/twenty-server/src/engine/core-modules/i18n/locales/en.po b/packages/twenty-server/src/engine/core-modules/i18n/locales/en.po index 507b9aa8a..46414b8b8 100644 --- a/packages/twenty-server/src/engine/core-modules/i18n/locales/en.po +++ b/packages/twenty-server/src/engine/core-modules/i18n/locales/en.po @@ -1,33 +1,11 @@ msgid "" msgstr "" -"POT-Creation-Date: 2025-01-25 21:24+0100\n" +"POT-Creation-Date: 2025-01-28 21:09+0100\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Generator: @lingui/cli\n" "Language: en\n" -"Project-Id-Version: \n" -"Report-Msgid-Bugs-To: \n" -"PO-Revision-Date: \n" -"Last-Translator: \n" -"Language-Team: \n" -"Plural-Forms: \n" - -#. js-lingui-explicit-id -#: src/engine/metadata-modules/object-metadata/object-metadata.service.ts:557 -#: src/engine/metadata-modules/object-metadata/object-metadata.service.ts:561 -msgid "Company" -msgstr "Company" - -#. js-lingui-explicit-id -#: src/modules/company/standard-objects/company.workspace-entity.ts:57 -#~ msgid "Companies" -#~ msgstr "Companies" - -#. js-lingui-explicit-id -#: src/modules/company/standard-objects/company.workspace-entity.ts:58 -#~ msgid "A company" -#~ msgstr "A company" #: src/modules/view/standard-objects/view-field.workspace-entity.ts:32 msgid "(System) View Fields" @@ -61,10 +39,6 @@ msgstr "A company" msgid "A connected account" msgstr "A connected account" -#: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:37 -#~ msgid "A favorite" -#~ msgstr "A favorite" - #: src/modules/favorite/standard-objects/favorite.workspace-entity.ts:37 msgid "A favorite that can be accessed from the left menu" msgstr "A favorite that can be accessed from the left menu" @@ -149,10 +123,6 @@ msgstr "An event related to user behavior" msgid "An opportunity" msgstr "An opportunity" -#: src/modules/task/standard-objects/task-target.workspace-entity.ts:27 -#~ msgid "An task target" -#~ msgstr "An task target" - #: src/modules/api-key/standard-objects/api-key.workspace-entity.ts:17 msgid "API Key" msgstr "API Key" @@ -308,6 +278,10 @@ msgstr "Message Threads" msgid "Messages" msgstr "Messages" +#: src/modules/company/standard-objects/company.workspace-entity.ts:67 +msgid "Name" +msgstr "Name" + #: src/modules/note/standard-objects/note.workspace-entity.ts:46 msgid "Note" msgstr "Note" @@ -356,6 +330,10 @@ msgstr "Task Targets" msgid "Tasks" msgstr "Tasks" +#: src/modules/company/standard-objects/company.workspace-entity.ts:68 +msgid "The company name" +msgstr "The company name" + #: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:34 msgid "Timeline Activities" msgstr "Timeline Activities" diff --git a/packages/twenty-server/src/engine/core-modules/i18n/locales/fr.po b/packages/twenty-server/src/engine/core-modules/i18n/locales/fr.po index c278536c1..5c8a1b7e0 100644 --- a/packages/twenty-server/src/engine/core-modules/i18n/locales/fr.po +++ b/packages/twenty-server/src/engine/core-modules/i18n/locales/fr.po @@ -1,6 +1,6 @@ msgid "" msgstr "" -"POT-Creation-Date: 2025-01-28 09:39+0100\n" +"POT-Creation-Date: 2025-01-28 21:09+0100\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" @@ -208,12 +208,6 @@ msgstr "Entreprises" msgid "Company" msgstr "Entreprise" -#. js-lingui-explicit-id -#: src/engine/metadata-modules/object-metadata/object-metadata.service.ts:557 -#: src/engine/metadata-modules/object-metadata/object-metadata.service.ts:561 -msgid "Company" -msgstr "Entreprise" - #: src/modules/connected-account/standard-objects/connected-account.workspace-entity.ts:33 msgid "Connected Account" msgstr "Compte connecté" @@ -284,6 +278,10 @@ msgstr "Fils de messages" msgid "Messages" msgstr "Messages" +#: src/modules/company/standard-objects/company.workspace-entity.ts:67 +msgid "Name" +msgstr "Nom" + #: src/modules/note/standard-objects/note.workspace-entity.ts:46 msgid "Note" msgstr "Note" @@ -332,6 +330,10 @@ msgstr "Objectifs de la tâche" msgid "Tasks" msgstr "Tâches" +#: src/modules/company/standard-objects/company.workspace-entity.ts:68 +msgid "The company name" +msgstr "Le nom de l'entreprise" + #: src/modules/timeline/standard-objects/timeline-activity.workspace-entity.ts:34 msgid "Timeline Activities" msgstr "Calendrier des activités" diff --git a/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/en.js b/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/en.js index e551d7011..7b0cdc992 100644 --- a/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/en.js +++ b/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/en.js @@ -1 +1 @@ -/*eslint-disable*/module.exports={messages:JSON.parse("{\"Company\":[\"Company\"],\"Companies\":[\"Companies\"],\"A company\":[\"A company\"],\"(System) View Fields\":[\"(System) View Fields\"],\"(System) View Filter Groups\":[\"(System) View Filter Groups\"],\"(System) View Filters\":[\"(System) View Filters\"],\"(System) View Groups\":[\"(System) View Groups\"],\"(System) View Sorts\":[\"(System) View Sorts\"],\"(System) Views\":[\"(System) Views\"],\"A connected account\":[\"A connected account\"],\"A favorite\":[\"A favorite\"],\"A favorite that can be accessed from the left menu\":[\"A favorite that can be accessed from the left menu\"],\"A Folder of favorites\":[\"A Folder of favorites\"],\"A group of related messages (e.g. email thread, chat thread)\":[\"A group of related messages (e.g. email thread, chat thread)\"],\"A message sent or received through a messaging channel (email, chat, etc.)\":[\"A message sent or received through a messaging channel (email, chat, etc.)\"],\"A note\":[\"A note\"],\"A note target\":[\"A note target\"],\"A person\":[\"A person\"],\"A task\":[\"A task\"],\"A task target\":[\"A task target\"],\"A webhook\":[\"A webhook\"],\"A workflow\":[\"A workflow\"],\"A workflow event listener\":[\"A workflow event listener\"],\"A workflow run\":[\"A workflow run\"],\"A workflow version\":[\"A workflow version\"],\"A workspace member\":[\"A workspace member\"],\"Aggregated / filtered event to be displayed on the timeline\":[\"Aggregated / filtered event to be displayed on the timeline\"],\"An API key\":[\"An API key\"],\"An attachment\":[\"An attachment\"],\"An audit log of actions performed in the system\":[\"An audit log of actions performed in the system\"],\"An event related to user behavior\":[\"An event related to user behavior\"],\"An opportunity\":[\"An opportunity\"],\"An task target\":[\"An task target\"],\"API Key\":[\"API Key\"],\"API Keys\":[\"API Keys\"],\"Attachment\":[\"Attachment\"],\"Attachments\":[\"Attachments\"],\"Audit Log\":[\"Audit Log\"],\"Audit Logs\":[\"Audit Logs\"],\"Behavioral Event\":[\"Behavioral Event\"],\"Behavioral Events\":[\"Behavioral Events\"],\"Blocklist\":[\"Blocklist\"],\"Blocklists\":[\"Blocklists\"],\"Calendar Channel\":[\"Calendar Channel\"],\"Calendar Channel Event Association\":[\"Calendar Channel Event Association\"],\"Calendar Channel Event Associations\":[\"Calendar Channel Event Associations\"],\"Calendar Channels\":[\"Calendar Channels\"],\"Calendar event\":[\"Calendar event\"],\"Calendar event participant\":[\"Calendar event participant\"],\"Calendar event participants\":[\"Calendar event participants\"],\"Calendar events\":[\"Calendar events\"],\"Connected Account\":[\"Connected Account\"],\"Connected Accounts\":[\"Connected Accounts\"],\"Favorite\":[\"Favorite\"],\"Favorite Folder\":[\"Favorite Folder\"],\"Favorite Folders\":[\"Favorite Folders\"],\"Favorites\":[\"Favorites\"],\"Message\":[\"Message\"],\"Message Channel\":[\"Message Channel\"],\"Message Channel Message Association\":[\"Message Channel Message Association\"],\"Message Channel Message Associations\":[\"Message Channel Message Associations\"],\"Message Channels\":[\"Message Channels\"],\"Message Participant\":[\"Message Participant\"],\"Message Participants\":[\"Message Participants\"],\"Message Synced with a Message Channel\":[\"Message Synced with a Message Channel\"],\"Message Thread\":[\"Message Thread\"],\"Message Threads\":[\"Message Threads\"],\"Messages\":[\"Messages\"],\"Note\":[\"Note\"],\"Note Target\":[\"Note Target\"],\"Note Targets\":[\"Note Targets\"],\"Notes\":[\"Notes\"],\"Opportunities\":[\"Opportunities\"],\"Opportunity\":[\"Opportunity\"],\"People\":[\"People\"],\"Person\":[\"Person\"],\"Task\":[\"Task\"],\"Task Target\":[\"Task Target\"],\"Task Targets\":[\"Task Targets\"],\"Tasks\":[\"Tasks\"],\"Timeline Activities\":[\"Timeline Activities\"],\"Timeline Activity\":[\"Timeline Activity\"],\"View\":[\"View\"],\"View Field\":[\"View Field\"],\"View Fields\":[\"View Fields\"],\"View Filter\":[\"View Filter\"],\"View Filter Group\":[\"View Filter Group\"],\"View Filter Groups\":[\"View Filter Groups\"],\"View Filters\":[\"View Filters\"],\"View Group\":[\"View Group\"],\"View Groups\":[\"View Groups\"],\"View Sort\":[\"View Sort\"],\"View Sorts\":[\"View Sorts\"],\"Views\":[\"Views\"],\"Webhook\":[\"Webhook\"],\"Webhooks\":[\"Webhooks\"],\"Workflow\":[\"Workflow\"],\"Workflow Run\":[\"Workflow Run\"],\"Workflow Runs\":[\"Workflow Runs\"],\"Workflow Version\":[\"Workflow Version\"],\"Workflow Versions\":[\"Workflow Versions\"],\"WorkflowEventListener\":[\"WorkflowEventListener\"],\"WorkflowEventListeners\":[\"WorkflowEventListeners\"],\"Workflows\":[\"Workflows\"],\"Workspace Member\":[\"Workspace Member\"],\"Workspace Members\":[\"Workspace Members\"]}")}; \ No newline at end of file +/*eslint-disable*/module.exports={messages:JSON.parse("{\"Qyrd7v\":[\"(System) View Fields\"],\"9Y3fTB\":[\"(System) View Filter Groups\"],\"TB2jLV\":[\"(System) View Filters\"],\"Y7M7Ro\":[\"(System) View Groups\"],\"9vliLw\":[\"(System) View Sorts\"],\"5B59WE\":[\"(System) Views\"],\"kZR6+h\":[\"A company\"],\"+aeifv\":[\"A connected account\"],\"HCoswz\":[\"A favorite that can be accessed from the left menu\"],\"6w8bHl\":[\"A Folder of favorites\"],\"sSGYmf\":[\"A group of related messages (e.g. email thread, chat thread)\"],\"vZj1Xc\":[\"A message sent or received through a messaging channel (email, chat, etc.)\"],\"bufuBA\":[\"A note\"],\"6kUkZW\":[\"A note target\"],\"Io42ej\":[\"A person\"],\"mkFXEH\":[\"A task\"],\"hk2NzW\":[\"A task target\"],\"HTSJFW\":[\"A webhook\"],\"ZIN9Ga\":[\"A workflow\"],\"juBVjt\":[\"A workflow event listener\"],\"1+xDbI\":[\"A workflow run\"],\"N0g7rp\":[\"A workflow version\"],\"HpZ/I5\":[\"A workspace member\"],\"W58PBh\":[\"Aggregated / filtered event to be displayed on the timeline\"],\"qeHcQj\":[\"An API key\"],\"MjyFvC\":[\"An attachment\"],\"+bL++X\":[\"An audit log of actions performed in the system\"],\"muVHgL\":[\"An event related to user behavior\"],\"bZq8rL\":[\"An opportunity\"],\"yRnk5W\":[\"API Key\"],\"FfSJ1Y\":[\"API Keys\"],\"UY1vmE\":[\"Attachment\"],\"w/Sphq\":[\"Attachments\"],\"ilRCh1\":[\"Audit Log\"],\"EPEFrH\":[\"Audit Logs\"],\"20B9kW\":[\"Behavioral Event\"],\"Jeh/Q/\":[\"Behavioral Events\"],\"K1172m\":[\"Blocklist\"],\"L5JhJe\":[\"Blocklists\"],\"Nh6GTX\":[\"Calendar Channel\"],\"jfNQ0m\":[\"Calendar Channel Event Association\"],\"kYNT3F\":[\"Calendar Channel Event Associations\"],\"Znix/S\":[\"Calendar Channels\"],\"bRk+FR\":[\"Calendar event\"],\"N2kMfO\":[\"Calendar event participant\"],\"AWDqkQ\":[\"Calendar event participants\"],\"X9A2xC\":[\"Calendar events\"],\"s2QZS6\":[\"Companies\"],\"7i8j3G\":[\"Company\"],\"PQ1Dw2\":[\"Connected Account\"],\"AMDUqA\":[\"Connected Accounts\"],\"6Ki4Pv\":[\"Favorite\"],\"TDlZ/o\":[\"Favorite Folder\"],\"SStz54\":[\"Favorite Folders\"],\"X9kySA\":[\"Favorites\"],\"xDAtGP\":[\"Message\"],\"g+QGD6\":[\"Message Channel\"],\"disipM\":[\"Message Channel Message Association\"],\"ijQY3P\":[\"Message Channel Message Associations\"],\"k7LXPQ\":[\"Message Channels\"],\"IUmVwu\":[\"Message Participant\"],\"FhIFx7\":[\"Message Participants\"],\"IC5A8V\":[\"Message Synced with a Message Channel\"],\"de2nM/\":[\"Message Thread\"],\"RD0ecC\":[\"Message Threads\"],\"t7TeQU\":[\"Messages\"],\"6YtxFj\":[\"Name\"],\"KiJn9B\":[\"Note\"],\"spaO7l\":[\"Note Target\"],\"tD4BxK\":[\"Note Targets\"],\"1DBGsz\":[\"Notes\"],\"4MyDFl\":[\"Opportunities\"],\"SV/iis\":[\"Opportunity\"],\"1wdjme\":[\"People\"],\"OZdaTZ\":[\"Person\"],\"Q3P/4s\":[\"Task\"],\"WSiiWf\":[\"Task Target\"],\"836FiO\":[\"Task Targets\"],\"GtycJ/\":[\"Tasks\"],\"N31Pso\":[\"The company name\"],\"az1boY\":[\"Timeline Activities\"],\"K/kU4E\":[\"Timeline Activity\"],\"jpctdh\":[\"View\"],\"cZPDyy\":[\"View Field\"],\"GUFYyq\":[\"View Fields\"],\"JRtI7Y\":[\"View Filter\"],\"l9/6pD\":[\"View Filter Group\"],\"/aP3iG\":[\"View Filter Groups\"],\"vj5JsR\":[\"View Filters\"],\"ziEP12\":[\"View Group\"],\"V4nZs/\":[\"View Groups\"],\"EUjpwJ\":[\"View Sort\"],\"UsdY3K\":[\"View Sorts\"],\"1I6UoR\":[\"Views\"],\"TRDppN\":[\"Webhook\"],\"v1kQyJ\":[\"Webhooks\"],\"bLt/0J\":[\"Workflow\"],\"5vIcqC\":[\"Workflow Run\"],\"u6DF/V\":[\"Workflow Runs\"],\"+wYPET\":[\"Workflow Version\"],\"OCyhkn\":[\"Workflow Versions\"],\"ENOy6I\":[\"WorkflowEventListener\"],\"3JA9se\":[\"WorkflowEventListeners\"],\"woYYQq\":[\"Workflows\"],\"qc38qR\":[\"Workspace Member\"],\"YCAEr+\":[\"Workspace Members\"]}")}; \ No newline at end of file diff --git a/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/fr.js b/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/fr.js index 306a44e45..15399f334 100644 --- a/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/fr.js +++ b/packages/twenty-server/src/engine/core-modules/i18n/locales/generated/fr.js @@ -1 +1 @@ -/*eslint-disable*/module.exports={messages:JSON.parse("{\"Company\":[\"Entreprise\"],\"Companies\":[\"Entreprises\"],\"A company\":[\"Une entreprise\"],\"(System) View Fields\":[\"(Système) Champs de visualisation\"],\"(System) View Filter Groups\":[\"(Système) Voir les groupes de filtres\"],\"(System) View Filters\":[\"(Système) Voir les filtres\"],\"(System) View Groups\":[\"(Système) Groupes de vues\"],\"(System) View Sorts\":[\"(Système) Afficher les tris\"],\"(System) Views\":[\"vues (système)\"],\"A connected account\":[\"Un compte connecté\"],\"A favorite\":[\"A favorite\"],\"A favorite that can be accessed from the left menu\":[\"Un favori accessible à partir du menu de gauche\"],\"A Folder of favorites\":[\"Un dossier de favoris\"],\"A group of related messages (e.g. email thread, chat thread)\":[\"Un groupe de messages liés (par exemple, un fil de discussion sur un courriel, un fil de discussion sur un chat)\"],\"A message sent or received through a messaging channel (email, chat, etc.)\":[\"Un message envoyé ou reçu par l'intermédiaire d'un canal de messagerie (courriel, chat, etc.)\"],\"A note\":[\"Une note\"],\"A note target\":[\"Une note cible\"],\"A person\":[\"Une personne\"],\"A task\":[\"Une tâche\"],\"A task target\":[\"Un objectif de tâche\"],\"A webhook\":[\"Un webhook\"],\"A workflow\":[\"Un flux de travail\"],\"A workflow event listener\":[\"Un récepteur d'événements de flux de travail\"],\"A workflow run\":[\"Un flux de travail\"],\"A workflow version\":[\"Une version du flux de travail\"],\"A workspace member\":[\"Un membre de l'espace de travail\"],\"Aggregated / filtered event to be displayed on the timeline\":[\"Événement agrégé / filtré à afficher sur la ligne de temps\"],\"An API key\":[\"Une clé API\"],\"An attachment\":[\"Une pièce jointe\"],\"An audit log of actions performed in the system\":[\"Un journal d'audit des actions effectuées dans le système\"],\"An event related to user behavior\":[\"Un événement lié au comportement de l'utilisateur\"],\"An opportunity\":[\"Une opportunité\"],\"An task target\":[\"An task target\"],\"API Key\":[\"Clé API\"],\"API Keys\":[\"Clés API\"],\"Attachment\":[\"Pièce jointe\"],\"Attachments\":[\"Pièces jointes\"],\"Audit Log\":[\"Journal d'audit\"],\"Audit Logs\":[\"Journaux d'audit\"],\"Behavioral Event\":[\"Événement comportemental\"],\"Behavioral Events\":[\"Événements comportementaux\"],\"Blocklist\":[\"Liste de blocage\"],\"Blocklists\":[\"Listes de blocage\"],\"Calendar Channel\":[\"Canal Calendrier\"],\"Calendar Channel Event Association\":[\"Calendrier Association des événements de la Manche\"],\"Calendar Channel Event Associations\":[\"Associations d'événements du canal Calendrier\"],\"Calendar Channels\":[\"Canaux du calendrier\"],\"Calendar event\":[\"Calendrier\"],\"Calendar event participant\":[\"Participant à un événement du calendrier\"],\"Calendar event participants\":[\"Participants aux événements du calendrier\"],\"Calendar events\":[\"Calendrier des événements\"],\"Connected Account\":[\"Compte connecté\"],\"Connected Accounts\":[\"Comptes connectés\"],\"Favorite\":[\"Favoris\"],\"Favorite Folder\":[\"Dossier favori\"],\"Favorite Folders\":[\"Dossiers favoris\"],\"Favorites\":[\"Favoris\"],\"Message\":[\"Message\"],\"Message Channel\":[\"Canal de messages\"],\"Message Channel Message Association\":[\"Canal de messages Association de messages\"],\"Message Channel Message Associations\":[\"Canal de messages Associations de messages\"],\"Message Channels\":[\"Canaux de messages\"],\"Message Participant\":[\"Message Participant\"],\"Message Participants\":[\"Message Participants\"],\"Message Synced with a Message Channel\":[\"Message synchronisé avec un canal de messages\"],\"Message Thread\":[\"Fil de messages\"],\"Message Threads\":[\"Fils de messages\"],\"Messages\":[\"Messages\"],\"Note\":[\"Note\"],\"Note Target\":[\"Note Cible\"],\"Note Targets\":[\"Note Objectifs\"],\"Notes\":[\"Notes\"],\"Opportunities\":[\"Opportunités\"],\"Opportunity\":[\"Opportunité\"],\"People\":[\"Les personnes\"],\"Person\":[\"Personne\"],\"Task\":[\"Tâche\"],\"Task Target\":[\"Tâche Cible\"],\"Task Targets\":[\"Objectifs de la tâche\"],\"Tasks\":[\"Tâches\"],\"Timeline Activities\":[\"Calendrier des activités\"],\"Timeline Activity\":[\"Activité chronologique\"],\"View\":[\"Voir\"],\"View Field\":[\"Voir le champ\"],\"View Fields\":[\"Voir les champs\"],\"View Filter\":[\"Voir le filtre\"],\"View Filter Group\":[\"Voir le groupe de filtres\"],\"View Filter Groups\":[\"Voir les groupes de filtres\"],\"View Filters\":[\"Voir les filtres\"],\"View Group\":[\"Voir le groupe\"],\"View Groups\":[\"Voir les groupes\"],\"View Sort\":[\"Voir le tri\"],\"View Sorts\":[\"Voir les tris\"],\"Views\":[\"Points de vue\"],\"Webhook\":[\"Crochet Web\"],\"Webhooks\":[\"Crochets Web\"],\"Workflow\":[\"Flux de travail\"],\"Workflow Run\":[\"Exécution du flux de travail\"],\"Workflow Runs\":[\"Exécution du flux de travail\"],\"Workflow Version\":[\"Version du flux de travail\"],\"Workflow Versions\":[\"Versions du flux de travail\"],\"WorkflowEventListener\":[\"WorkflowEventListener\"],\"WorkflowEventListeners\":[\"Écouteurs de flux de travail (WorkflowEventListeners)\"],\"Workflows\":[\"Flux de travail\"],\"Workspace Member\":[\"Membre de l'espace de travail\"],\"Workspace Members\":[\"Membres de l'espace de travail\"]}")}; \ No newline at end of file +/*eslint-disable*/module.exports={messages:JSON.parse("{\"Qyrd7v\":[\"(Système) Champs de visualisation\"],\"9Y3fTB\":[\"(Système) Voir les groupes de filtres\"],\"TB2jLV\":[\"(Système) Voir les filtres\"],\"Y7M7Ro\":[\"(Système) Groupes de vues\"],\"9vliLw\":[\"(Système) Afficher les tris\"],\"5B59WE\":[\"vues (système)\"],\"kZR6+h\":[\"Une entreprise\"],\"+aeifv\":[\"Un compte connecté\"],\"HCoswz\":[\"Un favori accessible à partir du menu de gauche\"],\"6w8bHl\":[\"Un dossier de favoris\"],\"sSGYmf\":[\"Un groupe de messages liés (par exemple, un fil de discussion sur un courriel, un fil de discussion sur un chat)\"],\"vZj1Xc\":[\"Un message envoyé ou reçu par l'intermédiaire d'un canal de messagerie (courriel, chat, etc.)\"],\"bufuBA\":[\"Une note\"],\"6kUkZW\":[\"Une note cible\"],\"Io42ej\":[\"Une personne\"],\"mkFXEH\":[\"Une tâche\"],\"hk2NzW\":[\"Un objectif de tâche\"],\"HTSJFW\":[\"Un webhook\"],\"ZIN9Ga\":[\"Un flux de travail\"],\"juBVjt\":[\"Un récepteur d'événements de flux de travail\"],\"1+xDbI\":[\"Un flux de travail\"],\"N0g7rp\":[\"Une version du flux de travail\"],\"HpZ/I5\":[\"Un membre de l'espace de travail\"],\"W58PBh\":[\"Événement agrégé / filtré à afficher sur la ligne de temps\"],\"qeHcQj\":[\"Une clé API\"],\"MjyFvC\":[\"Une pièce jointe\"],\"+bL++X\":[\"Un journal d'audit des actions effectuées dans le système\"],\"muVHgL\":[\"Un événement lié au comportement de l'utilisateur\"],\"bZq8rL\":[\"Une opportunité\"],\"yRnk5W\":[\"Clé API\"],\"FfSJ1Y\":[\"Clés API\"],\"UY1vmE\":[\"Pièce jointe\"],\"w/Sphq\":[\"Pièces jointes\"],\"ilRCh1\":[\"Journal d'audit\"],\"EPEFrH\":[\"Journaux d'audit\"],\"20B9kW\":[\"Événement comportemental\"],\"Jeh/Q/\":[\"Événements comportementaux\"],\"K1172m\":[\"Liste de blocage\"],\"L5JhJe\":[\"Listes de blocage\"],\"Nh6GTX\":[\"Canal Calendrier\"],\"jfNQ0m\":[\"Calendrier Association des événements de la Manche\"],\"kYNT3F\":[\"Associations d'événements du canal Calendrier\"],\"Znix/S\":[\"Canaux du calendrier\"],\"bRk+FR\":[\"Calendrier\"],\"N2kMfO\":[\"Participant à un événement du calendrier\"],\"AWDqkQ\":[\"Participants aux événements du calendrier\"],\"X9A2xC\":[\"Calendrier des événements\"],\"s2QZS6\":[\"Entreprises\"],\"7i8j3G\":[\"Entreprise\"],\"PQ1Dw2\":[\"Compte connecté\"],\"AMDUqA\":[\"Comptes connectés\"],\"6Ki4Pv\":[\"Favoris\"],\"TDlZ/o\":[\"Dossier favori\"],\"SStz54\":[\"Dossiers favoris\"],\"X9kySA\":[\"Favoris\"],\"xDAtGP\":[\"Message\"],\"g+QGD6\":[\"Canal de messages\"],\"disipM\":[\"Canal de messages Association de messages\"],\"ijQY3P\":[\"Canal de messages Associations de messages\"],\"k7LXPQ\":[\"Canaux de messages\"],\"IUmVwu\":[\"Message Participant\"],\"FhIFx7\":[\"Message Participants\"],\"IC5A8V\":[\"Message synchronisé avec un canal de messages\"],\"de2nM/\":[\"Fil de messages\"],\"RD0ecC\":[\"Fils de messages\"],\"t7TeQU\":[\"Messages\"],\"6YtxFj\":[\"Nom\"],\"KiJn9B\":[\"Note\"],\"spaO7l\":[\"Note Cible\"],\"tD4BxK\":[\"Note Objectifs\"],\"1DBGsz\":[\"Notes\"],\"4MyDFl\":[\"Opportunités\"],\"SV/iis\":[\"Opportunité\"],\"1wdjme\":[\"Les personnes\"],\"OZdaTZ\":[\"Personne\"],\"Q3P/4s\":[\"Tâche\"],\"WSiiWf\":[\"Tâche Cible\"],\"836FiO\":[\"Objectifs de la tâche\"],\"GtycJ/\":[\"Tâches\"],\"N31Pso\":[\"Le nom de l'entreprise\"],\"az1boY\":[\"Calendrier des activités\"],\"K/kU4E\":[\"Activité chronologique\"],\"jpctdh\":[\"Voir\"],\"cZPDyy\":[\"Voir le champ\"],\"GUFYyq\":[\"Voir les champs\"],\"JRtI7Y\":[\"Voir le filtre\"],\"l9/6pD\":[\"Voir le groupe de filtres\"],\"/aP3iG\":[\"Voir les groupes de filtres\"],\"vj5JsR\":[\"Voir les filtres\"],\"ziEP12\":[\"Voir le groupe\"],\"V4nZs/\":[\"Voir les groupes\"],\"EUjpwJ\":[\"Voir le tri\"],\"UsdY3K\":[\"Voir les tris\"],\"1I6UoR\":[\"Points de vue\"],\"TRDppN\":[\"Crochet Web\"],\"v1kQyJ\":[\"Crochets Web\"],\"bLt/0J\":[\"Flux de travail\"],\"5vIcqC\":[\"Exécution du flux de travail\"],\"u6DF/V\":[\"Exécution du flux de travail\"],\"+wYPET\":[\"Version du flux de travail\"],\"OCyhkn\":[\"Versions du flux de travail\"],\"ENOy6I\":[\"WorkflowEventListener\"],\"3JA9se\":[\"Écouteurs de flux de travail (WorkflowEventListeners)\"],\"woYYQq\":[\"Flux de travail\"],\"qc38qR\":[\"Membre de l'espace de travail\"],\"YCAEr+\":[\"Membres de l'espace de travail\"]}")}; \ No newline at end of file diff --git a/packages/twenty-server/src/engine/core-modules/i18n/types/i18n-context.type.ts b/packages/twenty-server/src/engine/core-modules/i18n/types/i18n-context.type.ts new file mode 100644 index 000000000..dd14812b5 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/i18n/types/i18n-context.type.ts @@ -0,0 +1,7 @@ +export type I18nContext = { + req: { + headers: { + 'x-locale': string | undefined; + }; + }; +}; diff --git a/packages/twenty-server/src/engine/core-modules/i18n/utils/generateMessageId.ts b/packages/twenty-server/src/engine/core-modules/i18n/utils/generateMessageId.ts new file mode 100644 index 000000000..24bb133c3 --- /dev/null +++ b/packages/twenty-server/src/engine/core-modules/i18n/utils/generateMessageId.ts @@ -0,0 +1,11 @@ +import crypto from 'crypto'; + +const UNIT_SEPARATOR = '\u001F'; + +export function generateMessageId(msg: string, context = '') { + return crypto + .createHash('sha256') + .update(msg + UNIT_SEPARATOR + (context || '')) + .digest('base64') + .slice(0, 6); +} diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts index 678f027e4..3f27757e0 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.resolver.ts @@ -16,6 +16,7 @@ import { FieldMetadataType } from 'twenty-shared'; import { FeatureFlagKey } from 'src/engine/core-modules/feature-flag/enums/feature-flag-key.enum'; import { FeatureFlagService } from 'src/engine/core-modules/feature-flag/services/feature-flag.service'; +import { I18nContext } from 'src/engine/core-modules/i18n/types/i18n-context.type'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { IDataloaders } from 'src/engine/dataloaders/dataloader.interface'; import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; @@ -43,6 +44,30 @@ export class FieldMetadataResolver { private readonly featureFlagService: FeatureFlagService, ) {} + @ResolveField(() => String, { nullable: true }) + async label( + @Parent() fieldMetadata: FieldMetadataDTO, + @Context() context: I18nContext, + ): Promise { + return this.fieldMetadataService.resolveTranslatableString( + fieldMetadata, + 'label', + context.req.headers['x-locale'], + ); + } + + @ResolveField(() => String, { nullable: true }) + async description( + @Parent() fieldMetadata: FieldMetadataDTO, + @Context() context: I18nContext, + ): Promise { + return this.fieldMetadataService.resolveTranslatableString( + fieldMetadata, + 'description', + context.req.headers['x-locale'], + ); + } + @Mutation(() => FieldMetadataDTO) async createOneField( @Args('input') input: CreateOneFieldMetadataInput, diff --git a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts index 93f59d98a..c5ee2eeba 100644 --- a/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/field-metadata/field-metadata.service.ts @@ -1,6 +1,7 @@ import { Injectable } from '@nestjs/common'; import { InjectDataSource, InjectRepository } from '@nestjs/typeorm'; +import { i18n } from '@lingui/core'; import { TypeOrmQueryService } from '@ptc-org/nestjs-query-typeorm'; import isEmpty from 'lodash.isempty'; import { FieldMetadataType } from 'twenty-shared'; @@ -8,6 +9,7 @@ import { DataSource, FindOneOptions, Repository } from 'typeorm'; import { v4 as uuidV4, v4 } from 'uuid'; import { TypeORMService } from 'src/database/typeorm/typeorm.service'; +import { generateMessageId } from 'src/engine/core-modules/i18n/utils/generateMessageId'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { compositeTypeDefinitions } from 'src/engine/metadata-modules/field-metadata/composite-types'; import { CreateFieldInput } from 'src/engine/metadata-modules/field-metadata/dtos/create-field.input'; @@ -773,4 +775,29 @@ export class FieldMetadataService extends TypeOrmQueryService { + if (fieldMetadata.isCustom) { + return fieldMetadata[labelKey] ?? ''; + } + + if (!locale) { + return fieldMetadata[labelKey] ?? ''; + } + + i18n.activate(locale); + + const messageId = generateMessageId(fieldMetadata[labelKey] ?? ''); + const translatedMessage = i18n._(messageId); + + if (translatedMessage === messageId) { + return fieldMetadata[labelKey] ?? ''; + } + + return translatedMessage; + } } diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts index a01f38f32..ddcd4c51e 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.resolver.ts @@ -8,6 +8,7 @@ import { Resolver, } from '@nestjs/graphql'; +import { I18nContext } from 'src/engine/core-modules/i18n/types/i18n-context.type'; import { Workspace } from 'src/engine/core-modules/workspace/workspace.entity'; import { AuthWorkspace } from 'src/engine/decorators/auth/auth-workspace.decorator'; import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard'; @@ -32,7 +33,7 @@ export class ObjectMetadataResolver { @ResolveField(() => String, { nullable: true }) async labelPlural( @Parent() objectMetadata: ObjectMetadataDTO, - @Context() context, + @Context() context: I18nContext, ): Promise { return this.objectMetadataService.resolveTranslatableString( objectMetadata, @@ -44,7 +45,7 @@ export class ObjectMetadataResolver { @ResolveField(() => String, { nullable: true }) async labelSingular( @Parent() objectMetadata: ObjectMetadataDTO, - @Context() context, + @Context() context: I18nContext, ): Promise { return this.objectMetadataService.resolveTranslatableString( objectMetadata, @@ -56,7 +57,7 @@ export class ObjectMetadataResolver { @ResolveField(() => String, { nullable: true }) async description( @Parent() objectMetadata: ObjectMetadataDTO, - @Context() context, + @Context() context: I18nContext, ): Promise { return this.objectMetadataService.resolveTranslatableString( objectMetadata, diff --git a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts index 8d6d6e75a..329f85486 100644 --- a/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts +++ b/packages/twenty-server/src/engine/metadata-modules/object-metadata/object-metadata.service.ts @@ -11,6 +11,7 @@ import { FindManyOptions, FindOneOptions, In, Not, Repository } from 'typeorm'; import { ObjectMetadataStandardIdToIdMap } from 'src/engine/metadata-modules/object-metadata/interfaces/object-metadata-standard-id-to-id-map'; +import { generateMessageId } from 'src/engine/core-modules/i18n/utils/generateMessageId'; import { DataSourceService } from 'src/engine/metadata-modules/data-source/data-source.service'; import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity'; import { IndexMetadataService } from 'src/engine/metadata-modules/index-metadata/index-metadata.service'; @@ -539,14 +540,18 @@ export class ObjectMetadataService extends TypeOrmQueryService { if (objectMetadata.isCustom) { return objectMetadata[labelKey]; } + if (!locale) { + return objectMetadata[labelKey]; + } + i18n.activate(locale); - return i18n._(objectMetadata[labelKey]); + return i18n._(generateMessageId(objectMetadata[labelKey])); } } diff --git a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts index 2ea31fa1e..7849f0937 100644 --- a/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts +++ b/packages/twenty-server/src/engine/twenty-orm/decorators/workspace-field.decorator.ts @@ -1,3 +1,4 @@ +import { MessageDescriptor } from '@lingui/core'; import { FieldMetadataType } from 'twenty-shared'; import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface'; @@ -14,8 +15,14 @@ export interface WorkspaceFieldOptions< > { standardId: string; type: T; - label: string | ((objectMetadata: ObjectMetadataEntity) => string); - description?: string | ((objectMetadata: ObjectMetadataEntity) => string); + label: + | string + | MessageDescriptor + | ((objectMetadata: ObjectMetadataEntity) => string); + description?: + | string + | MessageDescriptor + | ((objectMetadata: ObjectMetadataEntity) => string); icon?: string; defaultValue?: FieldMetadataDefaultValue; options?: FieldMetadataOptions; @@ -72,9 +79,15 @@ export function WorkspaceField( target: object.constructor, standardId: options.standardId, name: propertyKey.toString(), - label: options.label, + label: + typeof options.label === 'object' + ? (options.label.message ?? '') + : options.label, type: options.type, - description: options.description, + description: + typeof options.description === 'object' + ? (options.description.message ?? '') + : options.description, icon: options.icon, defaultValue, options: options.options, diff --git a/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts b/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts index 2a9e29a87..65f438fee 100644 --- a/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts +++ b/packages/twenty-server/src/modules/company/standard-objects/company.workspace-entity.ts @@ -64,8 +64,8 @@ export class CompanyWorkspaceEntity extends BaseWorkspaceEntity { @WorkspaceField({ standardId: COMPANY_STANDARD_FIELD_IDS.name, type: FieldMetadataType.TEXT, - label: 'Name', - description: 'The company name', + label: msg`Name`, + description: msg`The company name`, icon: 'IconBuildingSkyscraper', }) name: string;