From 2353bc62cc93b687d0e2e7bf626f4521cfec8b7c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 26 Jan 2026 07:11:01 +0100 Subject: [PATCH] i18n - docs translations (#17433) Created by Github action Co-authored-by: github-actions --- packages/twenty-docs/docs.json | 278 +++---- .../best-practices-server.mdx | 22 +- .../backend-development/custom-objects.mdx | 30 +- .../backend-development/feature-flags.mdx | 24 +- .../folder-architecture-server.mdx | 124 +-- .../backend-development/queue.mdx | 20 +- .../backend-development/server-commands.mdx | 53 +- .../backend-development/zapier.mdx | 40 +- .../capabilities/bug-and-requests.mdx | 68 +- .../best-practices-front.mdx | 160 ++-- .../folder-architecture-front.mdx | 72 +- .../frontend-commands.mdx | 54 +- .../frontend-development/hotkeys.mdx | 68 +- .../frontend-development/storybook.mdx | 6 +- .../frontend-development/style-guide.mdx | 116 +-- .../frontend-development/work-with-figma.mdx | 66 +- .../contribute/capabilities/local-setup.mdx | 178 ++--- .../l/es/developers/contribute/contribute.mdx | 32 +- .../developers/extend/capabilities/apis.mdx | 164 ++-- .../developers/extend/capabilities/apps.mdx | 737 +++++++++++------- .../extend/capabilities/webhooks.mdx | 96 +-- .../l/es/developers/extend/extend.mdx | 30 +- .../l/es/developers/introduction.mdx | 16 +- .../capabilities/cloud-providers.mdx | 36 +- .../self-host/capabilities/docker-compose.mdx | 178 ++--- .../self-host/capabilities/setup.mdx | 260 +++--- .../capabilities/troubleshooting.mdx | 177 +++-- .../self-host/capabilities/upgrade-guide.mdx | 280 +++---- .../l/es/developers/self-host/self-host.mdx | 26 +- packages/twenty-docs/l/es/navigation.json | 104 +-- .../l/es/twenty-ui/display/app-tooltip.mdx | 42 +- .../l/es/twenty-ui/display/checkmark.mdx | 28 +- .../l/es/twenty-ui/display/chip.mdx | 62 +- .../l/es/twenty-ui/display/icons.mdx | 48 +- .../l/es/twenty-ui/display/soon-pill.mdx | 4 +- .../l/es/twenty-ui/display/tag.mdx | 20 +- packages/twenty-docs/l/es/twenty-ui/input.mdx | 4 +- .../l/es/twenty-ui/input/block-editor.mdx | 14 +- .../l/es/twenty-ui/input/buttons.mdx | 230 +++--- .../l/es/twenty-ui/input/checkbox.mdx | 26 +- .../l/es/twenty-ui/input/color-scheme.mdx | 38 +- .../l/es/twenty-ui/input/icon-picker.mdx | 26 +- .../l/es/twenty-ui/input/image-input.mdx | 26 +- .../l/es/twenty-ui/input/radio.mdx | 46 +- .../l/es/twenty-ui/input/select.mdx | 30 +- .../twenty-docs/l/es/twenty-ui/input/text.mdx | 106 +-- .../l/es/twenty-ui/input/toggle.mdx | 22 +- .../l/es/twenty-ui/introduction.mdx | 22 +- .../twenty-docs/l/es/twenty-ui/navigation.mdx | 4 +- .../l/es/twenty-ui/navigation/breadcrumb.mdx | 16 +- .../l/es/twenty-ui/navigation/links.mdx | 80 +- .../l/es/twenty-ui/navigation/menu-item.mdx | 248 +++--- .../twenty-ui/navigation/navigation-bar.mdx | 30 +- .../l/es/twenty-ui/navigation/step-bar.mdx | 14 +- .../l/es/twenty-ui/progress-bar.mdx | 40 +- .../user-guide/ai/capabilities/ai-agents.mdx | 42 +- .../user-guide/ai/capabilities/ai-chatbot.mdx | 50 +- .../permissions-access-control.mdx | 44 +- .../l/es/user-guide/ai/how-tos/ai-faq.mdx | 28 +- .../l/es/user-guide/ai/overview.mdx | 72 +- .../billing/capabilities/pricing-plans.mdx | 92 +-- .../billing/capabilities/workflow-credits.mdx | 58 +- .../billing/how-tos/billing-faq.mdx | 86 +- .../l/es/user-guide/billing/overview.mdx | 48 +- .../calendar-emails/capabilities/calendar.mdx | 52 +- .../calendar-emails/capabilities/mailbox.mdx | 116 +-- .../can-i-book-meetings-from-twenty.mdx | 34 +- .../how-tos/can-i-send-emails-from-twenty.mdx | 48 +- ...-i-track-email-activity-on-all-objects.mdx | 42 +- .../connect-several-mailboxes-per-user.mdx | 52 +- .../how-tos/i-dont-see-emails-on-records.mdx | 56 +- .../how-tos/limit-emails-imported.mdx | 66 +- .../user-guide/calendar-emails/overview.mdx | 160 ++-- .../capabilities/chart-settings.mdx | 275 +++++++ .../dashboards/capabilities/dashboards.mdx | 100 ++- .../dashboards/capabilities/widgets.mdx | 190 +++-- .../dashboards/how-tos/dashboards-faq.mdx | 62 +- .../dashboards/how-tos/widget-faq.mdx | 67 ++ .../l/es/user-guide/dashboards/overview.mdx | 98 +-- .../capabilities/error-handling.mdx | 86 +- .../capabilities/field-mapping.mdx | 194 ++--- .../capabilities/file-formats.mdx | 64 +- .../capabilities/import-relations.mdx | 156 ++-- .../capabilities/uniqueness-constraints.mdx | 82 +- .../how-tos/export-your-data.mdx | 256 +++--- .../how-tos/fix-import-errors.mdx | 430 +++++----- .../how-tos/import-companies-via-csv.mdx | 202 ++--- .../how-tos/import-contacts-via-csv.mdx | 252 +++--- .../how-tos/import-data-via-api.mdx | 214 ++--- ...port-relations-between-objects-via-csv.mdx | 262 +++---- .../how-tos/migrating-from-other-crms.mdx | 356 ++++----- .../migrating-from-self-hosted-to-cloud.mdx | 198 ++--- .../how-tos/prepare-your-csv-files.mdx | 294 +++---- .../update-existing-records-via-import.mdx | 220 +++--- .../es/user-guide/data-migration/overview.mdx | 100 +-- .../data-model/capabilities/fields.mdx | 136 ++-- .../data-model/capabilities/objects.mdx | 98 +-- .../capabilities/relation-fields.mdx | 108 +-- .../how-tos/create-custom-fields.mdx | 82 +- .../how-tos/create-custom-objects.mdx | 60 +- .../how-tos/create-many-to-many-relations.mdx | 180 +++++ .../how-tos/create-relation-fields.mdx | 72 +- .../how-tos/customize-your-data-model.mdx | 30 +- .../data-model/how-tos/data-model-faq.mdx | 152 ++-- .../l/es/user-guide/data-model/overview.mdx | 210 ++--- .../getting-started/capabilities/glossary.mdx | 102 ++- .../capabilities/implementation-services.mdx | 18 +- .../capabilities/what-is-twenty.mdx | 56 +- .../how-tos/configure-your-workspace.mdx | 98 +-- .../how-tos/create-workspace.mdx | 52 +- .../how-tos/navigate-around-twenty.mdx | 97 +-- .../l/es/user-guide/introduction.mdx | 48 +- .../capabilities/permissions.mdx | 236 +++--- .../capabilities/sso-configuration.mdx | 152 ++-- .../how-tos/permissions-faq.mdx | 132 ++-- .../permissions-access/overview.mdx | 42 +- .../capabilities/domains-settings.mdx | 52 +- .../capabilities/experience-settings.mdx | 48 +- .../capabilities/member-management.mdx | 102 +-- .../capabilities/profile-settings.mdx | 50 +- .../capabilities/updates-settings.mdx | 36 + .../capabilities/workspace-settings.mdx | 32 +- .../settings/how-tos/settings-faq.mdx | 198 ++--- .../l/es/user-guide/settings/overview.mdx | 80 +- .../capabilities/calendar-view.mdx | 56 +- .../capabilities/fields-and-columns.mdx | 64 +- .../capabilities/filters-and-sorting.mdx | 100 +-- .../capabilities/kanban-views.mdx | 110 +-- .../capabilities/table-views.mdx | 74 +- .../capabilities/view-settings.mdx | 90 +-- .../create-a-calendar-view-for-tasks-due.mdx | 78 +- .../create-a-kanban-view-for-projects.mdx | 94 +-- .../create-a-table-view-with-grouping.mdx | 60 +- .../how-tos/restrict-access-to-your-view.mdx | 40 +- .../how-tos/set-up-a-sales-pipeline.mdx | 146 ++-- .../show-expected-amount-in-pipeline.mdx | 198 ++--- .../how-tos/track-time-in-stage.mdx | 236 +++--- .../user-guide/views-pipelines/overview.mdx | 170 ++-- .../send-emails-from-workflows.mdx | 189 +++-- .../use-branches-in-workflows.mdx | 100 +-- .../workflows/capabilities/use-iterator.mdx | 178 +++-- .../capabilities/workflow-actions.mdx | 314 ++++---- .../capabilities/workflow-branches.mdx | 74 +- .../capabilities/workflow-credits.mdx | 98 +-- .../workflows/capabilities/workflow-runs.mdx | 122 +-- .../capabilities/workflow-triggers.mdx | 142 ++-- .../capabilities/workflow-versions.mdx | 110 +-- .../handle-arrays-in-code-actions.mdx | 38 +- .../bring-product-data-in-twenty.mdx | 112 +-- .../bring-typeform-submissions-in-twenty.mdx | 78 +- .../generate-pdf-from-twenty.mdx | 228 ++++++ .../generate-quote-or-invoice-from-twenty.mdx | 113 +-- .../set-up-a-webhook-trigger.mdx | 126 +-- .../closed-won-automations.mdx | 216 ++--- .../detect-stale-opportunities.mdx | 124 +-- .../display-number-of-emails-received.mdx | 76 +- .../display-related-record-data.mdx | 186 ++--- .../crm-automations/formula-fields.mdx | 134 ++-- .../notify-teammates-of-note-to-review.mdx | 127 +++ .../send-email-alerts-with-tasks-due.mdx | 96 +-- .../need-more-help/professional-services.mdx | 36 +- .../workflow-troubleshooting.mdx | 222 +++--- .../how-tos/need-more-help/workflows-faq.mdx | 290 +++---- .../l/es/user-guide/workflows/overview.mdx | 98 +-- .../best-practices-server.mdx | 22 +- .../backend-development/custom-objects.mdx | 30 +- .../backend-development/feature-flags.mdx | 24 +- .../folder-architecture-server.mdx | 72 +- .../backend-development/queue.mdx | 20 +- .../backend-development/server-commands.mdx | 55 +- .../backend-development/zapier.mdx | 40 +- .../capabilities/bug-and-requests.mdx | 68 +- .../best-practices-front.mdx | 158 ++-- .../folder-architecture-front.mdx | 62 +- .../frontend-commands.mdx | 42 +- .../frontend-development/hotkeys.mdx | 74 +- .../frontend-development/storybook.mdx | 6 +- .../frontend-development/style-guide.mdx | 129 ++- .../frontend-development/work-with-figma.mdx | 64 +- .../contribute/capabilities/local-setup.mdx | 178 ++--- .../l/fr/developers/contribute/contribute.mdx | 32 +- .../developers/extend/capabilities/apis.mdx | 166 ++-- .../developers/extend/capabilities/apps.mdx | 735 ++++++++++------- .../extend/capabilities/webhooks.mdx | 94 +-- .../l/fr/developers/extend/extend.mdx | 30 +- .../l/fr/developers/introduction.mdx | 16 +- .../capabilities/cloud-providers.mdx | 36 +- .../self-host/capabilities/docker-compose.mdx | 176 ++--- .../self-host/capabilities/setup.mdx | 280 ++++--- .../capabilities/troubleshooting.mdx | 177 +++-- .../self-host/capabilities/upgrade-guide.mdx | 280 +++---- .../l/fr/developers/self-host/self-host.mdx | 26 +- packages/twenty-docs/l/fr/navigation.json | 102 +-- .../l/fr/twenty-ui/display/app-tooltip.mdx | 46 +- .../l/fr/twenty-ui/display/checkmark.mdx | 32 +- .../l/fr/twenty-ui/display/chip.mdx | 68 +- .../l/fr/twenty-ui/display/icons.mdx | 50 +- .../l/fr/twenty-ui/display/soon-pill.mdx | 6 +- .../l/fr/twenty-ui/display/tag.mdx | 22 +- packages/twenty-docs/l/fr/twenty-ui/input.mdx | 4 +- .../l/fr/twenty-ui/input/block-editor.mdx | 16 +- .../l/fr/twenty-ui/input/buttons.mdx | 240 +++--- .../l/fr/twenty-ui/input/checkbox.mdx | 28 +- .../l/fr/twenty-ui/input/color-scheme.mdx | 38 +- .../l/fr/twenty-ui/input/icon-picker.mdx | 28 +- .../l/fr/twenty-ui/input/image-input.mdx | 28 +- .../l/fr/twenty-ui/input/radio.mdx | 50 +- .../l/fr/twenty-ui/input/select.mdx | 28 +- .../twenty-docs/l/fr/twenty-ui/input/text.mdx | 82 +- .../l/fr/twenty-ui/input/toggle.mdx | 20 +- .../l/fr/twenty-ui/introduction.mdx | 6 +- .../twenty-docs/l/fr/twenty-ui/navigation.mdx | 2 +- .../l/fr/twenty-ui/navigation/breadcrumb.mdx | 18 +- .../l/fr/twenty-ui/navigation/links.mdx | 82 +- .../l/fr/twenty-ui/navigation/menu-item.mdx | 254 +++--- .../twenty-ui/navigation/navigation-bar.mdx | 18 +- .../l/fr/twenty-ui/navigation/step-bar.mdx | 16 +- .../l/fr/twenty-ui/progress-bar.mdx | 44 +- .../user-guide/ai/capabilities/ai-agents.mdx | 42 +- .../user-guide/ai/capabilities/ai-chatbot.mdx | 50 +- .../permissions-access-control.mdx | 44 +- .../l/fr/user-guide/ai/how-tos/ai-faq.mdx | 28 +- .../l/fr/user-guide/ai/overview.mdx | 72 +- .../billing/capabilities/pricing-plans.mdx | 90 +-- .../billing/capabilities/workflow-credits.mdx | 58 +- .../billing/how-tos/billing-faq.mdx | 86 +- .../l/fr/user-guide/billing/overview.mdx | 46 +- .../calendar-emails/capabilities/calendar.mdx | 52 +- .../calendar-emails/capabilities/mailbox.mdx | 116 +-- .../can-i-book-meetings-from-twenty.mdx | 34 +- .../how-tos/can-i-send-emails-from-twenty.mdx | 48 +- ...-i-track-email-activity-on-all-objects.mdx | 42 +- .../connect-several-mailboxes-per-user.mdx | 52 +- .../how-tos/i-dont-see-emails-on-records.mdx | 56 +- .../how-tos/limit-emails-imported.mdx | 66 +- .../user-guide/calendar-emails/overview.mdx | 160 ++-- .../capabilities/chart-settings.mdx | 275 +++++++ .../dashboards/capabilities/dashboards.mdx | 100 ++- .../dashboards/capabilities/widgets.mdx | 190 +++-- .../dashboards/how-tos/dashboards-faq.mdx | 62 +- .../dashboards/how-tos/widget-faq.mdx | 67 ++ .../l/fr/user-guide/dashboards/overview.mdx | 98 +-- .../capabilities/error-handling.mdx | 86 +- .../capabilities/field-mapping.mdx | 30 +- .../capabilities/file-formats.mdx | 64 +- .../capabilities/import-relations.mdx | 156 ++-- .../capabilities/uniqueness-constraints.mdx | 82 +- .../how-tos/export-your-data.mdx | 254 +++--- .../how-tos/fix-import-errors.mdx | 418 +++++----- .../how-tos/import-companies-via-csv.mdx | 204 ++--- .../how-tos/import-contacts-via-csv.mdx | 250 +++--- .../how-tos/import-data-via-api.mdx | 212 ++--- ...port-relations-between-objects-via-csv.mdx | 260 +++--- .../how-tos/migrating-from-other-crms.mdx | 352 ++++----- .../migrating-from-self-hosted-to-cloud.mdx | 196 ++--- .../how-tos/prepare-your-csv-files.mdx | 298 +++---- .../update-existing-records-via-import.mdx | 214 ++--- .../fr/user-guide/data-migration/overview.mdx | 100 +-- .../data-model/capabilities/fields.mdx | 136 ++-- .../data-model/capabilities/objects.mdx | 96 +-- .../capabilities/relation-fields.mdx | 106 +-- .../how-tos/create-custom-fields.mdx | 82 +- .../how-tos/create-custom-objects.mdx | 60 +- .../how-tos/create-many-to-many-relations.mdx | 180 +++++ .../how-tos/create-relation-fields.mdx | 74 +- .../how-tos/customize-your-data-model.mdx | 30 +- .../data-model/how-tos/data-model-faq.mdx | 150 ++-- .../l/fr/user-guide/data-model/overview.mdx | 210 ++--- .../getting-started/capabilities/glossary.mdx | 102 ++- .../capabilities/implementation-services.mdx | 18 +- .../capabilities/what-is-twenty.mdx | 54 +- .../how-tos/configure-your-workspace.mdx | 98 +-- .../how-tos/create-workspace.mdx | 48 +- .../how-tos/navigate-around-twenty.mdx | 97 +-- .../l/fr/user-guide/introduction.mdx | 48 +- .../capabilities/permissions.mdx | 234 +++--- .../capabilities/sso-configuration.mdx | 152 ++-- .../how-tos/permissions-faq.mdx | 134 ++-- .../permissions-access/overview.mdx | 38 +- .../capabilities/domains-settings.mdx | 52 +- .../capabilities/experience-settings.mdx | 46 +- .../capabilities/member-management.mdx | 102 +-- .../capabilities/profile-settings.mdx | 50 +- .../capabilities/updates-settings.mdx | 36 + .../capabilities/workspace-settings.mdx | 30 +- .../settings/how-tos/settings-faq.mdx | 198 ++--- .../l/fr/user-guide/settings/overview.mdx | 80 +- .../capabilities/calendar-view.mdx | 56 +- .../capabilities/fields-and-columns.mdx | 64 +- .../capabilities/filters-and-sorting.mdx | 100 +-- .../capabilities/kanban-views.mdx | 110 +-- .../capabilities/table-views.mdx | 74 +- .../capabilities/view-settings.mdx | 90 +-- .../create-a-calendar-view-for-tasks-due.mdx | 78 +- .../create-a-kanban-view-for-projects.mdx | 94 +-- .../create-a-table-view-with-grouping.mdx | 60 +- .../how-tos/restrict-access-to-your-view.mdx | 38 +- .../how-tos/set-up-a-sales-pipeline.mdx | 146 ++-- .../show-expected-amount-in-pipeline.mdx | 198 ++--- .../how-tos/track-time-in-stage.mdx | 236 +++--- .../user-guide/views-pipelines/overview.mdx | 170 ++-- .../send-emails-from-workflows.mdx | 199 ++--- .../use-branches-in-workflows.mdx | 100 +-- .../workflows/capabilities/use-iterator.mdx | 224 +++--- .../capabilities/workflow-actions.mdx | 288 +++---- .../capabilities/workflow-branches.mdx | 74 +- .../capabilities/workflow-credits.mdx | 98 +-- .../workflows/capabilities/workflow-runs.mdx | 122 +-- .../capabilities/workflow-triggers.mdx | 134 ++-- .../capabilities/workflow-versions.mdx | 110 +-- .../handle-arrays-in-code-actions.mdx | 38 +- .../bring-product-data-in-twenty.mdx | 100 +-- .../bring-typeform-submissions-in-twenty.mdx | 78 +- .../generate-pdf-from-twenty.mdx | 228 ++++++ .../generate-quote-or-invoice-from-twenty.mdx | 113 +-- .../set-up-a-webhook-trigger.mdx | 128 +-- .../closed-won-automations.mdx | 196 ++--- .../detect-stale-opportunities.mdx | 124 +-- .../display-number-of-emails-received.mdx | 76 +- .../display-related-record-data.mdx | 186 ++--- .../crm-automations/formula-fields.mdx | 134 ++-- .../notify-teammates-of-note-to-review.mdx | 127 +++ .../send-email-alerts-with-tasks-due.mdx | 96 +-- .../need-more-help/professional-services.mdx | 36 +- .../workflow-troubleshooting.mdx | 222 +++--- .../how-tos/need-more-help/workflows-faq.mdx | 292 +++---- .../l/fr/user-guide/workflows/overview.mdx | 98 +-- .../developers/extend/capabilities/apps.mdx | 108 +-- .../self-host/capabilities/setup.mdx | 28 +- .../capabilities/chart-settings.mdx | 268 +++---- .../dashboards/capabilities/dashboards.mdx | 24 +- .../dashboards/capabilities/widgets.mdx | 38 +- .../dashboards/how-tos/widget-faq.mdx | 72 +- .../l/it/user-guide/dashboards/overview.mdx | 6 +- .../capabilities/relation-fields.mdx | 10 +- .../how-tos/create-many-to-many-relations.mdx | 180 +++++ .../send-emails-from-workflows.mdx | 26 +- .../developers/extend/capabilities/apps.mdx | 38 +- .../extend/capabilities/webhooks.mdx | 80 +- .../self-host/capabilities/setup.mdx | 80 +- .../self-host/capabilities/upgrade-guide.mdx | 10 +- packages/twenty-docs/l/ru/navigation.json | 72 +- .../l/ru/twenty-ui/display/icons.mdx | 4 +- .../l/ru/twenty-ui/display/tag.mdx | 12 +- .../calendar-emails/capabilities/mailbox.mdx | 18 +- .../connect-several-mailboxes-per-user.mdx | 2 +- .../user-guide/calendar-emails/overview.mdx | 6 +- .../capabilities/chart-settings.mdx | 272 +++---- .../dashboards/capabilities/dashboards.mdx | 24 +- .../dashboards/capabilities/widgets.mdx | 38 +- .../dashboards/how-tos/widget-faq.mdx | 72 +- .../l/ru/user-guide/dashboards/overview.mdx | 8 +- .../capabilities/relation-fields.mdx | 10 +- .../how-tos/create-many-to-many-relations.mdx | 180 +++++ .../capabilities/updates-settings.mdx | 40 +- .../settings/how-tos/settings-faq.mdx | 14 +- .../send-emails-from-workflows.mdx | 26 +- .../generate-pdf-from-twenty.mdx | 112 +-- .../generate-quote-or-invoice-from-twenty.mdx | 2 +- .../display-number-of-emails-received.mdx | 70 +- .../notify-teammates-of-note-to-review.mdx | 110 +-- 361 files changed, 20096 insertions(+), 17317 deletions(-) create mode 100644 packages/twenty-docs/l/es/user-guide/dashboards/capabilities/chart-settings.mdx create mode 100644 packages/twenty-docs/l/es/user-guide/dashboards/how-tos/widget-faq.mdx create mode 100644 packages/twenty-docs/l/es/user-guide/data-model/how-tos/create-many-to-many-relations.mdx create mode 100644 packages/twenty-docs/l/es/user-guide/settings/capabilities/updates-settings.mdx create mode 100644 packages/twenty-docs/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty.mdx create mode 100644 packages/twenty-docs/l/es/user-guide/workflows/how-tos/crm-automations/notify-teammates-of-note-to-review.mdx create mode 100644 packages/twenty-docs/l/fr/user-guide/dashboards/capabilities/chart-settings.mdx create mode 100644 packages/twenty-docs/l/fr/user-guide/dashboards/how-tos/widget-faq.mdx create mode 100644 packages/twenty-docs/l/fr/user-guide/data-model/how-tos/create-many-to-many-relations.mdx create mode 100644 packages/twenty-docs/l/fr/user-guide/settings/capabilities/updates-settings.mdx create mode 100644 packages/twenty-docs/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty.mdx create mode 100644 packages/twenty-docs/l/fr/user-guide/workflows/how-tos/crm-automations/notify-teammates-of-note-to-review.mdx create mode 100644 packages/twenty-docs/l/it/user-guide/data-model/how-tos/create-many-to-many-relations.mdx create mode 100644 packages/twenty-docs/l/ru/user-guide/data-model/how-tos/create-many-to-many-relations.mdx diff --git a/packages/twenty-docs/docs.json b/packages/twenty-docs/docs.json index c62c64c10c..d8a33b0ca5 100644 --- a/packages/twenty-docs/docs.json +++ b/packages/twenty-docs/docs.json @@ -481,15 +481,15 @@ "language": "fr", "tabs": [ { - "tab": "User Guide", + "tab": "Guide de l'utilisateur", "groups": [ { - "group": "Discover Twenty", + "group": "Découvrez Twenty", "icon": "rocket", "pages": [ "l/fr/user-guide/introduction", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/getting-started/capabilities/what-is-twenty", "l/fr/user-guide/getting-started/capabilities/implementation-services", @@ -497,7 +497,7 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/getting-started/how-tos/create-workspace", "l/fr/user-guide/getting-started/how-tos/navigate-around-twenty", @@ -507,12 +507,12 @@ ] }, { - "group": "Data Model", + "group": "Modèle de données", "icon": "database", "pages": [ "l/fr/user-guide/data-model/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/data-model/capabilities/objects", "l/fr/user-guide/data-model/capabilities/fields", @@ -520,7 +520,7 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/data-model/how-tos/create-custom-objects", "l/fr/user-guide/data-model/how-tos/create-custom-fields", @@ -533,12 +533,12 @@ ] }, { - "group": "Data Migration", + "group": "Migration de données", "icon": "cloud-arrow-up", "pages": [ "l/fr/user-guide/data-migration/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/data-migration/capabilities/file-formats", "l/fr/user-guide/data-migration/capabilities/field-mapping", @@ -548,7 +548,7 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files", "l/fr/user-guide/data-migration/how-tos/import-companies-via-csv", @@ -565,19 +565,19 @@ ] }, { - "group": "Calendar & Emails", + "group": "Calendrier et e-mails", "icon": "envelope", "pages": [ "l/fr/user-guide/calendar-emails/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/calendar-emails/capabilities/mailbox", "l/fr/user-guide/calendar-emails/capabilities/calendar" ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user", "l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported", @@ -590,12 +590,12 @@ ] }, { - "group": "Workflows", + "group": "Flux de travail", "icon": "bolt", "pages": [ "l/fr/user-guide/workflows/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/workflows/capabilities/workflow-triggers", "l/fr/user-guide/workflows/capabilities/workflow-actions", @@ -609,10 +609,10 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ { - "group": "CRM Automations", + "group": "Automatisations CRM", "pages": [ "l/fr/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due", "l/fr/user-guide/workflows/how-tos/crm-automations/notify-teammates-of-note-to-review", @@ -624,7 +624,7 @@ ] }, { - "group": "Connect to Other Tools", + "group": "Connexion à d'autres outils", "pages": [ "l/fr/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger", "l/fr/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty", @@ -634,13 +634,13 @@ ] }, { - "group": "Advanced Configurations", + "group": "Configurations avancées", "pages": [ "l/fr/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions" ] }, { - "group": "Need More Help", + "group": "Besoin de plus d'aide", "pages": [ "l/fr/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting", "l/fr/user-guide/workflows/how-tos/need-more-help/workflows-faq", @@ -652,12 +652,12 @@ ] }, { - "group": "AI", + "group": "IA", "icon": "robot", "pages": [ "l/fr/user-guide/ai/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/ai/capabilities/ai-chatbot", "l/fr/user-guide/ai/capabilities/ai-agents", @@ -665,7 +665,7 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/ai/how-tos/ai-faq" ] @@ -673,12 +673,12 @@ ] }, { - "group": "Views & Pipelines", + "group": "Vues et pipelines", "icon": "table", "pages": [ "l/fr/user-guide/views-pipelines/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/views-pipelines/capabilities/table-views", "l/fr/user-guide/views-pipelines/capabilities/kanban-views", @@ -689,7 +689,7 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping", "l/fr/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects", @@ -703,12 +703,12 @@ ] }, { - "group": "Dashboards", + "group": "Tableaux de bord", "icon": "chart-bar", "pages": [ "l/fr/user-guide/dashboards/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/dashboards/capabilities/dashboards", "l/fr/user-guide/dashboards/capabilities/widgets", @@ -716,7 +716,7 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/dashboards/how-tos/dashboards-faq", "l/fr/user-guide/dashboards/how-tos/widget-faq" @@ -725,19 +725,19 @@ ] }, { - "group": "Permissions & Access", + "group": "Autorisations et accès", "icon": "lock", "pages": [ "l/fr/user-guide/permissions-access/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/permissions-access/capabilities/permissions", "l/fr/user-guide/permissions-access/capabilities/sso-configuration" ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/permissions-access/how-tos/permissions-faq" ] @@ -745,19 +745,19 @@ ] }, { - "group": "Billing", + "group": "Facturation", "icon": "credit-card", "pages": [ "l/fr/user-guide/billing/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/billing/capabilities/pricing-plans", "l/fr/user-guide/billing/capabilities/workflow-credits" ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/billing/how-tos/billing-faq" ] @@ -765,12 +765,12 @@ ] }, { - "group": "Settings", + "group": "Paramètres", "icon": "gear", "pages": [ "l/fr/user-guide/settings/overview", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/user-guide/settings/capabilities/workspace-settings", "l/fr/user-guide/settings/capabilities/member-management", @@ -781,7 +781,7 @@ ] }, { - "group": "How-Tos", + "group": "Guides pratiques", "pages": [ "l/fr/user-guide/settings/how-tos/settings-faq" ] @@ -791,21 +791,21 @@ ] }, { - "tab": "Developers", + "tab": "Développeurs", "groups": [ { - "group": "Developers", + "group": "Développeurs", "pages": [ "l/fr/developers/introduction" ] }, { - "group": "Extend", + "group": "Étendre", "icon": "plug", "pages": [ "l/fr/developers/extend/extend", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/developers/extend/capabilities/apis", "l/fr/developers/extend/capabilities/webhooks", @@ -815,12 +815,12 @@ ] }, { - "group": "Self-Host", + "group": "Auto-hébergement", "icon": "desktop", "pages": [ "l/fr/developers/self-host/self-host", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/developers/self-host/capabilities/docker-compose", "l/fr/developers/self-host/capabilities/setup", @@ -832,17 +832,17 @@ ] }, { - "group": "Contribute", + "group": "Contribuer", "icon": "github", "pages": [ "l/fr/developers/contribute/contribute", { - "group": "Capabilities", + "group": "Capacités", "pages": [ "l/fr/developers/contribute/capabilities/local-setup", "l/fr/developers/contribute/capabilities/bug-and-requests", { - "group": "Frontend Development", + "group": "Développement frontend", "pages": [ "l/fr/developers/contribute/capabilities/frontend-development/storybook", { @@ -850,7 +850,7 @@ "pages": [ "l/fr/twenty-ui/introduction", { - "group": "Display", + "group": "Afficher", "pages": [ "l/fr/twenty-ui/display/checkmark", "l/fr/twenty-ui/display/chip", @@ -861,13 +861,13 @@ ] }, { - "group": "Feedback", + "group": "Retour d'information", "pages": [ "l/fr/twenty-ui/progress-bar" ] }, { - "group": "Input", + "group": "Entrée ", "pages": [ "l/fr/twenty-ui/input/buttons", "l/fr/twenty-ui/input/color-scheme", @@ -903,7 +903,7 @@ ] }, { - "group": "Backend Development", + "group": "Développement backend", "pages": [ "l/fr/developers/contribute/capabilities/backend-development/server-commands", "l/fr/developers/contribute/capabilities/backend-development/feature-flags", @@ -2261,15 +2261,15 @@ "language": "es", "tabs": [ { - "tab": "User Guide", + "tab": "Guía de usuario", "groups": [ { - "group": "Discover Twenty", + "group": "Descubre Twenty", "icon": "rocket", "pages": [ "l/es/user-guide/introduction", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/getting-started/capabilities/what-is-twenty", "l/es/user-guide/getting-started/capabilities/implementation-services", @@ -2277,7 +2277,7 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/getting-started/how-tos/create-workspace", "l/es/user-guide/getting-started/how-tos/navigate-around-twenty", @@ -2287,12 +2287,12 @@ ] }, { - "group": "Data Model", + "group": "Modelo de datos", "icon": "database", "pages": [ "l/es/user-guide/data-model/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/data-model/capabilities/objects", "l/es/user-guide/data-model/capabilities/fields", @@ -2300,7 +2300,7 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/data-model/how-tos/create-custom-objects", "l/es/user-guide/data-model/how-tos/create-custom-fields", @@ -2313,12 +2313,12 @@ ] }, { - "group": "Data Migration", + "group": "Migración de datos", "icon": "cloud-arrow-up", "pages": [ "l/es/user-guide/data-migration/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/data-migration/capabilities/file-formats", "l/es/user-guide/data-migration/capabilities/field-mapping", @@ -2328,7 +2328,7 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/data-migration/how-tos/prepare-your-csv-files", "l/es/user-guide/data-migration/how-tos/import-companies-via-csv", @@ -2345,19 +2345,19 @@ ] }, { - "group": "Calendar & Emails", + "group": "Calendario y correos electrónicos", "icon": "envelope", "pages": [ "l/es/user-guide/calendar-emails/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/calendar-emails/capabilities/mailbox", "l/es/user-guide/calendar-emails/capabilities/calendar" ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user", "l/es/user-guide/calendar-emails/how-tos/limit-emails-imported", @@ -2370,12 +2370,12 @@ ] }, { - "group": "Workflows", + "group": "Flujos de trabajo", "icon": "bolt", "pages": [ "l/es/user-guide/workflows/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/workflows/capabilities/workflow-triggers", "l/es/user-guide/workflows/capabilities/workflow-actions", @@ -2389,10 +2389,10 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ { - "group": "CRM Automations", + "group": "Automatizaciones de CRM", "pages": [ "l/es/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due", "l/es/user-guide/workflows/how-tos/crm-automations/notify-teammates-of-note-to-review", @@ -2404,7 +2404,7 @@ ] }, { - "group": "Connect to Other Tools", + "group": "Conectar con otras herramientas", "pages": [ "l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger", "l/es/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty", @@ -2414,13 +2414,13 @@ ] }, { - "group": "Advanced Configurations", + "group": "Configuraciones avanzadas", "pages": [ "l/es/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions" ] }, { - "group": "Need More Help", + "group": "¿Necesitas más ayuda?", "pages": [ "l/es/user-guide/workflows/how-tos/need-more-help/workflow-troubleshooting", "l/es/user-guide/workflows/how-tos/need-more-help/workflows-faq", @@ -2432,12 +2432,12 @@ ] }, { - "group": "AI", + "group": "IA", "icon": "robot", "pages": [ "l/es/user-guide/ai/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/ai/capabilities/ai-chatbot", "l/es/user-guide/ai/capabilities/ai-agents", @@ -2445,7 +2445,7 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/ai/how-tos/ai-faq" ] @@ -2453,12 +2453,12 @@ ] }, { - "group": "Views & Pipelines", + "group": "Vistas y canalizaciones", "icon": "table", "pages": [ "l/es/user-guide/views-pipelines/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/views-pipelines/capabilities/table-views", "l/es/user-guide/views-pipelines/capabilities/kanban-views", @@ -2469,7 +2469,7 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping", "l/es/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects", @@ -2483,12 +2483,12 @@ ] }, { - "group": "Dashboards", + "group": "Tableros", "icon": "chart-bar", "pages": [ "l/es/user-guide/dashboards/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/dashboards/capabilities/dashboards", "l/es/user-guide/dashboards/capabilities/widgets", @@ -2496,7 +2496,7 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/dashboards/how-tos/dashboards-faq", "l/es/user-guide/dashboards/how-tos/widget-faq" @@ -2505,19 +2505,19 @@ ] }, { - "group": "Permissions & Access", + "group": "Permisos y acceso", "icon": "lock", "pages": [ "l/es/user-guide/permissions-access/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/permissions-access/capabilities/permissions", "l/es/user-guide/permissions-access/capabilities/sso-configuration" ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/permissions-access/how-tos/permissions-faq" ] @@ -2525,19 +2525,19 @@ ] }, { - "group": "Billing", + "group": "Facturación", "icon": "credit-card", "pages": [ "l/es/user-guide/billing/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/billing/capabilities/pricing-plans", "l/es/user-guide/billing/capabilities/workflow-credits" ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/billing/how-tos/billing-faq" ] @@ -2545,12 +2545,12 @@ ] }, { - "group": "Settings", + "group": "Configuración", "icon": "gear", "pages": [ "l/es/user-guide/settings/overview", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/user-guide/settings/capabilities/workspace-settings", "l/es/user-guide/settings/capabilities/member-management", @@ -2561,7 +2561,7 @@ ] }, { - "group": "How-Tos", + "group": "Guías prácticas", "pages": [ "l/es/user-guide/settings/how-tos/settings-faq" ] @@ -2571,21 +2571,21 @@ ] }, { - "tab": "Developers", + "tab": "Desarrolladores", "groups": [ { - "group": "Developers", + "group": "Desarrolladores", "pages": [ "l/es/developers/introduction" ] }, { - "group": "Extend", + "group": "Ampliar", "icon": "plug", "pages": [ "l/es/developers/extend/extend", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/developers/extend/capabilities/apis", "l/es/developers/extend/capabilities/webhooks", @@ -2595,12 +2595,12 @@ ] }, { - "group": "Self-Host", + "group": "Autoalojamiento", "icon": "desktop", "pages": [ "l/es/developers/self-host/self-host", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/developers/self-host/capabilities/docker-compose", "l/es/developers/self-host/capabilities/setup", @@ -2612,17 +2612,17 @@ ] }, { - "group": "Contribute", + "group": "Contribuir", "icon": "github", "pages": [ "l/es/developers/contribute/contribute", { - "group": "Capabilities", + "group": "Capacidades", "pages": [ "l/es/developers/contribute/capabilities/local-setup", "l/es/developers/contribute/capabilities/bug-and-requests", { - "group": "Frontend Development", + "group": "Desarrollo Frontend", "pages": [ "l/es/developers/contribute/capabilities/frontend-development/storybook", { @@ -2630,7 +2630,7 @@ "pages": [ "l/es/twenty-ui/introduction", { - "group": "Display", + "group": "Mostrar", "pages": [ "l/es/twenty-ui/display/checkmark", "l/es/twenty-ui/display/chip", @@ -2641,13 +2641,13 @@ ] }, { - "group": "Feedback", + "group": "Retroalimentación", "pages": [ "l/es/twenty-ui/progress-bar" ] }, { - "group": "Input", + "group": "Entrada", "pages": [ "l/es/twenty-ui/input/buttons", "l/es/twenty-ui/input/color-scheme", @@ -2662,7 +2662,7 @@ ] }, { - "group": "Navigation", + "group": "Navegación", "pages": [ "l/es/twenty-ui/navigation", "l/es/twenty-ui/navigation/breadcrumb", @@ -2683,7 +2683,7 @@ ] }, { - "group": "Backend Development", + "group": "Desarrollo Backend", "pages": [ "l/es/developers/contribute/capabilities/backend-development/server-commands", "l/es/developers/contribute/capabilities/backend-development/feature-flags", @@ -4931,15 +4931,15 @@ "language": "ru", "tabs": [ { - "tab": "User Guide", + "tab": "Руководство пользователя", "groups": [ { - "group": "Discover Twenty", + "group": "Откройте Twenty", "icon": "rocket", "pages": [ "l/ru/user-guide/introduction", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/getting-started/capabilities/what-is-twenty", "l/ru/user-guide/getting-started/capabilities/implementation-services", @@ -4947,7 +4947,7 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/getting-started/how-tos/create-workspace", "l/ru/user-guide/getting-started/how-tos/navigate-around-twenty", @@ -4962,7 +4962,7 @@ "pages": [ "l/ru/user-guide/data-model/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/data-model/capabilities/objects", "l/ru/user-guide/data-model/capabilities/fields", @@ -4970,7 +4970,7 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/data-model/how-tos/create-custom-objects", "l/ru/user-guide/data-model/how-tos/create-custom-fields", @@ -4983,12 +4983,12 @@ ] }, { - "group": "Data Migration", + "group": "Миграция данных", "icon": "cloud-arrow-up", "pages": [ "l/ru/user-guide/data-migration/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/data-migration/capabilities/file-formats", "l/ru/user-guide/data-migration/capabilities/field-mapping", @@ -4998,7 +4998,7 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/data-migration/how-tos/prepare-your-csv-files", "l/ru/user-guide/data-migration/how-tos/import-companies-via-csv", @@ -5015,19 +5015,19 @@ ] }, { - "group": "Calendar & Emails", + "group": "Календарь и электронная почта", "icon": "envelope", "pages": [ "l/ru/user-guide/calendar-emails/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/calendar-emails/capabilities/mailbox", "l/ru/user-guide/calendar-emails/capabilities/calendar" ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/calendar-emails/how-tos/connect-several-mailboxes-per-user", "l/ru/user-guide/calendar-emails/how-tos/limit-emails-imported", @@ -5045,7 +5045,7 @@ "pages": [ "l/ru/user-guide/workflows/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/workflows/capabilities/workflow-triggers", "l/ru/user-guide/workflows/capabilities/workflow-actions", @@ -5059,10 +5059,10 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ { - "group": "CRM Automations", + "group": "Автоматизации CRM", "pages": [ "l/ru/user-guide/workflows/how-tos/crm-automations/send-email-alerts-with-tasks-due", "l/ru/user-guide/workflows/how-tos/crm-automations/notify-teammates-of-note-to-review", @@ -5074,7 +5074,7 @@ ] }, { - "group": "Connect to Other Tools", + "group": "Подключение к другим инструментам", "pages": [ "l/ru/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger", "l/ru/user-guide/workflows/how-tos/connect-to-other-tools/bring-typeform-submissions-in-twenty", @@ -5084,7 +5084,7 @@ ] }, { - "group": "Advanced Configurations", + "group": "Расширенные настройки", "pages": [ "l/ru/user-guide/workflows/how-tos/advanced-configurations/handle-arrays-in-code-actions" ] @@ -5107,7 +5107,7 @@ "pages": [ "l/ru/user-guide/ai/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/ai/capabilities/ai-chatbot", "l/ru/user-guide/ai/capabilities/ai-agents", @@ -5115,7 +5115,7 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/ai/how-tos/ai-faq" ] @@ -5128,7 +5128,7 @@ "pages": [ "l/ru/user-guide/views-pipelines/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/views-pipelines/capabilities/table-views", "l/ru/user-guide/views-pipelines/capabilities/kanban-views", @@ -5139,7 +5139,7 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/views-pipelines/how-tos/create-a-table-view-with-grouping", "l/ru/user-guide/views-pipelines/how-tos/create-a-kanban-view-for-projects", @@ -5158,7 +5158,7 @@ "pages": [ "l/ru/user-guide/dashboards/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/dashboards/capabilities/dashboards", "l/ru/user-guide/dashboards/capabilities/widgets", @@ -5166,7 +5166,7 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/dashboards/how-tos/dashboards-faq", "l/ru/user-guide/dashboards/how-tos/widget-faq" @@ -5175,19 +5175,19 @@ ] }, { - "group": "Permissions & Access", + "group": "Разрешения и доступ", "icon": "lock", "pages": [ "l/ru/user-guide/permissions-access/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/permissions-access/capabilities/permissions", "l/ru/user-guide/permissions-access/capabilities/sso-configuration" ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/permissions-access/how-tos/permissions-faq" ] @@ -5200,14 +5200,14 @@ "pages": [ "l/ru/user-guide/billing/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/billing/capabilities/pricing-plans", "l/ru/user-guide/billing/capabilities/workflow-credits" ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/billing/how-tos/billing-faq" ] @@ -5220,7 +5220,7 @@ "pages": [ "l/ru/user-guide/settings/overview", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/user-guide/settings/capabilities/workspace-settings", "l/ru/user-guide/settings/capabilities/member-management", @@ -5231,7 +5231,7 @@ ] }, { - "group": "How-Tos", + "group": "Инструкции", "pages": [ "l/ru/user-guide/settings/how-tos/settings-faq" ] @@ -5250,12 +5250,12 @@ ] }, { - "group": "Extend", + "group": "Расширяйте", "icon": "plug", "pages": [ "l/ru/developers/extend/extend", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/developers/extend/capabilities/apis", "l/ru/developers/extend/capabilities/webhooks", @@ -5265,12 +5265,12 @@ ] }, { - "group": "Self-Host", + "group": "Самостоятельный хостинг", "icon": "desktop", "pages": [ "l/ru/developers/self-host/self-host", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/developers/self-host/capabilities/docker-compose", "l/ru/developers/self-host/capabilities/setup", @@ -5282,12 +5282,12 @@ ] }, { - "group": "Contribute", + "group": "Внести вклад", "icon": "github", "pages": [ "l/ru/developers/contribute/contribute", { - "group": "Capabilities", + "group": "Возможности", "pages": [ "l/ru/developers/contribute/capabilities/local-setup", "l/ru/developers/contribute/capabilities/bug-and-requests", diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx index d8f5c5ea7c..b476a16282 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx @@ -1,22 +1,22 @@ --- -title: Best Practices +title: Mejores prácticas --- -This document outlines the best practices you should follow when working on the backend. +Este documento describe las mejores prácticas que debe seguir al trabajar en el backend. -## Follow a modular approach +## Siga un enfoque modular -The backend follows a modular approach, which is a fundamental principle when working with NestJS. Make sure you break down your code into reusable modules to maintain a clean and organized codebase. -Each module should encapsulate a particular feature or functionality and have a well-defined scope. This modular approach enables clear separation of concerns and removes unnecessary complexities. +El backend sigue un enfoque modular, que es un principio fundamental al trabajar con NestJS. Asegúrese de descomponer su código en módulos reutilizables para mantener una base de código limpia y organizada. +Cada módulo debe encapsular una característica o funcionalidad particular y tener un alcance bien definido. Este enfoque modular permite una clara separación de responsabilidades y elimina complejidades innecesarias. -## Expose services to use in modules +## Exponer servicios para usar en módulos -Always create services that have a clear and single responsibility, which enhances code readability and maintainability. Name the services descriptively and consistently. +Siempre cree servicios que tengan una responsabilidad clara y única, lo que mejora la legibilidad y mantenibilidad del código. Nombre los servicios de manera descriptiva y consistente. -You should also expose services that you want to use in other modules. Exposing services to other modules is possible through NestJS's powerful dependency injection system, and promotes loose coupling between components. +También debe exponer servicios que desee usar en otros módulos. Exponer servicios a otros módulos es posible a través del poderoso sistema de inyección de dependencias de NestJS, y promueve un acoplamiento débil entre los componentes. -## Avoid using `any` type +## Evitar usar el tipo `any` -When you declare a variable as `any`, TypeScript's type checker doesn't perform any type checking, making it possible to assign any type of values to the variable. TypeScript uses type inference to determine the type of variable based on the value. By declaring it as `any`, TypeScript can no longer infer the type. This makes it hard to catch type-related errors during development, leading to runtime errors and makes the code less maintainable, less reliable, and harder to understand for others. +Cuando declara una variable como `any`, el verificador de tipos de TypeScript no realiza ninguna comprobación de tipos, lo que hace posible asignar cualquier tipo de valores a la variable. TypeScript utiliza la inferencia de tipos para determinar el tipo de la variable a partir del valor. Al declararlo como `any`, TypeScript ya no puede inferir el tipo. Esto dificulta la captura de errores relacionados con el tipo durante el desarrollo, lo que lleva a errores en tiempo de ejecución y hace que el código sea menos mantenible, menos fiable y más difícil de entender para otros. -This is why everything should have a type. So if you create a new object with a first name and last name, you should create an interface or type that contains a first name and last name that defines the shape of the object you are manipulating. +Por eso todo debe tener un tipo. Entonces, si crea un nuevo objeto con un nombre y apellido, debe crear una interfaz o tipo que contenga un nombre y apellido y defina la forma del objeto que está manipulando. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx index 7feec7a639..7ce5c14c0b 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx @@ -1,39 +1,39 @@ --- -title: Custom Objects +title: Objetos personalizados --- -Objects are structures that allow you to store data (records, attributes, and values) specific to an organization. Twenty provides both standard and custom objects. +Los objetos son estructuras que te permiten almacenar datos (registros, atributos y valores) específicos de una organización. Twenty proporciona tanto objetos estándar como personalizados. -Standard objects are in-built objects with a set of attributes available for all users. Examples of standard objects in Twenty include Company and Person. Standard objects have standard fields that are also available for all Twenty users, like Company.displayName. +Los objetos estándar son objetos incorporados con un conjunto de atributos disponibles para todos los usuarios. Ejemplos de objetos estándar en Twenty incluyen Empresa y Persona. Los objetos estándar tienen campos estándar que también están disponibles para todos los usuarios de Twenty, como Company.displayName. -Custom objects are objects that you can create to store information that is unique to your organization. They are not built-in; members of your workspace can create and customize custom objects to hold information that standard objects aren't suitable for. +Los objetos personalizados son objetos que puedes crear para almacenar información que es única para tu organización. No están incorporados; los miembros de tu espacio de trabajo pueden crear y personalizar objetos personalizados para albergar información para la cual los objetos estándar no son aptos. -## High-level schema +## Esquema de alto nivel
- High level schema + Esquema de alto nivel

-## How it works +## Cómo funciona -Custom objects come from metadata tables that determine the shape, name, and type of the objects. All this information is present in the metadata schema database, consisting of tables: +Los objetos personalizados provienen de tablas de metadatos que determinan la forma, el nombre y el tipo de los objetos. Toda esta información está presente en la base de datos del esquema de metadatos, que consta de tablas: -* **DataSource**: Details where the data is present. -* **Object**: Describes the object and links to a DataSource. -* **Field**: Outlines an Object's fields and connects to the Object. +* **DataSource**: Detalles de dónde se encuentra la información. +* **Object**: Describe el objeto y lo vincula a un DataSource. +* **Field**: Describe los campos de un objeto y lo conecta al objeto. -To add a custom object, the workspaceMember will query the /metadata API. This updates the metadata accordingly and computes a GraphQL schema based on the metadata, storing it in a GQL cache for later use. +Para añadir un objeto personalizado, el workspaceMember consultará la API de /metadata. Esto actualiza los metadatos de acuerdo y calcula un esquema GraphQL basado en los metadatos, almacenándolo en un caché de GQL para su uso posterior.
- Query the /metadata API to add custom objects + Consultando la API de /metadata para añadir objetos personalizados

-To fetch data, the process involves making queries through the /graphql endpoint and passing them through the Query Resolver. +Para obtener datos, el proceso implica hacer consultas a través del endpoint /graphql y pasarlos a través del Query Resolver.
- Query the /graphql endpoint to fetch data + Consulta el endpoint /graphql para obtener datos
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx index a261cfec3c..5800b04a44 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/feature-flags.mdx @@ -1,12 +1,12 @@ --- -title: Feature Flags +title: Indicadores de característica --- -Feature flags are used to hide experimental features. For Twenty, they are set on workspace level and not on a user level. +Los indicadores de característica se usan para ocultar características experimentales. Para Twenty, se configuran a nivel de espacio de trabajo y no a nivel de usuario. -## Adding a new feature flag +## Agregar un nuevo indicador de característica -In `FeatureFlagKey.ts` add the feature flag: +En `FeatureFlagKey.ts` agrega el indicador de característica: ```ts type FeatureFlagKey = @@ -14,7 +14,7 @@ type FeatureFlagKey = | ...; ``` -Also add it to the enum in `feature-flag.entity.ts`: +También agrégalo al enum en `feature-flag.entity.ts`: ```ts enum FeatureFlagKeys { @@ -23,7 +23,7 @@ enum FeatureFlagKeys { } ``` -To apply a feature flag on a **backend** feature use: +Para aplicar un indicador de característica en una característica de **backend** usa: ```ts @Gate({ @@ -31,16 +31,16 @@ To apply a feature flag on a **backend** feature use: }) ``` -To apply a feature flag on a **frontend** feature use: +Para aplicar un indicador de característica en una característica de **frontend** usa: ```ts const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED'); ``` -## Configure feature flags for the deployment +## Configurar indicadores de característica para el despliegue -Change the corresponding record in the Table `core.featureFlag`: +Cambie el registro correspondiente en la Tabla `core.featureFlag`: -| id | key | workspaceId | value | -| ------ | ------------------------ | ----------- | ------ | -| Random | `IS_FEATURENAME_ENABLED` | WorkspaceID | `true` | +| iD | clave | workspaceId | valor | +| --------- | ------------------------ | ------------------------- | ----------- | +| Aleatorio | `IS_FEATURENAME_ENABLED` | ID del espacio de trabajo | `verdadero` | diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx index 233d92ac8a..681229a498 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/folder-architecture-server.mdx @@ -1,12 +1,12 @@ --- -title: Folder Architecture -info: A detailed look into our server folder architecture +title: Arquitectura de Carpetas +info: Una mirada detallada a la arquitectura de carpetas de nuestro servidor --- -The backend directory structure is as follows: +La estructura del directorio backend es la siguiente: ``` -server +servidor └───ability └───constants └───core @@ -21,105 +21,105 @@ server └───utils ``` -## Ability +## Habilidad -Defines permissions and includes handlers for each entity. +Define permisos e incluye gestores para cada entidad. -## Decorators +## Decoradores -Defines custom decorators in NestJS for added functionality. +Define decoradores personalizados en NestJS para funcionalidad adicional. -See [custom decorators](https://docs.nestjs.com/custom-decorators) for more details. +Ver [decoradores personalizados](https://docs.nestjs.com/custom-decorators) para más detalles. -## Filters +## Filtros -Includes exception filters to handle exceptions that might occur in GraphQL endpoints. +Incluye filtros de excepciones para manejar excepciones que puedan ocurrir en endpoints de GraphQL. -## Guards +## Guardias -See [guards](https://docs.nestjs.com/guards) for more details. +Ver [guardias](https://docs.nestjs.com/guards) para más detalles. -## Health +## Salud -Includes a publicly available REST API (healthz) that returns a JSON to confirm whether the database is working as expected. +Incluye una API REST públicamente disponible (healthz) que devuelve un JSON para confirmar si la base de datos está funcionando como se esperaba. -## Metadata +## Metadatos -Defines custom objects and makes available a GraphQL API (graphql/metadata). +Define objetos personalizados y hace disponible una API de GraphQL (graphql/metadata). -## Workspace +## Espacio de trabajo -Generates and serves custom GraphQL schema based on the metadata. +Genera y sirve un esquema GraphQL personalizado basado en los metadatos. -### Workspace Directory Structure +### Estructura del Directorio de Espacio de Trabajo ``` workspace - └───workspace-schema-builder - └───factories - └───graphql-types - └───database + └───construcción-esquema-espacio-de-trabajo + └───fábricas + └───tipos-graphql + └───bases-datos └───interfaces - └───object-definitions - └───services - └───storage - └───utils - └───workspace-resolver-builder - └───factories + └───definiciones-objetos + └───servicios + └───almacenamiento + └───utilidades + └───constructor-resolver-espacio-de-trabajo + └───fábricas └───interfaces - └───workspace-query-builder - └───factories + └───constructor-consultas-espacio-de-trabajo + └───fábricas └───interfaces - └───workspace-query-runner + └───ejecutor-consultas-espacio-de-trabajo └───interfaces - └───utils - └───workspace-datasource - └───workspace-manager - └───workspace-migration-runner - └───utils - └───workspace.module.ts - └───workspace.factory.spec.ts - └───workspace.factory.ts + └───utilidades + └───fuente-datos-espacio-de-trabajo + └───gestor-espacio-de-trabajo + └───ejecutor-migraciones-espacio-de-trabajo + └───utilidades + └───espacio.trabajo.module.ts + └───espacio.trabajo.factory.spec.ts + └───espacio.trabajo.factory.ts ``` -The root of the workspace directory includes the `workspace.factory.ts`, a file containing the `createGraphQLSchema` function. This function generates workspace-specific schema by using the metadata to tailor a schema for individual workspaces. By separating the schema and resolver construction, we use the `makeExecutableSchema` function, which combines these discrete elements. +La raíz del directorio de espacio de trabajo incluye el `espacio.trabajo.factory.ts`, un archivo que contiene la función `createGraphQLSchema`. Esta función genera un esquema específico para el espacio de trabajo utilizando los metadatos para adaptar un esquema para espacios de trabajo individuales. Al separar la construcción del esquema y del resolver, usamos la función `makeExecutableSchema`, que combina estos elementos discretos. -This strategy is not just about organization, but also helps with optimization, such as caching generated type definitions to enhance performance and scalability. +Esta estrategia no solo se trata de organización, sino que también ayuda con la optimización, como el almacenamiento en caché de definiciones de tipos generados para mejorar el rendimiento y la escalabilidad. -### Workspace Schema builder +### Constructor de Esquema de Espacio de Trabajo -Generates the GraphQL schema, and includes: +Genera el esquema GraphQL, e incluye: -#### Factories: +#### Fábricas: -Specialised constructors to generate GraphQL-related constructs. +Constructores especializados para generar constructos relacionados con GraphQL. -* The type.factory translates field metadata into GraphQL types using `TypeMapperService`. -* The type-definition.factory creates GraphQL input or output objects derived from `objectMetadata`. +* La fábrica de tipos traduce los metadatos de los campos en tipos GraphQL utilizando `TypeMapperService`. +* La fábrica de definiciones de tipos crea objetos de entrada o salida de GraphQL derivados de `objectMetadata`. -#### GraphQL Types +#### Tipos GraphQL -Includes enumerations, inputs, objects, and scalars, and serves as the building blocks for the schema construction. +Incluye enumeraciones, entradas, objetos y escalares, y sirve como bloques de construcción para la construcción del esquema. -#### Interfaces and Object Definitions +#### Interfaces y Definiciones de Objetos -Contains the blueprints for GraphQL entities, and includes both predefined and custom types like `MONEY` or `URL`. +Contiene los planos para entidades GraphQL, e incluye tanto tipos predefinidos como personalizados como `MONEY` o `URL`. -#### Services +#### Servicios -Contains the service responsible for associating FieldMetadataType with its appropriate GraphQL scalar or query modifiers. +Contiene el servicio responsable de asociar FieldMetadataType con su escalar de GraphQL apropiado o modificadores de consulta. -#### Storage +#### Almacenamiento -Includes the `TypeDefinitionsStorage` class that contains reusable type definitions, preventing duplication of GraphQL types. +Incluye la clase `TypeDefinitionsStorage` que contiene definiciones de tipos reutilizables, previniendo duplicación de tipos GraphQL. -### Workspace Resolver Builder +### Constructor de Resolver de Espacio de Trabajo -Creates resolver functions for querying and mutating the GraphQL schema. +Crea funciones de resolutor para consultar y modificar el esquema GraphQL. -Each factory in this directory is responsible for producing a distinct resolver type, such as the `FindManyResolverFactory`, designed for adaptable application across various tables. +Cada fábrica en este directorio es responsable de producir un tipo de resolutor distinto, como el `FindManyResolverFactory`, diseñado para aplicación adaptable a través de varias tablas. -### Workspace Query Runner +### Ejecutor de Consultas de Espacio de Trabajo -Runs the generated queries on the database and parses the result. +Ejecuta las consultas generadas en la base de datos y analiza el resultado. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx index 6148c0fbf0..d814f2fd13 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx @@ -1,20 +1,20 @@ --- -title: Message Queue +title: Cola de Mensajes --- -Queues facilitate async operations to be performed. They can be used for performing background tasks such as sending a welcome email on register. -Each use case will have its own queue class extended from `MessageQueueServiceBase`. +Las colas facilitan la realización de operaciones asíncronas. Se pueden utilizar para realizar tareas en segundo plano, como enviar un correo de bienvenida al registrarse. +Cada caso de uso tendrá su propia clase de cola extendida de `MessageQueueServiceBase`. -Currently, we only support `bull-mq`[bull-mq](https://bullmq.io/) as the queue driver. +Actualmente, solo soportamos `bull-mq`[bull-mq](https://bullmq.io/) como el controlador de cola. -## Steps to create and use a new queue +## Pasos para crear y usar una nueva cola -1. Add a queue name for your new queue under enum `MESSAGE_QUEUES`. -2. Provide the factory implementation of the queue with the queue name as the dependency token. -3. Inject the queue that you created in the required module/service with the queue name as the dependency token. -4. Add worker class with token based injection just like producer. +1. Agregue un nombre de cola para su nueva cola en la enumeración `MESSAGE_QUEUES`. +2. Proporcione la implementación de fábrica de la cola con el nombre de la cola como el token de dependencia. +3. Inyecte la cola que creó en el módulo/servicio requerido con el nombre de la cola como el token de dependencia. +4. Agregue una clase de trabajador con inyección basada en token, al igual que el productor. -### Example usage +### Ejemplo de uso ```ts class Resolver { diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx index 6951909788..23a323a5a4 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/server-commands.mdx @@ -1,19 +1,19 @@ --- -title: Backend Commands +title: Comandos de Backend --- -## Useful commands +## Comandos útiles -These commands should be executed from packages/twenty-server folder. -From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`). +Estos comandos deben ejecutarse desde la carpeta packages/twenty-server. +Desde cualquier otra carpeta, puedes ejecutar `npx nx {command} twenty-server` (o `npx nx run twenty-server:{command}`). -### First time setup +### Configuración inicial ``` npx nx database:reset twenty-server # setup the database with dev seeds ``` -### Starting the server +### Iniciando el servidor ``` npx nx run twenty-server:start @@ -25,53 +25,52 @@ npx nx run twenty-server:start npx nx run twenty-server:lint # pass --fix to fix lint errors ``` -### Test +### Prueba ``` npx nx run twenty-server:test:unit # run unit tests npx nx run twenty-server:test:integration # run integration tests ``` -Note: you can run `npx nx run twenty-server:test:integration:with-db-reset` in case you need to reset the database before running the integration tests. +Nota: puedes ejecutar `npx nx run twenty-server:test:integration:with-db-reset` en caso de que necesites restablecer la base de datos antes de ejecutar las pruebas de integración. -### Resetting the database +### Restablecer la base de datos -If you want to reset and seed the database, you can run the following command: +Si deseas restablecer y sembrar la base de datos, puedes ejecutar el siguiente comando: ```bash npx nx run twenty-server:database:reset ``` -### Migrations +### Migraciones -#### For objects in Core/Metadata schemas (TypeORM) +#### Para objetos en esquemas Core/Metadata (TypeORM) ```bash npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts ``` -#### For Workspace objects +#### Para objetos de Workspace -There are no migrations files, migration are generated automatically for each workspace, -stored in the database, and applied with this command +No hay archivos de migraciones, las migraciones se generan automáticamente para cada espacio de trabajo, se almacenan en la base de datos y se aplican con este comando ```bash npx nx run twenty-server:command workspace:sync-metadata -f ``` - This will drop the database and re-run the migrations and seed. + Esto eliminará la base de datos y volverá a ejecutar las migraciones y semillas. - Make sure to back up any data you want to keep before running this command. + Asegúrate de respaldar cualquier dato que desees conservar antes de ejecutar este comando. -## Tech Stack +## Stack Tecnológico -Twenty primarily uses NestJS for the backend. +Twenty utiliza principalmente NestJS para el backend. -Prisma was the first ORM we used. But in order to allow users to create custom fields and custom objects, a lower-level made more sense as we need to have fine-grained control. The project now uses TypeORM. +Prisma fue el primer ORM que usamos. Pero para permitir a los usuarios crear campos y objetos personalizados, un nivel más bajo tenía más sentido ya que necesitamos tener un control detallado. El proyecto ahora usa TypeORM. -Here's what the tech stack now looks like. +Así es como se ve la pila tecnológica ahora. **Core** @@ -79,23 +78,23 @@ Here's what the tech stack now looks like. * [TypeORM](https://typeorm.io/) * [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server) -**Database** +**Base de datos** * [Postgres](https://www.postgresql.org/) -**Third-party integrations** +**Integraciones de terceros** -* [Sentry](https://sentry.io/welcome/) for tracking bugs +* [Sentry](https://sentry.io/welcome/) para rastrear errores -**Testing** +**Pruebas** * [Jest](https://jestjs.io/) -**Tooling** +**Herramientas** * [Yarn](https://yarnpkg.com/) * [ESLint](https://eslint.org/) -**Development** +**Desarrollo** * [AWS EKS](https://aws.amazon.com/eks/) diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx index 46bcd563fc..3a853d4d22 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/zapier.mdx @@ -1,18 +1,18 @@ --- -title: Zapier App +title: Aplicación Zapier --- -Effortlessly sync Twenty with 3000+ apps using [Zapier](https://zapier.com/). Automate tasks, boost productivity, and supercharge your customer relationships! +Sincroniza sin esfuerzo Twenty con más de 3000 aplicaciones usando [Zapier](https://zapier.com/). ¡Automatiza tareas, mejora la productividad y potencia tus relaciones con los clientes! -## About Zapier +## Acerca de Zapier -Zapier is a tool that allows you to automate workflows by connecting the apps that your team uses every day. The fundamental concept of Zapier is automation workflows, called Zaps, and include triggers and actions. +Zapier es una herramienta que permite automatizar flujos de trabajo al conectar las aplicaciones que tu equipo utiliza a diario. El concepto fundamental de Zapier son los flujos de trabajo automatizados, llamados Zaps, que incluyen desencadenantes y acciones. -You can learn more about how Zapier works [here](https://zapier.com/how-it-works). +Puedes aprender más sobre cómo funciona Zapier [aquí](https://zapier.com/how-it-works). -## Setup +## Configuración -### Step 1: Install Zapier packages +### Paso 1: Instalar paquetes de Zapier ```bash cd packages/twenty-zapier @@ -20,33 +20,33 @@ cd packages/twenty-zapier yarn ``` -### Step 2: Login with the CLI +### Paso 2: Iniciar sesión con la CLI -Use your Zapier credentials to log in using the CLI: +Utiliza tus credenciales de Zapier para iniciar sesión usando la CLI: ```bash zapier login ``` -### Step 3: Set environment variables +### Paso 3: Configurar variables de entorno -From the `packages/twenty-zapier` folder, run: +Desde la carpeta `packages/twenty-zapier`, ejecuta: ```bash cp .env.example .env ``` -Run the application locally, go to [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), and generate an API key. +Ejecuta la aplicación localmente, ve a [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks) y genera una clave API. -Replace the **YOUR_API_KEY** value in the `.env` file with the API key you just generated. +Reemplaza el valor de **YOUR_API_KEY** en el archivo `.env` con la clave API que acabas de generar. -## Development +## Desarrollo - Make sure to run `yarn build` before any `zapier` command. + Asegúrate de ejecutar `yarn build` antes de cualquier comando `zapier`. -### Test +### Prueba ```bash yarn test @@ -58,25 +58,25 @@ yarn test yarn format ``` -### Watch and compile as you edit code +### Observa y compila mientras editas el código ```bash yarn watch ``` -### Validate your Zapier app +### Valida tu aplicación Zapier ```bash yarn validate ``` -### Deploy your Zapier app +### Despliega tu aplicación Zapier ```bash yarn deploy ``` -### List all Zapier CLI commands +### Lista todos los comandos de Zapier CLI ```bash zapier diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx index 4db64b703d..fe5ba34c84 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/bug-and-requests.mdx @@ -1,78 +1,78 @@ --- -title: Bugs, Requests & Pull Requests -info: Report issues, request features, and contribute code +title: Errores, solicitudes y pull requests +info: Informa de problemas, solicita funcionalidades y contribuye con código --- -## Reporting Bugs +## Reportar errores -To report a bug, please [create an issue on GitHub](https://github.com/twentyhq/twenty/issues/new). +Para reportar un error, por favor [crea un problema en GitHub](https://github.com/twentyhq/twenty/issues/new). -You can also ask for help on [Discord](https://discord.gg/cx5n4Jzs57). +También puedes pedir ayuda en [Discord](https://discord.gg/cx5n4Jzs57). -## Feature Requests +## Solicitudes de funciones -If you're not sure if it's a bug, and you feel it's closer to a feature request, then you should probably [open a discussion instead](https://github.com/twentyhq/twenty/discussions/new). +Si no estás seguro de si es un error y sientes que está más cerca de una solicitud de función, entonces probablemente deberías [abrir una discusión en su lugar](https://github.com/twentyhq/twenty/discussions/new). -## Submit a Pull Request +## Envía un pull request -Contributing code to Twenty starts with a pull request (PR). +Contribuir código a Twenty comienza con un pull request (PR). -### Before You Start +### Antes de empezar -1. Check [existing issues](https://github.com/twentyhq/twenty/issues) for related work -2. For new features, open an issue first to discuss -3. Review our [Code of Conduct](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md) +1. Consulta [los issues existentes](https://github.com/twentyhq/twenty/issues) para ver trabajos relacionados +2. Para nuevas funcionalidades, abre primero un issue para discutir +3. Revisa nuestro [Código de conducta](https://github.com/twentyhq/twenty/blob/main/CODE_OF_CONDUCT.md) -### Fork and Clone +### Haz un fork y clona -1. Fork the repository on GitHub -2. Clone your fork: +1. Haz un fork del repositorio en GitHub +2. Clona tu fork: ```bash git clone https://github.com/YOUR_USERNAME/twenty.git cd twenty ``` -3. Add upstream remote: +3. Añade el remoto upstream: ```bash git remote add upstream https://github.com/twentyhq/twenty.git ``` -### Create a Branch +### Crea una rama ```bash git checkout -b feature/your-feature-name ``` -Use descriptive branch names: +Usa nombres de rama descriptivos: * `feature/add-export-button` * `fix/login-redirect-issue` * `docs/update-api-guide` -### Make Your Changes +### Realiza tus cambios -1. Write clean, well-documented code -2. Follow existing code style -3. Add tests for new functionality -4. Update documentation if needed +1. Escribe código limpio y bien documentado +2. Sigue el estilo de código existente +3. Añade pruebas para la nueva funcionalidad +4. Actualiza la documentación si es necesario -### Submit Your PR +### Envía tu PR -1. Push your branch: +1. Haz push de tu rama: ```bash git push origin feature/your-feature-name ``` -2. Open a PR on GitHub -3. Fill in the PR template -4. Link related issues +2. Abre un PR en GitHub +3. Rellena la plantilla del PR +4. Vincula los issues relacionados -### PR Checklist +### Lista de verificación de PR -* [ ] Code follows project style guidelines -* [ ] Tests pass locally -* [ ] Documentation is updated -* [ ] PR description explains the changes +* [ ] El código sigue las pautas de estilo del proyecto +* [ ] Las pruebas pasan localmente +* [ ] La documentación está actualizada +* [ ] La descripción del PR explica los cambios diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx index 187c2d848c..f69bb71246 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/best-practices-front.mdx @@ -1,19 +1,19 @@ --- -title: Best Practices +title: Mejores prácticas --- -This document outlines the best practices you should follow when working on the frontend. +Este documento describe las mejores prácticas que debes seguir al trabajar en el frontend. -## State management +## Gestión de estado -React and Recoil handle state management in the codebase. +React y Recoil manejan la gestión de estado en la base de código. -### Use `useRecoilState` to store state +### Usa `useRecoilState` para almacenar el estado -It's good practice to create as many atoms as you need to store your state. +Es buena práctica crear tantos átomos como necesites para almacenar tu estado. - It's better to use extra atoms than trying to be too concise with props drilling. + Es mejor usar átomos adicionales que intentar ser demasiado concisos con la perforación de props. ```tsx @@ -36,29 +36,29 @@ export const MyComponent = () => { } ``` -### Do not use `useRef` to store state +### No uses `useRef` para almacenar el estado -Avoid using `useRef` to store state. +Evita usar `useRef` para almacenar el estado. If you want to store state, you should use `useState` or `useRecoilState`. -See [how to manage re-renders](#managing-re-renders) if you feel like you need `useRef` to prevent some re-renders from happening. +Consulta [cómo gestionar las re-renderizaciones](#managing-re-renders) si sientes que necesitas `useRef` para evitar algunas re-renderizaciones. -## Managing re-renders +## Gestión de las re-renderizaciones -Re-renders can be hard to manage in React. +Las re-renderizaciones pueden ser difíciles de gestionar en React. -Here are some rules to follow to avoid unnecessary re-renders. +Aquí hay algunas reglas a seguir para evitar re-renderizaciones innecesarias. -Keep in mind that you can **always** avoid re-renders by understanding their cause. +Ten en cuenta que siempre puedes evitar re-renderizaciones comprendiendo su causa. -### Work at the root level +### Trabaja a nivel de raíz -Avoiding re-renders in new features is now made easy by eliminating them at the root level. +Ahora es fácil evitar re-renderizaciones en nuevas funciones eliminándolas a nivel de raíz. The `PageChangeEffect` sidecar component contains just one `useEffect` that holds all the logic to execute on a page change. -That way you know that there's just one place that can trigger a re-render. +De esa manera, sabes que solo hay un lugar que puede desencadenar una re-renderización. ### Always think twice before adding `useEffect` in your codebase @@ -68,17 +68,17 @@ You should think whether you need `useEffect`, or if you can move the logic in a You'll find it generally easy to move the logic in a `handleClick` or `handleChange` function. -You can also find them in libraries like Apollo: `onCompleted`, `onError`, etc. +También puedes encontrarlas en bibliotecas como Apollo: `onCompleted`, `onError`, etc. ### Use a sibling component to extract `useEffect` or data fetching logic If you feel like you need to add a `useEffect` in your root component, you should consider extracting it in a sidecar component. -You can apply the same for data fetching logic, with Apollo hooks. +Puedes aplicar lo mismo para la lógica de obtención de datos, con hooks de Apollo. ```tsx -// ❌ Bad, will cause re-renders even if data is not changing, -// because useEffect needs to be re-evaluated +// ❌ Malo, provocará re-renderizados incluso si los datos no cambian, +// porque useEffect necesita volver a evaluarse export const PageComponent = () => { const [data, setData] = useRecoilState(dataState); const [someDependency] = useRecoilState(someDependencyState); @@ -100,8 +100,8 @@ export const App = () => ( ``` ```tsx -// ✅ Good, will not cause re-renders if data is not changing, -// because useEffect is re-evaluated in another sibling component +// ✅ Bueno, no provocará re-renderizados si los datos no cambian, +// porque useEffect se vuelve a evaluar en otro componente hermano export const PageComponent = () => { const [data, setData] = useRecoilState(dataState); @@ -129,84 +129,84 @@ export const App = () => ( ); ``` -### Use recoil family states and recoil family selectors +### Usa estados de familia de recoil y selectores de familia de recoil -Recoil family states and selectors are a great way to avoid re-renders. +Los estados y selectores de familia de recoil son una gran manera de evitar re-renderizaciones. -They are useful when you need to store a list of items. +Son útiles cuando necesitas almacenar una lista de elementos. -### You shouldn't use `React.memo(MyComponent)` +### No deberías usar `React.memo(MyComponent)` -Avoid using `React.memo()` because it does not solve the cause of the re-render, but instead breaks the re-render chain, which can lead to unexpected behavior and make the code very hard to refactor. +Evita usar `React.memo()` porque no resuelve la causa de la re-renderización, sino que rompe la cadena de re-renderización, lo que puede llevar a un comportamiento inesperado y hacer que el código sea muy difícil de refactorizar. -### Limit `useCallback` or `useMemo` usage +### Limita el uso de `useCallback` o `useMemo` -They are often not necessary and will make the code harder to read and maintain for a gain of performance that is unnoticeable. +A menudo no son necesarios y harán que el código sea más difícil de leer y mantener para una ganancia de rendimiento que es imperceptible. ## Console.logs -`console.log` statements are valuable during development, offering real-time insights into variable values and code flow. But, leaving them in production code can lead to several issues: +Las declaraciones `console.log` son valiosas durante el desarrollo, ofreciendo información en tiempo real sobre los valores de las variables y el flujo de código. Pero, dejarlas en el código de producción puede llevar a varios problemas: -1. **Performance**: Excessive logging can affect the runtime performance, especially on client-side applications. +1. **Rendimiento**: El registro excesivo puede afectar el rendimiento en tiempo de ejecución, especialmente en aplicaciones del lado del cliente. -2. **Security**: Logging sensitive data can expose critical information to anyone who inspects the browser's console. +2. **Seguridad**: Registrar datos sensibles puede exponer información crítica a cualquier persona que inspeccione la consola del navegador. -3. **Cleanliness**: Filling up the console with logs can obscure important warnings or errors that developers or tools need to see. +3. **Limpieza**: Llenar la consola con registros puede oscurecer advertencias o errores importantes que los desarrolladores o herramientas necesitan ver. -4. **Professionalism**: End users or clients checking the console and seeing a myriad of log statements might question the code's quality and polish. +4. **Profesionalismo**: Los usuarios finales o clientes que revisen la consola y vean una miríada de declaraciones de registros podrían cuestionar la calidad y el acabado del código. -Make sure you remove all `console.logs` before pushing the code to production. +Asegúrate de eliminar todos los `console.logs` antes de enviar el código a producción. -## Naming +## Nomenclatura -### Variable Naming +### Nombres de variables -Variable names ought to precisely depict the purpose or function of the variable. +Los nombres de variables deben describir con precisión el propósito o función de la variable. -#### The issue with generic names +#### El problema con los nombres genéricos -Generic names in programming are not ideal because they lack specificity, leading to ambiguity and reduced code readability. Such names fail to convey the variable or function's purpose, making it challenging for developers to understand the code's intent without deeper investigation. This can result in increased debugging time, higher susceptibility to errors, and difficulties in maintenance and collaboration. Meanwhile, descriptive naming makes the code self-explanatory and easier to navigate, enhancing code quality and developer productivity. +Los nombres genéricos en programación no son ideales porque carecen de especificidad, lo que lleva a la ambigüedad y reduce la legibilidad del código. Tales nombres no transmiten el propósito de la variable o función, lo que dificulta a los desarrolladores entender la intención del código sin una investigación más profunda. Esto puede resultar en un aumento del tiempo de depuración, una mayor susceptibilidad a errores y dificultades en el mantenimiento y colaboración. Mientras tanto, la nomenclatura descriptiva hace que el código sea autoexplicativo y más fácil de navegar, mejorando la calidad del código y la productividad del desarrollador. ```tsx -// ❌ Bad, uses a generic name that doesn't communicate its -// purpose or content clearly +// ❌ Malo, usa un nombre genérico que no comunica claramente su +// propósito o contenido const [value, setValue] = useState(''); ``` ```tsx -// ✅ Good, uses a descriptive name +// ✅ Bueno, usa un nombre descriptivo const [email, setEmail] = useState(''); ``` -#### Some words to avoid in variable names +#### Algunas palabras a evitar en los nombres de variables -* dummy +* ficticio -### Event handlers +### Manejadores de eventos -Event handler names should start with `handle`, while `on` is a prefix used to name events in components props. +Los nombres de manejadores de eventos deben comenzar con `handle`, mientras que `on` es un prefijo usado para nombrar eventos en las props de los componentes. ```tsx -// ❌ Bad +// ❌ Malo const onEmailChange = (val: string) => { // ... }; ``` ```tsx -// ✅ Good +// ✅ Bueno const handleEmailChange = (val: string) => { // ... }; ``` -## Optional Props +## Props opcionales -Avoid passing the default value for an optional prop. +Evita pasar el valor predeterminado para una prop opcional. -**EXAMPLE** +**EJEMPLO** -Take the`EmailField` component defined below: +Toma el componente `EmailField` definido a continuación: ```tsx type EmailFieldProps = { @@ -219,28 +219,28 @@ const EmailField = ({ value, disabled = false }: EmailFieldProps) => ( ); ``` -**Usage** +**Uso** ```tsx -// ❌ Bad, passing in the same value as the default value adds no value +// ❌ Malo, pasar el mismo valor que el valor predeterminado no aporta nada const Form = () => ; ``` ```tsx -// ✅ Good, assumes the default value +// ✅ Bueno, asume el valor predeterminado const Form = () => ; ``` -## Component as props +## Componente como props -Try as much as possible to pass uninstantiated components as props, so children can decide on their own of what props they need to pass. +Intenta tanto como sea posible pasar componentes no instanciados como propiedades, para que los hijos puedan decidir por sí mismos qué propiedades necesitan pasar. -The most common example for that is icon components: +El ejemplo más común de esto son los componentes de icono: ```tsx const SomeParentComponent = () => ; -// In MyComponent +// En MyComponent const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => { const theme = useTheme(); @@ -252,25 +252,25 @@ const MyComponent = ({ MyIcon }: { MyIcon: IconComponent }) => { }; ``` -For React to understand that the component is a component, you need to use PascalCase, to later instantiate it with `` +Para que React entienda que el componente es un componente, necesitas usar PascalCase, para luego instanciarlo con `` -## Prop Drilling: Keep It Minimal +## Prop Drilling: Mantenlo Minimalista -Prop drilling, in the React context, refers to the practice of passing state variables and their setters through many component layers, even if intermediary components don't use them. While sometimes necessary, excessive prop drilling can lead to: +El prop drilling, en el contexto de React, se refiere a la práctica de pasar variables de estado y sus setters a través de muchas capas de componentes, incluso si los componentes intermedios no los usan. Aunque a veces es necesario, el exceso de prop drilling puede llevar a: -1. **Decreased Readability**: Tracing where a prop originates or where it's utilized can become convoluted in a deeply nested component structure. +1. **Readabilidad Reducida**: Rastrear de dónde proviene una propiedad o dónde se utiliza puede volverse complicado en una estructura de componentes muy anidada. -2. **Maintenance Challenges**: Changes in one component's prop structure might require adjustments in several components, even if they don't directly use the prop. +2. **Desafíos de Mantenimiento**: Los cambios en la estructura de propiedades de un componente podrían requerir ajustes en varios componentes, incluso si no utilizan directamente la propiedad. -3. **Reduced Component Reusability**: A component receiving a lot of props solely for passing them down becomes less general-purpose and harder to reuse in different contexts. +3. **Reducción de la Reusabilidad del Componente**: Un componente que recibe muchas propiedades solo para pasarlas se vuelve menos general y más difícil de reutilizar en diferentes contextos. -If you feel that you are using excessive prop drilling, see [state management best practices](#state-management). +Si sientes que estás usando en exceso el prop drilling, consulta [mejores prácticas de gestión de estado](#state-management). -## Imports +## Importar -When importing, opt for the designated aliases rather than specifying complete or relative paths. +Al importar, opta por los alias designados en lugar de especificar rutas completas o relativas. -**The Aliases** +**Alias del identificador** ```js { @@ -282,10 +282,10 @@ When importing, opt for the designated aliases rather than specifying complete o } ``` -**Usage** +**Uso** ```tsx -// ❌ Bad, specifies the entire relative path +// ❌ Malo, especifica toda la ruta relativa import { CatalogDecorator } from '../../../../../testing/decorators/CatalogDecorator'; @@ -295,14 +295,14 @@ import { ``` ```tsx -// ✅ Good, utilises the designated aliases +// ✅ Bueno, utiliza los alias designados import { CatalogDecorator } from '~/testing/decorators/CatalogDecorator'; import { ComponentDecorator } from 'twenty-ui/testing'; ``` -## Schema Validation +## Validación de Esquema -[Zod](https://github.com/colinhacks/zod) is the schema validator for untyped objects: +[Zod](https://github.com/colinhacks/zod) es el validador de esquemas para objetos no tipados: ```js const validationSchema = z @@ -310,16 +310,16 @@ const validationSchema = z exist: z.boolean(), email: z .string() - .email('Email must be a valid email'), + .email('El correo electrónico debe ser válido'), password: z .string() - .regex(PASSWORD_REGEX, 'Password must contain at least 8 characters'), + .regex(PASSWORD_REGEX, 'La contraseña debe contener al menos 8 caracteres'), }) .required(); type Form = z.infer; ``` -## Breaking Changes +## Cambios Cruciales -Always perform thorough manual testing before proceeding to guarantee that modifications haven’t caused disruptions elsewhere, given that tests have not yet been extensively integrated. +Siempre ejecuta pruebas manuales exhaustivas antes de proceder para garantizar que las modificaciones no hayan causado interrupciones en otras partes, dado que las pruebas aún no se han integrado extensivamente. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx index 064ac5c256..3043db00b0 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx @@ -1,11 +1,11 @@ --- -title: Folder Architecture -info: A detailed look into our folder architecture +title: Arquitectura de Carpetas +info: Una mirada detallada a nuestra arquitectura de carpetas --- -In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty. +En esta guía, explorarás los detalles de la estructura del directorio del proyecto y cómo contribuye a la organización y mantenibilidad de Twenty. -By following this folder architecture convention, it's easier to find the files related to specific features and ensure that the application is scalable and maintainable. +Siguiendo esta convención de arquitectura de carpetas, es más fácil encontrar los archivos relacionados con funciones específicas y asegurar que la aplicación sea escalable y mantenible. ``` front @@ -22,14 +22,14 @@ front └───... ``` -## Pages +## Páginas -Includes the top-level components defined by the application routes. They import more low-level components from the modules folder (more details below). +Incluye los componentes de alto nivel definidos por las rutas de la aplicación. Importan más componentes de bajo nivel de la carpeta de módulos (más detalles abajo). -## Modules +## Módulos -Each module represents a feature or a group of feature, comprising its specific components, states, and operational logic. -They should all follow the structure below. You can nest modules within modules (referred to as submodules) and the same rules will apply. +Cada módulo representa una función o un grupo de funciones, comprendiendo sus componentes específicos, estados y lógica operativa. +Todos deberían seguir la estructura siguiente. Puedes anidar módulos dentro de módulos (denominados submódulos) y se aplicarán las mismas reglas. ``` module1 @@ -50,60 +50,60 @@ module1 └───utils ``` -### Contexts +### Contextos -A context is a way to pass data through the component tree without having to pass props down manually at every level. +Un contexto es una manera de pasar datos a través del árbol de componentes sin tener que pasar propiedades manualmente en cada nivel. -See [React Context](https://react.dev/reference/react#context-hooks) for more details. +Ver [React Context](https://react.dev/reference/react#context-hooks) para más detalles. ### GraphQL -Includes fragments, queries, and mutations. +Incluye fragmentos, consultas y mutaciones. -See [GraphQL](https://graphql.org/learn/) for more details. +Ver [GraphQL](https://graphql.org/learn/) para más detalles. -* Fragments +* Fragmentos -A fragment is a reusable piece of a query, which you can use in different places. By using fragments, it's easier to avoid duplicating code. +Un fragmento es una parte reutilizable de una consulta, que puedes usar en diferentes lugares. Usando fragmentos, es más fácil evitar la duplicación de código. -See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details. +Ver [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) para más detalles. -* Queries +* Consultas -See [GraphQL Queries](https://graphql.org/learn/queries/) for more details. +Ver [GraphQL Queries](https://graphql.org/learn/queries/) para más detalles. -* Mutations +* Mutaciones -See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details. +Ver [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) para más detalles. ### Hooks -See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details. +Ver [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) para más detalles. -### States +### Estados -Contains the state management logic. [RecoilJS](https://recoiljs.org) handles this. +Contiene la lógica de gestión de estado. [RecoilJS](https://recoiljs.org) maneja esto. -* Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details. +* Selectores: Ver [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) para más detalles. -React's built-in state management still handles state within a component. +La gestión de estado incorporada de React todavía maneja el estado dentro de un componente. -### Utils +### Utilidades -Should just contain reusable pure functions. Otherwise, create custom hooks in the `hooks` folder. +Debería contener solo funciones puras reutilizables. De lo contrario, crea hooks personalizados en la carpeta `hooks`. -## UI +## Interfaz de usuario -Contains all the reusable UI components used in the application. +Contiene todos los componentes de interfaz de usuario reutilizables utilizados en la aplicación. -This folder can contain sub-folders, like `data`, `display`, `feedback`, and `input` for specific types of components. Each component should be self-contained and reusable, so that you can use it in different parts of the application. +Esta carpeta puede contener subcarpetas, como `datos`, `visualización`, `retroalimentación` y `entrada` para tipos específicos de componentes. Cada componente debe ser autónomo y reutilizable, para que puedas usarlo en diferentes partes de la aplicación. -By separating the UI components from the other components in the `modules` folder, it's easier to maintain a consistent design and to make changes to the UI without affecting other parts (business logic) of the codebase. +Al separar los componentes de la interfaz de usuario de otros componentes en la carpeta `modules`, es más fácil mantener un diseño consistente y realizar cambios en la interfaz de usuario sin afectar otras partes (lógica de negocio) del código base. -## Interface and dependencies +## Interfaz y dependencias -You can import other module code from any module except for the `ui` folder. This will keep its code easy to test. +Puedes importar otro código de módulo desde cualquier módulo excepto desde la carpeta `ui`. Esto mantendrá su código fácil de probar. -### Internal +### Interno -Each part (hooks, states, ...) of a module can have an `internal` folder, which contains parts that are just used within the module. +Cada parte (hooks, estados, ...) de un módulo puede tener una carpeta `internal`, que contiene partes que se usan solo dentro del módulo. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx index dfbe97af88..cd8c36551b 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/frontend-commands.mdx @@ -1,22 +1,22 @@ --- -title: Frontend Commands +title: Comandos del Frontend --- -## Useful commands +## Comandos útiles -### Starting the app +### Iniciando la aplicación ```bash npx nx start twenty-front ``` -### Regenerate graphql schema based on API graphql schema +### Regenerar el esquema de graphql basado en el esquema API graphql ```bash npx nx run twenty-front:graphql:generate --configuration=metadata ``` -OR +O ```bash npx nx run twenty-front:graphql:generate @@ -25,30 +25,30 @@ npx nx run twenty-front:graphql:generate ### Lint ```bash -npx nx run twenty-front:lint # pass --fix to fix lint errors +npx nx run twenty-front:lint # pasar --fix para corregir errores de lint ``` -## Translations +## Traducciones ```bash npx nx run twenty-front:lingui:extract npx nx run twenty-front:lingui:compile ``` -### Test +### Prueba ```bash -npx nx run twenty-front:test # run jest tests -npx nx run twenty-front:storybook:serve:dev # run storybook -npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve:dev to be running) -npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running) +npx nx run twenty-front:test # ejecutar pruebas con Jest +npx nx run twenty-front:storybook:serve:dev # ejecutar Storybook +npx nx run twenty-front:storybook:test # ejecutar pruebas # (requiere que yarn storybook:serve:dev esté en ejecución) +npx nx run twenty-front:storybook:coverage # (requiere que yarn storybook:serve:dev esté en ejecución) ``` -## Tech Stack +## Stack Tecnológico -The project has a clean and simple stack, with minimal boilerplate code. +El proyecto tiene un stack limpio y sencillo, con un código boilerplate mínimo. -**App** +**Aplicación** * [React](https://react.dev/) * [Apollo](https://www.apollographql.com/docs/) @@ -56,35 +56,35 @@ The project has a clean and simple stack, with minimal boilerplate code. * [Recoil](https://recoiljs.org/docs/introduction/core-concepts) * [TypeScript](https://www.typescriptlang.org/) -**Testing** +**Pruebas** * [Jest](https://jestjs.io/) * [Storybook](https://storybook.js.org/) -**Tooling** +**Herramientas** * [Yarn](https://yarnpkg.com/) * [Craco](https://craco.js.org/docs/) * [ESLint](https://eslint.org/) -## Architecture +## Arquitectura -### Routing +### Enrutamiento -[React Router](https://reactrouter.com/) handles the routing. +[React Router](https://reactrouter.com/) maneja el enrutamiento. To avoid unnecessary [re-renders](/l/es/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) all the routing logic is in a `useEffect` in `PageChangeEffect`. -### State Management +### Gestión del Estado -[Recoil](https://recoiljs.org/docs/introduction/core-concepts) handles state management. +[Recoil](https://recoiljs.org/docs/introduction/core-concepts) maneja la gestión del estado. -See [best practices](/l/es/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) for more information on state management. +Ver [mejores prácticas](/l/es/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) para más información sobre la gestión del estado. -## Testing +## Pruebas -[Jest](https://jestjs.io/) serves as the tool for unit testing while [Storybook](https://storybook.js.org/) is for component testing. +[Jest](https://jestjs.io/) sirve como la herramienta para pruebas unitarias mientras [Storybook](https://storybook.js.org/) es para pruebas de componentes. -Jest is mainly for testing utility functions, and not components themselves. +Jest es principalmente para probar funciones utilitarias, y no los componentes en sí mismos. -Storybook is for testing the behavior of isolated components, as well as displaying the design system. +Storybook es para probar el comportamiento de componentes aislados, así como mostrar el sistema de diseño. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx index 43cde50e63..9f78bbb54b 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx @@ -1,42 +1,42 @@ --- -title: Hotkeys +title: Atajos de teclado --- -## Introduction +## Introducción -When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener. +Cuando necesitas escuchar una tecla de acceso rápido, normalmente usarías el evento `onKeyDown`. -In `twenty-front` however, you might have conflicts between same hotkeys that are used in different components, mounted at the same time. +En `twenty-front`, sin embargo, podrías tener conflictos entre los mismos atajos de teclado utilizados en diferentes componentes, montados al mismo tiempo. -For example, if you have a page that listens for the Enter key, and a modal that listens for the Enter key, with a Select component inside that modal that listens for the Enter key, you might have a conflict when all are mounted at the same time. +Por ejemplo, si tienes una página que escucha la tecla Enter y un modal que escucha la tecla Enter, con un componente Select dentro de ese modal que también escucha la tecla Enter, podrías tener un conflicto cuando todos están montados al mismo tiempo. -## The `useScopedHotkeys` hook +## El gancho `useScopedHotkeys` -To handle this problem, we have a custom hook that makes it possible to listen to hotkeys without any conflict. +Para manejar este problema, tenemos un gancho personalizado que hace posible escuchar atajos de teclado sin ningún conflicto. -You place it in a component, and it will listen to the hotkeys only when the component is mounted AND when the specified **hotkey scope** is active. +Lo colocas en un componente, y escuchará los atajos de teclado solo cuando el componente está montado Y cuando el **ámbito del atajo de teclado** especificado está activo. -## How to listen for hotkeys in practice? +## ¿Cómo escuchar atajos de teclado en la práctica? -There are two steps involved in setting up hotkey listening : +Hay dos pasos involucrados en configurar la escucha de atajos de teclado: -1. Set the [hotkey scope](#what-is-a-hotkey-scope-) that will listen to hotkeys -2. Use the `useScopedHotkeys` hook to listen to hotkeys +1. Establece el [ámbito del atajo de teclado](#qué-es-un-ambito-de-atajo-de-teclado-) que escuchará los atajos de teclado +2. Usa el gancho `useScopedHotkeys` para escuchar atajos de teclado -Setting up hotkey scopes is required even in simple pages, because other UI elements like left menu or command menu might also listen to hotkeys. +Configurar los ámbitos de atajos de teclado es necesario incluso en páginas simples, porque otros elementos de la interfaz de usuario como el menú lateral o el menú de comandos también podrían escuchar atajos de teclado. -## Use cases for hotkeys +## Casos de uso para atajos de teclado -In general, you'll have two use cases that require hotkeys : +En general, tendrás dos casos de uso que requieren atajos de teclado: -1. In a page or a component mounted in a page -2. In a modal-type component that takes the focus due to a user action +1. En una página o un componente montado en una página +2. En un componente tipo modal que toma el enfoque debido a la acción del usuario -The second use case can happen recursively : a dropdown in a modal for example. +El segundo caso de uso puede ocurrir recursivamente: un desplegable en un modal, por ejemplo. -### Listening to hotkeys in a page +### Escuchando atajos de teclado en una página -Example : +Ejemplo: ```tsx const PageListeningEnter = () => { @@ -71,11 +71,11 @@ const PageListeningEnter = () => { }; ``` -### Listening to hotkeys in a modal-type component +### Escuchando atajos de teclado en un componente tipo modal -For this example we'll use a modal component that listens for the Escape key to tell its parent to close it. +Para este ejemplo utilizaremos un componente modal que escucha la tecla Escape para indicar a su padre que lo cierre. -Here the user interaction is changing the scope. +Aquí la interacción del usuario está cambiando el ámbito. ```tsx const ExamplePageWithModal = () => { @@ -108,7 +108,7 @@ const ExamplePageWithModal = () => { }; ``` -Then in the modal component : +Luego, en el componente modal: ```tsx const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => { @@ -131,15 +131,15 @@ It's important to use this pattern when you're not sure that just using a useEff Those conflicts can be hard to debug, and it might happen more often than not with useEffects. -## What is a hotkey scope? +## ¿Qué es un ámbito de atajo de teclado? -A hotkey scope is a string that represents a context in which the hotkeys are active. It is generally encoded as an enum. +Un ámbito de atajo de teclado es una cadena que representa un contexto en el que los atajos de teclado están activos. Por lo general, se codifica como un enum. -When you change the hotkey scope, the hotkeys that are listening to this scope will be enabled and the hotkeys that are listening to other scopes will be disabled. +Cuando cambias el ámbito del atajo de teclado, se habilitarán los atajos que están escuchando este ámbito y se deshabilitarán los atajos que escuchan otros ámbitos. -You can set only one scope at a time. +Solo puedes establecer un ámbito a la vez. -As an example, the hotkey scopes for each page are defined in the `PageHotkeyScope` enum: +Como ejemplo, los ámbitos de atajos de teclado para cada página se definen en el enum `PageHotkeyScope`: ```tsx export enum PageHotkeyScope { @@ -160,7 +160,7 @@ export enum PageHotkeyScope { } ``` -Internally, the currently selected scope is stored in a Recoil state that is shared across the application : +Internamente, el ámbito seleccionado se almacena en un estado de Recoil que se comparte en toda la aplicación: ```tsx export const currentHotkeyScopeState = createState({ @@ -169,10 +169,10 @@ export const currentHotkeyScopeState = createState({ }); ``` -But this Recoil state should never be handled manually ! We'll see how to use it in the next section. +¡Pero este estado de Recoil nunca debe manejarse manualmente! Veremos cómo usarlo en la siguiente sección. -## How is it working internally? +## ¿Cómo funciona internamente? -We made a thin wrapper on top of [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) that makes it more performant and avoids unnecessary re-renders. +Hicimos un contenedor delgado sobre [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) que lo hace más eficiente y evita renders innecesarios. -We also create a Recoil state to handle the hotkey scope state and make it available everywhere in the application. +También creamos un estado de Recoil para manejar el estado del ámbito de atajos de teclado y hacerlo disponible en toda la aplicación. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx index 5c7f5fa52a..f6e770b67b 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx @@ -1,8 +1,8 @@ --- title: Storybook -description: Browse Twenty's UI component library +description: Navegar por la biblioteca de componentes de interfaz de Twenty --- -View our complete component library and documentation in Storybook. +Ver nuestra biblioteca completa de componentes y documentación en Storybook. -[Open Storybook →](https://storybook.twenty.com) +[Abrir Storybook →](https://storybook.twenty.com) diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx index e3ba4a44f0..ea4c1651d0 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/style-guide.mdx @@ -1,24 +1,24 @@ --- -title: Style Guide +title: Guía de Estilo --- -This document includes the rules to follow when writing code. +Este documento incluye las reglas a seguir al escribir código. -The goal here is to have a consistent codebase, which is easy to read and easy to maintain. +El objetivo aquí es tener una base de código coherente, que sea fácil de leer y de mantener. -For this, it's better to be a bit more verbose than to be too concise. +Para esto, es mejor ser un poco más detallado que ser demasiado conciso. -Always keep in mind that people read code more often than they write it, specially on an open source project, where anyone can contribute. +Ten siempre en cuenta que la gente lee código más a menudo de lo que lo escribe, especialmente en un proyecto de código abierto, donde cualquiera puede contribuir. -There are a lot of rules that are not defined here, but that are automatically checked by linters. +Hay muchas reglas que no están definidas aquí, pero que son verificadas automáticamente por linters. ## React -### Use functional components +### Usar componentes funcionales -Always use TSX functional components. +Siempre usa componentes funcionales TSX. -Do not use default `import` with `const`, because it's harder to read and harder to import with code completion. +No uses `import` por defecto con `const`, porque es más difícil de leer y más difícil de importar con el autocompletado de código. ```tsx // ❌ Bad, harder to read, harder to import with code completion @@ -34,11 +34,11 @@ export function MyComponent() { }; ``` -### Props +### "Props" -Create the type of the props and call it `(ComponentName)Props` if there's no need to export it. +Crea el tipo de las props y llámalo `(NombreDelComponente)Props` si no hay necesidad de exportarlo. -Use props destructuring. +Usa la desestructuración de props. ```tsx // ❌ Bad, no type @@ -52,7 +52,7 @@ type MyComponentProps = { export const MyComponent = ({ name }: MyComponentProps) =>
Hello {name}
; ``` -#### Refrain from using `React.FC` or `React.FunctionComponent` to define prop types +#### Evita usar `React.FC` o `React.FunctionComponent` para definir tipos de props ```tsx /* ❌ - Bad, defines the component type annotations with `FC` @@ -67,10 +67,10 @@ const EmailField: React.FC<{ ``` ```tsx -/* ✅ - Good, a separate type (OwnProps) is explicitly defined for the - * component's props - * - This method doesn't automatically include the children prop. If - * you want to include it, you have to specify it in OwnProps. +/* ✅ - Bueno, se define explícitamente un tipo (OwnProps) separado para las + * props del componente + * - Este método no incluye automáticamente la prop children. Si + * quieres incluirla, debes especificarla en OwnProps. */ type EmailFieldProps = { value: string; @@ -81,9 +81,9 @@ const EmailField = ({ value }: EmailFieldProps) => ( ); ``` -#### No Single Variable Prop Spreading in JSX Elements +#### Sin Propagación de una sola variable de Props en Elementos JSX -Avoid using single variable prop spreading in JSX elements, like `{...props}`. This practice often results in code that is less readable and harder to maintain because it's unclear which props the component is receiving. +Evita usar la propagación de una sola variable de props en elementos JSX, como `{...props}`. Esta práctica a menudo resulta en un código que es menos legible y más difícil de mantener porque no está claro qué props está recibiendo el componente. ```tsx /* ❌ - Bad, spreads a single variable prop into the underlying component @@ -94,23 +94,23 @@ const MyComponent = (props: OwnProps) => { ``` ```tsx -/* ✅ - Good, Explicitly lists all props - * - Enhances readability and maintainability +/* ✅ - Bueno, enumera explícitamente todas las props + * - Mejora la legibilidad y la mantenibilidad */ const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => { return ; }; ``` -Rationale: +Razonamiento: -* At a glance, it's clearer which props the code passes down, making it easier to understand and maintain. -* It helps to prevent tight coupling between components via their props. -* Linting tools make it easier to identify misspelled or unused props when you list props explicitly. +* A simple vista, es más claro qué props se está pasando, lo que hace que sea más fácil de entender y mantener. +* Ayuda a prevenir el acoplamiento estricto entre componentes mediante sus props. +* Las herramientas de linting facilitan la identificación de props mal escritas o sin uso al listar props explícitamente. ## JavaScript -### Use nullish-coalescing operator `??` +### Usar el operador de fusión nula `??` ```tsx // ❌ Bad, can return 'default' even if value is 0 or '' @@ -120,21 +120,21 @@ const value = process.env.MY_VALUE || 'default'; const value = process.env.MY_VALUE ?? 'default'; ``` -### Use optional chaining `?.` +### Usar encadenamiento opcional `?.` ```tsx -// ❌ Bad +// ❌ Malo onClick && onClick(); -// ✅ Good +// ✅ Bueno onClick?.(); ``` ## TypeScript -### Use `type` instead of `interface` +### Usar `type` en lugar de `interface` -Always use `type` instead of `interface`, because they almost always overlap, and `type` is more flexible. +Siempre usa `type` en lugar de `interface`, porque casi siempre se superponen y `type` es más flexible. ```tsx // ❌ Bad @@ -148,11 +148,11 @@ type MyType = { }; ``` -### Use string literals instead of enums +### Usar literales de cadena en lugar de enums -[String literals](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) are the go-to way to handle enum-like values in TypeScript. They are easier to extend with Pick and Omit, and offer a better developer experience, specially with code completion. +[Los literales de cadena](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) son la manera preferida para manejar valores tipo enum en TypeScript. Son más fáciles de extender con Pick y Omit, y ofrecen una mejor experiencia de desarrollo, especialmente con la autocompletación de código. -You can see why TypeScript recommends avoiding enums [here](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums). +Puedes ver por qué TypeScript recomienda evitar enums [aquí](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums). ```tsx // ❌ Bad, utilizes an enum @@ -171,13 +171,13 @@ let color = Color.Red; let color: "red" | "green" | "blue" = "red"; ``` -#### GraphQL and internal libraries +#### GraphQL y bibliotecas internas -You should use enums that GraphQL codegen generates. +Deberías usar enums que genera el codegen de GraphQL. -It's also better to use an enum when using an internal library, so the internal library doesn't have to expose a string literal type that is not related to the internal API. +También es mejor usar un enum al usar una biblioteca interna, para que la biblioteca interna no tenga que exponer un tipo de literal de cadena que no está relacionado con la API interna. -Example: +Ejemplo: ```TSX const { @@ -190,11 +190,11 @@ setHotkeyScopeAndMemorizePreviousScope( ); ``` -## Styling +## Estilo -### Use StyledComponents +### Usar StyledComponents -Style the components with [styled-components](https://emotion.sh/docs/styled). +Estiliza los componentes con [styled-components](https://emotion.sh/docs/styled). ```tsx // ❌ Bad @@ -208,7 +208,7 @@ const StyledTitle = styled.div` `; ``` -Prefix styled components with "Styled" to differentiate them from "real" components. +Prefija los componentes estilizados con "Styled" para diferenciarlos de los componentes "reales". ```tsx // ❌ Bad @@ -224,17 +224,17 @@ const StyledTitle = styled.div` `; ``` -### Theming +### Tematización -Utilizing the theme for the majority of component styling is the preferred approach. +Utilizar el tema para la mayor parte de la estilización de los componentes es el enfoque preferido. -#### Units of measurement +#### Unidades de medida -Avoid using `px` or `rem` values directly within the styled components. The necessary values are generally already defined in the theme, so it’s recommended to make use of the theme for these purposes. +Evita usar valores `px` o `rem` directamente dentro de los componentes estilizados. Los valores necesarios suelen estar ya definidos en el tema, por lo que se recomienda usar el tema para estos fines. -#### Colors +#### Colores -Refrain from introducing new colors; instead, use the existing palette from the theme. Should there be a situation where the palette does not align, please leave a comment so that the team can rectify it. +Abstente de introducir nuevos colores; en su lugar, utiliza la paleta existente del tema. Si hay una situación en la que la paleta no se ajusta, deja un comentario para que el equipo pueda corregirlo. ```tsx // ❌ Bad, directly specifies style values without utilizing the theme @@ -258,9 +258,9 @@ const StyledButton = styled.button` `; ``` -## Enforcing No-Type Imports +## Aplicando No-Type Imports -Avoid type imports. To enforce this standard, an ESLint rule checks for and reports any type imports. This helps maintain consistency and readability in the TypeScript code. +Evita las importaciones de tipo. Para reforzar este estándar, una regla de ESLint verifica y reporta cualquier importación de tipo. Esto ayuda a mantener la consistencia y la legibilidad en el código TypeScript. ```tsx // ❌ Bad @@ -273,18 +273,18 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Meta, StoryObj } from '@storybook/react'; ``` -### Why No-Type Imports +### Por qué No-Type Imports -* **Consistency**: By avoiding type imports and using a single approach for both type and value imports, the codebase remains consistent in its module import style. +* **Consistencia**: Al evitar las importaciones de tipo y usar un solo enfoque tanto para las importaciones de tipo como de valor, la base de código se mantiene consistente en su estilo de importación de módulos. -* **Readability**: No-type imports improve code readability by making it clear when you're importing values or types. This reduces ambiguity and makes it easier to understand the purpose of imported symbols. +* **Legibilidad**: Las no-importaciones de tipo mejoran la legibilidad del código al dejar claro cuándo se están importando valores o tipos. Esto reduce la ambigüedad y hace más fácil entender el propósito de los símbolos importados. -* **Maintainability**: It enhances codebase maintainability because developers can identify and locate type-only imports when reviewing or modifying code. +* **Mantenibilidad**: Mejora la mantenibilidad de la base de código porque los desarrolladores pueden identificar y localizar importaciones solo de tipo al revisar o modificar el código. -### ESLint Rule +### Regla de ESLint -An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. This rule will generate errors or warnings for any type import violations. +Una regla de ESLint, `@typescript-eslint/consistent-type-imports`, impone el estándar de no usar "type" en las importaciones. Esta regla generará errores o advertencias sobre cualquier violación de importación de tipo. -Please note that this rule specifically addresses rare edge cases where unintentional type imports occur. TypeScript itself discourages this practice, as mentioned in the [TypeScript 3.8 release notes](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). In most situations, you should not need to use type-only imports. +Por favor, ten en cuenta que esta regla específicamente aborda extraños casos límite donde ocurren importaciones de tipo no intencionadas. TypeScript en sí mismo desaconseja esta práctica, como se menciona en las [notas de lanzamiento de TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). En la mayoría de situaciones, no deberías necesitar usar importaciones solo de tipo. -To ensure your code complies with this rule, make sure to run ESLint as part of your development workflow. +Para asegurarte de que tu código cumpla con esta regla, asegúrate de ejecutar ESLint como parte de tu flujo de trabajo de desarrollo. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx index 6cffcc405e..85382f32b1 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx @@ -1,59 +1,59 @@ --- -title: Work with Figma -info: Learn how you can collaborate with Twenty's Figma +title: Trabajar con Figma +info: Aprende cómo puedes colaborar con Twenty en Figma --- -Figma is a collaborative interface design tool that aids in bridging the communication barrier between designers and developers. -This guide explains how you can collaborate with Figma. +Figma es una herramienta de diseño de interfaces colaborativa que ayuda a superar la barrera de comunicación entre diseñadores y desarrolladores. +Esta guía explica cómo puedes colaborar con Figma. -## Access +## Acceso -1. **Access the shared link:** You can access the project's Figma file [here](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty). -2. **Sign in:** If you're not already signed in, Figma will prompt you to do so. - Key features are only available to logged-in users, such as the developer mode and the ability to select a dedicated frame. +1. **Accede al enlace compartido:** Puedes acceder al archivo de Figma del proyecto [aquí](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty). +2. **Inicia sesión:** Si aún no has iniciado sesión, Figma te pedirá que lo hagas. + Las características clave solo están disponibles para usuarios registrados, como el modo desarrollador y la capacidad de seleccionar un marco dedicado. - You will not be able to collaborate effectively without an account. + No podrás colaborar efectivamente sin una cuenta. -## Figma structure +## Estructura de Figma -On the left sidebar, you can access the different pages of Twenty's Figma. This is how they're organized: +En la barra lateral izquierda, puedes acceder a las diferentes páginas del Figma de Twenty. Así es como están organizadas: -* **Components page:** This is the first page. The designer uses it to create and organize the reusable design elements used throughout the design file. For example, buttons, icons, symbols, or any other reusable components. It serves to maintain consistency across the design. -* **Main page:** The second page is the main page, which shows the complete user interface of the project. You can press ***Play*** to use the full app prototype. -* **Features pages:** The other pages are typically dedicated to features in progress. They contain the design of specific features or modules of the application or website. They are typically still in progress. +* **Página de componentes:** Esta es la primera página. El diseñador la utiliza para crear y organizar los elementos de diseño reutilizables que se usan en todo el archivo de diseño. Por ejemplo, botones, íconos, símbolos u otros componentes reutilizables. Sirve para mantener la consistencia a lo largo del diseño. +* **Página principal:** La segunda página es la página principal, que muestra la interfaz de usuario completa del proyecto. Puedes presionar ***Play*** para usar el prototipo completo de la aplicación. +* **Páginas de características:** Las otras páginas están típicamente dedicadas a características en progreso. Contienen el diseño de características específicas o módulos de la aplicación o sitio web. Normalmente, aún están en desarrollo. -## Useful Tips +## Consejos útiles -With read-only access, you can't edit the design, but you can access all features that will be useful to convert the designs into code. +Con acceso de solo lectura, no puedes editar el diseño, pero puedes acceder a todas las características que serán útiles para convertir los diseños en código. -### Use the Dev mode +### Usa el modo Dev -Figma's Dev Mode enhances developers' productivity by providing easy design navigation, effective asset management, efficient communication tools, toolbox integrations, quick code snippets, and key layer information, bridging the gap between design and development. You can learn more about Dev Mode [here](https://www.figma.com/dev-mode/). +El Modo Dev de Figma mejora la productividad de los desarrolladores al proporcionar una navegación fácil por el diseño, una gestión eficaz de assets, herramientas de comunicación eficientes, integraciones de caja de herramientas, fragmentos de código rápidos e información clave de capas, superando la brecha entre diseño y desarrollo. Puedes aprender más sobre el Modo Dev [aquí](https://www.figma.com/dev-mode/). -Switch to the "Developer" mode in the right part of the toolbar to see design specs, copy CSS, and access assets. +Cambia al modo "Desarrollador" en la parte derecha de la barra de herramientas para ver las especificaciones de diseño, copiar CSS y acceder a los assets. -### Use the Prototype +### Usar el prototipo -Click on any element on the canvas and press the “Play” button at the top right edge of the interface to access the prototype view. Prototype mode allows you to interact with the design as if it were the final product. It demonstrates the flow between screens and how interface elements like buttons, links, or menus behave when interacted with. +Haz clic en cualquier elemento del lienzo y presiona el botón "Play" en el extremo superior derecho de la interfaz para acceder a la vista del prototipo. El modo de prototipo te permite interactuar con el diseño como si fuera el producto final. Demuestra el flujo entre pantallas y cómo los elementos de la interfaz, como botones, enlaces o menús, se comportan al interactuar con ellos. -1. **Understanding transitions and animations:** In the Prototype mode, you can view any transitions or animations added by a designer between screens or UI elements, providing clear visual instructions to developers on the intended behavior and style. -2. **Implementation clarification:** A prototype can also help reduce ambiguities. Developers can interact with it to gain a better understanding of the functionality or appearance of particular elements. +1. **Entendiendo las transiciones y animaciones:** En el modo Prototipo, puedes ver cualquier transición o animación añadida por un diseñador entre pantallas o elementos de UI, proporcionando instrucciones visuales claras a los desarrolladores sobre la conducta y el estilo intencionados. +2. **Aclaración de implementación:** Un prototipo también puede ayudar a reducir las ambigüedades. Los desarrolladores pueden interactuar con él para obtener una mejor comprensión de la funcionalidad o apariencia de elementos particulares. -For more comprehensive details and guidance on learning the Figma platform, you can visit the official [Figma Documentation](https://help.figma.com/hc/en-us). +Para más detalles y orientación sobre el aprendizaje de la plataforma Figma, puedes visitar la [Documentación Oficial de Figma](https://help.figma.com/hc/en-us). -### Measure distances +### Medir distancias -Select an element, hold `Option` key (Mac) or `Alt` key (Windows), then hover over another element to see the distance between them. +Selecciona un elemento, mantén presionada la tecla `Option` (Mac) o `Alt` (Windows), luego pasa el cursor sobre otro elemento para ver la distancia entre ellos. -### Figma extension for VSCode (Recommended) +### Extensión Figma para VSCode (Recomendado) -[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension) -lets you navigate and inspect design files, collaborate with designers, track changes, and speed up implementation - all without leaving your text editor. -It's part of our recommended extensions. +[Figma para VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension) +te permite navegar e inspeccionar archivos de diseño, colaborar con diseñadores, rastrear cambios y acelerar la implementación, todo sin salir de tu editor de texto. +Forma parte de nuestras extensiones recomendadas. -## Collaboration +## Colaboración -1. **Using Comments:** You are welcome to use the comment feature by clicking on the bubble icon in the left part of the toolbar. -2. **Cursor chat:** A nice feature of Figma is the Cursor chat. Just press `;` on Mac and `/` on Windows to send a message if you see someone else using Figma as the same time as you. +1. **Uso de Comentarios:** Puedes utilizar la función de comentarios haciendo clic en el ícono de burbuja en la parte izquierda de la barra de herramientas. +2. **Chat de Cursor:** Una característica agradable de Figma es el Chat de Cursor. Simplemente presiona `;` en Mac y `/` en Windows para enviar un mensaje si ves a alguien más usando Figma al mismo tiempo que tú. diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx index cabd274d46..8932ef7ec3 100644 --- a/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/local-setup.mdx @@ -1,13 +1,13 @@ --- -title: Local Setup -description: The guide for contributors (or curious developers) who want to run Twenty locally. +title: Configuración Local +description: La guía para los colaboradores (o desarrolladores curiosos) que quieren ejecutar Twenty localmente. --- -## Prerequisites +## Prerrequisitos - - Before you can install and use Twenty, make sure you install the following on your computer: + + Antes de que puedas instalar y usar Twenty, asegúrate de instalar lo siguiente en tu computadora: * [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) * [Node v24.5.0](https://nodejs.org/en/download) @@ -15,25 +15,25 @@ description: The guide for contributors (or curious developers) who want to run * [nvm](https://github.com/nvm-sh/nvm/blob/master/README.md) - `npm` won't work, you should use `yarn` instead. Yarn is now shipped with Node.js, so you don't need to install it separately. - You only have to run `corepack enable` to enable Yarn if you haven't done it yet. + `npm` no funcionará, deberías usar `yarn` en su lugar. Yarn ahora se envía con Node.js, por lo que no necesitas instalarlo por separado. + Solo tienes que ejecutar `corepack enable` para habilitar Yarn si aún no lo has hecho. - 1. Install WSL - Open PowerShell as Administrator and run: + 1. Instalar WSL + Abre PowerShell como Administrador y ejecuta: ```powershell wsl --install ``` - You should now see a prompt to restart your computer. If not, restart it manually. + Ahora deberías ver un aviso para reiniciar tu computadora. Si no, reiníciala manualmente. - Upon restart, a powershell window will open and install Ubuntu. This may take up some time. - You'll see a prompt to create a username and password for your Ubuntu installation. + Al reiniciar, se abrirá una ventana de PowerShell e instalará Ubuntu. Esto puede tomar algo de tiempo. + Verás un aviso para crear un nombre de usuario y contraseña para tu instalación de Ubuntu. - 2. Install and configure git + 2. Instalar y configurar git ```bash sudo apt-get install git @@ -43,10 +43,10 @@ description: The guide for contributors (or curious developers) who want to run git config --global user.email "youremail@domain.com" ``` - 3. Install nvm, node.js and yarn + 3. Instalar nvm, node.js y yarn - Use `nvm` to install the correct `node` version. The `.nvmrc` ensures all contributors use the same version. + Usa `nvm` para instalar la versión correcta de `node`. El `.nvmrc` asegura que todos los colaboradores usen la misma versión. ```bash @@ -55,7 +55,7 @@ description: The guide for contributors (or curious developers) who want to run curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/master/install.sh | bash ``` - Close and reopen your terminal to use nvm. Then run the following commands. + Cierra y vuelve a abrir tu terminal para usar nvm. Luego ejecuta los siguientes comandos. ```bash @@ -70,13 +70,13 @@ description: The guide for contributors (or curious developers) who want to run --- -## Step 1: Git Clone +## Paso 1: Clonar con Git -In your terminal, run the following command. +En tu terminal, ejecuta el siguiente comando. - - If you haven't already set up SSH keys, you can learn how to do so [here](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh). + + Si aún no has configurado claves SSH, puedes aprender cómo hacerlo [aquí](https://docs.github.com/en/authentication/connecting-to-github-with-ssh/about-ssh). ```bash git clone git@github.com:twentyhq/twenty.git @@ -90,36 +90,36 @@ In your terminal, run the following command. -## Step 2: Position yourself at the root +## Paso 2: Ubícate en la raíz ```bash cd twenty ``` -You should run all commands in the following steps from the root of the project. +Debes ejecutar todos los comandos de los siguientes pasos desde la raíz del proyecto. -## Step 3: Set up a PostgreSQL Database +## Paso 3: Configurar una Base de Datos PostgreSQL - **Option 1 (preferred):** To provision your database locally: - Use the following link to install Postgresql on your Linux machine: [Postgresql Installation](https://www.postgresql.org/download/linux/) + **Opción 1 (preferido):** Para aprovisionar tu base de datos localmente: + Usa el siguiente enlace para instalar PostgreSQL en tu máquina Linux: [Instalación de PostgreSQL](https://www.postgresql.org/download/linux/) ```bash psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;" ``` - Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors. + Nota: Puede que necesites agregar `sudo -u postgres` antes del comando `psql` para evitar errores de permisos. - **Option 2:** If you have docker installed: + **Opción 2:** Si tienes Docker instalado: ```bash - make postgres-on-docker + make -C packages/twenty-docker postgres-on-docker ``` - **Option 1 (preferred):** To provision your database locally with `brew`: + **Opción 1 (preferido):** Para aprovisionar tu base de datos localmente con `brew`: ```bash brew install postgresql@16 @@ -128,16 +128,16 @@ You should run all commands in the following steps from the root of the project. psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;" ``` - You can verify if the PostgreSQL server is running by executing: + Puedes verificar si el servidor PostgreSQL está corriendo ejecutando: ```bash brew services list ``` - The installer might not create the `postgres` user by default when installing - via Homebrew on MacOS. Instead, it creates a PostgreSQL role that matches your macOS - username (e.g., "john"). - To check and create the `postgres` user if necessary, follow these steps: + El instalador puede que no cree el usuario `postgres` por defecto al instalar + vía Homebrew en macOS. En cambio, crea un rol de PostgreSQL que coincide con tu + nombre de usuario de macOS (por ejemplo, "john"). + Para comprobar y crear el usuario `postgres` si es necesario, sigue estos pasos: ```bash # Connect to PostgreSQL @@ -146,14 +146,14 @@ You should run all commands in the following steps from the root of the project. psql -U $(whoami) -d postgres ``` - Once at the psql prompt (postgres=#), run: + Una vez en el comando psql (postgres=#), ejecuta: ```bash # List existing PostgreSQL roles \du ``` - You'll see output similar to: + Verás una salida similar a: ```bash Role name | Attributes | Member of @@ -161,98 +161,98 @@ You should run all commands in the following steps from the root of the project. john | Superuser | {} ``` - If you do not see a `postgres` role listed, proceed to the next step. - Create the `postgres` role manually: + Si no ves un rol `postgres` listado, procede al siguiente paso. + Crea el rol `postgres` manualmente: ```bash CREATE ROLE postgres WITH SUPERUSER LOGIN; ``` - This creates a superuser role named `postgres` with login access. + Esto crea un rol de superusuario llamado `postgres` con acceso de inicio de sesión. - **Option 2:** If you have docker installed: + **Opción 2:** Si tienes Docker instalado: ```bash - make postgres-on-docker + make -C packages/twenty-docker postgres-on-docker ``` - All the following steps are to be run in the WSL terminal (within your virtual machine) + Todos los siguientes pasos deben ejecutarse en la terminal de WSL (dentro de tu máquina virtual) - **Option 1:** To provision your Postgresql locally: - Use the following link to install Postgresql on your Linux virtual machine: [Postgresql Installation](https://www.postgresql.org/download/linux/) + **Opción 1:** Para aprovisionar tu PostgreSQL localmente: + Usa el siguiente enlace para instalar PostgreSQL en tu máquina virtual Linux: [Instalación de PostgreSQL](https://www.postgresql.org/download/linux/) ```bash psql postgres -c "CREATE DATABASE \"default\";" -c "CREATE DATABASE test;" ``` - Note: You might need to add `sudo -u postgres` to the command before `psql` to avoid permission errors. + Nota: Puede que necesites agregar `sudo -u postgres` antes del comando `psql` para evitar errores de permisos. - **Option 2:** If you have docker installed: - Running Docker on WSL adds an extra layer of complexity. - Only use this option if you are comfortable with the extra steps involved, including turning on [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl). + **Opción 2:** Si tienes Docker instalado: + Ejecutar Docker en WSL agrega una capa extra de complejidad. + Solo usa esta opción si estás cómodo con los pasos extras involucrados, incluyendo activar [Docker Desktop WSL2](https://docs.docker.com/desktop/wsl). ```bash - make postgres-on-docker + make -C packages/twenty-docker postgres-on-docker ``` -You can now access the database at [localhost:5432](localhost:5432), with user `postgres` and password `postgres` . +Ahora puedes acceder a la base de datos en [localhost:5432](localhost:5432), con usuario `postgres` y contraseña `postgres`. -## Step 4: Set up a Redis Database (cache) +## Paso 4: Configurar una Base de Datos Redis (cache) -Twenty requires a redis cache to provide the best performance +Twenty requiere un caché de redis para proporcionar el mejor rendimiento - **Option 1:** To provision your Redis locally: - Use the following link to install Redis on your Linux machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/) + **Opción 1:** Para aprovisionar tu Redis localmente: + Usa el siguiente enlace para instalar Redis en tu máquina Linux: [Instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/) - **Option 2:** If you have docker installed: + **Opción 2:** Si tienes Docker instalado: ```bash - make redis-on-docker + make -C packages/twenty-docker redis-on-docker ``` - **Option 1 (preferred):** To provision your Redis locally with `brew`: + **Opción 1 (preferido):** Para aprovisionar tu Redis localmente con `brew`: ```bash brew install redis ``` - Start your redis server: + Inicia tu servidor redis: `brew services start redis` - **Option 2:** If you have docker installed: + **Opción 2:** Si tienes Docker instalado: ```bash - make redis-on-docker + make -C packages/twenty-docker redis-on-docker ``` - **Option 1:** To provision your Redis locally: - Use the following link to install Redis on your Linux virtual machine: [Redis Installation](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/) + **Opción 1:** Para aprovisionar tu Redis localmente: + Usa el siguiente enlace para instalar Redis en tu máquina virtual Linux: [Instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/install-redis-on-linux/) - **Option 2:** If you have docker installed: + **Opción 2:** Si tienes Docker instalado: ```bash - make redis-on-docker + make -C packages/twenty-docker redis-on-docker ``` -If you need a Client GUI, we recommend [redis insight](https://redis.io/insight/) (free version available) +Si necesitas una interfaz gráfica de cliente, recomendamos [Redis Insight](https://redis.io/insight/) (versión gratuita disponible) -## Step 5: Setup environment variables +## Paso 5: Configurar las variables de entorno -Use environment variables or `.env` files to configure your project. More info [here](/l/es/developers/self-host/capabilities/setup) +Usa variables de entorno o archivos `.env` para configurar tu proyecto. Más información [aquí](/l/es/developers/self-host/capabilities/setup) -Copy the `.env.example` files in `/front` and `/server`: +Copia los archivos `.env.example` en `/front` y `/server`: ```bash cp ./packages/twenty-front/.env.example ./packages/twenty-front/.env @@ -260,29 +260,29 @@ cp ./packages/twenty-server/.env.example ./packages/twenty-server/.env ``` - **Multi-Workspace Mode:** By default, Twenty runs in single-workspace mode where only one workspace can be created. To enable multi-workspace support (useful for testing subdomain-based features), set `IS_MULTIWORKSPACE_ENABLED=true` in your server `.env` file. See [Multi-Workspace Mode](/l/es/developers/self-host/capabilities/setup#multi-workspace-mode) for details. + **Modo de múltiples espacios de trabajo:** De forma predeterminada, Twenty se ejecuta en modo de un solo espacio de trabajo, donde solo se puede crear un espacio de trabajo. Para habilitar la compatibilidad con múltiples espacios de trabajo (útil para probar funciones basadas en subdominios), establece `IS_MULTIWORKSPACE_ENABLED=true` en el archivo `.env` de tu servidor. Consulta [Modo de múltiples espacios de trabajo](/l/es/developers/self-host/capabilities/setup#multi-workspace-mode) para más detalles. -## Step 6: Installing dependencies +## Paso 6: Instalación de dependencias -To build Twenty server and seed some data into your database, run the following command: +Para compilar el servidor de Twenty e ingresar algunos datos en tu base de datos, ejecuta el siguiente comando: ```bash yarn ``` -Note that `npm` or `pnpm` won't work +Ten en cuenta que `npm` o `pnpm` no funcionarán -## Step 7: Running the project +## Paso 7: Ejecutar el proyecto - Depending on your Linux distribution, Redis server might be started automatically. - If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro. + Dependiendo de tu distribución de Linux, el servidor Redis podría iniciarse automáticamente. + Si no, revisa la [guía de instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) para tu distribución. - Redis should already be running. If not, run: + Redis ya debería estar funcionando. Si no, ejecuta: ```bash brew services start redis @@ -290,18 +290,18 @@ Note that `npm` or `pnpm` won't work - Depending on your Linux distribution, Redis server might be started automatically. - If not, check the [Redis installation guide](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) for your distro. + Dependiendo de tu distribución de Linux, el servidor Redis podría iniciarse automáticamente. + Si no es así, consulte la [guía de instalación de Redis](https://redis.io/docs/latest/operate/oss_and_stack/install/install-redis/) para su distribución. -Set up your database with the following command: +Configure su base de datos con el siguiente comando: ```bash npx nx database:reset twenty-server ``` -Start the server, the worker and the frontend services: +Inicie el servidor, el trabajador y los servicios frontend: ```bash npx nx start twenty-server @@ -309,25 +309,25 @@ npx nx worker twenty-server npx nx start twenty-front ``` -Alternatively, you can start all services at once: +Alternativamente, puede iniciar todos los servicios a la vez: ```bash npx nx start ``` -## Step 8: Use Twenty +## Paso 8: Use Twenty **Frontend** -Twenty's frontend will be running at [http://localhost:3001](http://localhost:3001). -You can log in using the default demo account: `tim@apple.dev` (password: `tim@apple.dev`) +El frontend de Twenty estará ejecutándose en [http://localhost:3001](http://localhost:3001). +Puede iniciar sesión usando la cuenta demo por defecto: `tim@apple.dev` (contraseña: `tim@apple.dev`) **Backend** -* Twenty's server will be up and running at [http://localhost:3000](http://localhost:3000) -* The GraphQL API can be accessed at [http://localhost:3000/graphql](http://localhost:3000/graphql) -* The REST API can be reached at [http://localhost:3000/rest](http://localhost:3000/rest) +* El servidor de Twenty estará operativo en [http://localhost:3000](http://localhost:3000) +* La API GraphQL puede ser accedida en [http://localhost:3000/graphql](http://localhost:3000/graphql) +* La API REST puede ser alcanzada en [http://localhost:3000/rest](http://localhost:3000/rest) -## Troubleshooting +## Solución de Problemas -If you encounter any problem, check [Troubleshooting](/l/es/developers/self-host/capabilities/troubleshooting) for solutions. +Si encuentras algún problema, consulta [Solución de Problemas](/l/es/developers/self-host/capabilities/troubleshooting) para ver soluciones. diff --git a/packages/twenty-docs/l/es/developers/contribute/contribute.mdx b/packages/twenty-docs/l/es/developers/contribute/contribute.mdx index 79742b6f2c..f5b6ce47b6 100644 --- a/packages/twenty-docs/l/es/developers/contribute/contribute.mdx +++ b/packages/twenty-docs/l/es/developers/contribute/contribute.mdx @@ -1,32 +1,32 @@ --- -title: Contribute -description: Contribute to Twenty's open-source development. +title: Contribuir +description: Contribuye al desarrollo de código abierto de Twenty. --- - AI + IA -## Overview +## Resumen -Twenty is open-source and welcomes contributions from the community. Whether you're fixing bugs, adding features, or improving documentation, your contributions help make Twenty better for everyone. +Twenty es de código abierto y da la bienvenida a las contribuciones de la comunidad. Ya sea que estés solucionando errores, agregando funciones o mejorando la documentación, tus contribuciones ayudan a que Twenty sea mejor para todos. -## Ways to Contribute +## Formas de contribuir -* **Report bugs**: Help identify and document issues -* **Submit features**: Propose and implement new functionality -* **Improve documentation**: Make our docs clearer and more helpful -* **Frontend development**: Work on the React-based UI -* **Backend development**: Contribute to the NestJS server +* **Reporta errores**: Ayuda a identificar y documentar problemas +* **Propón funcionalidades**: Propón e implementa nuevas funcionalidades +* **Mejora la documentación**: Haz que nuestra documentación sea más clara y útil +* **Desarrollo de frontend**: Trabaja en la interfaz de usuario basada en React +* **Desarrollo de backend**: Contribuye al servidor NestJS -## Getting Started +## Primeros pasos - - Report issues or request features + + Reporta problemas o solicita funcionalidades - - Contribute to the UI + + Contribuye a la interfaz de usuario diff --git a/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx b/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx index b436ae7425..65f08139df 100644 --- a/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx +++ b/packages/twenty-docs/l/es/developers/extend/capabilities/apis.mdx @@ -1,147 +1,147 @@ --- title: APIs -description: Query and modify your CRM data programmatically using REST or GraphQL. +description: Consulta y modifica tus datos de CRM de forma programática usando REST o GraphQL. --- import { VimeoEmbed } from '/snippets/vimeo-embed.mdx'; -Twenty was built to be developer-friendly, offering powerful APIs that adapt to your custom data model. We provide four distinct API types to meet different integration needs. +Twenty fue creado para ser amigable con los desarrolladores, ofreciendo APIs potentes que se adaptan a tu modelo de datos personalizado. Proveemos cuatro tipos de API distintos para satisfacer diferentes necesidades de integración. -## Developer-First Approach +## Enfoque centrado en el desarrollador -Twenty generates APIs specifically for your data model: +Twenty genera APIs específicamente para tu modelo de datos: -* **No long IDs required**: Use your object and field names directly in endpoints -* **Standard and custom objects treated equally**: Your custom objects get the same API treatment as built-in ones -* **Dedicated endpoints**: Each object and field gets its own API endpoint -* **Custom documentation**: Generated specifically for your workspace's data model +* **No se requieren IDs largos**: Usa los nombres de tus objetos y campos directamente en los endpoints. +* **Objetos estándar y personalizados tratados por igual**: Tus objetos personalizados reciben el mismo tratamiento de API que los incorporados. +* **Endpoints dedicados**: Cada objeto y campo recibe su propio endpoint de API. +* **Documentación personalizada**: Generada específicamente para el modelo de datos de tu espacio de trabajo. - Your personalized API documentation is available under **Settings → API & Webhooks** after creating an API key. Since Twenty generates APIs that match your custom data model, the documentation is unique to your workspace. + Tu documentación personalizada de la API está disponible en **Configuración → API & Webhooks** después de crear una clave de API. Como Twenty genera APIs que coinciden con tu modelo de datos personalizado, la documentación es única para tu espacio de trabajo. -## The Two API Types +## Los dos tipos de API -### Core API +### API Principal -Accessed on `/rest/` or `/graphql/` +Accesible en `/rest/` o `/graphql/` -Work with your actual **records** (the data): +Trabaja con tus **registros** reales (los datos): -* Create, read, update, delete People, Companies, Opportunities, etc. -* Query and filter data -* Manage record relationships +* Crear, leer, actualizar y eliminar Personas, Empresas, Oportunidades, etc. +* Consultar y filtrar datos +* Gestionar relaciones de registros -### Metadata API +### API de Metadatos -Accessed on `/rest/metadata/` or `/metadata/` +Accesible en `/rest/metadata/` o `/metadata/` -Manage your **workspace and data model**: +Administra tu **espacio de trabajo y modelo de datos**: -* Create, modify, or delete objects and fields -* Configure workspace settings -* Define relationships between objects +* Crear, modificar o eliminar objetos y campos +* Configurar ajustes del espacio de trabajo +* Define relaciones entre objetos ## REST vs GraphQL -Both Core and Metadata APIs are available in REST and GraphQL formats: +Tanto las API Core como las de Metadatos están disponibles en formatos REST y GraphQL: -| Format | Available Operations | -| ----------- | ---------------------------------------------------------- | -| **REST** | CRUD, batch operations, upserts | -| **GraphQL** | Same + **batch upserts**, relationship queries in one call | +| Formato | Operaciones disponibles | +| ----------- | ----------------------------------------------------------------------------- | +| **REST** | CRUD, operaciones por lotes, upserts | +| **GraphQL** | Lo mismo + **upserts por lotes**, consultas de relaciones en una sola llamada | -Choose based on your needs — both formats access the same data. +Elige según tus necesidades — ambos formatos acceden a los mismos datos. -## API Endpoints +## Puntos de Acceso de API -| Environment | Base URL | -| --------------- | ------------------------- | -| **Cloud** | `https://api.twenty.com/` | -| **Self-Hosted** | `https://{your-domain}/` | +| Entorno | URL base | +| ------------------- | ------------------------- | +| **Nube** | `https://api.twenty.com/` | +| **Autoalojamiento** | `https://{your-domain}/` | -## Authentication +## Autenticación -Every API request requires an API key in the header: +Cada solicitud a la API requiere una clave de API en el encabezado: ``` Authorization: Bearer YOUR_API_KEY ``` -### Create an API Key +### Crear una Clave de API -1. Go to **Settings → APIs & Webhooks** -2. Click **+ Create key** -3. Configure: - * **Name**: Descriptive name for the key - * **Expiration Date**: When the key expires -4. Click **Save** -5. **Copy immediately** — the key is only shown once +1. Ve a **Configuración → APIs y Webhooks** +2. Haz clic en **+ Crear clave** +3. Configurar: + * **Nombre**: Nombre descriptivo para la clave + * **Fecha de vencimiento**: Cuándo expira la clave +4. Haga clic en **Guardar** +5. **Copia de inmediato** — la clave solo se muestra una vez - + - Your API key grants access to sensitive data. Don't share it with untrusted services. If compromised, disable it immediately and generate a new one. + Tu clave de API concede acceso a datos sensibles. No la compartas con servicios no confiables. Si se ve comprometida, desactívala de inmediato y genera una nueva. -### Assign a Role to an API Key +### Asignar un rol a una clave de API -For better security, assign a specific role to limit access: +Para mayor seguridad, asigna un rol específico para limitar el acceso: -1. Go to **Settings → Roles** -2. Click on the role to assign -3. Open the **Assignment** tab -4. Under **API Keys**, click **+ Assign to API key** -5. Select the API key +1. Ve a **Configuración → Roles** +2. Haz clic en el rol que deseas asignar +3. Abre la pestaña **Asignación** +4. En **Claves de API**, haz clic en **+ Asignar a clave de API** +5. Selecciona la clave de API -The key will inherit that role's permissions. See [Permissions](/l/es/user-guide/permissions-access/capabilities/permissions) for details. +La clave heredará los permisos de ese rol. Consulta [Permisos](/l/es/user-guide/permissions-access/capabilities/permissions) para más detalles. -### Manage API Keys +### Gestionar Claves de API -**Regenerate**: Settings → APIs & Webhooks → Click key → **Regenerate** +**Regenerar**: Configuración → APIs & Webhooks → Haz clic en la clave → **Regenerar** -**Delete**: Settings → APIs & Webhooks → Click key → **Delete** +**Eliminar**: Configuración → APIs & Webhooks → Haz clic en la clave → **Eliminar** -## API Playground +## Playground de la API -Test your APIs directly in the browser with our built-in playground — available for both **REST** and **GraphQL**. +Prueba tus API directamente en el navegador con nuestro playground integrado — disponible tanto para **REST** como para **GraphQL**. -### Access the Playground +### Accede al Playground -1. Go to **Settings → APIs & Webhooks** -2. Create an API key (required) -3. Click on **REST API** or **GraphQL API** to open the playground +1. Ve a **Configuración → APIs y Webhooks** +2. Crea una clave de API (obligatorio) +3. Haz clic en **REST API** o **GraphQL API** para abrir el playground -### What You Get +### Lo que obtienes -* **Interactive documentation**: Generated for your specific data model -* **Live testing**: Execute real API calls against your workspace -* **Schema explorer**: Browse available objects, fields, and relationships -* **Request builder**: Construct queries with autocomplete +* **Documentación interactiva**: Generada para tu modelo de datos específico +* **Pruebas en vivo**: Ejecuta llamadas reales a la API en tu espacio de trabajo +* **Explorador de esquemas**: Navega por los objetos, campos y relaciones disponibles +* **Constructor de solicitudes**: Crea consultas con autocompletado -The playground reflects your custom objects and fields, so documentation is always accurate for your workspace. +El playground refleja tus objetos y campos personalizados, por lo que la documentación siempre es precisa para tu espacio de trabajo. -## Batch Operations +## Operaciones por Lotes -Both REST and GraphQL support batch operations: +Tanto REST como GraphQL admiten operaciones por lotes: -* **Batch size**: Up to 60 records per request -* **Operations**: Create, update, delete multiple records +* **Tamaño del lote**: Hasta 60 registros por solicitud +* **Operaciones**: Crear, actualizar y eliminar múltiples registros -**GraphQL-only features:** +**Características exclusivas de GraphQL:** -* **Batch Upsert**: Create or update in one call -* Use plural object names (e.g., `CreateCompanies` instead of `CreateCompany`) +* **Upsert por lotes**: Crear o actualizar en una llamada +* Usa nombres de objetos en plural (por ejemplo, `CreateCompanies` en lugar de `CreateCompany`) -## Rate Limits +## Límites de tasa -API requests are throttled to ensure platform stability: +Las solicitudes a la API se limitan para garantizar la estabilidad de la plataforma: -| Limit | Value | -| -------------- | -------------------- | -| **Requests** | 100 calls per minute | -| **Batch size** | 60 records per call | +| Límite | Valor | +| ------------------- | -------------------------- | +| **Solicitudes** | 100 solicitudes por minuto | +| **Tamaño del lote** | 60 registros por llamada | - Use batch operations to maximize throughput — process up to 60 records in a single API call instead of making individual requests. + Usa operaciones por lotes para maximizar el rendimiento — procesa hasta 60 registros en una sola llamada a la API en lugar de hacer solicitudes individuales. diff --git a/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx b/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx index dc528fa780..64760e33e0 100644 --- a/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx +++ b/packages/twenty-docs/l/es/developers/extend/capabilities/apps.mdx @@ -1,81 +1,88 @@ --- -title: Twenty Apps -description: Build and manage Twenty customizations as code. +title: Aplicaciones de Twenty +description: Crea y gestiona personalizaciones de Twenty como código. --- - Apps are currently in alpha testing. The feature is functional but still evolving. + Las aplicaciones están actualmente en pruebas alfa. La funcionalidad es operativa, pero sigue evolucionando. -## What Are Apps? +## ¿Qué son las aplicaciones? -Apps let you build and manage Twenty customizations **as code**. Instead of configuring everything through the UI, you define your data model and serverless functions in code — making it faster to build, maintain, and roll out to multiple workspaces. +Las aplicaciones te permiten crear y administrar personalizaciones de Twenty **como código**. En lugar de configurar todo a través de la interfaz de usuario, defines tu modelo de datos y funciones sin servidor en código, lo que hace más rápido crear, mantener y desplegar en múltiples espacios de trabajo. -**What you can do today:** +**Lo que puedes hacer hoy:** -* Define custom objects and fields as code (managed data model) -* Build serverless functions with custom triggers -* Deploy the same app across multiple workspaces +* Define objetos y campos personalizados como código (modelo de datos gestionado) +* Crea funciones sin servidor con desencadenadores personalizados +* Despliega la misma aplicación en múltiples espacios de trabajo -**Coming soon:** +**Próximamente:** -* Custom UI layouts and components +* Diseños y componentes de la interfaz de usuario personalizados -## Prerequisites +## Prerrequisitos -* Node.js 24+ and Yarn 4 -* A Twenty workspace and an API key (create one at https://app.twenty.com/settings/api-webhooks) +* Node.js 24+ y Yarn 4 +* Un espacio de trabajo de Twenty y una clave de API (créala en https://app.twenty.com/settings/api-webhooks) -## Getting Started +## Primeros pasos -Create a new app using the official scaffolder, then authenticate and start developing: +Crea una aplicación nueva usando el generador oficial, luego autentícate y comienza a desarrollar: ```bash filename="Terminal" -# Scaffold a new app +# Crear la estructura de una nueva aplicación npx create-twenty-app@latest my-twenty-app cd my-twenty-app -# Authenticate using your API key (you'll be prompted) -yarn auth +# Si no usas yarn@4 +corepack enable +yarn install -# Start dev mode: automatically syncs local changes to your workspace -yarn dev +# Autentícate con tu clave de API (se te pedirá) +yarn auth:login + +# Inicia el modo de desarrollo: sincroniza automáticamente los cambios locales con tu espacio de trabajo +yarn app:dev ``` -From here you can: +Desde aquí usted puede: ```bash filename="Terminal" # Add a new entity to your application (guided) -yarn create-entity +yarn app:create-entity # Generate a typed Twenty client and workspace entity types -yarn generate +yarn app:generate # Run a one‑time sync (instead of watch mode) -yarn sync +yarn app:sync # Watch your application's functions logs -yarn logs +yarn function:logs + +# Execute a function by name +yarn function:execute -n my-function -p '{"name": "test"}' # Uninstall the application from the current workspace -yarn uninstall +yarn app:uninstall # Display commands' help -yarn help +yarn app:help ``` -See also: the CLI reference pages for [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) and [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). +Consulta también: las páginas de referencia de la CLI para [create-twenty-app](https://www.npmjs.com/package/create-twenty-app) y [twenty-sdk CLI](https://www.npmjs.com/package/twenty-sdk). -## Project structure (scaffolded) +## Estructura del proyecto (generada) -When you run `npx create-twenty-app@latest my-twenty-app`, the scaffolder: +Cuando ejecutas `npx create-twenty-app@latest my-twenty-app`, el generador: -* Copies a minimal base application into `my-twenty-app/` -* Adds a local `twenty-sdk` dependency and Yarn 4 configuration -* Creates config files and scripts wired to the `twenty` CLI -* Generates a default application config and a default function role +* Copia una aplicación base mínima en `my-twenty-app/` +* Añade una dependencia local de `twenty-sdk` y la configuración de Yarn 4 +* Crea archivos de configuración y scripts vinculados a la CLI `twenty` +* Genera una configuración de aplicación predeterminada y un rol de función predeterminado -A freshly scaffolded app looks like this: +Una aplicación recién generada se ve así: ```text filename="my-twenty-app/" my-twenty-app/ @@ -85,79 +92,144 @@ my-twenty-app/ .nvmrc .yarnrc.yml .yarn/ - releases/ - yarn-4.9.2.cjs install-state.gz eslint.config.mjs tsconfig.json README.md src/ - application.config.ts - role.config.ts - // your entities, actions, and other app files + app/ + application.config.ts # Obligatorio - configuración principal de la aplicación + default-function.role.ts # Rol predeterminado para las funciones sin servidor + // tus entidades (*.object.ts, *.function.ts, *.role.ts) + utils/ # Opcional - implementaciones de manejadores y utilidades ``` -At a high level: +### Convención sobre configuración -* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall`, and `auth` that delegate to the local `twenty` CLI. -* **.gitignore**: Ignores common artifacts such as `node_modules`, `.yarn`, `generated/` (typed client), `dist/`, `build/`, coverage folders, log files, and `.env*` files. -* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Lock and configure the Yarn 4 toolchain used by the project. -* **.nvmrc**: Pins the Node.js version expected by the project. -* **eslint.config.mjs** and **tsconfig.json**: Provide linting and TypeScript configuration for your app’s TypeScript sources. -* **README.md**: A short README in the app root with basic instructions. -* **src/**: The main place where you define your application-as-code: - * `application.config.ts`: Global configuration for your app (metadata and runtime wiring). See “Application config” below. - * `role.config.ts`: Default function role used by your serverless functions. See “Default function role” below. - * Future entities, actions/functions, and any supporting code you add. +Las aplicaciones usan un enfoque de **convención sobre configuración** en el que las entidades se detectan por su sufijo de archivo. Esto permite una organización flexible dentro de la carpeta `src/app/`: -Later commands will add more files and folders: +| Sufijo de archivo | Tipo de entidad | +| ----------------- | -------------------------------------- | +| `*.object.ts` | Definiciones de objetos personalizados | +| `*.function.ts` | Definiciones de funciones sin servidor | +| `*.role.ts` | Definiciones de roles | -* `yarn generate` will create a `generated/` folder (typed Twenty client + workspace types). -* `yarn create-entity` will add entity definition files under `src/` for your custom objects. +### Organizaciones de carpetas compatibles -## Authentication +Puedes organizar tus entidades con cualquiera de estos patrones: -The first time you run `yarn auth`, you'll be prompted for: +**Tradicional (por tipo):** -* API URL (defaults to http://localhost:3000 or your current workspace profile) -* API key +```text +src/app/ +├── application.config.ts +├── objects/ +│ └── postCard.object.ts +├── functions/ +│ └── createPostCard.function.ts +└── roles/ + └── admin.role.ts +``` -Your credentials are stored per-user in `~/.twenty/config.json`. You can maintain multiple profiles and switch using `--workspace `. +**Basado en funcionalidades:** -Examples: +```text +src/app/ +├── application.config.ts +└── post-card/ + ├── postCard.object.ts + ├── createPostCard.function.ts + └── postCardAdmin.role.ts +``` + +**Plano:** + +```text +src/app/ +├── application.config.ts +├── postCard.object.ts +├── createPostCard.function.ts +└── admin.role.ts +``` + +A grandes rasgos: + +* **package.json**: Declara el nombre de la aplicación, la versión, los entornos (Node 24+, Yarn 4) y agrega `twenty-sdk` además de scripts como `dev`, `sync`, `generate`, `create-entity`, `logs`, `uninstall` y `auth` que delegan en la CLI local `twenty`. +* **.gitignore**: Ignora artefactos comunes como `node_modules`, `.yarn`, `generated/` (cliente tipado), `dist/`, `build/`, carpetas de cobertura, archivos de registro y archivos `.env*`. +* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Bloquean y configuran la cadena de herramientas Yarn 4 utilizada por el proyecto. +* **.nvmrc**: Fija la versión de Node.js esperada por el proyecto. +* **eslint.config.mjs** y **tsconfig.json**: Proporcionan linting y configuración de TypeScript para las fuentes de TypeScript de tu aplicación. +* **README.md**: Un README breve en la raíz de la aplicación con instrucciones básicas. +* **src/app/**: El lugar principal donde defines tu aplicación como código: + * `application.config.ts`: Configuración global de tu aplicación (metadatos y vinculación en tiempo de ejecución). Consulta "Configuración de la aplicación" más abajo. + * `*.role.ts`: Definiciones de roles usadas por tus funciones sin servidor. Consulta "Rol de función predeterminado" más abajo. + * `*.object.ts`: Definiciones de objetos personalizados. + * `*.function.ts`: Definiciones de funciones sin servidor. +* **src/utils/**: Carpeta opcional para implementaciones de controladores y utilidades. + +Comandos posteriores añadirán más archivos y carpetas: + +* `yarn app:generate` creará una carpeta `generated/` (cliente tipado de Twenty + tipos del espacio de trabajo). +* `yarn app:create-entity` añadirá archivos de definición de entidades en `src/app/` para tus objetos, funciones o roles personalizados. + l + +## Autenticación + +La primera vez que ejecutes `yarn auth:login`, se te solicitará: + +* URL de la API (por defecto http://localhost:3000 o el perfil de tu espacio de trabajo actual) +* Clave de API + +Tus credenciales se almacenan por usuario en `~/.twenty/config.json`. Puedes mantener varios perfiles y cambiar entre ellos. + +### Gestión de espacios de trabajo ```bash filename="Terminal" # Login interactively (recommended) -yarn auth +yarn auth:login -# Use a specific workspace profile -yarn auth --workspace my-custom-workspace +# Login to a specific workspace profile +yarn auth:login --workspace my-custom-workspace + +# List all configured workspaces +yarn auth:list + +# Switch the default workspace (interactive) +yarn auth:switch + +# Switch to a specific workspace +yarn auth:switch production + +# Check current authentication status +yarn auth:status ``` -## Use the SDK resources (types & config) +Una vez que hayas cambiado de espacio de trabajo con `auth:switch`, todos los comandos posteriores usarán ese espacio de trabajo de forma predeterminada. Aún puedes anularlo temporalmente con `--workspace `. -The twenty-sdk provides typed building blocks you use inside your app. Below are the key pieces you'll touch most often. +## Usa los recursos del SDK (tipos y configuración) -### Defining objects +El twenty-sdk proporciona bloques de construcción tipados y funciones auxiliares que utilizas dentro de tu aplicación. A continuación, las partes clave que usarás con más frecuencia. -Custom objects are regular TypeScript classes annotated with decorators from `twenty-sdk`. They live under `src/objects/` in your app and describe both schema and behavior for records in your workspace. +### Funciones auxiliares -Here is an example `postCard` object from the Hello World app: +El SDK proporciona cuatro funciones auxiliares con validación incorporada para definir las entidades de tu aplicación: + +| Función | Propósito | +| ------------------ | ----------------------------------------------- | +| `defineApp()` | Configura los metadatos de la aplicación | +| `defineObject()` | Define objetos personalizados con campos | +| `defineFunction()` | Define funciones sin servidor con controladores | +| `defineRole()` | Configura permisos de roles y acceso a objetos | + +Estas funciones validan tu configuración en tiempo de ejecución y proporcionan un mejor autocompletado en el IDE y seguridad de tipos. + +### Definir objetos + +Los objetos personalizados describen tanto el esquema como el comportamiento de los registros en tu espacio de trabajo. Usa `defineObject()` para definir objetos con validación incorporada: ```typescript -import { type Note } from '../../generated'; - -import { - type AddressField, - Field, - FieldType, - type FullNameField, - Object, - OnDeleteAction, - Relation, - RelationType, - STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, -} from 'twenty-sdk'; +// src/app/postCard.object.ts +import { defineObject, FieldType } from 'twenty-sdk'; enum PostCardStatus { DRAFT = 'DRAFT', @@ -166,176 +238,186 @@ enum PostCardStatus { RETURNED = 'RETURNED', } -@Object({ +export default defineObject({ universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', nameSingular: 'postCard', namePlural: 'postCards', - labelSingular: 'Post card', - labelPlural: 'Post cards', - description: ' A post card object', + labelSingular: 'Post Card', + labelPlural: 'Post Cards', + description: 'A post card object', icon: 'IconMail', -}) -export class PostCard { - @Field({ - universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', - type: FieldType.TEXT, - label: 'Content', - description: "Postcard's content", - icon: 'IconAbc', - }) - content: string; - - @Field({ - universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac', - type: FieldType.FULL_NAME, - label: 'Recipient name', - icon: 'IconUser', - }) - recipientName: FullNameField; - - @Field({ - universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266', - type: FieldType.ADDRESS, - label: 'Recipient address', - icon: 'IconHome', - }) - recipientAddress: AddressField; - - @Field({ - universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e', - type: FieldType.SELECT, - label: 'Status', - icon: 'IconSend', - defaultValue: `'${PostCardStatus.DRAFT}'`, - options: [ - { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' }, - { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' }, - { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' }, - { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' }, - ], - }) - status: PostCardStatus; - - @Relation({ - universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', - type: RelationType.ONE_TO_MANY, - label: 'Notes', - icon: 'IconComment', - inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, - onDelete: OnDeleteAction.CASCADE, - }) - notes: Note[]; - - @Field({ - universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433', - type: FieldType.DATE_TIME, - label: 'Delivered at', - icon: 'IconCheck', - isNullable: true, - defaultValue: null, - }) - deliveredAt?: Date; -} + fields: [ + { + universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', + name: 'content', + type: FieldType.TEXT, + label: 'Content', + description: "Postcard's content", + icon: 'IconAbc', + }, + { + universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac', + name: 'recipientName', + type: FieldType.FULL_NAME, + label: 'Recipient name', + icon: 'IconUser', + }, + { + universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266', + name: 'recipientAddress', + type: FieldType.ADDRESS, + label: 'Recipient address', + icon: 'IconHome', + }, + { + universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e', + name: 'status', + type: FieldType.SELECT, + label: 'Status', + icon: 'IconSend', + defaultValue: `'${PostCardStatus.DRAFT}'`, + options: [ + { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' }, + { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' }, + { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' }, + { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' }, + ], + }, + { + universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433', + name: 'deliveredAt', + type: FieldType.DATE_TIME, + label: 'Delivered at', + icon: 'IconCheck', + isNullable: true, + defaultValue: null, + }, + ], +}); ``` -Key points: +Puntos clave: -* The `@Object` decorator defines the object identity and labels used across the workspace; its `universalIdentifier` must be unique and stable across deployments. -* Each `@Field` decorator defines a field on the object with a type, label, and its own stable `universalIdentifier`. -* `@Relation` wires this object to other objects (standard or custom) and controls cascade behavior with `onDelete`. -* You can scaffold new objects using `yarn create-entity`, which guides you through naming, fields, and relationships, then generates object files similar to the `postCard` example. +* Usa `defineObject()` para validación incorporada y mejor soporte del IDE. +* El `universalIdentifier` debe ser único y estable entre implementaciones. +* Cada campo requiere `name`, `type`, `label` y su propio `universalIdentifier` estable. +* La matriz `fields` es opcional: puedes definir objetos sin campos personalizados. +* Puedes generar nuevos objetos usando `yarn app:create-entity`, que te guía por el nombrado, los campos y las relaciones. -### Application config (application.config.ts) + + **Los campos base se crean automáticamente.** Cuando defines un objeto personalizado, Twenty añade automáticamente campos estándar como `name`, `createdAt`, `updatedAt`, `createdBy`, `position` y `deletedAt`. No necesitas definir estos en tu matriz `fields` — solo agrega tus campos personalizados. + -Every app has a single `application.config.ts` file that describes: + + También puedes definir objetos usando decoradores de TypeScript. Este enfoque usa sintaxis basada en clases con los decoradores `@Object`, `@Field` y `@Relation`: -* **Who the app is**: identifiers, display name, and description. -* **How its functions run**: which role they use for permissions. -* **(Optional) variables**: key–value pairs exposed to your functions as environment variables. + ```typescript + import { + type AddressField, + Field, + FieldType, + type FullNameField, + Object, + OnDeleteAction, + Relation, + RelationType, + STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS, + } from 'twenty-sdk'; + import { type Note } from '../../generated'; -When you scaffold a new app, you start with a minimal config: + @Object({ + universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05', + nameSingular: 'postCard', + namePlural: 'postCards', + labelSingular: 'Post card', + labelPlural: 'Post cards', + description: 'A post card object', + icon: 'IconMail', + }) + export class PostCard { + @Field({ + universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b', + type: FieldType.TEXT, + label: 'Content', + description: "Postcard's content", + icon: 'IconAbc', + }) + content: string; + + @Relation({ + universalIdentifier: 'c9e2b4f4-b9ad-4427-9b42-9971b785edfe', + type: RelationType.ONE_TO_MANY, + label: 'Notes', + icon: 'IconComment', + inverseSideTargetUniversalIdentifier: STANDARD_OBJECT_UNIVERSAL_IDENTIFIERS.note, + onDelete: OnDeleteAction.CASCADE, + }) + notes: Note[]; + } + ``` + + Nota: El enfoque de decoradores requiere `experimentalDecorators` en tu configuración de TypeScript. + + +### Configuración de la aplicación (application.config.ts) + +Cada aplicación tiene un único archivo `application.config.ts` que describe: + +* **Qué es la aplicación**: identificadores, nombre para mostrar y descripción. +* **Cómo se ejecutan sus funciones**: qué rol usan para permisos. +* **Variables (opcionales)**: pares clave–valor expuestos a tus funciones como variables de entorno. + +Usa `defineApp()` para definir la configuración de tu aplicación: ```typescript -import { type ApplicationConfig } from 'twenty-sdk'; +// src/app/application.config.ts +import { defineApp } from 'twenty-sdk'; +import { DEFAULT_FUNCTION_ROLE_UNIVERSAL_IDENTIFIER } from './default-function.role'; -const config: ApplicationConfig = { - universalIdentifier: '', +export default defineApp({ + universalIdentifier: '4ec0391d-18d5-411c-b2f3-266ddc1c3ef7', displayName: 'My Twenty App', description: 'My first Twenty app', - functionRoleUniversalIdentifier: '', -}; - -export default config; -``` - -You can gradually extend this file as your app grows. For example, you can add an icon and application-scoped variables: - -```typescript -import { type ApplicationConfig } from 'twenty-sdk'; - -const config: ApplicationConfig = { - universalIdentifier: '', - displayName: 'My App', - description: 'What your app does', - icon: 'IconWorld', // Choose an icon by name + icon: 'IconWorld', applicationVariables: { DEFAULT_RECIPIENT_NAME: { - universalIdentifier: '', - description: 'Default recipient used by functions', + universalIdentifier: '19e94e59-d4fe-4251-8981-b96d0a9f74de', + description: 'Default recipient name for postcards', value: 'Jane Doe', isSecret: false, }, }, - functionRoleUniversalIdentifier: '', -}; - -export default config; + functionRoleUniversalIdentifier: DEFAULT_FUNCTION_ROLE_UNIVERSAL_IDENTIFIER, +}); ``` -Notes: +Notas: -* `universalIdentifier` fields are deterministic IDs you own; generate them once and keep them stable across syncs. -* `applicationVariables` become environment variables for your functions (for example, `DEFAULT_RECIPIENT_NAME` is available as `process.env.DEFAULT_RECIPIENT_NAME`). -* `functionRoleUniversalIdentifier` must match the role you define in `role.config.ts` (see below). +* Los campos `universalIdentifier` son ID deterministas bajo tu control; genéralos una vez y mantenlos estables entre sincronizaciones. +* Las `applicationVariables` se convierten en variables de entorno para tus funciones (por ejemplo, `DEFAULT_RECIPIENT_NAME` está disponible como `process.env.DEFAULT_RECIPIENT_NAME`). +* `functionRoleUniversalIdentifier` debe coincidir con el rol que defines en tu archivo `*.role.ts` (ver abajo). -#### Roles and permissions +#### Roles y permisos -Applications can define roles that encapsulate permissions on your workspace’s objects and actions. The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app’s serverless functions. +Las aplicaciones pueden definir roles que encapsulan permisos sobre los objetos y acciones de tu espacio de trabajo. El campo `functionRoleUniversalIdentifier` en `application.config.ts` designa el rol predeterminado que usan las funciones sin servidor de tu aplicación. -* The runtime API key injected as `TWENTY_API_KEY` is derived from this default function role. -* The typed client will be restricted to the permissions granted to that role. -* Follow least‑privilege: create a dedicated role with only the permissions your functions need, then reference its universal identifier. +* La clave de API en tiempo de ejecución inyectada como `TWENTY_API_KEY` se deriva de este rol de función predeterminado. +* El cliente tipado estará restringido a los permisos otorgados a ese rol. +* Sigue el principio de mínimo privilegio: crea un rol dedicado con solo los permisos que necesitan tus funciones y luego referencia su identificador universal. -##### Default function role (role.config.ts) +##### Rol de función predeterminado (\*.role.ts) -When you scaffold a new app, the CLI also creates `src/role.config.ts`. This file exports the default role your serverless functions will use at runtime: +Cuando generas una nueva aplicación, la CLI también crea un archivo de rol predeterminado. Usa `defineRole()` para definir roles con validación incorporada: ```typescript -import { PermissionFlag, type RoleConfig } from 'twenty-sdk'; +// src/app/default-function.role.ts +import { defineRole, PermissionFlag } from 'twenty-sdk'; -export const functionRole: RoleConfig = { - universalIdentifier: '', - label: 'My Twenty App default function role', - description: 'My Twenty App default function role', - canReadAllObjectRecords: true, - canUpdateAllObjectRecords: true, - canSoftDeleteAllObjectRecords: true, - canDestroyAllObjectRecords: false, -}; -``` +export const DEFAULT_FUNCTION_ROLE_UNIVERSAL_IDENTIFIER = + 'b648f87b-1d26-4961-b974-0908fd991061'; -The `universalIdentifier` of this role is automatically wired into `application.config.ts` as `functionRoleUniversalIdentifier`. In other words: - -* **role.config.ts** defines what the default function role can do. -* **application.config.ts** points to that role so your functions inherit its permissions. - -As you move beyond the initial scaffold, you should tighten this role and make it explicit about what it can access. A more production-ready role might look closer to: - -```typescript -import { PermissionFlag, type RoleConfig } from 'twenty-sdk'; - -export const functionRole: RoleConfig = { - universalIdentifier: '', +export default defineRole({ + universalIdentifier: DEFAULT_FUNCTION_ROLE_UNIVERSAL_IDENTIFIER, label: 'Default function role', description: 'Default role for function Twenty client', canReadAllObjectRecords: false, @@ -363,41 +445,41 @@ export const functionRole: RoleConfig = { canUpdateFieldValue: false, }, ], - permissionFlags: ['APPLICATIONS'], -}; + permissionFlags: [PermissionFlag.APPLICATIONS], +}); ``` -Notes: +El `universalIdentifier` de este rol se referencia luego en `application.config.ts` como `functionRoleUniversalIdentifier`. En otras palabras: -* Start from the scaffolded role, then progressively restrict it following least‑privilege. -* Replace the `objectPermissions` and `fieldPermissions` with the objects/fields your functions need. -* `permissionFlags` control access to platform-level capabilities. Keep them minimal; add only what you need. -* See a working example in the Hello World app: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts). +* **\*.role.ts** define lo que puede hacer el rol de función predeterminado. +* **application.config.ts** apunta a ese rol para que tus funciones hereden sus permisos. -### Serverless function config and entrypoint +Notas: -Each function exports a main handler and a config describing its triggers. You can mix multiple trigger types. +* Parte del rol generado y luego restríngele progresivamente siguiendo el principio de mínimo privilegio. +* Reemplaza `objectPermissions` y `fieldPermissions` con los objetos/campos que necesitan tus funciones. +* `permissionFlags` controla el acceso a capacidades a nivel de plataforma. Mantenlos al mínimo; agrega solo lo que necesites. +* Consulta un ejemplo funcional en la aplicación Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts). + +### Configuración y punto de entrada de funciones sin servidor + +Cada archivo de función usa `defineFunction()` para exportar una configuración con un controlador y desencadenadores opcionales. Usa el sufijo de archivo `*.function.ts` para la detección automática. ```typescript -// src/actions/create-new-post-card.ts -import type { - FunctionConfig, - DatabaseEventPayload, - ObjectRecordCreateEvent, - CronPayload, -} from 'twenty-sdk'; -import Twenty, { type Person } from '../generated'; +// src/app/createPostCard.function.ts +import { defineFunction } from 'twenty-sdk'; +import type { DatabaseEventPayload, ObjectRecordCreateEvent, CronPayload, RoutePayload } from 'twenty-sdk'; +import Twenty, { type Person } from '../../generated'; -// main handler can accept parameters from route, cron, or database events -export const main = async ( +const handler = async ( params: - | { name?: string } + | RoutePayload | DatabaseEventPayload> | CronPayload, ) => { const client = new Twenty(); // generated typed client - const name = 'name' in params - ? params.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' + const name = 'name' in params.queryStringParameters + ? params.queryStringParameters.name ?? process.env.DEFAULT_RECIPIENT_NAME ?? 'Hello world' : 'Hello world'; const result = await client.mutation({ @@ -410,14 +492,15 @@ export const main = async ( return result; }; -export const config: FunctionConfig = { - universalIdentifier: '', +export default defineFunction({ + universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf', name: 'create-new-post-card', timeoutSeconds: 2, + handler, triggers: [ // Public HTTP route trigger '/s/post-card/create' { - universalIdentifier: '', + universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6', type: 'route', path: '/post-card/create', httpMethod: 'GET', @@ -425,39 +508,137 @@ export const config: FunctionConfig = { }, // Cron trigger (CRON pattern) { - universalIdentifier: '', + universalIdentifier: 'dd802808-0695-49e1-98c9-d5c9e2704ce2', type: 'cron', pattern: '0 0 1 1 *', }, // Database event trigger { - universalIdentifier: '', + universalIdentifier: '203f1df3-4a82-4d06-a001-b8cf22a31156', type: 'databaseEvent', - eventName: 'person.created', + eventName: 'person.updated', + updatedFields: ['name'], }, ], +}); +``` + +Tipos de desencadenadores comunes: + +* **route**: Expone tu función en una ruta y método HTTP **bajo el endpoint `/s/`**: + +> p. ej. `path: '/post-card/create',` -> llamar en `/s/post-card/create` + +* **cron**: Ejecuta tu función en un horario usando una expresión CRON. +* **databaseEvent**: Se ejecuta en eventos del ciclo de vida de objetos del espacio de trabajo. Cuando la operación del evento es `updated`, se pueden especificar campos específicos que se deben escuchar en el arreglo `updatedFields`. Si se deja sin definir o vacío, cualquier actualización activará la función. + +> p. ej., `person.updated` + +Notas: + +* La matriz `triggers` es opcional. Las funciones sin desencadenadores pueden usarse como funciones utilitarias llamadas por otras funciones. +* Puedes combinar múltiples tipos de desencadenadores en una sola función. + +### Carga útil del disparador de ruta + + + **Cambio no retrocompatible (v1.16, enero de 2026):** El formato de la carga útil del disparador de ruta ha cambiado. Antes de la v1.16, los parámetros de consulta, los parámetros de ruta y el cuerpo se enviaban directamente como la carga útil. A partir de la v1.16, están anidados dentro de un objeto `RoutePayload` estructurado. + + **Antes de la v1.16:** + + ```typescript + const handler = async (params) => { + const { param1, param2 } = params; // Direct access + }; + ``` + + **Después de la v1.16:** + + ```typescript + const handler = async (event: RoutePayload) => { + const { param1, param2 } = event.body; // Access via .body + const { queryParam } = event.queryStringParameters; + const { id } = event.pathParameters; + }; + ``` + + **Para migrar las funciones existentes:** Actualiza tu controlador para desestructurar desde `event.body`, `event.queryStringParameters` o `event.pathParameters` en lugar de hacerlo directamente desde el objeto params. + + +Cuando un disparador de ruta invoca tu función, esta recibe un objeto `RoutePayload` que sigue el formato de AWS HTTP API v2. Importa el tipo desde `twenty-sdk`: + +```typescript +import { defineFunction, type RoutePayload } from 'twenty-sdk'; + +const handler = async (event: RoutePayload) => { + // Access request data + const { headers, queryStringParameters, pathParameters, body } = event; + + // HTTP method and path are available in requestContext + const { method, path } = event.requestContext.http; + + return { message: 'Success' }; }; ``` -Common trigger types: +El tipo `RoutePayload` tiene la siguiente estructura: -* route: Exposes your function on an HTTP path and method **under the `/s/` endpoint**: +| Propiedad | Tipo | Descripción | +| ---------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------- | +| `headers` | `Record` | Encabezados HTTP (solo aquellos listados en `forwardedRequestHeaders`) | +| `queryStringParameters` | `Record` | Parámetros de consulta (valores múltiples unidos con comas) | +| `pathParameters` | `Record` | Parámetros de ruta extraídos del patrón de ruta (p. ej., `/users/:id` → `{ id: '123' }`) | +| `cuerpo` | `object \| null` | Cuerpo de la solicitud analizado (JSON) | +| `isBase64Encoded` | `booleano` | Indica si el cuerpo está codificado en base64 | +| `requestContext.http.method` | `string` | Método HTTP (GET, POST, PUT, PATCH, DELETE) | +| `requestContext.http.path` | `string` | Ruta de la solicitud sin procesar | -> e.g. `path: '/post-card/create',` -> call on `/s/post-card/create` +### Reenvío de encabezados HTTP -* cron: Runs your function on a schedule using a CRON expression. -* databaseEvent: Runs on workspace object lifecycle events +De forma predeterminada, los encabezados HTTP de las solicitudes entrantes **no** se pasan a tu función sin servidor por razones de seguridad. Para acceder a encabezados específicos, enuméralos explícitamente en el arreglo `forwardedRequestHeaders`: -> e.g. `person.created` +```typescript +export default defineFunction({ + universalIdentifier: 'e56d363b-0bdc-4d8a-a393-6f0d1c75bdcf', + name: 'webhook-handler', + handler, + triggers: [ + { + universalIdentifier: 'c9f84c8d-b26d-40d1-95dd-4f834ae5a2c6', + type: 'route', + path: '/webhook', + httpMethod: 'POST', + isAuthRequired: false, + forwardedRequestHeaders: ['x-webhook-signature', 'content-type'], + }, + ], +}); +``` -You can create new functions in two ways: +En tu controlador, luego puedes acceder a estos encabezados: -* **Scaffolded**: Run `yarn create-entity --path ` and choose the option to add a new function. This generates a starter file under `` with a `main` handler and a `config` block similar to the example above. -* **Manual**: Create a new file and export `main` and `config` yourself, following the same pattern. +```typescript +const handler = async (event: RoutePayload) => { + const signature = event.headers['x-webhook-signature']; + const contentType = event.headers['content-type']; -### Generated typed client + // Validate webhook signature... + return { received: true }; +}; +``` -Run yarn generate to create a local typed client in generated/ based on your workspace schema. Use it in your functions: + + Los nombres de los encabezados se normalizan a minúsculas. Accede a ellos usando claves en minúsculas (por ejemplo, `event.headers['content-type']`). + + +Puedes crear funciones nuevas de dos maneras: + +* **Generado**: Ejecuta `yarn app:create-entity` y elige la opción para añadir una nueva función. Esto genera un archivo inicial con un controlador y configuración. +* **Manual**: Crea un nuevo archivo `*.function.ts` y usa `defineFunction()`, siguiendo el mismo patrón. + +### Cliente tipado generado + +Ejecuta yarn app:generate para crear un cliente tipado local en generated/ basado en el esquema de tu espacio de trabajo. Úsalo en tus funciones: ```typescript import Twenty from './generated'; @@ -466,34 +647,34 @@ const client = new Twenty(); const { me } = await client.query({ me: { id: true, displayName: true } }); ``` -The client is re-generated by `yarn generate`. Re-run after changing your objects and `yarn sync` or when onboarding to a new workspace. +El cliente se vuelve a generar con `yarn app:generate`. Vuelve a ejecutarlo después de cambiar tus objetos y de hacer `yarn app:sync`, o al incorporarte a un nuevo espacio de trabajo. -#### Runtime credentials in serverless functions +#### Credenciales en tiempo de ejecución en funciones sin servidor -When your function runs on Twenty, the platform injects credentials as environment variables before your code executes: +Cuando tu función se ejecuta en Twenty, la plataforma inyecta credenciales como variables de entorno antes de que tu código se ejecute: -* `TWENTY_API_URL`: Base URL of the Twenty API your app targets. -* `TWENTY_API_KEY`: Short‑lived key scoped to your application’s default function role. +* `TWENTY_API_URL`: URL base de la API de Twenty a la que apunta tu aplicación. +* `TWENTY_API_KEY`: Clave de corta duración con alcance al rol de función predeterminado de tu aplicación. -Notes: +Notas: -* You do not need to pass URL or API key to the generated client. It reads `TWENTY_API_URL` and `TWENTY_API_KEY` from process.env at runtime. -* The API key’s permissions are determined by the role referenced in your `application.config.ts` via `functionRoleUniversalIdentifier`. This is the default role used by serverless functions of your application. -* Applications can define roles to follow least‑privilege. Grant only the permissions your functions need, then point `functionRoleUniversalIdentifier` to that role’s universal identifier. +* No necesitas pasar la URL ni la clave de API al cliente generado. Lee `TWENTY_API_URL` y `TWENTY_API_KEY` de process.env en tiempo de ejecución. +* Los permisos de la clave de API están determinados por el rol referenciado en tu `application.config.ts` mediante `functionRoleUniversalIdentifier`. Este es el rol predeterminado que usan las funciones sin servidor de tu aplicación. +* Las aplicaciones pueden definir roles para seguir el principio de mínimo privilegio. Concede solo los permisos que necesitan tus funciones y después apunta `functionRoleUniversalIdentifier` al identificador universal de ese rol. -### Hello World example +### Ejemplo Hello World -Explore a minimal, end-to-end example that demonstrates objects, functions, and multiple triggers [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world): +Explora un ejemplo mínimo de extremo a extremo que demuestra objetos, funciones y múltiples desencadenadores [aquí](https://github.com/twentyhq/twenty/tree/main/packages/twenty-apps/hello-world): -## Manual setup (without the scaffolder) +## Configuración manual (sin el generador) -While we recommend using `create-twenty-app` for the best getting-started experience, you can also set up a project manually. Do not install the CLI globally. Instead, add `twenty-sdk` as a local dependency and wire scripts in your package.json: +Aunque recomendamos usar `create-twenty-app` para la mejor experiencia de inicio, también puedes configurar un proyecto manualmente. No instales la CLI globalmente. En su lugar, agrega `twenty-sdk` como dependencia local y conecta scripts en tu package.json: ```bash filename="Terminal" yarn add -D twenty-sdk ``` -Then add scripts like these: +Luego agrega scripts como estos: ```json filename="package.json" { @@ -510,13 +691,13 @@ Then add scripts like these: } ``` -Now you can run the same commands via Yarn, e.g. `yarn dev`, `yarn sync`, etc. +Ahora puedes ejecutar los mismos comandos mediante Yarn, p. ej., `yarn app:dev`, `yarn app:sync`, etc. -## Troubleshooting +## Solución de problemas -* Authentication errors: run `yarn auth` and ensure your API key has the required permissions. -* Cannot connect to server: verify the API URL and that the Twenty server is reachable. -* Types or client missing/outdated: run `yarn generate` and then `yarn dev`. -* Dev mode not syncing: ensure `yarn dev` is running and that changes are not ignored by your environment. +* Errores de autenticación: ejecuta `yarn auth:login` y asegúrate de que tu clave de API tenga los permisos necesarios. +* No se puede conectar al servidor: verifica la URL de la API y que el servidor de Twenty sea accesible. +* Tipos o cliente faltantes/obsoletos: ejecuta `yarn app:generate` y luego `yarn app:dev`. +* El modo de desarrollo no sincroniza: asegúrate de que `yarn app:dev` esté ejecutándose y de que los cambios no sean ignorados por tu entorno. -Discord Help Channel: https://discord.com/channels/1130383047699738754/1130386664812982322 +Canal de ayuda en Discord: https://discord.com/channels/1130383047699738754/1130386664812982322 diff --git a/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx b/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx index e8ee19e955..aa938bf322 100644 --- a/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx +++ b/packages/twenty-docs/l/es/developers/extend/capabilities/webhooks.mdx @@ -1,44 +1,44 @@ --- title: Webhooks -description: Receive real-time notifications when events occur in your CRM. +description: Recibe notificaciones en tiempo real cuando ocurran eventos en tu CRM. --- import { VimeoEmbed } from '/snippets/vimeo-embed.mdx'; -Webhooks push data to your systems in real-time when events occur in Twenty — no polling required. Use them to keep external systems in sync, trigger automations, or send alerts. +Los webhooks envían datos a tus sistemas en tiempo real cuando ocurren eventos en Twenty — no se requiere sondeo. Úsalos para mantener sincronizados los sistemas externos, activar automatizaciones o enviar alertas. -## Create a Webhook +## Crear un Webhook -1. Go to **Settings → APIs & Webhooks → Webhooks** -2. Click **+ Create webhook** -3. Enter your webhook URL (must be publicly accessible) -4. Click **Save** +1. Ve a **Configuración → APIs y Webhooks → Webhooks** +2. Haga clic en **+ Crear webhook** +3. Introduce la URL de tu webhook (debe ser públicamente accesible) +4. Haga clic en **Guardar** -The webhook activates immediately and starts sending notifications. +El webhook se activa de inmediato y comienza a enviar notificaciones. - + -### Manage Webhooks +### Gestionar Webhooks -**Edit**: Click the webhook → Update URL → **Save** +**Editar**: Haz clic en el webhook → Actualizar la URL → **Guardar** -**Delete**: Click the webhook → **Delete** → Confirm +**Eliminar**: Haz clic en el webhook → **Eliminar** → Confirmar -## Events +## Eventos -Twenty sends webhooks for these event types: +Twenty envía webhooks para estos tipos de eventos: -| Event | Example | -| ------------------ | ---------------------------------------------------------- | -| **Record Created** | `person.created`, `company.created`, `note.created` | -| **Record Updated** | `person.updated`, `company.updated`, `opportunity.updated` | -| **Record Deleted** | `person.deleted`, `company.deleted` | +| Evento | Ejemplo | +| ---------------------------- | ---------------------------------------------------------- | +| **Se crea un registro** | `person.created`, `company.created`, `note.created` | +| **Se actualiza un registro** | `person.updated`, `company.updated`, `opportunity.updated` | +| **Se elimina un registro** | `person.deleted`, `company.deleted` | -All event types are sent to your webhook URL. Event filtering may be added in future releases. +Todos los tipos de eventos se envían a la URL de tu webhook. Es posible que se agregue el filtrado de eventos en versiones futuras. -## Payload Format +## Formato de la carga útil -Each webhook sends an HTTP POST with a JSON body: +Cada webhook envía una solicitud HTTP POST con un cuerpo JSON: ```json { @@ -55,35 +55,35 @@ Each webhook sends an HTTP POST with a JSON body: } ``` -| Field | Description | -| ----------- | ------------------------------------------------ | -| `event` | What happened (e.g., `person.created`) | -| `data` | The full record that was created/updated/deleted | -| `timestamp` | When the event occurred (UTC) | +| Campo | Descripción | +| ----------------- | -------------------------------------------------- | +| `evento` | Qué ocurrió (p. ej., `person.created`) | +| `datos` | El registro completo que se creó/actualizó/eliminó | +| `marca de tiempo` | Cuándo ocurrió el evento (UTC) | - Respond with a **2xx HTTP status** (200-299) to acknowledge receipt. Non-2xx responses are logged as delivery failures. + Responde con un **estado HTTP 2xx** (200-299) para confirmar la recepción. Las respuestas que no sean 2xx se registran como errores de entrega. -## Webhook Validation +## Validación de Webhook -Twenty signs each webhook request for security. Validate signatures to ensure requests are authentic. +Twenty firma cada solicitud de webhook por seguridad. Valida las firmas para garantizar que las solicitudes sean auténticas. -### Headers +### Encabezados -| Header | Description | -| ---------------------------- | --------------------- | -| `X-Twenty-Webhook-Signature` | HMAC SHA256 signature | -| `X-Twenty-Webhook-Timestamp` | Request timestamp | +| Encabezado | Descripción | +| ---------------------------- | ------------------------------- | +| `X-Twenty-Webhook-Signature` | Firma HMAC SHA256 | +| `X-Twenty-Webhook-Timestamp` | Marca de tiempo de la solicitud | -### Validation Steps +### Pasos de validación -1. Get the timestamp from `X-Twenty-Webhook-Timestamp` -2. Create the string: `{timestamp}:{JSON payload}` -3. Compute HMAC SHA256 using your webhook secret -4. Compare with `X-Twenty-Webhook-Signature` +1. Obtén la marca de tiempo de `X-Twenty-Webhook-Timestamp` +2. Crea la cadena: `{timestamp}:{JSON payload}` +3. Calcula HMAC SHA256 usando tu secreto de webhook +4. Compara con `X-Twenty-Webhook-Signature` -### Example (Node.js) +### Ejemplo (Node.js) ```javascript const crypto = require("crypto"); @@ -101,12 +101,12 @@ const expectedSignature = crypto const isValid = expectedSignature === req.headers["x-twenty-webhook-signature"]; ``` -## Webhooks vs Workflows +## Webhooks vs flujos de trabajo -| Method | Direction | Use Case | -| ---------------------------- | --------- | ---------------------------------------------------------- | -| **Webhooks** | OUT | Automatically notify external systems of any record change | -| **Workflow + HTTP Request** | OUT | Send data out with custom logic (filters, transformations) | -| **Workflow Webhook Trigger** | IN | Receive data into Twenty from external systems | +| Método | Dirección | Caso de uso | +| --------------------------------------------- | --------- | --------------------------------------------------------------------------------- | +| **Webhooks** | SALIDA | Notificar automáticamente a los sistemas externos cualquier cambio en un registro | +| **Flujo de trabajo + solicitud HTTP** | SALIDA | Enviar datos con lógica personalizada (filtros, transformaciones) | +| **Disparador de webhook de flujo de trabajo** | ENTRADA | Recibir datos en Twenty desde sistemas externos | -For receiving external data, see [Set Up a Webhook Trigger](/l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). +Para recibir datos externos, consulta [Configurar un disparador de webhook](/l/es/user-guide/workflows/how-tos/connect-to-other-tools/set-up-a-webhook-trigger). diff --git a/packages/twenty-docs/l/es/developers/extend/extend.mdx b/packages/twenty-docs/l/es/developers/extend/extend.mdx index 5d5cedc184..b64b2e3dba 100644 --- a/packages/twenty-docs/l/es/developers/extend/extend.mdx +++ b/packages/twenty-docs/l/es/developers/extend/extend.mdx @@ -1,34 +1,34 @@ --- -title: Extend -description: Extend Twenty's functionality with APIs, webhooks, and custom apps. +title: Ampliar +description: Amplía la funcionalidad de Twenty con APIs, webhooks y aplicaciones personalizadas. --- - AI + IA -## Overview +## Resumen -Twenty is designed to be extensible. Use our APIs, webhooks, and app framework to integrate with your existing tools and build custom functionality. +Twenty está diseñado para ser extensible. Usa nuestras APIs, webhooks y el framework de aplicaciones para integrarte con tus herramientas existentes y crear funcionalidades personalizadas. -## What You Can Do +## Lo que puedes hacer -* **APIs**: Query and modify your CRM data programmatically using REST or GraphQL -* **Webhooks**: Receive real-time notifications when events occur in Twenty -* **Apps**: Build custom applications that extend Twenty's capabilities - Coming soon! +* **APIs**: Consulta y modifica tus datos de CRM de forma programática usando REST o GraphQL +* **Webhooks**: Recibe notificaciones en tiempo real cuando ocurran eventos en Twenty +* **Aplicaciones**: Crea aplicaciones personalizadas que amplíen las capacidades de Twenty - Próximamente. -## Getting Started +## Primeros pasos - - Connect to Twenty programmatically + + Conéctate a Twenty de forma programática - Get notified of events in real-time + Recibe notificaciones de eventos en tiempo real - - Build customizations as code (Alpha) + + Crea personalizaciones como código (Alpha) diff --git a/packages/twenty-docs/l/es/developers/introduction.mdx b/packages/twenty-docs/l/es/developers/introduction.mdx index ccefba6268..711c0fbf53 100644 --- a/packages/twenty-docs/l/es/developers/introduction.mdx +++ b/packages/twenty-docs/l/es/developers/introduction.mdx @@ -1,23 +1,23 @@ --- -title: Getting Started -description: Welcome to Twenty Developer Documentation, your resources for extending, self-hosting, and contributing to Twenty. +title: Primeros pasos +description: Bienvenido a la documentación para desarrolladores de Twenty, tus recursos para ampliar, autoalojar y contribuir a Twenty. --- import { CardTitle } from "/snippets/card-title.mdx" - Extend - Build integrations with APIs, webhooks, and custom apps. + Ampliar + Crea integraciones con APIs, webhooks y aplicaciones personalizadas. - Self-Host - Deploy and manage Twenty on your own infrastructure. + Autoalojar + Despliega y administra Twenty en tu propia infraestructura. - Contribute - Join our open-source community and contribute to Twenty. + Contribuir + Únete a nuestra comunidad de código abierto y contribuye a Twenty. diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx index 809388612a..d3abe79a30 100644 --- a/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx +++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/cloud-providers.mdx @@ -1,45 +1,45 @@ --- -title: Other methods +title: Otros métodos --- - This document is maintained by the community. It might contain issues. + Este documento es mantenido por la comunidad. Podría contener problemas. -## Kubernetes via Terraform and Manifests +## Kubernetes vía Terraform y Manifests -Community-led documentation for Kubernetes deployment is available [here](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s) +Documentación comunitaria para la implementación de Kubernetes está disponible [aquí](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s) ### Coolify -Deploy Twenty on servers using Coolify. (official image on Coolify will be available soon) +Despliega Twenty en servidores usando Coolify. (la imagen oficial en Coolify estará disponible pronto) -[Coolify documentation](https://coolify.io/docs/get-started/introduction) +[Documentación de Coolify](https://coolify.io/docs/get-started/introduction) ### EasyPanel -Deploy Twenty on EasyPanel with the community maintained template below. +Despliega Twenty en EasyPanel con la plantilla mantenida por la comunidad a continuación. -[Deploy on EasyPanel](https://easypanel.io/docs/templates/twenty) +[Desplegar en EasyPanel](https://easypanel.io/docs/templates/twenty) ### Elest.io -Deploy Twenty on servers with Elest.io using link below. +Despliega Twenty en servidores con Elest.io utilizando el enlace a continuación. -[Deploy on Elest.io](https://elest.io/open-source/twenty) +[Desplegar en Elest.io](https://elest.io/open-source/twenty) -### Twenty on Railway +### Twenty en Railway -Deploy Twenty on Railway with the community maintained template below. +Despliega Twenty en Railway con la plantilla mantenida por la comunidad a continuación. -[![Deploy on Railway](https://railway.com/button.svg)](https://railway.com/deploy/nAL3hA) +[![Desplegar en Railway](https://railway.com/button.svg)](https://railway.com/deploy/nAL3hA) -### Twenty on Sealos +### Twenty en Sealos -Deploy Twenty on Sealos with the community maintained template below. +Despliega Twenty en Sealos con la plantilla mantenida por la comunidad a continuación. -[![Deploy on Sealos](https://sealos.io/Deploy-on-Sealos.svg)](https://sealos.io/products/app-store/twenty) +[![Desplegar en Sealos](https://sealos.io/Deploy-on-Sealos.svg)](https://sealos.io/products/app-store/twenty) -## Others +## Otros -Please feel free to Open a PR to add more Cloud Provider options. +No dudes en abrir un PR para añadir más opciones de proveedores de la nube. diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx index 3791b5e48b..538160baad 100644 --- a/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx +++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/docker-compose.mdx @@ -1,253 +1,253 @@ --- -title: 1-Click w/ Docker Compose +title: 1-Clic con Docker Compose --- - Docker containers are for production hosting or self-hosting, for the contribution please check the [Local Setup](/l/es/developers/contribute/capabilities/local-setup). + Los contenedores de Docker son para alojamiento en producción o autoalojamiento, para la contribución por favor revise la [Configuración Local](/l/es/developers/contribute/capabilities/local-setup). -## Overview +## Resumen -This guide provides step-by-step instructions to install and configure the Twenty application using Docker Compose. The aim is to make the process straightforward and prevent common pitfalls that could break your setup. +Esta guía proporciona instrucciones paso a paso para instalar y configurar la aplicación Twenty utilizando Docker Compose. El objetivo es simplificar el proceso y prevenir errores comunes que podrían arruinar tu configuración. -**Important:** Only modify settings explicitly mentioned in this guide. Altering other configurations may lead to issues. +**Importante:** Solo modifica configuraciones explícitamente mencionadas en esta guía. Alterar otras configuraciones puede causar problemas. -See docs [Setup Environment Variables](/l/es/developers/self-host/capabilities/setup) for advanced configuration. All environment variables must be declared in the docker-compose.yml file at the server and / or worker level depending on the variable. +Consulta los documentos [Configurar Variables de Entorno](/l/es/developers/self-host/capabilities/setup) para configuraciones avanzadas. Todas las variables de entorno deben ser declaradas en el archivo docker-compose.yml en el nivel del servidor y/o trabajador dependiendo de la variable. -## System Requirements +## Requisitos del sistema -* RAM: Ensure your environment has at least 2GB of RAM. Insufficient memory can cause processes to crash. -* Docker & Docker Compose: Make sure both are installed and up-to-date. +* RAM: Asegúrate de que tu entorno tenga al menos 2GB de RAM. La memoria insuficiente puede causar que los procesos se bloqueen. +* Docker & Docker Compose: Asegúrate de que ambos estén instalados y actualizados. -## Option 1: One-line script +## Opción 1: Script de una línea -Install the latest stable version of Twenty with a single command: +Instala la última versión estable de Twenty con un solo comando: ```bash bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh) ``` -To install a specific version or branch: +Para instalar una versión o rama específica: ```bash VERSION=vx.y.z BRANCH=branch-name bash <(curl -sL https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/scripts/install.sh) ``` -* Replace x.y.z with the desired version number. -* Replace branch-name with the name of the branch you want to install. +* Reemplace x.y.z con el número de versión deseado. +* Reemplace branch-name con el nombre de la rama que desea instalar. -## Option 2: Manual steps +## Opción 2: Pasos manuales -Follow these steps for a manual setup. +Sigue estos pasos para una configuración manual. -### Step 1: Set Up the Environment File +### Paso 1: Configurar el archivo de entorno -1. **Create the .env File** +1. **Crea el archivo .env** - Copy the example environment file to a new .env file in your working directory: + Copia el archivo de entorno de ejemplo a tu directorio de trabajo a un nuevo archivo .env: ```bash curl -o .env https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/.env.example ``` -2. **Generate Secret Tokens** +2. **Generar tokens secretos** - Run the following command to generate a unique random string: + Ejecuta el siguiente comando para generar una cadena única aleatoria: ```bash openssl rand -base64 32 ``` - **Important:** Keep this value secret / do not share it. + **Importante:** Mantén este valor en secreto / no lo compartas. -3. **Update the `.env`** +3. **Actualiza el `.env`** - Replace the placeholder value in your .env file with the generated token: + Reemplaza el valor de marcador de posición en tu archivo .env con el token generado: ```ini APP_SECRET=first_random_string ``` -4. **Set the Postgres Password** +4. **Establecer la contraseña de Postgres** - Update the `PG_DATABASE_PASSWORD` value in the .env file with a strong password without special characters. + Actualiza el valor de `PG_DATABASE_PASSWORD` en el archivo .env con una contraseña fuerte sin caracteres especiales. ```ini PG_DATABASE_PASSWORD=my_strong_password ``` -### Step 2: Obtain the Docker Compose File +### Paso 2: Obtener el archivo Docker Compose -Download the `docker-compose.yml` file to your working directory: +Descarga el archivo `docker-compose.yml` en tu directorio de trabajo: ```bash curl -o docker-compose.yml https://raw.githubusercontent.com/twentyhq/twenty/refs/heads/main/packages/twenty-docker/docker-compose.yml ``` -### Step 3: Launch the Application +### Paso 3: Lanza la aplicación -Start the Docker containers: +Inicia los contenedores Docker: ```bash docker compose up -d ``` -### Step 4: Access the Application +### Paso 4: Acceder a la aplicación -If you host twentyCRM on your own computer, open your browser and navigate to [http://localhost:3000](http://localhost:3000). +Si alojas twentyCRM en tu propia computadora, abre tu navegador y navega a [http://localhost:3000](http://localhost:3000). -If you host it on a server, check that the server is running and that everything is ok with +Si lo alojas en un servidor, verifica que el servidor esté en funcionamiento y que todo esté bien con ```bash curl http://localhost:3000 ``` -## Configuration +## Configuración -### Expose Twenty to External Access +### Exponer Twenty para acceso externo -By default, Twenty runs on `localhost` at port `3000`. To access it via an external domain or IP address, you need to configure the `SERVER_URL` in your `.env` file. +Por defecto, Twenty se ejecuta en `localhost` en el puerto `3000`. Para acceder a él mediante un dominio externo o dirección IP, necesitas configurar `SERVER_URL` en tu archivo `.env`. -#### Understanding `SERVER_URL` +#### Entendiendo `SERVER_URL` -* **Protocol:** Use `http` or `https` depending on your setup. - * Use `http` if you haven't set up SSL. - * Use `https` if you have SSL configured. -* **Domain/IP:** This is the domain name or IP address where your application is accessible. -* **Port:** Include the port number if you're not using the default ports (`80` for `http`, `443` for `https`). +* **Protocolo:** Usa `http` o `https` dependiendo de tu configuración. + * Usa `http` si no has configurado SSL. + * Usa `https` si tienes SSL configurado. +* **Dominio/IP:** Este es el nombre de dominio o dirección IP donde tu aplicación es accesible. +* **Puerto:** Incluye el número de puerto si no estás usando los puertos predeterminados (`80` para `http`, `443` para `https`). -### SSL Requirements +### Requisitos de SSL -SSL (HTTPS) is required for certain browser features to work properly. While these features might work during local development (as browsers treat localhost differently), a proper SSL setup is needed when hosting Twenty on a regular domain. +SSL (HTTPS) es requerido para que ciertas características del navegador funcionen correctamente. Aunque estas características podrían funcionar durante el desarrollo local (ya que los navegadores tratan localhost de manera diferente), se requiere una configuración SSL adecuada al alojar Twenty en un dominio regular. -For example, the clipboard API might require a secure context - some features like copy buttons throughout the application might not work without HTTPS enabled. +Por ejemplo, es posible que la API del portapapeles requiera un contexto seguro: algunas características como los botones de copia en toda la aplicación pueden no funcionar sin HTTPS habilitado. -We strongly recommend setting up Twenty behind a reverse proxy with SSL termination for optimal security and functionality. +Recomendamos encarecidamente configurar Twenty detrás de un proxy inverso con terminación SSL para una seguridad y funcionalidad óptimas. -#### Configuring `SERVER_URL` +#### Configurando `SERVER_URL` -1. **Determine Your Access URL** - * **Without Reverse Proxy (Direct Access):** +1. **Determine su URL de acceso** + * **Sin proxy inverso (Acceso directo):** - If you're accessing the application directly without a reverse proxy: + Si estás accediendo a la aplicación directamente sin un proxy inverso: ```ini SERVER_URL=http://your-domain-or-ip:3000 ``` - * **With Reverse Proxy (Standard Ports):** + * **Con proxy inverso (Puertos estándar):** - If you're using a reverse proxy like Nginx or Traefik and have SSL configured: + Si estás usando un proxy inverso como Nginx o Traefik y tienes SSL configurado: ```ini SERVER_URL=https://your-domain-or-ip ``` - * **With Reverse Proxy (Custom Ports):** + * **Con proxy inverso (Puertos personalizados):** - If you're using non-standard ports: + Si estás usando puertos no estándar: ```ini SERVER_URL=https://your-domain-or-ip:custom-port ``` -2. **Update the `.env` File** +2. **Actualiza el archivo `.env`** - Open your `.env` file and update the `SERVER_URL`: + Abre tu archivo `.env` y actualiza el `SERVER_URL`: ```ini SERVER_URL=http(s)://your-domain-or-ip:your-port ``` - **Examples:** + **Ejemplos:** - * Direct access without SSL: + * Acceso directo sin SSL: ```ini SERVER_URL=http://123.45.67.89:3000 ``` - * Access via domain with SSL: + * Acceso vía dominio con SSL: ```ini SERVER_URL=https://mytwentyapp.com ``` -3. **Restart the Application** +3. **Reiniciar la aplicación** - For changes to take effect, restart the Docker containers: + Para que los cambios surtan efecto, reinicia los contenedores Docker: ```bash docker compose down docker compose up -d ``` -#### Considerations +#### Consideraciones -* **Reverse Proxy Configuration:** +* **Configuración del Proxy Inverso:** - Ensure your reverse proxy forwards requests to the correct internal port (`3000` by default). Configure SSL termination and any necessary headers. + Asegúrese de que su proxy inverso envíe las solicitudes al puerto interno correcto (`3000` por defecto). Configure la terminación SSL y cualquier cabecera necesaria. -* **Firewall Settings:** +* **Configuración del Cortafuegos:** - Open necessary ports in your firewall to allow external access. + Abra los puertos necesarios en su cortafuegos para permitir el acceso externo. -* **Consistency:** +* **Consistencia:** - The `SERVER_URL` must match how users access your application in their browsers. + La `SERVER_URL` debe coincidir con cómo los usuarios acceden a su aplicación en sus navegadores. -#### Persistence +#### Persistencia -* **Data Volumes:** +* **Volúmenes de Datos:** - The Docker Compose configuration uses volumes to persist data for the database and server storage. + La configuración de Docker Compose utiliza volúmenes para persistir datos para la base de datos y el almacenamiento del servidor. -* **Stateless Environments:** +* **Entornos Sin Estado:** - If deploying to a stateless environment (e.g., certain cloud services), configure external storage to persist data. + Si se despliega en un entorno sin estado (por ejemplo, ciertos servicios en la nube), configure un almacenamiento externo para persistir los datos. -## Backup and Restore +## Copia de seguridad y restauración -Regular backups protect your CRM data from loss. +Las copias de seguridad periódicas protegen los datos de tu CRM contra la pérdida. -### Create a Database Backup +### Crea una copia de seguridad de la base de datos ```bash docker exec twenty-postgres pg_dump -U postgres twenty > backup_$(date +%Y%m%d).sql ``` -### Automate Daily Backups +### Automatiza las copias de seguridad diarias -Add to your crontab (`crontab -e`): +Añade a tu crontab (`crontab -e`): ```bash 0 2 * * * docker exec twenty-postgres pg_dump -U postgres twenty > /backups/twenty_$(date +\%Y\%m\%d).sql ``` -### Restore from Backup +### Restaura desde una copia de seguridad -1. Stop the application: +1. Detén la aplicación: ```bash docker compose stop twenty-server twenty-front ``` -2. Restore the database: +2. Restaura la base de datos: ```bash docker exec -i twenty-postgres psql -U postgres twenty < backup_20240115.sql ``` -3. Restart services: +3. Reinicia los servicios: ```bash docker compose up -d ``` -### Backup Best Practices +### Mejores prácticas de copias de seguridad -* **Test restores regularly** — verify backups actually work -* **Store backups off-site** — use cloud storage (S3, GCS, etc.) -* **Encrypt sensitive data** — protect backups with encryption -* **Retain multiple copies** — keep daily, weekly, and monthly backups +* **Prueba las restauraciones con regularidad** — verifica que las copias de seguridad realmente funcionen +* **Almacena las copias de seguridad fuera del sitio** — usa almacenamiento en la nube (S3, GCS, etc.) +* **Cifra los datos sensibles** — protege las copias de seguridad con cifrado +* **Conserva múltiples copias** — mantén copias de seguridad diarias, semanales y mensuales -## Troubleshooting +## Solución de Problemas -If you encounter any problem, check [Troubleshooting](/l/es/developers/self-host/capabilities/troubleshooting) for solutions. +Si encuentras algún problema, consulta [Solución de Problemas](/l/es/developers/self-host/capabilities/troubleshooting) para ver soluciones. diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx index f706378ad2..62ce90e8c7 100644 --- a/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx +++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/setup.mdx @@ -1,146 +1,146 @@ --- -title: Setup +title: Configuración --- -# Configuration Management +# Gestión de Configuración - **First time installing?** Follow the [Docker Compose installation guide](/l/es/developers/self-host/capabilities/docker-compose) to get Twenty running, then return here for configuration. + **¿Instalando por primera vez?** Siga la [guía de instalación de Docker Compose](/l/es/developers/self-host/capabilities/docker-compose) para ejecutar Twenty, luego regrese aquí para la configuración. -Twenty offers **two configuration modes** to suit different deployment needs: +Twenty ofrece **dos modos de configuración** para adaptarse a diferentes necesidades de implementación: -**Admin panel access:** Only users with admin privileges (`canAccessFullAdminPanel: true`) can access the configuration interface. +**Acceso al panel de administración:** Solo los usuarios con privilegios de administrador (`canAccessFullAdminPanel: true`) pueden acceder a la interfaz de configuración. -## 1. Admin Panel Configuration (Default) +## 1. Configuración del Panel de Administración (Predeterminado) ```bash IS_CONFIG_VARIABLES_IN_DB_ENABLED=true # default ``` -**Most configuration happens through the UI** after installation: +**La mayoría de las configuraciones se realizan a través de la interfaz** después de la instalación: -1. Access your Twenty instance (usually `http://localhost:3000`) -2. Go to **Settings / Admin Panel / Configuration Variables** -3. Configure integrations, email, storage, and more -4. Changes take effect immediately (within 15 seconds for multi-container deployments) +1. Acceda a su instancia de Twenty (normalmente `http://localhost:3000`) +2. Vaya a **Configuración / Panel de Administración / Variables de Configuración** +3. Configure integraciones, correo electrónico, almacenamiento y más +4. Los cambios se aplican inmediatamente (dentro de 15 segundos para implementaciones multicontenedor) - **Multi-Container Deployments:** When using database configuration (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), both server and worker containers read from the same database. Admin panel changes affect both automatically, eliminating the need to duplicate environment variables between containers (except for infrastructure variables). + **Implementaciones Multicontenedor:** Al usar la configuración de base de datos (`IS_CONFIG_VARIABLES_IN_DB_ENABLED=true`), tanto los contenedores del servidor como los de trabajo leen de la misma base de datos. Los cambios en el panel de administración afectan a ambos automáticamente, eliminando la necesidad de duplicar las variables de entorno entre contenedores (excepto para las variables de infraestructura). -**What you can configure through the admin panel:** +**Qué se puede configurar a través del panel de administración:** -* **Authentication** - Google/Microsoft OAuth, password settings -* **Email** - SMTP settings, templates, verification -* **Storage** - S3 configuration, local storage paths -* **Integrations** - Gmail, Google Calendar, Microsoft services -* **Workflow & Rate Limiting** - Execution limits, API throttling -* **And much more...** +* **Autenticación** - OAuth de Google/Microsoft, configuración de contraseñas +* **Correo Electrónico** - Configuración de SMTP, plantillas, verificación +* **Almacenamiento** - Configuración S3, rutas de almacenamiento local +* **Integraciones** - Gmail, Google Calendar, servicios de Microsoft +* **Flujo de Trabajo y Limitación de Tasas** - Límites de ejecución, restricción de API +* **Y mucho más...** -![Admin Panel Configuration Variables](/images/user-guide/setup/admin-panel-config-variables.png) +![Variables de Configuración del Panel de Administración](/images/user-guide/setup/admin-panel-config-variables.png) - Each variable is documented with descriptions in your admin panel at **Settings → Admin Panel → Configuration Variables**. - Some infrastructure settings like database connections (`PG_DATABASE_URL`), server URLs (`SERVER_URL`), and app secrets (`APP_SECRET`) can only be configured via `.env` file. + Cada variable está documentada con descripciones en su panel de administración en **Configuración → Panel de Administración → Variables de Configuración**. + Algunas configuraciones de infraestructura como las conexiones de base de datos (`PG_DATABASE_URL`), URLs del servidor (`SERVER_URL`), y secretos de la aplicación (`APP_SECRET`) solo se pueden configurar a través del archivo `.env`. - [Complete technical reference →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) + [Referencia técnica completa →](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/twenty-config/config-variables.ts) -## 2. Environment-Only Configuration +## 2. Configuración Solo de Entorno ```bash IS_CONFIG_VARIABLES_IN_DB_ENABLED=false ``` -**All configuration managed through `.env` files:** +**Toda la configuración se gestiona a través de archivos `.env`:** -1. Set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` in your `.env` file -2. Add all configuration variables to your `.env` file -3. Restart containers for changes to take effect -4. Admin panel will show current values but cannot modify them +1. Establezca `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` en su archivo `.env` +2. Agregue todas las variables de configuración a su archivo `.env` +3. Reinicie los contenedores para que los cambios tengan efecto +4. El panel de administración mostrará los valores actuales pero no podrá modificarlos -## Multi-Workspace Mode +## Modo de múltiples espacios de trabajo -By default, Twenty runs in **single-workspace mode** — ideal for most self-hosted deployments where you need one CRM instance for your organization. +De forma predeterminada, Twenty se ejecuta en **modo de un solo espacio de trabajo** — ideal para la mayoría de las implementaciones autoalojadas en las que necesitas una instancia de CRM para tu organización. -### Single-Workspace Mode (Default) +### Modo de un solo espacio de trabajo (predeterminado) ```bash IS_MULTIWORKSPACE_ENABLED=false # default ``` -* One workspace per Twenty instance -* First user automatically becomes admin with full privileges (`canImpersonate` and `canAccessFullAdminPanel`) -* New signups are disabled after the first workspace is created -* Simple URL structure: `https://your-domain.com` +* Un espacio de trabajo por instancia de Twenty +* El primer usuario se convierte automáticamente en administrador con privilegios completos (`canImpersonate` y `canAccessFullAdminPanel`) +* Los nuevos registros se deshabilitan después de crear el primer espacio de trabajo +* Estructura de URL simple: `https://your-domain.com` -### Enabling Multi-Workspace Mode +### Habilitar el modo de múltiples espacios de trabajo ```bash IS_MULTIWORKSPACE_ENABLED=true DEFAULT_SUBDOMAIN=app # default value ``` -Enable multi-workspace mode for SaaS-like deployments where multiple independent teams need their own workspaces on the same Twenty instance. +Habilita el modo de múltiples espacios de trabajo para implementaciones tipo SaaS en las que varios equipos independientes necesitan sus propios espacios de trabajo en la misma instancia de Twenty. -**Key differences from single-workspace mode:** +**Diferencias clave respecto al modo de un solo espacio de trabajo:** -* Multiple workspaces can be created on the same instance -* Each workspace gets its own subdomain (e.g., `sales.your-domain.com`, `marketing.your-domain.com`) -* Users sign up and log in at `{DEFAULT_SUBDOMAIN}.your-domain.com` (e.g., `app.your-domain.com`) -* No automatic admin privileges — first user in each workspace is a regular user -* Workspace-specific settings like subdomain and custom domain become available in workspace settings +* Se pueden crear varios espacios de trabajo en la misma instancia +* Cada espacio de trabajo obtiene su propio subdominio (p. ej., `sales.your-domain.com`, `marketing.your-domain.com`) +* Los usuarios se registran e inician sesión en `{DEFAULT_SUBDOMAIN}.your-domain.com` (p. ej., `app.your-domain.com`) +* Sin privilegios de administrador automáticos — el primer usuario de cada espacio de trabajo es un usuario normal +* Configuraciones específicas del espacio de trabajo, como subdominio y dominio personalizado, están disponibles en la configuración del espacio de trabajo - **Environment-only setting:** `IS_MULTIWORKSPACE_ENABLED` can only be configured via `.env` file and requires a restart. It cannot be changed through the admin panel. + **Configuración solo por entorno:** `IS_MULTIWORKSPACE_ENABLED` solo se puede configurar mediante el archivo `.env` y requiere un reinicio. No se puede cambiar a través del panel de administración. -### DNS Configuration for Multi-Workspace +### Configuración de DNS para múltiples espacios de trabajo -When using multi-workspace mode, configure your DNS with a wildcard record to allow dynamic subdomain creation: +Al usar el modo de múltiples espacios de trabajo, configura tu DNS con un registro comodín para permitir la creación dinámica de subdominios: ``` *.your-domain.com -> your-server-ip ``` -This enables automatic subdomain routing for new workspaces without manual DNS configuration. +Esto habilita el enrutamiento automático de subdominios para nuevos espacios de trabajo sin configuración manual de DNS. -### Restricting Workspace Creation +### Restricción de la creación de espacios de trabajo -In multi-workspace mode, you may want to limit who can create new workspaces: +En el modo de múltiples espacios de trabajo, es posible que quieras limitar quién puede crear nuevos espacios de trabajo: ```bash IS_WORKSPACE_CREATION_LIMITED_TO_SERVER_ADMINS=true ``` -When enabled, only users with `canAccessFullAdminPanel` can create additional workspaces. Users can still create their first workspace during initial signup. +Cuando está habilitado, solo los usuarios con `canAccessFullAdminPanel` pueden crear espacios de trabajo adicionales. Los usuarios aún pueden crear su primer espacio de trabajo durante el registro inicial. -## Gmail & Google Calendar Integration +## Integración con Gmail y Google Calendar -### Create Google Cloud Project +### Crear Proyecto en Google Cloud -1. Go to [Google Cloud Console](https://console.cloud.google.com/) -2. Create a new project or select existing one -3. Enable these APIs: +1. Vaya a [Google Cloud Console](https://console.cloud.google.com/) +2. Cree un nuevo proyecto o seleccione uno existente +3. Habilite estas APIs: * [Gmail API](https://console.cloud.google.com/apis/library/gmail.googleapis.com) * [Google Calendar API](https://console.cloud.google.com/apis/library/calendar-json.googleapis.com) * [People API](https://console.cloud.google.com/apis/library/people.googleapis.com) -### Configure OAuth +### Configurar OAuth -1. Go to [Credentials](https://console.cloud.google.com/apis/credentials) -2. Create OAuth 2.0 Client ID -3. Add these redirect URIs: - * `https://{your-domain}/auth/google/redirect` (for SSO) - * `https://{your-domain}/auth/google-apis/get-access-token` (for integrations) +1. Vaya a [Credenciales](https://console.cloud.google.com/apis/credentials) +2. Cree un ID de Cliente OAuth 2.0 +3. Agregue estas URIs de redirección: + * `https://{your-domain}/auth/google/redirect` (para SSO) + * `https://{your-domain}/auth/google-apis/get-access-token` (para integraciones) -### Configure in Twenty +### Configurar en Twenty -1. Go to **Settings → Admin Panel → Configuration Variables** -2. Find the **Google Auth** section -3. Set these variables: +1. Vaya a **Configuración → Panel de Administración → Variables de Configuración** +2. Encuentre la sección **Google Auth** +3. Establezca estas variables: * `MESSAGING_PROVIDER_GMAIL_ENABLED=true` * `CALENDAR_PROVIDER_GOOGLE_ENABLED=true` * `AUTH_GOOGLE_CLIENT_ID={client-id}` @@ -149,35 +149,35 @@ When enabled, only users with `canAccessFullAdminPanel` can create additional wo * `AUTH_GOOGLE_APIS_CALLBACK_URL=https://{your-domain}/auth/google-apis/get-access-token` - **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead. + **Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar. -**Required scopes** (automatically configured): -[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10) +**Ámbitos requeridos** (configurados automáticamente): +[Ver código fuente relevante](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-google-apis-oauth-scopes.ts#L4-L10) * `https://www.googleapis.com/auth/calendar.events` * `https://www.googleapis.com/auth/gmail.readonly` * `https://www.googleapis.com/auth/profile.emails.read` -### If your app is in test mode +### Si su aplicación está en modo de prueba -If your app is in test mode, you will need to add test users to your project. +Si su aplicación está en modo de prueba, deberá agregar usuarios de prueba a su proyecto. -Under [OAuth consent screen](https://console.cloud.google.com/apis/credentials/consent), add your test users to the "Test users" section. +En [Pantalla de consentimiento OAuth](https://console.cloud.google.com/apis/credentials/consent), agregue sus usuarios de prueba en la sección "Usuarios de prueba". -## Microsoft 365 Integration +## Integración con Microsoft 365 - Users must have a [Microsoft 365 Licence](https://admin.microsoft.com/Adminportal/Home) to be able to use the Calendar and Messaging API. They will not be able to sync their account on Twenty without one. + Los usuarios deben tener una [licencia de Microsoft 365](https://admin.microsoft.com/Adminportal/Home) para poder usar la API de Calendar y Messaging. No podrán sincronizar su cuenta en Twenty sin una. -### Create a project in Microsoft Azure +### Cree un proyecto en Microsoft Azure -You will need to create a project in [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) and get the credentials. +Necesitará crear un proyecto en [Microsoft Azure](https://portal.azure.com/#view/Microsoft_AAD_IAM/AppGalleryBladeV2) y obtener las credenciales. -### Enable APIs +### Habilitar APIs -On Microsoft Azure Console enable the following APIs in "Permissions": +En la Consola de Microsoft Azure habilite las siguientes APIs en "Permisos": * Microsoft Graph: Mail.ReadWrite * Microsoft Graph: Mail.Send @@ -188,20 +188,20 @@ On Microsoft Azure Console enable the following APIs in "Permissions": * Microsoft Graph: profile * Microsoft Graph: offline_access -Note: "Mail.ReadWrite" and "Mail.Send" are only mandatory if you want to send emails using our workflow actions. You can use "Mail.Read" instead if you only want to receive emails. +Nota: "Mail.ReadWrite" y "Mail.Send" solo son obligatorios si desea enviar correos electrónicos usando nuestras acciones de flujo de trabajo. Puede usar "Mail.Read" en su lugar si solo desea recibir correos electrónicos. -### Authorized redirect URIs +### URIs de redirección autorizadas -You need to add the following redirect URIs to your project: +Necesita agregar las siguientes URIs de redirección a su proyecto: -* `https://{your-domain}/auth/microsoft/redirect` if you want to use Microsoft SSO +* `https://{your-domain}/auth/microsoft/redirect` si quieres usar el inicio de sesión único de Microsoft * `https://{your-domain}/auth/microsoft-apis/get-access-token` -### Configure in Twenty +### Configurar en Twenty -1. Go to **Settings → Admin Panel → Configuration Variables** -2. Find the **Microsoft Auth** section -3. Set these variables: +1. Vaya a **Configuración → Panel de Administración → Variables de Configuración** +2. Encuentre la sección **Microsoft Auth** +3. Establezca estas variables: * `MESSAGING_PROVIDER_MICROSOFT_ENABLED=true` * `CALENDAR_PROVIDER_MICROSOFT_ENABLED=true` * `AUTH_MICROSOFT_ENABLED=true` @@ -211,32 +211,32 @@ You need to add the following redirect URIs to your project: * `AUTH_MICROSOFT_APIS_CALLBACK_URL=https://{your-domain}/auth/microsoft-apis/get-access-token` - **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead. + **Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar. -### Configure scopes +### Configurar ámbitos -[See relevant source code](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9) +[Ver código fuente relevante](https://github.com/twentyhq/twenty/blob/main/packages/twenty-server/src/engine/core-modules/auth/utils/get-microsoft-apis-oauth-scopes.ts#L2-L9) * 'openid' -* 'email' -* 'profile' +* 'correo Electrónico' +* 'perfil' * 'offline_access' * 'Mail.ReadWrite' * 'Mail.Send' * 'Calendars.Read' -### If your app is in test mode +### Si su aplicación está en modo de prueba -If your app is in test mode, you will need to add test users to your project. +Si su aplicación está en modo de prueba, deberá agregar usuarios de prueba a su proyecto. -Add your test users to the "Users and groups" section. +Agregue sus usuarios de prueba a la sección "Usuarios y grupos". -## Background Jobs for Calendar & Messaging +## Trabajos en segundo plano para Calendarios y Mensajes -After configuring Gmail, Google Calendar, or Microsoft 365 integrations, you need to start the background jobs that sync data. +Después de configurar las integraciones de Gmail, Google Calendar, o Microsoft 365, necesita iniciar los trabajos en segundo plano que sincronizan los datos. -Register the following recurring jobs in your worker container: +Registre los siguientes trabajos recurrentes en su contenedor de trabajo: ```bash # from your worker container @@ -249,15 +249,15 @@ yarn command:prod cron:calendar:ongoing-stale yarn command:prod cron:workflow:automated-cron-trigger ``` -## Email Configuration +## Configuración de Correo Electrónico -1. Go to **Settings → Admin Panel → Configuration Variables** -2. Find the **Email** section -3. Configure your SMTP settings: +1. Vaya a **Configuración → Panel de Administración → Variables de Configuración** +2. Encuentre la sección **Correo Electrónico** +3. Configure su configuración SMTP: - You will need to provision an [App Password](https://support.google.com/accounts/answer/185833). + Necesitará proporcionar una [Contraseña de Aplicación](https://support.google.com/accounts/answer/185833). * EMAIL_DRIVER=smtp * EMAIL_SMTP_HOST=smtp.gmail.com @@ -267,7 +267,7 @@ yarn command:prod cron:workflow:automated-cron-trigger - Keep in mind that if you have 2FA enabled, you will need to provision an [App Password](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9). + Tenga en cuenta que si tiene la autenticación de dos factores habilitada, necesitará proporcionar una [Contraseña de Aplicación](https://support.microsoft.com/en-us/account-billing/manage-app-passwords-for-two-step-verification-d6dc8c6d-4bf7-4851-ad95-6d07799387e9). * EMAIL_DRIVER=smtp * EMAIL_SMTP_HOST=smtp.office365.com @@ -277,11 +277,11 @@ yarn command:prod cron:workflow:automated-cron-trigger - **smtp4dev** is a fake SMTP email server for development and testing. + **smtp4dev** es un servidor de correo SMTP falso para desarrollo y pruebas. - * Run the smtp4dev image: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev` - * Access the smtp4dev ui here: [http://localhost:8090](http://localhost:8090) - * Set the following variables: + * Ejecute la imagen de smtp4dev: `docker run --rm -it -p 8090:80 -p 2525:25 rnwood/smtp4dev` + * Acceda a la interfaz de smtp4dev aquí: [http://localhost:8090](http://localhost:8090) + * Establezca las siguientes variables: * EMAIL_DRIVER=smtp * EMAIL_SMTP_HOST=localhost * EMAIL_SMTP_PORT=2525 @@ -289,5 +289,49 @@ yarn command:prod cron:workflow:automated-cron-trigger - **Environment-only mode:** If you set `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, add these variables to your `.env` file instead. + **Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar. + +## Funciones sin servidor + +Twenty admite funciones sin servidor para flujos de trabajo y lógica personalizada. El entorno de ejecución se configura mediante la variable de entorno `SERVERLESS_TYPE`. + + + **Aviso de seguridad:** El controlador local sin servidor (`SERVERLESS_TYPE=LOCAL`) ejecuta código directamente en el host en un proceso de Node.js sin aislamiento. Solo debe utilizarse para código de confianza en desarrollo. Para implementaciones de producción que manejen código no confiable, recomendamos encarecidamente usar `SERVERLESS_TYPE=LAMBDA` o `SERVERLESS_TYPE=DISABLED`. + + +### Controladores disponibles + +| Controlador | Variable de entorno | Caso de uso | Nivel de seguridad | +| ----------- | -------------------------- | --------------------------------------------------- | -------------------------------------- | +| Desactivado | `SERVERLESS_TYPE=DISABLED` | Desactivar completamente las funciones sin servidor | N/A | +| Local | `SERVERLESS_TYPE=LOCAL` | Entornos de desarrollo y de confianza | Bajo (sin aislamiento) | +| Lambda | `SERVERLESS_TYPE=LAMBDA` | Producción con código no confiable | Alto (aislamiento a nivel de hardware) | + +### Configuración recomendada + +**Para desarrollo:** + +```bash +SERVERLESS_TYPE=LOCAL # default +``` + +**Para producción (AWS):** + +```bash +SERVERLESS_TYPE=LAMBDA +SERVERLESS_LAMBDA_REGION=us-east-1 +SERVERLESS_LAMBDA_ROLE=arn:aws:iam::123456789:role/your-lambda-role +SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key +SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key +``` + +**Para desactivar las funciones sin servidor:** + +```bash +SERVERLESS_TYPE=DISABLED +``` + + + Al usar `SERVERLESS_TYPE=DISABLED`, cualquier intento de ejecutar una función sin servidor devolverá un error. Esto es útil si desea ejecutar Twenty sin capacidades de funciones sin servidor. + diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx index d2187aedac..887408ed52 100644 --- a/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx +++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/troubleshooting.mdx @@ -1,26 +1,25 @@ --- -title: Troubleshooting +title: Solución de problemas --- -## Troubleshooting +## Solución de Problemas -If you encounter any problem while setting up environment for development, upgrading your instance or self-hosting, -here are some solutions for common problems. +Si encuentra algún problema al configurar el entorno para el desarrollo, al actualizar su instancia o al autoalojar, aquí hay algunas soluciones para problemas comunes. -### Self-hosting +### Autoalojamiento -#### First install results in `password authentication failed for user "postgres"` +#### La primera instalación resulta en `fallo de autenticación de contraseña para el usuario "postgres"` -🚨 **IMPORTANT: This solution is ONLY for fresh installations** 🚨 -If you have an existing Twenty instance with production data, **DO NOT** follow these steps as they will permanently delete your database! +🚨 **IMPORTANTE: Esta solución es SOLO para instalaciones nuevas** 🚨 +Si tiene una instancia de Twenty existente con datos de producción, **NO** siga estos pasos ya que borrarán permanentemente su base de datos. -While installing Twenty for the first time, you might want to change the default database password. -The password you set during the first installation becomes permanently stored in the database volume. If you later try to change this password in your configuration without removing the old volume, you'll get authentication errors because the database is still using the original password. +Al instalar Twenty por primera vez, es posible que desee cambiar la contraseña predeterminada de la base de datos. +La contraseña que establezca durante la primera instalación se almacena permanentemente en el volumen de base de datos. Si más tarde intenta cambiar esta contraseña en su configuración sin eliminar el volumen anterior, obtendrá errores de autenticación porque la base de datos todavía está usando la contraseña original. -⚠️ WARNING: Following steps will PERMANENTLY DELETE all database data! ⚠️ -Only proceed if this is a fresh installation with no important data. +⚠️ ADVERTENCIA: ¡Seguir los pasos borrará PERMANENTEMENTE todos los datos de la base de datos! ⚠️ +Prosiga solo si se trata de una instalación nueva sin datos importantes. -In order to update the `PG_DATABASE_PASSWORD` you need to: +Para actualizar el `PG_DATABASE_PASSWORD` necesita: ```sh # Update the PG_DATABASE_PASSWORD in .env @@ -28,33 +27,33 @@ docker compose down --volumes docker compose up -d ``` -#### CR line breaks found [Windows] +#### Rupturas de línea de CR encontradas [Windows] -This is due to the line break characters of Windows and the git configuration. Try running: +Esto se debe a los caracteres de salto de línea de Windows y a la configuración de Git. Intente ejecutar: ``` git config --global core.autocrlf false ``` -Then delete the repository and clone it again. +Luego elimine el repositorio y clónelo de nuevo. -#### Missing metadata schema +#### Esquema de metadatos faltante -During Twenty installation, you need to provision your postgres database with the right schemas, extensions, and users. -If you're successful in running this provisioning, you should have `default` and `metadata` schemas in your database. -If you don't, make sure you don't have more than one postgres instance running on your computer. +Durante la instalación de Twenty, debe aprovisionar su base de datos postgres con los esquemas, extensiones y usuarios correctos. +Si ha ejecutado con éxito este aprovisionamiento, debería tener esquemas `default` y `metadata` en su base de datos. +Si no los tiene, asegúrese de no tener más de una instancia de postgres ejecutándose en su computadora. -#### Cannot find module 'twenty-emails' or its corresponding type declarations. +#### No se puede encontrar el módulo 'twenty-emails' o sus declaraciones de tipo correspondientes. -You have to build the package `twenty-emails` before running the initialization of the database with `npx nx run twenty-emails:build` +Tienes que construir el paquete `twenty-emails` antes de ejecutar la inicialización de la base de datos con `npx nx run twenty-emails:build` -#### Missing twenty-x package +#### Falta el paquete twenty-x -Make sure to run yarn in the root directory and then run `npx nx server:dev twenty-server`. If this still doesn't work try building the missing package manually. +Asegúrese de ejecutar yarn en el directorio raíz y luego ejecute `npx nx server:dev twenty-server`. Si esto aún no funciona, intente construir el paquete faltante manualmente. -#### Lint on Save not working +#### Lint on Save no funciona -This should work out of the box with the eslint extension installed. If this doesn't work try adding this to your vscode setting (on the dev container scope): +Esto debería funcionar sin configuración adicional con la extensión de ESLint instalada. Si esto no funciona, intente agregar esto a su configuración de vscode (en el ámbito del contenedor de desarrollo): ``` "editor.codeActionsOnSave": { @@ -64,85 +63,85 @@ This should work out of the box with the eslint extension installed. If this doe } ``` -#### While running `npx nx start` or `npx nx start twenty-front`, Out of memory error is thrown +#### Al ejecutar `npx nx start` o `npx nx start twenty-front`, se produce un error de falta de memoria -In `packages/twenty-front/.env` uncomment `VITE_DISABLE_TYPESCRIPT_CHECKER=true` to disable background checks thus reducing amount of needed RAM. +En `packages/twenty-front/.env` descomente `VITE_DISABLE_TYPESCRIPT_CHECKER=true` y `VITE_DISABLE_ESLINT_CHECKER=true` para deshabilitar las comprobaciones en segundo plano y así reducir la cantidad de RAM necesaria. -**If it does not work:** -Run only the services you need, instead of `npx nx start`. For instance, if you work on the server, run only `npx nx worker twenty-server` +**Si no funciona:** +Ejecute solo los servicios que necesite, en lugar de `npx nx start`. Por ejemplo, si trabaja en el servidor, ejecute solo `npx nx worker twenty-server` -**If it does not work:** -If you tried to run only `npx nx run twenty-server:start` on WSL and it's failing with the below memory error: +**Si no funciona:** +Si intentó ejecutar solo `npx nx run twenty-server:start` en WSL y falla con el siguiente error de memoria: -`FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory` +`ERROR FATAL: Las marcas compactas ineficaces cercanas al límite del montón Falló la asignación - JavaScript heap out of memory` -Workaround is to execute below command in terminal or add it in .bashrc profile to get setup automatically: +La solución es ejecutar el siguiente comando en el terminal o agregarlo en el perfil .bashrc para configurarlo automáticamente: `export NODE_OPTIONS="--max-old-space-size=8192"` -The --max-old-space-size=8192 flag sets an upper limit of 8GB for the Node.js heap; usage scales with application demand. -Reference: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048 +La bandera --max-old-space-size=8192 establece un límite superior de 8GB para el montón de Node.js; su uso escala con la demanda de la aplicación. +Referencia: https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048 -**If it does not work:** -Investigate which processes are taking you most of your machine RAM. At Twenty, we noticed that some VScode extensions were taking a lot of RAM so we temporarily disable them. +**Si no funciona:** +Investigue qué procesos están ocupando la mayor parte de la RAM de su máquina. En Twenty, notamos que algunas extensiones de VScode estaban ocupando mucha RAM, por lo que las desactivamos temporalmente. -**If it does not work:** -Restart your machine helps to clean up ghost processes. +**Si no funciona:** +Reiniciar su máquina ayuda a limpiar procesos fantasma. -#### While running `npx nx start` there are weird [0] and [1] in logs +#### Mientras ejecuta `npx nx start` hay [0] y [1] extraños en los registros -That's expected as command `npx nx start` is running more commands under the hood +Es esperado, ya que el comando `npx nx start` está ejecutando más comandos detrás de escena. -#### No emails are sent +#### No se envían correos electrónicos -Most of the time, it's because the `worker` is not running in the background. Try to run +La mayoría de las veces, se debe a que el `worker` no se está ejecutando en segundo plano. Intente ejecutar ``` npx nx worker twenty-server ``` -#### Cannot connect my Microsoft 365 account +#### No se puede conectar mi cuenta de Microsoft 365 -Most of the time, it's because your admin has not enabled the Microsoft 365 Licence for your account. Check [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home). +La mayoría de las veces, se debe a que su administrador no ha habilitado la licencia de Microsoft 365 para su cuenta. Verifique [https://admin.microsoft.com/](https://admin.microsoft.com/Adminportal/Home). -If you have an error code `AADSTS50020`, it probably means that you are using a personal Microsoft account. This is not supported yet. More info [here](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist) +Si tiene un código de error `AADSTS50020`, probablemente significa que está usando una cuenta de Microsoft personal. Esto aún no es compatible. Más información [aquí](https://learn.microsoft.com/fr-fr/troubleshoot/entra/entra-id/app-integration/error-code-aadsts50020-user-account-identity-provider-does-not-exist) -#### While running `yarn` warnings appear in console +#### Mientras ejecuta `yarn` aparecen advertencias en la consola -Warnings are informing about pulling additional dependencies which aren't explicitly stated in `package.json`, so as long as no breaking error appears, everything should work as expected. +Las advertencias informan sobre la carga de dependencias adicionales que no están explicitadas en `package.json`, así que mientras no aparezca un error crítico, todo debería funcionar como se espera. -#### When user accesses login page, error about unauthorized user trying to access workspace appears in logs +#### Cuando el usuario accede a la página de inicio de sesión, aparece un error sobre un usuario no autorizado que intenta acceder al espacio de trabajo en los registros -That's expected as user is unauthorized when logged out since its identity is not verified. +Es esperado ya que el usuario no está autorizado cuando cierra sesión porque su identidad no está verificada. -#### How to check if your worker is running? +#### ¿Cómo comprobar si su worker está funcionando? -* Go to [webhook-test.com](https://webhook-test.com/) and copy **Your Unique Webhook URL**. +* Vaya a [webhook-test.com](https://webhook-test.com/) y copie **Su URL de Webhook Única**.
- Webhook test + Prueba de webhook
-* Open your Twenty app, navigate to `/settings`, and enable the **Advanced** toggle at the bottom left of the screen. -* Create a new webhook. -* Paste **Your Unique Webhook URL** in the **Endpoint Url** field in Twenty. Set the **Filters** to `Companies` and `Created`. +* Abra la aplicación Twenty, navegue a `/settings` y active el interruptor **Avanzado** en la parte inferior izquierda de la pantalla. +* Cree un nuevo webhook. +* Pegue **Su URL de Webhook Única** en el campo **Url de EndPoint** en Twenty. Establezca los **Filtros** en `Companies` y `Created`.
- Webhook settings + Configuraciones del webhook
-* Go to `/objects/companies` and create a new company record. -* Return to [webhook-test.com](https://webhook-test.com/) and check if a new **POST request** has been received. +* Vaya a `/objects/companies` y cree un nuevo registro de empresa. +* Regrese a [webhook-test.com](https://webhook-test.com/) y verifique si se ha recibido una nueva **solicitud POST**.
- Webhook test result + Resultado de la prueba del webhook
-* If a **POST request** is received, your worker is running successfully. Otherwise, you need to troubleshoot your worker. +* Si se recibe una **solicitud POST**, su worker está funcionando con éxito. De lo contrario, debe solucionar problemas de su worker. -#### Front-end fails to start and returns error TS5042: Option 'project' cannot be mixed with source files on a command line +#### El front-end no comienza y devuelve el error TS5042: La opción 'project' no se puede mezclar con archivos fuente en una línea de comando -Comment out checker plugin in `packages/twenty-ui/vite-config.ts` like in example below +Comente el plugin checker en `packages/twenty-ui/vite-config.ts` como en el ejemplo a continuación ``` plugins: [ @@ -166,62 +165,62 @@ plugins: [ ], ``` -#### Admin panel not accessible +#### Panel de administración no accesible -Run `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` in database container to get access to admin panel. +Ejecute `UPDATE core."user" SET "canAccessFullAdminPanel" = TRUE WHERE email = 'you@yourdomain.com';` en el contenedor de la base de datos para obtener acceso al panel de administración. -### 1-click Docker compose +### 1-clic con Docker Compose -#### Unable to Log In +#### No se puede iniciar sesión -If you can't log in after setup: +Si no puedes iniciar sesión después de la configuración: -1. Run the following commands: +1. Ejecución de los siguientes comandos: ```bash docker exec -it twenty-server-1 yarn docker exec -it twenty-server-1 npx nx database:reset --configuration=no-seed ``` -2. Restart the Docker containers: +2. Reinicie los contenedores de Docker: ```bash docker compose down docker compose up -d ``` -Note the database:reset command will completely erase your database and recreate it from scratch. +Tenga en cuenta que el comando database:reset borrará toda su base de datos y la recreará desde cero. -#### Connection Issues Behind a Reverse Proxy +#### Problemas de conexión detrás de un Proxy Reverso -If you're running Twenty behind a reverse proxy and experiencing connection issues: +Si está ejecutando Twenty detrás de un proxy inverso y experimenta problemas de conexión: -1. **Verify SERVER_URL:** +1. **Verifique SERVER_URL:** - Ensure `SERVER_URL` in your `.env` file matches your external access URL, including `https` if SSL is enabled. + Asegúrese de que `SERVER_URL` en su archivo `.env` coincida con su URL de acceso externa, incluyendo `https` si SSL está habilitado. -2. **Check Reverse Proxy Settings:** +2. **Verifique la configuración del Proxy Reverso:** - * Confirm that your reverse proxy is correctly forwarding requests to the Twenty server. - * Ensure headers like `X-Forwarded-For` and `X-Forwarded-Proto` are properly set. + * Confirme que su proxy reverso está reenviando correctamente las solicitudes al servidor de Twenty. + * Asegúrese de que los encabezados como `X-Forwarded-For` y `X-Forwarded-Proto` estén configurados correctamente. -3. **Restart Services:** +3. **Reinicie los Servicios:** - After making changes, restart both the reverse proxy and Twenty containers. + Después de hacer cambios, reinicie tanto el proxy inverso como los contenedores de Twenty. -#### Error when uploading an image - permission denied +#### Error al cargar una imagen - permiso denegado -Switching the data folder ownership on the host from root to another user and group resolves this problem. +Cambiar la propiedad de la carpeta de datos en el host de raíz a otro usuario y grupo resuelve este problema. -## Getting Help +## Obtención de Ayuda -If you encounter issues not covered in this guide: +Si enfrenta problemas no cubiertos en esta guía: -* Check Logs: +* Verifique los Registros: - View container logs for error messages: + Vea los registros del contenedor por mensajes de error: ```bash docker compose logs ``` -* Community Support: +* Soporte Comunitario: - Reach out to the [Twenty community](https://github.com/twentyhq/twenty/issues) or [support channels](https://discord.gg/cx5n4Jzs57) for assistance. + Póngase en contacto con la [comunidad de Twenty](https://github.com/twentyhq/twenty/issues) o [los canales de soporte](https://discord.gg/cx5n4Jzs57) para obtener asistencia. diff --git a/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx b/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx index 03a53f5685..0c27c2cd89 100644 --- a/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx +++ b/packages/twenty-docs/l/es/developers/self-host/capabilities/upgrade-guide.mdx @@ -1,40 +1,40 @@ --- -title: Upgrade guide +title: Guía de actualización --- -## General guidelines +## Guías generales -**Always make sure to back up your database before starting the upgrade process** by running `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`. +**Asegúrese siempre de respaldar su base de datos antes de iniciar el proceso de actualización** ejecutando `docker exec -it {db_container_name_or_id} pg_dumpall -U {postgres_user} > databases_backup.sql`. -To restore backup, run `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`. +Para restaurar el respaldo, ejecute `cat databases_backup.sql | docker exec -i {db_container_name_or_id} psql -U {postgres_user}`. -If you used Docker Compose, follow these steps: +Si usó Docker Compose, siga estos pasos: -1. In a terminal, on the host where Twenty is running, turn off Twenty: `docker compose down` +1. En una terminal, en el host donde Twenty está funcionando, apague Twenty: `docker compose down` -2. Upgrade the version by changing the `TAG` value in the .env file near your docker-compose. ( We recommend consuming `major.minor` version such as `v0.53` ) +2. Actualice la versión cambiando el valor de `TAG` en el archivo .env cerca de su docker-compose. ( Recomendamos consumir la versión `major.minor` como `v0.53` ) -3. Bring Twenty back online with `docker compose up -d` +3. Vuelva a conectar Twenty con `docker compose up -d` -If you want to upgrade your instance by few versions, e.g. from v0.33.0 to v0.35.0, you have to upgrade your instance sequentially, in this example from v0.33.0 to v0.34.0, then from v0.34.0 to v0.35.0. +Si desea actualizar su instancia por algunas versiones, por ejemplo de v0.33.0 a v0.35.0, debe actualizar su instancia secuencialmente, en este ejemplo de v0.33.0 a v0.34.0, luego de v0.34.0 a v0.35.0. -**Make sure that after each upgraded version you have non-corrupted backup.** +**Asegúrese de que después de cada versión actualizada tenga una copia de respaldo no corrupta.** -## Version-specific upgrade steps +## Pasos de actualización específicos por versión ## v1.0 -Hello Twenty v1.0! 🎉 +¡Hola Twenty v1.0! 🎉 ## v0.60 -### Performance Enhancements +### Mejoras de rendimiento -All interactions with the metadata API have been optimized for better performance, particularly for object metadata manipulation and workspace creation operations. +Todas las interacciones con la API de metadatos han sido optimizadas para un mejor rendimiento, particularmente para la manipulación de metadatos de objetos y operaciones de creación de espacios de trabajo. -We've refactored our caching strategy to prioritize cache hits over database queries when possible, significantly improving the performance of metadata API operations. +Hemos reestructurado nuestra estrategia de almacenamiento en caché para priorizar los aciertos de caché sobre las consultas de base de datos cuando sea posible, mejorando significativamente el rendimiento de las operaciones de la API de metadatos. -If you encounter any runtime issues after upgrading, you may need to flush your cache to ensure it's synchronized with the latest changes. Run this command in your twenty-server container: +Si encuentra problemas de ejecución después de actualizar, es posible que deba vaciar su caché para asegurar que esté sincronizado con los cambios más recientes. Ejecute este comando en su contenedor del servidor de twenty: ```bash yarn command:prod cache:flush @@ -42,113 +42,113 @@ yarn command:prod cache:flush ### v0.55 -Upgrade your Twenty instance to use v0.55 image +Actualice su instancia de Twenty para usar la imagen v0.55 -You don't need to run any command anymore, the new image will automatically care about running all required migrations. +Ya no necesita ejecutar ningún comando, la nueva imagen se encargará automáticamente de ejecutar todas las migraciones necesarias. -### `User does not have permission` error +### Error: `El usuario no tiene permiso` -If you encounter authorization errors on most requests after upgrading, you may need to flush your cache to recompute the latest permissions. +Si encuentra errores de autorización en la mayoría de solicitudes después de actualizar, es posible que deba vaciar su caché para recalcular los permisos más recientes. -In your `twenty-server` container, run: +En su contenedor `twenty-server`, ejecute: ```bash yarn command:prod cache:flush ``` -This issue is specific to this Twenty version and should not be required for future upgrades. +Este problema es específico de esta versión de Twenty y no debería ser necesario para futuras actualizaciones. ### v0.54 -Since version `0.53`, no manual actions needed. +Desde la versión `0.53`, no se necesitan acciones manuales. -#### Metadata schema deprecation +#### Desaparición del esquema de metadatos -We've merged the `metadata` schema into the `core` one to simplify data retrieval from `TypeORM`. -We have merged the `migrate` command step within the `upgrade` command. We do not recommend running `migrate` manually within any of your server/worker containers. +Hemos fusionado el esquema `metadata` en el esquema `core` para simplificar la recuperación de datos desde `TypeORM`. +Hemos fusionado el paso del comando `migrate` dentro del comando `upgrade`. No recomendamos ejecutar `migrate` manualmente dentro de ninguno de sus contenedores de servidor/trabajador. -### Since v0.53 +### Desde v0.53 -Starting from `0.53`, upgrade is programmatically done within the `DockerFile`, this means from now on, you shouldn't have to run any command manually anymore. +A partir de `0.53`, la actualización se realiza de forma programática dentro del `DockerFile`, esto significa que de ahora en adelante, no debería necesitar ejecutar ningún comando manualmente. -Make sure to keep upgrading your instance sequentially, without skipping any major version (e.g. `0.43.3` to `0.44.0` is allowed, but `0.43.1` to `0.45.0` isn't), else could lead to workspace version desynchronization that could result in runtime error and missing functionality. +Asegúrese de seguir actualizando su instancia secuencialmente, sin omitir ninguna versión principal (por ejemplo, de `0.43.3` a `0.44.0` está permitido, pero de `0.43.1` a `0.45.0` no lo está), de lo contrario, podría provocar un desincronización de la versión del espacio de trabajo que podría resultar en errores de ejecución y funciones faltantes. -To check if a workspace has been correctly migrated you can review its version in database in `core.workspace` table. +Para verificar si un espacio de trabajo se ha migrado correctamente, puede revisar su versión en la base de datos en la tabla `core.workspace`. -It should always be in the range of your current Twenty's instance `major.minor` version, you can view your instance version in the admin panel (at `/settings/admin-panel`, accessible if your user has `canAccessFullAdminPanel` property set to true in the database) or by running `echo $APP_VERSION` in your `twenty-server` container. +Siempre debería estar dentro del rango de la versión `major.minor` actual de su instancia de Twenty; puede ver la versión de su instancia en el panel de administración (en `/settings/admin-panel`, accesible si su usuario tiene la propiedad `canAccessFullAdminPanel` establecida en verdadero en la base de datos) o ejecutando `echo $APP_VERSION` en su contenedor `twenty-server`. -To fix a desynchronized workspace version, you will have to upgrade from the corresponding twenty's version following related upgrade guide sequentially and so on until it reaches desired version. +Para corregir una versión de espacio de trabajo desincronizada, tendrá que actualizar desde la correspondiente versión de twenty siguiendo la guía de actualización relacionada secuencialmente, y así sucesivamente hasta alcanzar la versión deseada. -#### `auditLog` removal +#### Eliminación de `auditLog` -We've removed the auditLog standard object, which means your backup size might be significantly reduced after this migration. +Hemos eliminado el objeto estándar auditLog, lo que significa que el tamaño de su copia de seguridad podría reducirse significativamente después de esta migración. -### v0.51 to v0.52 +### v0.51 a v0.52 -Upgrade your Twenty instance to use v0.52 image +Actualice su instancia de Twenty para usar la imagen v0.52 ``` yarn database:migrate:prod yarn command:prod upgrade ``` -#### I have a workspace blocked in version between `0.52.0` and `0.52.6` +#### Tengo un espacio de trabajo bloqueado en la versión entre `0.52.0` y `0.52.6` -Unfortunately `0.52.0` and `0.52.6` have been completely removed from dockerHub. -You will have to manually update your workspace version to `0.51.0` in database and upgrade using twenty version `0.52.11` following its just above upgrade guide. +Desafortunadamente, `0.52.0` y `0.52.6` se han eliminado completamente de dockerHub. +Tendrá que actualizar manualmente la versión de su espacio de trabajo a `0.51.0` en la base de datos y actualizar usando la versión twenty `0.52.11` siguiendo su guía de actualización justo arriba. -### v0.50 to v0.51 +### v0.50 a v0.51 -Upgrade your Twenty instance to use v0.51 image +Actualice su instancia de Twenty para usar la imagen v0.51 ``` yarn database:migrate:prod yarn command:prod upgrade ``` -### v0.44.0 to v0.50.0 +### v0.44.0 a v0.50.0 -Upgrade your Twenty instance to use v0.50.0 image +Actualice su instancia de Twenty para usar la imagen v0.50.0 ``` yarn database:migrate:prod yarn command:prod upgrade ``` -#### Docker-compose.yml mutation +#### Mutación del docker-compose.yml -This version includes a `docker-compose.yml` mutation to give `worker` service access to the `server-local-data` volume. -Please update your local `docker-compose.yml` with [v0.50.0 docker-compose.yml](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml) +Esta versión incluye una mutación del `docker-compose.yml` para dar acceso al servicio `worker` al volumen `server-local-data`. +Actualice su `docker-compose.yml` local con el [docker-compose.yml de v0.50.0](https://github.com/twentyhq/twenty/blob/v0.50.0/packages/twenty-docker/docker-compose.yml) -### v0.43.0 to v0.44.0 +### v0.43.0 a v0.44.0 -Upgrade your Twenty instance to use v0.44.0 image +Actualice su instancia de Twenty para usar la imagen v0.44.0 ``` yarn database:migrate:prod yarn command:prod upgrade ``` -### v0.42.0 to v0.43.0 +### v0.42.0 a v0.43.0 -Upgrade your Twenty instance to use v0.43.0 image +Actualice su instancia de Twenty para usar la imagen v0.43.0 ``` yarn database:migrate:prod yarn command:prod upgrade ``` -In this version, we have also switched to postgres:16 image in docker-compose.yml. +En esta versión, también hemos cambiado a la imagen de postgres:16 en docker-compose.yml. -#### (Option 1) Database migration +#### (Opción 1) Migración de base de datos -Keeping the existing postgres-spilo image is fine, but you will have to freeze the version in your docker-compose.yml to be 0.43.0. +Mantener la imagen postgres-spilo existente está bien, pero tendrá que congelar la versión en su docker-compose.yml a 0.43.0. -#### (Option 2) Database migration +#### (Opción 2) Migración de base de datos -If you want to migrate your database to the new postgres:16 image, please follow these steps: +Si desea migrar su base de datos a la nueva imagen de postgres:16, siga estos pasos: -1. Dump your database from the old postgres-spilo container +1. Descargue su base de datos del contenedor antiguo de postgres-spilo ``` docker exec -it twenty-db-1 sh @@ -157,11 +157,11 @@ exit docker cp twenty-db-1:/home/postgres/databases_backup.sql . ``` -Make sure your dump file is not empty. +Asegúrese de que su archivo de respaldo no esté vacío. -2. Upgrade your docker-compose.yml to use postgres:16 image as in the [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) file. +2. Actualice su docker-compose.yml para usar la imagen de postgres:16 como en el archivo [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml). -3. Restore the database to the new postgres:16 container +3. Restaure la base de datos al nuevo contenedor postgres:16 ``` docker cp databases_backup.sql twenty-db-1:/databases_backup.sql @@ -170,86 +170,86 @@ psql -U {YOUR_POSTGRES_USER} -d {YOUR_POSTGRES_DB} -f databases_backup.sql exit ``` -### v0.41.0 to v0.42.0 +### v0.41.0 a v0.42.0 -Upgrade your Twenty instance to use v0.42.0 image +Actualice su instancia de Twenty para usar la imagen v0.42.0 ``` yarn database:migrate:prod yarn command:prod upgrade-0.42 ``` -**Environment Variables** +**Variables del entorno** -* Removed: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT` -* Added: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED` +* Removidos: `FRONT_PORT`, `FRONT_PROTOCOL`, `FRONT_DOMAIN`, `PORT` +* Agregados: `FRONTEND_URL`, `NODE_PORT`, `MAX_NUMBER_OF_WORKSPACES_DELETED_PER_EXECUTION`, `MESSAGING_PROVIDER_MICROSOFT_ENABLED`, `CALENDAR_PROVIDER_MICROSOFT_ENABLED`, `IS_MICROSOFT_SYNC_ENABLED` -### v0.40.0 to v0.41.0 +### v0.40.0 a v0.41.0 -Upgrade your Twenty instance to use v0.41.0 image +Actualice su instancia de Twenty para usar la imagen v0.41.0 ``` yarn database:migrate:prod yarn command:prod upgrade-0.41 ``` -**Environment Variables** +**Variables del entorno** -* Removed: `AUTH_MICROSOFT_TENANT_ID` +* Removido: `AUTH_MICROSOFT_TENANT_ID` -### v0.35.0 to v0.40.0 +### v0.35.0 a v0.40.0 -Upgrade your Twenty instance to use v0.40.0 image +Actualice su instancia de Twenty para usar la imagen v0.40.0 ``` yarn database:migrate:prod yarn command:prod upgrade-0.40 ``` -**Environment Variables** +**Variables del entorno** -* Added: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL` +* Agregados: `IS_EMAIL_VERIFICATION_REQUIRED`, `EMAIL_VERIFICATION_TOKEN_EXPIRES_IN`, `WORKFLOW_EXEC_THROTTLE_LIMIT`, `WORKFLOW_EXEC_THROTTLE_TTL` -### v0.34.0 to v0.35.0 +### v0.34.0 a v0.35.0 -Upgrade your Twenty instance to use v0.35.0 image +Actualice su instancia de Twenty para usar la imagen v0.35.0 ``` yarn database:migrate:prod yarn command:prod upgrade-0.35 ``` -The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas) -The `yarn command:prod upgrade-0.35` takes care of the data migration of all workspaces. +El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata) +El `yarn command:prod upgrade-0.35` se encarga de la migración de datos de todos los espacios de trabajo. -**Environment Variables** +**Variables del entorno** -* We replaced `ENABLE_DB_MIGRATIONS` with `DISABLE_DB_MIGRATIONS` (default value is now `false`, you probably don't have to set anything) +* Reemplazamos `ENABLE_DB_MIGRATIONS` por `DISABLE_DB_MIGRATIONS` (valor predeterminado ahora es `false`, probablemente no tenga que establecer nada) -### v0.33.0 to v0.34.0 +### v0.33.0 a v0.34.0 -Upgrade your Twenty instance to use v0.34.0 image +Actualice su instancia de Twenty para usar la imagen v0.34.0 ``` yarn database:migrate:prod yarn command:prod upgrade-0.34 ``` -The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas) -The `yarn command:prod upgrade-0.34` takes care of the data migration of all workspaces. +El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata) +El `yarn command:prod upgrade-0.34` se encarga de la migración de datos de todos los espacios de trabajo. -**Environment Variables** +**Variables del entorno** -* Removed: `FRONT_BASE_URL` -* Added: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT` +* Removido: `FRONT_BASE_URL` +* Agregados: `FRONT_DOMAIN`, `FRONT_PROTOCOL`, `FRONT_PORT` -We have updated the way we handle the frontend URL. -You can now set the frontend URL using the `FRONT_DOMAIN`, `FRONT_PROTOCOL` and `FRONT_PORT` variables. -If FRONT_DOMAIN is not set, the frontend URL will fall back to `SERVER_URL`. +Hemos actualizado la forma en que manejamos la URL del frontend. +Ahora puede configurar la URL del frontend usando las variables `FRONT_DOMAIN`, `FRONT_PROTOCOL` y `FRONT_PORT`. +Si FRONT_DOMAIN no está configurado, la URL del frontend volverá a `SERVER_URL`. -### v0.32.0 to v0.33.0 +### v0.32.0 a v0.33.0 -Upgrade your Twenty instance to use v0.33.0 image +Actualice su instancia de Twenty para usar la imagen v0.33.0 ``` yarn command:prod cache:flush @@ -257,68 +257,68 @@ yarn database:migrate:prod yarn command:prod upgrade-0.33 ``` -The `yarn command:prod cache:flush` command will flush the Redis cache. -The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas) -The `yarn command:prod upgrade-0.33` takes care of the data migration of all workspaces. +El comando `yarn command:prod cache:flush` eliminará la caché de Redis. +El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata) +El `yarn command:prod upgrade-0.33` se encarga de la migración de datos de todos los espacios de trabajo. -Starting from this version, twenty-postgres image for DB became deprecated and twenty-postgres-spilo is used instead. -If you want to keep using twenty-postgres image, simply replace `twentycrm/twenty-postgres:${TAG}` with `twentycrm/twenty-postgres` in docker-compose.yml. +A partir de esta versión, la imagen twenty-postgres para DB quedó obsoleta y ahora se usa twenty-postgres-spilo. +Si desea seguir usando la imagen twenty-postgres, simplemente reemplace `twentycrm/twenty-postgres:${TAG}` con `twentycrm/twenty-postgres` en docker-compose.yml. -### v0.31.0 to v0.32.0 +### v0.31.0 a v0.32.0 -Upgrade your Twenty instance to use v0.32.0 image +Actualice su instancia de Twenty para usar la imagen v0.32.0 -**Schema and data migration** +**Migración de esquemas y datos** ``` yarn database:migrate:prod yarn command:prod upgrade-0.32 ``` -The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas) -The `yarn command:prod upgrade-0.32` takes care of the data migration of all workspaces. +El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata) +El `yarn command:prod upgrade-0.32` se encarga de la migración de datos de todos los espacios de trabajo. -**Environment Variables** +**Variables del entorno** -We have updated the way we handle the Redis connection. +Hemos actualizado la forma en que manejamos la conexión Redis. -* Removed: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD` -* Added: `REDIS_URL` +* Removidos: `REDIS_HOST`, `REDIS_PORT`, `REDIS_USERNAME`, `REDIS_PASSWORD` +* Agregado: `REDIS_URL` -Update your `.env` file to use the new `REDIS_URL` variable instead of the individual Redis connection parameters. +Actualice su archivo `.env` para usar la nueva variable `REDIS_URL` en lugar de los parámetros de conexión individuales de Redis. -We have also simplified the way we handle the JWT tokens. +También hemos simplificado la forma en que manejamos los tokens JWT. -* Removed: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET` -* Added: `APP_SECRET` +* Removidos: `ACCESS_TOKEN_SECRET`, `LOGIN_TOKEN_SECRET`, `REFRESH_TOKEN_SECRET`, `FILE_TOKEN_SECRET` +* Agregado: `APP_SECRET` -Update your `.env` file to use the new `APP_SECRET` variable instead of the individual tokens secrets (you can use the same secret as before or generate a new random string) +Actualice su archivo `.env` para usar la nueva variable `APP_SECRET` en lugar de los secretos de tokens individuales (puede usar el mismo secreto que antes o generar una nueva cadena aleatoria) -**Connected Account** +**Cuenta conectada** -If you are using connected account to synchronize your Google emails and calendars, you will need to activate the [People API](https://developers.google.com/people) on your Google Admin console. +Si está utilizando cuentas conectadas para sincronizar sus correos electrónicos y calendarios de Google, deberá activar la [API de People](https://developers.google.com/people) en su consola de administración de Google. -### v0.30.0 to v0.31.0 +### v0.30.0 a v0.31.0 -Upgrade your Twenty instance to use v0.31.0 image +Actualice su instancia de Twenty para usar la imagen v0.31.0 -**Schema and data migration**: +**Migración de esquemas y datos:** ``` yarn database:migrate:prod yarn command:prod upgrade-0.31 ``` -The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas) -The `yarn command:prod upgrade-0.31` takes care of the data migration of all workspaces. +El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata) +El `yarn command:prod upgrade-0.31` se encarga de la migración de datos de todos los espacios de trabajo. -### v0.24.0 to v0.30.0 +### v0.24.0 a v0.30.0 -Upgrade your Twenty instance to use v0.30.0 image +Actualice su instancia de Twenty para usar la imagen v0.30.0 -**Breaking change**: -To enhance performances, Twenty now requires redis cache to be configured. We have updated our [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) to reflect this. -Make sure to update your configuration and to update your environment variables accordingly: +**Cambio importante**: +Para mejorar el rendimiento, Twenty ahora requiere que la caché redis esté configurada. Hemos actualizado nuestro [docker-compose.yml](https://raw.githubusercontent.com/twentyhq/twenty/main/packages/twenty-docker/docker-compose.yml) para reflejar esto. +Asegúrese de actualizar su configuración y sus variables de entorno en consecuencia: ``` REDIS_HOST={your-redis-host} @@ -326,49 +326,49 @@ REDIS_PORT={your-redis-port} CACHE_STORAGE_TYPE=redis ``` -**Schema and data migration**: +**Migración de esquemas y datos:** ``` yarn database:migrate:prod yarn command:prod upgrade-0.30 ``` -The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas) -The `yarn command:prod upgrade-0.30` takes care of the data migration of all workspaces. +El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata) +El `yarn command:prod upgrade-0.30` se encarga de la migración de datos de todos los espacios de trabajo. -### v0.23.0 to v0.24.0 +### v0.23.0 a v0.24.0 -Upgrade your Twenty instance to use v0.24.0 image +Actualice su instancia de Twenty para usar la imagen v0.24.0 -Run the following commands: +Ejecución de los siguientes comandos: ``` yarn database:migrate:prod yarn command:prod upgrade-0.24 ``` -The `yarn database:migrate:prod` command will apply the migrations to the database structure (core and metadata schemas) -The `yarn command:prod upgrade-0.24` takes care of the data migration of all workspaces. +El comando `yarn database:migrate:prod` aplicará las migraciones a la estructura de la base de datos (esquemas core y metadata) +El `yarn command:prod upgrade-0.24` se encarga de la migración de datos de todos los espacios de trabajo. -### v0.22.0 to v0.23.0 +### v0.22.0 a v0.23.0 -Upgrade your Twenty instance to use v0.23.0 image +Actualice su instancia de Twenty para usar la imagen v0.23.0 -Run the following commands: +Ejecución de los siguientes comandos: ``` yarn database:migrate:prod yarn command:prod upgrade-0.23 ``` -The `yarn database:migrate:prod` command will apply the migrations to the Database. -The `yarn command:prod upgrade-0.23` takes care of the data migration, including transferring activities to tasks/notes. +El comando `yarn database:migrate:prod` aplicará las migraciones a la base de datos. +El `yarn command:prod upgrade-0.23` se encarga de la migración de datos, incluyendo la transferencia de actividades a tareas/notas. -### v0.21.0 to v0.22.0 +### v0.21.0 a v0.22.0 -Upgrade your Twenty instance to use v0.22.0 image +Actualice su instancia de Twenty para usar la imagen v0.22.0 -Run the following commands: +Ejecución de los siguientes comandos: ``` yarn database:migrate:prod @@ -376,6 +376,6 @@ yarn command:prod workspace:sync-metadata -f yarn command:prod upgrade-0.22 ``` -The `yarn database:migrate:prod` command will apply the migrations to the Database. -The `yarn command:prod workspace:sync-metadata -f` command will sync the definition of standard objects to the metadata tables and apply to required migrations to existing workspaces. -The `yarn command:prod upgrade-0.22` command will apply specific data transformations to adapt to the new object defaultRequestInstrumentationOptions. +El comando `yarn database:migrate:prod` aplicará las migraciones a la base de datos. +El comando `yarn command:prod workspace:sync-metadata -f` sincronizará la definición de objetos estándar a las tablas de metadatos y aplicará las migraciones requeridas a los espacios de trabajo existentes. +El comando `yarn command:prod upgrade-0.22` aplicará transformaciones de datos específicas para adaptarse a las nuevas opciones predeterminadas de instrumentación de solicitud de objetos. diff --git a/packages/twenty-docs/l/es/developers/self-host/self-host.mdx b/packages/twenty-docs/l/es/developers/self-host/self-host.mdx index 86d3072999..246ce12ead 100644 --- a/packages/twenty-docs/l/es/developers/self-host/self-host.mdx +++ b/packages/twenty-docs/l/es/developers/self-host/self-host.mdx @@ -1,30 +1,30 @@ --- -title: Self-Host -description: Deploy and manage Twenty on your own infrastructure. +title: Autoalojamiento +description: Despliega y administra Twenty en tu propia infraestructura. --- - AI + IA -## Overview +## Resumen -Twenty can be self-hosted on your own infrastructure, giving you full control over your data and deployment. +Puedes autoalojar Twenty en tu propia infraestructura, lo que te brinda control total sobre tus datos y el despliegue. -## Why Self-Host? +## ¿Por qué autoalojar? -* **Data ownership**: Keep all CRM data on your own servers -* **Compliance**: Meet regulatory requirements for data residency -* **Customization**: Full access to modify and extend the platform +* **Propiedad de los datos**: Mantén todos los datos de CRM en tus propios servidores +* **Cumplimiento**: Cumple los requisitos normativos de residencia de datos +* **Personalización**: Acceso completo para modificar y ampliar la plataforma -## Getting Started +## Primeros pasos - Quick setup with Docker + Configuración rápida con Docker - - Deploy on AWS, GCP, or Azure + + Despliega en AWS, GCP o Azure diff --git a/packages/twenty-docs/l/es/navigation.json b/packages/twenty-docs/l/es/navigation.json index 8096fbf4ac..4b022c374e 100644 --- a/packages/twenty-docs/l/es/navigation.json +++ b/packages/twenty-docs/l/es/navigation.json @@ -1,197 +1,197 @@ { "tabs": { "userGuide": { - "label": "User Guide", + "label": "Guía de usuario", "groups": { "discoverTwenty": { - "label": "Discover Twenty", + "label": "Descubre Twenty", "groups": { "gettingStartedCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "gettingStartedHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "dataModel": { - "label": "Data Model", + "label": "Modelo de datos", "groups": { "dataModelCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "dataModelHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "dataMigration": { - "label": "Data Migration", + "label": "Migración de datos", "groups": { "dataMigrationCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "dataMigrationHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "calendarEmails": { - "label": "Calendar & Emails", + "label": "Calendario y correos electrónicos", "groups": { "calendarEmailsCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "calendarEmailsHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "workflows": { - "label": "Workflows", + "label": "Flujos de trabajo", "groups": { "workflowsCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "workflowsHowTos": { - "label": "How-Tos", + "label": "Guías prácticas", "groups": { "crmAutomations": { - "label": "CRM Automations" + "label": "Automatizaciones de CRM" }, "connectToOtherTools": { - "label": "Connect to Other Tools" + "label": "Conectar con otras herramientas" }, "advancedConfigurations": { - "label": "Advanced Configurations" + "label": "Configuraciones avanzadas" }, "needMoreHelp": { - "label": "Need More Help" + "label": "¿Necesitas más ayuda?" } } } } }, "ai": { - "label": "AI", + "label": "IA", "groups": { "aiCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "aiHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "viewsPipelines": { - "label": "Views & Pipelines", + "label": "Vistas y canalizaciones", "groups": { "viewsPipelinesCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "viewsPipelinesHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "dashboards": { - "label": "Dashboards", + "label": "Tableros", "groups": { "dashboardsCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "dashboardsHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "permissionsAccess": { - "label": "Permissions & Access", + "label": "Permisos y acceso", "groups": { "permissionsAccessCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "permissionsAccessHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "billing": { - "label": "Billing", + "label": "Facturación", "groups": { "billingCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "billingHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } }, "settings": { - "label": "Settings", + "label": "Configuración", "groups": { "settingsCapabilities": { - "label": "Capabilities" + "label": "Capacidades" }, "settingsHowTos": { - "label": "How-Tos" + "label": "Guías prácticas" } } } } }, "developers": { - "label": "Developers", + "label": "Desarrolladores", "groups": { "developersGroup": { - "label": "Developers" + "label": "Desarrolladores" }, "extend": { - "label": "Extend", + "label": "Ampliar", "groups": { "extendCapabilities": { - "label": "Capabilities" + "label": "Capacidades" } } }, "selfHost": { - "label": "Self-Host", + "label": "Autoalojamiento", "groups": { "selfHostCapabilities": { - "label": "Capabilities" + "label": "Capacidades" } } }, "contribute": { - "label": "Contribute", + "label": "Contribuir", "groups": { "contributeCapabilities": { - "label": "Capabilities", + "label": "Capacidades", "groups": { "frontendDevelopment": { - "label": "Frontend Development", + "label": "Desarrollo Frontend", "groups": { "twentyUi": { "label": "Twenty UI", "groups": { "display": { - "label": "Display" + "label": "Mostrar" }, "feedback": { - "label": "Feedback" + "label": "Retroalimentación" }, "input": { - "label": "Input" + "label": "Entrada" }, "navigation": { - "label": "Navigation" + "label": "Navegación" } } } } }, "backendDevelopment": { - "label": "Backend Development" + "label": "Desarrollo Backend" } } } diff --git a/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx index 4e620eedc7..ced09dc767 100644 --- a/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/display/app-tooltip.mdx @@ -1,16 +1,16 @@ --- -title: App Tooltip +title: Consejo de la aplicación image: /images/user-guide/tips/light-bulb.png --- - Header + Encabezado -A brief message that displays additional information when a user interacts with an element. +Un breve mensaje que muestra información adicional cuando un usuario interactúa con un elemento. - + ```jsx import { AppTooltip } from "@/ui/display/tooltip/AppTooltip"; @@ -38,26 +38,26 @@ A brief message that displays additional information when a user interacts with - | Props | Type | Description | - | ---------------- | ---------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | className | string | Optional CSS class for additional styling | - | anchorSelect | CSS selector | Selector for the tooltip anchor (the element that triggers the tooltip) | - | content | string | The content you want to display within the tooltip | - | delayHide | number | The delay in seconds before hiding the tooltip after the cursor leaves the anchor | - | offset | number | The offset in pixels for positioning the tooltip | - | noArrow | boolean | If `true`, hides the arrow on the tooltip | - | isOpen | boolean | If `true`, the tooltip is open by default | - | place | `PlacesType` string from `react-tooltip` | Specifies the placement of the tooltip. Values include `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, and `left-end` | - | positionStrategy | `PositionStrategy` string from `react-tooltip` | Position strategy for the tooltip. Has two values: `absolute` and `fixed` | + | Props | Tipo | Descripción | + | ------------------ | -------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | nombreDeClase | cadena | Clase CSS opcional para estilo adicional | + | anchorSelect | Selector CSS | Selector para el ancla del consejo (el elemento que activa el consejo) | + | contenido | cadena | El contenido que desea mostrar dentro del consejo | + | delayHide | número | The delay in seconds before hiding the tooltip after the cursor leaves the anchor | + | desplazamiento | número | El desplazamiento en píxeles para posicionar el consejo | + | sinFlecha | booleano | Si es `true`, oculta la flecha en el consejo | + | estáAbierto | booleano | Si es `true`, el consejo está abierto por defecto | + | lugar | Cadena `PlacesType` de `react-tooltip` | Especifica la colocación del consejo. Los valores incluyen `inferior`, `izquierda`, `derecha`, `superior`, `superior-inicio`, `superior-fin`, `derecha-inicio`, `derecha-fin`, `inferior-inicio`, `inferior-fin`, `izquierda-inicio` y `izquierda-fin` | + | estrategiaPosicion | Cadena `PositionStrategy` de `react-tooltip` | Estrategia de posición para el consejo. Tiene dos valores: `absoluto` y `fijo` | -## Overflowing Text with Tooltip +## Texto Desbordante con Consejo -Handles overflowing text and displays a tooltip when the text overflows. +Maneja texto desbordante y muestra un consejo cuando el texto se desborda. - + ```jsx import { OverflowingTextWithTooltip } from 'twenty-ui/display'; @@ -71,8 +71,8 @@ Handles overflowing text and displays a tooltip when the text overflows. - | Props | Type | Description | - | ----- | ------ | ------------------------------------------------------------ | - | text | string | The content you want to display in the overflowing text area | + | Props | Tipo | Descripción | + | ----- | ------ | -------------------------------------------------------------- | + | texto | cadena | El contenido que desea mostrar en el área de texto desbordante | diff --git a/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx b/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx index ef84d5c2d5..7726dabf92 100644 --- a/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/display/checkmark.mdx @@ -1,16 +1,16 @@ --- -title: Checkmark +title: Marca de verificación image: /images/user-guide/tasks/tasks_header.png --- - Header + Encabezado -Represents a successful or completed action. +Representa una acción exitosa o completada. - + ```jsx import { Checkmark } from 'twenty-ui/display'; @@ -21,16 +21,16 @@ Represents a successful or completed action. - Extends `React.ComponentPropsWithoutRef<'div'>` and accepts all the props of a regular `div` element. + Extiende `React.ComponentPropsWithoutRef<'div'>` y acepta todas las propiedades de un elemento `div` regular. -## Animated Checkmark +## Marca de verificación animada -Represents a checkmark icon with the added feature of animation. +Representa un ícono de marca de verificación con la característica adicional de animación. - + ```jsx import { AnimatedCheckmark } from 'twenty-ui/display'; @@ -48,11 +48,11 @@ Represents a checkmark icon with the added feature of animation. - | Props | Type | Description | Default | - | ----------- | ------- | ------------------------------------------- | ----------- | - | isAnimating | boolean | Controls whether the checkmark is animating | false | - | color | string | Color of the checkmark | | - | duration | number | The duration of the animation in seconds | 0.5 seconds | - | size | number | The size of the checkmark | 28 pixels | + | Props | Tipo | Descripción | Predeterminado | + | ----------- | -------- | -------------------------------------------------- | -------------- | + | isAnimating | booleano | Controla si la marca de verificación está animando | falso | + | color | cadena | Color de la marca de verificación | | + | duración | número | La duración de la animación en segundos | 0.5 segundos | + | tamaño | número | El tamaño de la marca de verificación | 28 píxeles | diff --git a/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx index ded2fd1c77..81da2d7549 100644 --- a/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/display/chip.mdx @@ -4,13 +4,13 @@ image: /images/user-guide/github/github-header.png --- - Header + Encabezado -A visual element that you can use as a clickable or non-clickable container with a label, optional left and right components, and various styling options to display labels and tags. +Un elemento visual que puedes usar como contenedor con o sin posibilidad de hacer clic, con una etiqueta, componentes opcionales a la izquierda y a la derecha y varias opciones de estilo para mostrar rótulos y etiquetas. - + ```jsx import { Chip } from 'twenty-ui/components'; @@ -18,7 +18,7 @@ A visual element that you can use as a clickable or non-clickable container with return ( - | Props | Type | Description | - | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- | - | linkToEntity | string | The link to the entity | - | entityId | string | The unique identifier for the entity | - | name | string | The name of the entity | - | pictureUrl | string | s picture", | - | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` | - | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` | - | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip | + | Props | Tipo | Descripción | + | ------------ | ------------------------ | ------------------------------------------------------------------------------------------------ | + | linkToEntity | cadena | El enlace a la entidad | + | entityId | cadena | El identificador único de la entidad | + | nombre | cadena | El nombre de la entidad | + | pictureUrl | cadena | s foto", | + | avatarType | Tipo de Avatar | El tipo de avatar que quieres mostrar. Tiene dos opciones: `redondeado` y `cuadrado` | + | variante | `EntityChipVariant` enum | Variante del chip de entidad que quieres mostrar. Tiene dos opciones: `regular` y `transparente` | + | LeftIcon | IconComponent | Un componente de React que representa un ícono. Mostrado en el lado izquierdo del chip | -## Examples +## Ejemplos -### Transparent Disabled Chip +### Chip Transparente Deshabilitado ```jsx import { Chip } from 'twenty-ui/components'; @@ -57,7 +57,7 @@ export const MyComponent = () => { return ( {
-### Disabled Chip with Tooltip +### Chip Deshabilitado con Tooltip ```jsx import { Chip } from "twenty-ui/components"; @@ -82,7 +82,7 @@ export const MyComponent = () => { return ( { }; ``` -## Entity Chip +## Chip de Entidad -A Chip-like element to display information about an entity. +Un elemento tipo Chip para mostrar información sobre una entidad. - + ```jsx import { BrowserRouter as Router } from 'react-router-dom'; import { IconTwentyStar } from 'twenty-ui/display'; @@ -112,7 +112,7 @@ A Chip-like element to display information about an entity. - | Props | Type | Description | - | ------------ | ------------------------ | -------------------------------------------------------------------------------------------- | - | linkToEntity | string | The link to the entity | - | entityId | string | The unique identifier for the entity | - | name | string | The name of the entity | - | pictureUrl | string | s picture", | - | avatarType | Avatar Type | The type of avatar you want to display. Has two options: `rounded` and `squared` | - | variant | `EntityChipVariant` enum | Variant of the entity chip you want to display. Has two options: `regular` and `transparent` | - | LeftIcon | IconComponent | A React component representing an icon. Displayed on the left side of the chip | + | Props | Tipo | Descripción | + | ------------ | ------------------------ | ------------------------------------------------------------------------------------------------ | + | linkToEntity | cadena | El enlace a la entidad | + | entityId | cadena | El identificador único de la entidad | + | nombre | cadena | El nombre de la entidad | + | pictureUrl | cadena | s foto", | + | avatarType | Tipo de Avatar | El tipo de avatar que quieres mostrar. Tiene dos opciones: `redondeado` y `cuadrado` | + | variante | `EntityChipVariant` enum | Variante del chip de entidad que quieres mostrar. Tiene dos opciones: `regular` y `transparente` | + | LeftIcon | IconComponent | Un componente de React que representa un ícono. Mostrado en el lado izquierdo del chip | diff --git a/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx b/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx index 2d73154c8d..9e7646d32e 100644 --- a/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/display/icons.mdx @@ -1,20 +1,20 @@ --- -title: Icons +title: Iconos image: /images/user-guide/objects/objects.png --- - Header + Encabezado -A list of icons used throughout our app. +Una lista de iconos utilizados en toda nuestra aplicación. -## Tabler Icons +## Iconos Tabler -We use Tabler icons for React throughout the app. +Usamos iconos Tabler para React en toda la aplicación. - +
``` @@ -22,8 +22,8 @@ We use Tabler icons for React throughout the app. ```
- - You can import each icon as a component. Here's an example: + + Puede importar cada icono como un componente. Aquí hay un ejemplo:
@@ -36,25 +36,25 @@ We use Tabler icons for React throughout the app. ```
- - | Props | Type | Description | Default | - | ------ | ------ | ------------------------------------------ | ------------ | - | size | number | The height and width of the icon in pixels | 24 | - | color | string | The color of the icons | currentColor | - | stroke | number | The stroke width of the icon in pixels | 2 | + + | Propiedades | Tipo | Descripción | Predeterminado | + | ----------- | ------ | ----------------------------------------- | -------------- | + | tamaño | número | La altura y el ancho del icono en píxeles | 24 | + | color | cadena | El color de los iconos | currentColor | + | trazo | número | El ancho del trazo del icono en píxeles | 2 |
-## Custom Icons +## Iconos Personalizados -In addition to Tabler icons, the app also uses some custom icons. +Además de los iconos Tabler, la aplicación también utiliza algunos iconos personalizados. -### Icon Address Book +### Icono de Libreta de Direcciones -Displays an address book icon. +Muestra un icono de libreta de direcciones. - + ```jsx import { IconAddressBook } from 'twenty-ui/display'; @@ -64,10 +64,10 @@ Displays an address book icon. ``` - - | Props | Type | Description | Default | - | ------ | ------ | ------------------------------------------ | ------- | - | size | number | The height and width of the icon in pixels | 24 | - | stroke | number | The stroke width of the icon in pixels | 2 | + + | "Props" | Tipo | Descripción | Predeterminado | + | ------- | ------ | ----------------------------------------- | -------------- | + | tamaño | número | La altura y el ancho del icono en píxeles | 24 | + | trazo | número | El ancho del trazo del icono en píxeles | 2 | diff --git a/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx index 56ace0bae7..8506f3f486 100644 --- a/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/display/soon-pill.mdx @@ -4,10 +4,10 @@ image: /images/user-guide/kanban-views/kanban.png --- - Header + Encabezado -A small badge or "pill" to indicate something is coming soon. +Una pequeña insignia o "pastilla" para indicar que algo estará disponible próximamente. ```jsx import { SoonPill } from "@/ui/display/pill/components/SoonPill"; diff --git a/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx index a2226c88d4..421e926bf9 100644 --- a/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/display/tag.mdx @@ -1,16 +1,16 @@ --- -title: Tag +title: Etiqueta image: /images/user-guide/table-views/table.png --- - Header + Encabezado -Component to visually categorize or label content. +Componente para categorizar o etiquetar contenido visualmente. - + ```jsx import { Tag } from "@/ui/display/tag/components/Tag"; @@ -28,11 +28,11 @@ Component to visually categorize or label content. - | Props | Type | Description | - | --------- | -------- | --------------------------------------------------------------------------------------------------------------------------- | - | className | string | Optional name for additional styling | - | color | string | Color of the tag. Options include: `green`, `turquoise`, `sky`, `blue`, `purple`, `pink`, `red`, `orange`, `yellow`, `gray` | - | text | string | The content of the tag | - | onClick | function | Optional function called when a user clicks on the tag | + | Props | Tipo | Descripción | + | ------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- | + | nombreDeClase | cadena | Nombre opcional para estilo adicional | + | color | cadena | Color de la etiqueta. Las opciones incluyen: `verde`, `turquesa`, `cielo`, `azul`, `púrpura`, `rosa`, `rojo`, `naranja`, `amarillo`, `gris` | + | texto | cadena | El contenido de la etiqueta | + | enClic | función | Función opcional llamada cuando un usuario hace clic en la etiqueta | diff --git a/packages/twenty-docs/l/es/twenty-ui/input.mdx b/packages/twenty-docs/l/es/twenty-ui/input.mdx index 2da701caf5..a2550d107a 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input.mdx @@ -1,8 +1,8 @@ --- -title: Input +title: Entrada image: /images/user-guide/tips/light-bulb.png --- - Header + Encabezado diff --git a/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx b/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx index 9943fa5f5d..2934ad9fac 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/block-editor.mdx @@ -1,16 +1,16 @@ --- -title: Block Editor +title: Editor de Bloques image: /images/user-guide/api/api.png --- - Header + Encabezado -Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org/) to allow users to edit and view blocks of content. +Usa un editor de texto enriquecido basado en bloques de [BlockNote](https://www.blocknotejs.org/) para permitir a los usuarios editar y ver bloques de contenido. - + ```jsx import { useBlockNote } from "@blocknote/react"; import { BlockEditor } from "@/ui/input/editor/components/BlockEditor"; @@ -24,8 +24,8 @@ Uses a block-based rich text editor from [BlockNote](https://www.blocknotejs.org - | Props | Type | Description | - | ------ | ----------------- | ------------------------------------------ | - | editor | `BlockNoteEditor` | The block editor instance or configuration | + | Props | Tipo | Descripción | + | ------ | ----------------- | -------------------------------------------------- | + | editor | `BlockNoteEditor` | La instancia o configuración del editor de bloques | diff --git a/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx b/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx index 1c53eb1816..426122437d 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/buttons.mdx @@ -1,18 +1,18 @@ --- -title: Buttons +title: Botones image: /images/user-guide/views/filter.png --- - Header + Encabezado -A list of buttons and button groups used throughout the app. +Una lista de botones y grupos de botones utilizados en toda la aplicación. -## Button +## Botón - + ```jsx import { Button } from "@/ui/input/button/components/Button"; @@ -37,28 +37,28 @@ A list of buttons and button groups used throughout the app. ``` - - | Props | Type | Description | - | --------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- | - | className | string | Optional class name for additional styling | - | Icon | `React.ComponentType` | An optional icon component that's displayed within the button | - | title | string | The text content of the button | - | fullWidth | boolean | Defines whether the button should span the whole width of its container | - | variant | string | The visual style variant of the button. Options include `primary`, `secondary`, and `tertiary` | - | size | string | The size of the button. Has two options: `small` and `medium` | - | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` | - | accent | string | The accent color of the button. Options include: `default`, `blue`, and `danger` | - | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) | - | disabled | boolean | Specifies whether the button is disabled or not | - | focus | boolean | Determines if the button has focus | - | onClick | function | A callback function that triggers when the user clicks on the button | + + | "Props" | Tipo | Descripción | + | ------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------- | + | "className" | string | Nombre de clase opcional para estilos adicionales | + | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón | + | título | cadena | El contenido de texto del botón | + | "fullWidth" | booleano | Define si el botón debe ocupar todo el ancho de su contenedor | + | variante | cadena | La variante de estilo visual del botón. Las opciones incluyen `primario`, `secundario` y `terciario` | + | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` | + | posición | cadena | La posición del botón en relación con sus compañeros. Las opciones incluyen: `independiente`, `izquierda`, `derecha` y `central` | + | acento | cadena | El color de acento del botón. Las opciones incluyen: `predeterminado`, `azul` y `peligro` | + | próximamente | booleano | Indica si el botón está marcado como "pronto" (como para funciones próximas) | + | deshabilitado | booleano | Especifica si el botón está deshabilitado o no | + | enfoque | booleano | Determina si el botón tiene foco | + | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón | -## Button Group +## Grupo de Botones - + ```jsx import { Button } from "@/ui/input/button/components/Button"; import { ButtonGroup } from "@/ui/input/button/components/ButtonGroup"; @@ -116,20 +116,20 @@ A list of buttons and button groups used throughout the app. - | Props | Type | Description | - | --------- | --------- | ---------------------------------------------------------------------------------------------------------------- | - | variant | string | The visual style variant of the buttons within the group. Options include `primary`, `secondary`, and `tertiary` | - | size | string | The size of the buttons within the group. Has two options: `medium` and `small` | - | accent | string | The accent color of the buttons within the group. Options include `default`, `blue` and `danger` | - | className | string | Optional class name for additional styling | - | children | ReactNode | An array of React elements representing the individual buttons within the group | + | Props | Tipo | Descripción | + | --------- | --------- | -------------------------------------------------------------------------------------------------------------------------- | + | variante | cadena | La variante de estilo visual de los botones dentro del grupo. Las opciones incluyen `primario`, `secundario` y `terciario` | + | tamaño | cadena | El tamaño de los botones dentro del grupo. Tiene dos opciones: `mediano` y `pequeño` | + | acento | cadena | El color de acento de los botones dentro del grupo. Las opciones incluyen `predeterminado`, `azul` y `peligro` | + | className | cadena | Nombre de clase opcional para estilos adicionales | + | hijos | ReactNode | Una matriz de elementos React que representan los botones individuales dentro del grupo | -## Floating Button +## Botón Flotante - + ```jsx import { FloatingButton } from "@/ui/input/button/components/FloatingButton"; import { IconSearch } from "@tabler/icons-react"; @@ -153,24 +153,24 @@ A list of buttons and button groups used throughout the app. - | Props | Type | Description | - | ----------- | --------------------- | ---------------------------------------------------------------------------------------------------------------- | - | className | string | Optional name for additional styling | - | Icon | `React.ComponentType` | An optional icon component that's displayed within the button | - | title | string | The text content of the button | - | size | string | The size of the button. Has two options: `small` and `medium` | - | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `middle`, `right` | - | applyShadow | boolean | Determines whether to apply shadow to a button | - | applyBlur | boolean | Determines whether to apply a blur effect to the button | - | disabled | boolean | Determines whether the button is disabled | - | focus | boolean | Indicates if the button has focus | + | Props | Tipo | Descripción | + | ----------------- | --------------------- | ------------------------------------------------------------------------------------------------------------------------------- | + | className | cadena | Nombre opcional para estilos adicionales | + | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón | + | título | cadena | El contenido de texto del botón | + | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` | + | posición | cadena | La posición del botón en relación con sus compañeros. Las opciones incluyen: `independiente`, `izquierda`, `central`, `derecha` | + | aplicarSombra | booleano | Determina si se aplica sombra a un botón | + | aplicarDesenfoque | booleano | Determina si se aplica un efecto de desenfoque al botón | + | deshabilitado | booleano | Determina si el botón está deshabilitado | + | enfoque | booleano | Indica si el botón tiene foco | -## Floating Button Group +## Grupo de Botones Flotantes - + ```jsx import { FloatingButton } from "@/ui/input/button/components/FloatingButton"; import { FloatingButtonGroup } from "@/ui/input/button/components/FloatingButtonGroup"; @@ -206,18 +206,18 @@ A list of buttons and button groups used throughout the app. ``` - - | Props | Type | Description | Default | - | -------- | --------- | ------------------------------------------------------------------------------- | ------- | - | size | string | The size of the button. Has two options: `small` and `medium` | small | - | children | ReactNode | An array of React elements representing the individual buttons within the group | | + + | "Props" | Tipo | Descripción | Predeterminado | + | ------- | --------- | --------------------------------------------------------------------------------------- | -------------- | + | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` | pequeño | + | hijos | ReactNode | Una matriz de elementos React que representan los botones individuales dentro del grupo | | -## Floating Icon Button +## Botón de Ícono Flotante - + ```jsx import { FloatingIconButton } from "@/ui/input/button/components/FloatingIconButton"; import { IconSearch } from "@tabler/icons-react"; @@ -242,25 +242,25 @@ A list of buttons and button groups used throughout the app. - | Props | Type | Description | - | ----------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- | - | className | string | Optional name for additional styling | - | Icon | `React.ComponentType` | An optional icon component that's displayed within the button | - | size | string | The size of the button. Has two options: `small` and `medium` | - | position | string | The position of the button in relation to its siblings. Options include: `standalone`, `left`, `right`, and `middle` | - | applyShadow | boolean | Determines whether to apply shadow to a button | - | applyBlur | boolean | Determines whether to apply a blur effect to the button | - | disabled | boolean | Determines whether the button is disabled | - | focus | boolean | Indicates if the button has focus | - | onClick | function | A callback function that triggers when the user clicks on the button | - | isActive | boolean | Determines if the button is in an active state | + | Props | Tipo | Descripción | + | ----------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------------------- | + | className | cadena | "Nombre opcional para estilización adicional" | + | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón | + | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` | + | posición | cadena | La posición del botón en relación con sus compañeros. Las opciones incluyen: `independiente`, `izquierda`, `derecha` y `central` | + | aplicarSombra | booleano | Determina si se aplica sombra a un botón | + | aplicarDesenfoque | booleano | Determina si se aplica un efecto de desenfoque al botón | + | deshabilitado | booleano | Determina si el botón está deshabilitado | + | enfoque | booleano | Indica si el botón tiene foco | + | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón | + | esActivo | booleano | Determina si el botón está en estado activo | -## Floating Icon Button Group +## Grupo de Botones de Ícono Flotante - + ```jsx import { FloatingIconButtonGroup } from "@/ui/input/button/components/FloatingIconButtonGroup"; import { IconClipboardText, IconCheckbox } from "@tabler/icons-react"; @@ -291,18 +291,18 @@ A list of buttons and button groups used throughout the app. - | Props | Type | Description | - | ----------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | - | className | string | Optional name for additional styling | - | size | string | The size of the button. Has two options: `small` and `medium` | - | iconButtons | array | An array of objects, each representing an icon button in the group. Each object should include the icon component you want to display in the button, the function you want to call when a user clicks on the button, and whether the button should be active or not. | + | Props | Tipo | Descripción | + | ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | + | className | cadena | "Nombre opcional para estilización adicional" | + | tamaño | cadena | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` | + | iconButtons | array | Una matriz de objetos, cada uno de los cuales representa un botón de icono del grupo. Cada objeto debe incluir el componente de ícono que desea mostrar en el botón, la función que desea llamar cuando un usuario hace clic en el botón y si el botón debe estar activo o no. | -## Light Button +## Botón Claro - + ```jsx import { LightButton } from "@/ui/input/button/components/LightButton"; @@ -322,23 +322,23 @@ A list of buttons and button groups used throughout the app. - | Props | Type | Description | - | --------- | ----------------- | --------------------------------------------------------------------------- | - | className | string | Optional name for additional styling | - | icon | `React.ReactNode` | The icon you want to display in the button | - | title | string | The text content of the button | - | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` | - | active | boolean | Determines if the button is in an active state | - | disabled | boolean | Determines whether the button is disabled | - | focus | boolean | Indicates if the button has focus | - | onClick | function | A callback function that triggers when the user clicks on the button | + | Props | Tipo | Descripción | + | ------------- | ----------------- | ------------------------------------------------------------------------------- | + | className | cadena | "Nombre opcional para estilización adicional" | + | ícono | `React.ReactNode` | El ícono que desea mostrar en el botón | + | título | cadena | El contenido de texto del botón | + | acento | "cadena" | El color de acento del botón. Las opciones incluyen: `secundario` y `terciario` | + | activo | booleano | Determina si el botón está en estado activo | + | deshabilitado | booleano | Determina si el botón está deshabilitado | + | enfoque | booleano | Indica si el botón tiene foco | + | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón | -## Light Icon Button +## Botón de Ícono Claro - + ```jsx import { LightIconButton } from "@/ui/input/button/components/LightIconButton"; import { IconSearch } from "@tabler/icons-react"; @@ -362,26 +362,26 @@ A list of buttons and button groups used throughout the app. ``` - - | Props | Type | Description | - | --------- | --------------------- | --------------------------------------------------------------------------- | - | className | string | Optional name for additional styling | - | testId | string | Test identifier for the button | - | Icon | `React.ComponentType` | An optional icon component that's displayed within the button | - | title | string | The text content of the button | - | size | string | The size of the button. Has two options: `small` and `medium` | - | accent | string | The accent color of the button. Options include: `secondary` and `tertiary` | - | active | boolean | Determines if the button is in an active state | - | disabled | boolean | Determines whether the button is disabled | - | focus | boolean | Indicates if the button has focus | - | onClick | function | A callback function that triggers when the user clicks on the button | + + | "Props" | Tipo | Descripción | + | ------------- | --------------------- | ----------------------------------------------------------------------------- | + | "className" | cadena | "Nombre opcional para estilización adicional" | + | testId | "cadena" | Identificador de prueba para el botón | + | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón | + | título | "cadena" | El contenido de texto del botón | + | tamaño | "cadena" | El tamaño del botón. Tiene dos opciones: `pequeño` y `mediano` | + | acento | "cadena" | El color de acento del botón. Opciones incluyen: `secundario` y `terciario` | + | activo | booleano | Determina si el botón está en estado activo | + | "desactivado" | booleano | Determina si el botón está deshabilitado | + | enfoque | booleano | Indica si el botón tiene foco | + | alHacerClic | función | Una función de callback que se activa cuando el usuario hace clic en el botón | -## Main Button +## Botón Principal - + ```jsx import { MainButton } from "@/ui/input/button/components/MainButton"; import { IconCheckbox } from "@tabler/icons-react"; @@ -400,22 +400,22 @@ A list of buttons and button groups used throughout the app. ``` - - | Props | Type | Description | - | -------------------- | -------------------------------- | --------------------------------------------------------------------------------- | - | title | string | The text content of the button | - | fullWidth | boolean | Defines whether the button should span the whole width of its container | - | variant | string | The visual style variant of the button. Options include `primary` and `secondary` | - | soon | boolean | Indicates if the button is marked as "soon" (such as for upcoming features) | - | Icon | `React.ComponentType` | An optional icon component that's displayed within the button | - | React `button` props | `React.ComponentProps<'button'>` | All standard HTML button props are supported | + + | Propiedades | Tipo | Descripción | + | -------------------------- | -------------------------------- | ------------------------------------------------------------------------------------- | + | título | "cadena" | El contenido de texto del botón | + | anchoCompleto | booleano | Define si el botón debe abarcar todo el ancho de su contenedor | + | variante | "cadena" | La variante de estilo visual del botón. Las opciones incluyen `primary` y `secondary` | + | próximamente | booleano | Indica si el botón está marcado como "próximamente" (como para funciones futuras) | + | Ícono | `React.ComponentType` | Un componente de ícono opcional que se muestra dentro del botón | + | Propiedades React `button` | `React.ComponentProps<'button'>` | Se admiten todas las propiedades estándar del botón HTML | -## Rounded Icon Button +## Botón de Icono Redondeado - + ```jsx import { RoundedIconButton } from "@/ui/input/button/components/RoundedIconButton"; import { IconSearch } from "@tabler/icons-react"; @@ -430,10 +430,10 @@ A list of buttons and button groups used throughout the app. ``` - - | Props | Type | Description | - | -------------------- | ----------------------------------------------- | ----------- | - | Icon | `React.ComponentType` | | - | React `button` props | `React.ButtonHTMLAttributes` | | + + | "Props" | Tipo | Descripción | + | -------------------------- | ----------------------------------------------- | ----------- | + | Ícono | `React.ComponentType` | | + | Propiedades React `button` | `React.ButtonHTMLAttributes` | | diff --git a/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx index b25eeba052..5a0ffd8064 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx @@ -1,16 +1,16 @@ --- -title: Checkbox +title: Caja de selección image: /images/user-guide/tasks/tasks_header.png --- - Header + Encabezado -Used when a user needs to select multiple values from several options. +Usado cuando un usuario necesita seleccionar múltiples valores entre varias opciones. - + ```jsx import { Checkbox } from "twenty-ui/display"; @@ -31,14 +31,14 @@ Used when a user needs to select multiple values from several options. - | Props | Type | Description | - | --------------- | -------- | -------------------------------------------------------------------------------------------- | - | checked | boolean | Indicates whether the checkbox is checked | - | indeterminate | boolean | Indicates whether the checkbox is in an indeterminate state (neither checked nor unchecked) | - | onChange | function | The callback function you want to trigger when the checkbox state changes | - | onCheckedChange | function | The callback function you want to trigger when the `checked` state changes | - | variant | string | The visual style variant of the box. Options include: `primary`, `secondary`, and `tertiary` | - | size | string | The size of the checkbox. Has two options: `small` and `large` | - | shape | string | The shape of the checkbox. Has two options: `squared` and `rounded` | + | Props | Tipo | Descripción | + | --------------- | -------- | ------------------------------------------------------------------------------------------------------ | + | marcado | booleano | Indica si la caja de selección está marcada | + | indeterminado | booleano | Indica si la caja de selección está en un estado indeterminado (ni marcada ni desmarcada) | + | onChange | función | La función de devolución de llamada que desea activar cuando cambia el estado de la caja de selección | + | onCheckedChange | función | La función de devolución de llamada que desea activar cuando cambia el estado `marcado` | + | variante | cadena | La variante de estilo visual de la caja. Las opciones incluyen: `primario`, `secundario` y `terciario` | + | tamaño | cadena | El tamaño de la caja de selección. Tiene dos opciones: `pequeño` y `grande` | + | forma | cadena | La forma de la caja de selección. Tiene dos opciones: `cuadrado` y `redondeado` | diff --git a/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx b/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx index 1b1505d481..2fc8f859ce 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/color-scheme.mdx @@ -1,18 +1,18 @@ --- -title: Color Scheme +title: Esquema de colores image: /images/user-guide/fields/field.png --- - Header + Encabezado -## Color Scheme Card +## Tarjeta de Esquema de Color -Represents different color schemes and is specially tailored for light and dark themes. +Representa diferentes esquemas de color y está diseñado especialmente para temas claros y oscuros. - + ```jsx import { ColorSchemeCard } from "twenty-ui/display"; @@ -27,21 +27,21 @@ Represents different color schemes and is specially tailored for light and dark ``` - - | Props | Type | Description | Default | - | ---------------- | --------------------------------------- | ----------------------------------------------------------------------- | ------- | - | variant | string | The color scheme variant. Options include `Dark`, `Light`, and `System` | light | - | selected | boolean | If `true`, displays a checkmark to indicate the selected color scheme | | - | additional props | `React.ComponentPropsWithoutRef<'div'>` | Standard HTML `div` element props | | + + | "Props" | Tipo | Descripción | Predeterminado | + | ----------------- | --------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------- | + | variante | string | La variante del esquema de color. Las opciones incluyen `Oscuro`, `Claro` y `Sistema` | claro | + | seleccionado | booleano | Si es `verdadero`, muestra una marca de verificación para indicar el esquema de color seleccionado | | + | props adicionales | `React.ComponentPropsWithoutRef<'div'>` | Props del elemento HTML estándar `div` | | -## Color Scheme Picker +## Selector de Esquema de Color -Allows users to choose between different color schemes. +Permite a los usuarios elegir entre diferentes esquemas de color. - + ```jsx import { ColorSchemePicker } from "twenty-ui/display"; @@ -54,10 +54,10 @@ Allows users to choose between different color schemes. ``` - - | Props | Type | Description | - | -------- | -------------- | ---------------------------------------------------------------------------- | - | value | `Color Scheme` | The currently selected color scheme | - | onChange | function | The callback function you want to trigger when a user selects a color scheme | + + | "Props" | Tipo | Descripción | + | ---------- | -------------------- | ------------------------------------------------------------------------------------------------------ | + | valor | `Esquema de colores` | El esquema de color actualmente seleccionado | + | "onChange" | función | La función de devolución de llamada que desea activar cuando un usuario selecciona un esquema de color | diff --git a/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx index 59d269242e..ec67238451 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/icon-picker.mdx @@ -1,16 +1,16 @@ --- -title: Icon Picker +title: Selector de Íconos image: /images/user-guide/github/github-header.png --- - Header + Encabezado -A dropdown-based icon picker that allows users to select an icon from a list. +Un selector de íconos basado en un menú desplegable que permite a los usuarios seleccionar un ícono de una lista. - + ```jsx import { RecoilRoot } from "recoil"; import React, { useState } from "react"; @@ -39,14 +39,14 @@ A dropdown-based icon picker that allows users to select an icon from a list. - | Props | Type | Description | - | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- | - | disabled | boolean | Disables the icon picker if set to `true` | - | onChange | function | The callback function triggered when the user selects an icon. It receives an object with `iconKey` and `Icon` properties | - | selectedIconKey | string | The key of the initially selected icon | - | onClickOutside | function | Callback function triggered when the user clicks outside the dropdown | - | onClose | function | Callback function triggered when the dropdown is closed | - | onOpen | function | Callback function triggered when the dropdown is opened | - | variant | string | The visual style variant of the clickable icon. Options include: `primary`, `secondary`, and `tertiary` | + | Props | Tipo | Descripción | + | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------ | + | deshabilitado | booleano | Desactiva el selector de íconos si está configurado en `true` | + | "onChange" | función | La función de devolución de llamada que se activa cuando el usuario selecciona un icono. Recibe un objeto con las propiedades `iconKey` y `Icon` | + | selectedIconKey | cadena | La clave del ícono seleccionado inicialmente | + | onClickOutside | función | Función de devolución de llamada que se activa cuando el usuario hace clic fuera del menú desplegable | + | onClose | función | Función de devolución de llamada que se activa cuando se cierra el menú desplegable | + | onOpen | función | Función de devolución de llamada que se activa cuando se abre el menú desplegable | + | variante | cadena | La variante de estilo visual del ícono clicable. Las opciones incluyen: `primario`, `secundario` y `terciario` | diff --git a/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx index 0d563d7c37..c06de9c4a0 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/image-input.mdx @@ -1,16 +1,16 @@ --- -title: Image Input +title: Entrada de imagen image: /images/user-guide/objects/objects.png --- - Header + Encabezado -Allows users to upload and remove an image. +Permite a los usuarios subir y eliminar una imagen. - + ```jsx import { ImageInput } from "@/ui/input/components/ImageInput"; @@ -21,14 +21,14 @@ Allows users to upload and remove an image. - | Props | Type | Description | - | ------------ | -------- | ------------------------------------------------------------------------------------------------- | - | picture | string | The image source URL | - | onUpload | function | The function called when a user uploads a new image. It receives the `File` object as a parameter | - | onRemove | function | The function called when the user clicks on the remove button | - | onAbort | function | The function called when a user clicks on the abort button during image upload | - | isUploading | boolean | Indicates whether an image is currently being uploaded | - | errorMessage | string | An optional error message to display below the image input | - | disabled | boolean | If `true`, the entire input is disabled, and the buttons are not clickable | + | Props | Tipo | Descripción | + | ------------- | -------- | ---------------------------------------------------------------------------------------------------------- | + | foto | cadena | La URL de origen de la imagen | + | onUpload | función | La función que se llama cuando un usuario sube una nueva imagen. Recibe el objeto `File` como un parámetro | + | onRemove | función | La función que se llama cuando el usuario hace clic en el botón eliminar | + | onAbort | función | La función que se llama cuando un usuario hace clic en el botón de abortar durante la subida de imagen | + | isUploading | booleano | Indica si una imagen se está cargando actualmente | + | errorMessage | cadena | Un mensaje de error opcional para mostrar debajo de la entrada de imagen | + | "desactivado" | booleano | Si es `true`, toda la entrada está deshabilitada y los botones no son clicables | diff --git a/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx index e6246e631f..b9b6a0d601 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/radio.mdx @@ -4,13 +4,13 @@ image: /images/user-guide/create-workspace/workspace-cover.png --- - Header + Encabezado -Used when users may only choose one option from a series of options. +Usado cuando los usuarios solo pueden elegir una opción de una serie de opciones. - + ```jsx import { Radio } from "twenty-ui/display"; @@ -42,26 +42,26 @@ Used when users may only choose one option from a series of options. - | Props | Type | Description | - | --------------- | ---------------------- | ------------------------------------------------------------------------------------------------ | - | style | `React.CSS` properties | Additional inline styles for the component | - | className | string | Optional CSS class for additional styling | - | checked | boolean | Indicates whether the radio button is checked | - | value | string | The label or text associated with the radio button | - | onChange | function | The function called when the selected radio button is changed | - | onCheckedChange | function | The function called when the `checked` state of the radio button changes | - | size | string | The size of the radio button. Options include: `large` and `small` | - | disabled | boolean | If `true`, the radio button is disabled and not clickable | - | labelPosition | string | The position of the label text relative to the radio button. Has two options: `left` and `right` | + | Props | Tipo | Descripción | + | --------------- | -------------------------- | --------------------------------------------------------------------------------------------------------------------- | + | estilo | propiedades de `React.CSS` | Estilos en línea adicionales para el componente. | + | "className" | cadena | Clase CSS opcional para estilo adicional. | + | marcado | booleano | Indica si el botón de opción está marcado. | + | valor | cadena | La etiqueta o texto asociado con el botón de opción. | + | "onChange" | función | La función que se llama cuando se cambia el botón de opción seleccionado. | + | onCheckedChange | función | La función que se llama cuando el estado de `seleccionado` del botón de opción cambia. | + | tamaño | cadena | El tamaño del botón de opción. Las opciones incluyen: `grande` y `pequeño`. | + | "desactivado" | booleano | Si es `verdadero`, el botón de opción está deshabilitado y no se puede hacer clic. | + | labelPosition | cadena | La posición del texto de la etiqueta en relación con el botón de opción. Tiene dos opciones: `izquierda` y `derecha`. | -## Radio Group +## Grupo de Radio -Groups together related radio buttons. +Agrupa botones de opción relacionados. - + ```jsx import React, { useState } from "react"; import { Radio, RadioGroup } from "twenty-ui/display"; @@ -87,11 +87,11 @@ Groups together related radio buttons. - | Props | Type | Description | - | ------------- | ----------------- | ---------------------------------------------------------------------------------- | - | value | string | The value of the currently selected radio button | - | onChange | function | The callback function triggered when the radio button is changed | - | onValueChange | function | The callback function triggered when the selected value in the group changes. | - | children | `React.ReactNode` | Allows you to pass React components (such as Radio) as children to the Radio Group | + | Props | Tipo | Descripción | + | --------------- | ----------------- | ----------------------------------------------------------------------------------------------------- | + | valor | cadena | El valor del botón de opción seleccionado actualmente. | + | "onChange" | función | La función de devolución de llamada que se activa cuando se cambia el botón de opción. | + | alCambioDeValor | función | La función de devolución de llamada que se activa cuando se cambia el valor seleccionado en el grupo. | + | hijos | `React.ReactNode` | Permite pasar componentes de React (como Radio) como hijos al Radio Group. | diff --git a/packages/twenty-docs/l/es/twenty-ui/input/select.mdx b/packages/twenty-docs/l/es/twenty-ui/input/select.mdx index d685bf4012..a7d12b2c72 100644 --- a/packages/twenty-docs/l/es/twenty-ui/input/select.mdx +++ b/packages/twenty-docs/l/es/twenty-ui/input/select.mdx @@ -1,16 +1,16 @@ --- -title: Select +title: Seleccionar image: /images/user-guide/what-is-twenty/20.png --- - Header + Encabezado -Allows users to pick a value from a list of predefined options. +Permite a los usuarios seleccionar un valor de una lista de opciones predefinidas. - + ```jsx import { RecoilRoot } from 'recoil'; import { IconTwentyStar } from 'twenty-ui/display'; @@ -24,10 +24,10 @@ Allows users to pick a value from a list of predefined options.