From c0bae491e1d1c46b31e4d1ebbe735182d517818c Mon Sep 17 00:00:00 2001 From: Abdul Rahman <81605929+abdulrahmancodes@users.noreply.github.com> Date: Sat, 15 Nov 2025 02:33:54 +0530 Subject: [PATCH] docs: localize navigation tabs and groups for supported locales (#15811) --- .github/workflows/docs-i18n-pull.yaml | 47 +- .github/workflows/docs-i18n-push.yaml | 13 + .github/workflows/i18n-pull.yaml | 2 + crowdin.yml | 7 + package.json | 2 + packages/twenty-docs/README.md | 12 +- packages/twenty-docs/docs.json | 2881 ++++++++++++++++- packages/twenty-docs/l/aa/navigation.json | 91 + packages/twenty-docs/l/ar/navigation.json | 91 + .../workflows/workflow-troubleshooting.mdx | 2 +- packages/twenty-docs/l/cs/navigation.json | 91 + packages/twenty-docs/l/da/navigation.json | 91 + packages/twenty-docs/l/de/navigation.json | 91 + packages/twenty-docs/l/el/navigation.json | 91 + packages/twenty-docs/l/es/navigation.json | 91 + .../l/es/user-guide/settings/settings-faq.mdx | 12 +- .../workflows/workflow-troubleshooting.mdx | 2 +- packages/twenty-docs/l/fi/navigation.json | 91 + packages/twenty-docs/l/fr/navigation.json | 91 + packages/twenty-docs/l/it/navigation.json | 91 + .../backend-development/feature-flags.mdx | 2 +- .../backend-development/server-commands.mdx | 3 +- .../best-practices-front.mdx | 4 +- .../frontend-development/hotkeys.mdx | 4 +- .../frontend-development/work-with-figma.mdx | 10 +- .../self-hosting/cloud-providers.mdx | 4 +- packages/twenty-docs/l/ja/navigation.json | 91 + .../l/ja/twenty-ui/display/app-tooltip.mdx | 2 +- .../l/ja/twenty-ui/display/chip.mdx | 36 +- .../l/ja/twenty-ui/display/tag.mdx | 12 +- .../l/ja/twenty-ui/input/icon-picker.mdx | 18 +- .../l/ja/twenty-ui/navigation/breadcrumb.mdx | 8 +- .../l/ja/twenty-ui/navigation/links.mdx | 12 +- .../twenty-ui/navigation/navigation-bar.mdx | 8 +- .../l/ja/twenty-ui/navigation/step-bar.mdx | 8 +- .../collaboration/emails-and-calendars.mdx | 2 +- .../contact-and-account-management.mdx | 20 +- .../crm-essentials/sales-use-cases.mdx | 2 +- .../data-model/customize-your-data-model.mdx | 18 +- .../l/ja/user-guide/resources/glossary.mdx | 6 +- .../workflows/external-tool-integration.mdx | 2 +- packages/twenty-docs/l/nl/navigation.json | 91 + packages/twenty-docs/l/no/navigation.json | 91 + packages/twenty-docs/l/pl/navigation.json | 91 + .../developers/api-and-webhooks/webhooks.mdx | 40 +- .../l/pt/developers/bug-and-requests.mdx | 10 +- .../folder-architecture-front.mdx | 52 +- .../frontend-commands.mdx | 28 +- .../frontend-development/hotkeys.mdx | 52 +- .../frontend-development/storybook.mdx | 6 +- .../frontend-development/style-guide.mdx | 64 +- packages/twenty-docs/l/pt/navigation.json | 91 + .../l/pt/twenty-ui/display/app-tooltip.mdx | 34 +- .../user-guide/data-model/relation-fields.mdx | 32 +- .../workflows/getting-started-workflows.mdx | 64 +- .../user-guide/workflows/workflow-credits.mdx | 70 +- packages/twenty-docs/l/ro/navigation.json | 91 + packages/twenty-docs/l/ru/navigation.json | 91 + packages/twenty-docs/l/sv/navigation.json | 91 + packages/twenty-docs/l/uk/navigation.json | 91 + .../best-practices-server.mdx | 4 +- .../backend-development/custom-objects.mdx | 2 +- .../folder-architecture-server.mdx | 80 +- .../developers/backend-development/queue.mdx | 20 +- .../best-practices-front.mdx | 2 +- .../folder-architecture-front.mdx | 68 +- .../frontend-commands.mdx | 42 +- .../frontend-development/hotkeys.mdx | 2 +- .../frontend-development/storybook.mdx | 6 +- .../self-hosting/cloud-providers.mdx | 2 +- packages/twenty-docs/l/zh/navigation.json | 91 + .../l/zh/twenty-ui/display/app-tooltip.mdx | 22 +- .../l/zh/twenty-ui/display/soon-pill.mdx | 4 +- .../l/zh/twenty-ui/display/tag.mdx | 12 +- .../l/zh/twenty-ui/input/icon-picker.mdx | 22 +- .../l/zh/twenty-ui/input/radio.mdx | 42 +- .../l/zh/twenty-ui/input/select.mdx | 20 +- .../twenty-docs/l/zh/twenty-ui/input/text.mdx | 18 +- .../l/zh/twenty-ui/navigation/breadcrumb.mdx | 12 +- .../l/zh/twenty-ui/navigation/links.mdx | 64 +- .../crm-essentials/sales-use-cases.mdx | 12 +- .../integrations-api/apis-overview.mdx | 4 +- .../l/zh/user-guide/settings/permissions.mdx | 128 +- .../user-guide/settings/profile-settings.mdx | 52 +- .../workflows/external-tool-integration.mdx | 266 +- .../workflows/professional-services.mdx | 2 +- .../user-guide/workflows/workflow-credits.mdx | 2 +- .../navigation/navigation-schema.json | 254 ++ .../navigation/navigation.template.json | 91 + .../navigation/supported-languages.ts | 21 + .../twenty-docs/scripts/generate-docs-json.ts | 168 + .../scripts/generate-navigation-template.ts | 81 + 92 files changed, 6158 insertions(+), 800 deletions(-) create mode 100644 packages/twenty-docs/l/aa/navigation.json create mode 100644 packages/twenty-docs/l/ar/navigation.json create mode 100644 packages/twenty-docs/l/cs/navigation.json create mode 100644 packages/twenty-docs/l/da/navigation.json create mode 100644 packages/twenty-docs/l/de/navigation.json create mode 100644 packages/twenty-docs/l/el/navigation.json create mode 100644 packages/twenty-docs/l/es/navigation.json create mode 100644 packages/twenty-docs/l/fi/navigation.json create mode 100644 packages/twenty-docs/l/fr/navigation.json create mode 100644 packages/twenty-docs/l/it/navigation.json create mode 100644 packages/twenty-docs/l/ja/navigation.json create mode 100644 packages/twenty-docs/l/nl/navigation.json create mode 100644 packages/twenty-docs/l/no/navigation.json create mode 100644 packages/twenty-docs/l/pl/navigation.json create mode 100644 packages/twenty-docs/l/pt/navigation.json create mode 100644 packages/twenty-docs/l/ro/navigation.json create mode 100644 packages/twenty-docs/l/ru/navigation.json create mode 100644 packages/twenty-docs/l/sv/navigation.json create mode 100644 packages/twenty-docs/l/uk/navigation.json create mode 100644 packages/twenty-docs/l/zh/navigation.json create mode 100644 packages/twenty-docs/navigation/navigation-schema.json create mode 100644 packages/twenty-docs/navigation/navigation.template.json create mode 100644 packages/twenty-docs/navigation/supported-languages.ts create mode 100644 packages/twenty-docs/scripts/generate-docs-json.ts create mode 100644 packages/twenty-docs/scripts/generate-navigation-template.ts diff --git a/.github/workflows/docs-i18n-pull.yaml b/.github/workflows/docs-i18n-pull.yaml index 99ec643d292..d8c7a63ed7f 100644 --- a/.github/workflows/docs-i18n-pull.yaml +++ b/.github/workflows/docs-i18n-pull.yaml @@ -37,6 +37,16 @@ jobs: token: ${{ github.token }} ref: ${{ github.ref }} + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + cache-dependency-path: 'yarn.lock' + + - name: Install dependencies + run: yarn install --frozen-lockfile + - name: Setup i18n branch run: | git fetch origin i18n || true @@ -59,7 +69,6 @@ jobs: upload_sources: false upload_translations: false download_translations: true - download_language: fr source: 'packages/twenty-docs/**/*.mdx' translation: 'packages/twenty-docs/l/%two_letters_code%/**/%original_file_name%' export_only_approved: false @@ -81,6 +90,42 @@ jobs: - name: Fix translated documentation links run: bash packages/twenty-docs/scripts/fix-translated-links.sh + - name: Detect navigation template change + id: nav_change + run: | + git fetch origin main || true + + if git diff --quiet origin/main -- packages/twenty-docs/navigation/navigation.template.json; then + echo "changed=false" >> $GITHUB_OUTPUT + else + echo "changed=true" >> $GITHUB_OUTPUT + fi + + - name: Pull navigation translations from Crowdin + if: steps.nav_change.outputs.changed == 'true' + uses: crowdin/github-action@v2 + with: + upload_sources: false + upload_translations: false + download_translations: true + source: 'packages/twenty-docs/navigation/navigation.template.json' + translation: 'packages/twenty-docs/l/%two_letters_code%/navigation.json' + export_only_approved: false + localization_branch_name: i18n + base_url: 'https://twenty.api.crowdin.com' + skip_untranslated_files: true + push_translations: false + create_pull_request: false + skip_ref_checkout: true + dryrun_action: false + env: + GITHUB_TOKEN: ${{ github.token }} + CROWDIN_PROJECT_ID: '1' + CROWDIN_PERSONAL_TOKEN: ${{ secrets.CROWDIN_PERSONAL_TOKEN }} + + - name: Regenerate docs.json + run: yarn docs:generate + - name: Check for changes and commit id: check_changes run: | diff --git a/.github/workflows/docs-i18n-push.yaml b/.github/workflows/docs-i18n-push.yaml index 359fc996bac..3c157b0a380 100644 --- a/.github/workflows/docs-i18n-push.yaml +++ b/.github/workflows/docs-i18n-push.yaml @@ -28,6 +28,19 @@ jobs: token: ${{ github.token }} ref: main + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version-file: '.nvmrc' + cache: 'yarn' + cache-dependency-path: 'yarn.lock' + + - name: Install dependencies + run: yarn install --frozen-lockfile + + - name: Generate navigation template for Crowdin + run: yarn docs:generate-navigation-template + - name: Upload docs to Crowdin uses: crowdin/github-action@v2 with: diff --git a/.github/workflows/i18n-pull.yaml b/.github/workflows/i18n-pull.yaml index 6e4f36c5afb..e673c0b5af0 100644 --- a/.github/workflows/i18n-pull.yaml +++ b/.github/workflows/i18n-pull.yaml @@ -74,6 +74,8 @@ jobs: upload_sources: false upload_translations: false download_translations: true + source: '**/en.po' + translation: '%original_path%/%locale%.po' export_only_approved: false localization_branch_name: i18n base_url: 'https://twenty.api.crowdin.com' diff --git a/crowdin.yml b/crowdin.yml index bc7f7c04278..f78c7b009c3 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -52,5 +52,12 @@ files: [ # "source": "packages/twenty-docs/twenty-ui/**/*.mdx", "translation": "packages/twenty-docs/l/%two_letters_code%/twenty-ui/**/%original_file_name%", + }, + { + # + # Navigation labels template - translated into per-locale navigation.json + # + "source": "packages/twenty-docs/navigation/navigation.template.json", + "translation": "packages/twenty-docs/l/%two_letters_code%/navigation.json", } ] diff --git a/package.json b/package.json index 59424214950..08c477b2144 100644 --- a/package.json +++ b/package.json @@ -217,6 +217,8 @@ "version": "0.2.1", "nx": {}, "scripts": { + "docs:generate": "tsx packages/twenty-docs/scripts/generate-docs-json.ts", + "docs:generate-navigation-template": "tsx packages/twenty-docs/scripts/generate-navigation-template.ts", "start": "npx concurrently --kill-others 'npx nx run-many -t start -p twenty-server twenty-front' 'npx wait-on tcp:3000 && npx nx run twenty-server:worker'" }, "workspaces": { diff --git a/packages/twenty-docs/README.md b/packages/twenty-docs/README.md index 0621cb52e0e..dbb9aceacb3 100644 --- a/packages/twenty-docs/README.md +++ b/packages/twenty-docs/README.md @@ -33,7 +33,10 @@ The documentation will be available at `http://localhost:3000` - `developers/` - Developer documentation - `twenty-ui/` - Component documentation -2. Update `docs.json` to add pages to navigation +2. Update `navigation/navigation-schema.json` if you need to change the tab/group hierarchy or add/remove pages. This file stays in the repo and is **not** uploaded to Crowdin. +3. Keep the translation template (`navigation/navigation.template.json`) in sync by running `yarn docs:generate-navigation-template` after editing the base structure. This template is the only file that should be pushed to Crowdin. +4. For each translated locale pulled from Crowdin, ensure a `packages/twenty-docs/l//navigation.json` file exists. These files contain **labels only**; page slugs always come from the base structure. +5. Run `yarn docs:generate` to rebuild `docs.json` from the base structure + translated labels. ### MDX Format @@ -62,8 +65,11 @@ Your content here... ## 🔧 Configuration -- `docs.json` - Main Mintlify configuration (navigation, theme, etc.) -- `package.json` - Package dependencies and scripts +- `navigation/navigation-schema.json` - Source of truth for tabs, groups, icons, and page slugs (English only, not sent to Crowdin). +- `navigation/navigation.template.json` - Generated translation template (labels only) that is uploaded to Crowdin. +- `l//navigation.json` - Locale-specific label files pulled from Crowdin. +- `docs.json` - Generated Mintlify configuration (always run `yarn docs:generate` after modifying navigation files). +- `package.json` - Package dependencies and scripts (`docs:generate`, `docs:generate-navigation-template`, …). - `project.json` - Nx workspace configuration ## 📦 Building diff --git a/packages/twenty-docs/docs.json b/packages/twenty-docs/docs.json index 5594c61bbf6..6495b60a4d8 100644 --- a/packages/twenty-docs/docs.json +++ b/packages/twenty-docs/docs.json @@ -111,7 +111,9 @@ { "group": "Reporting", "icon": "chart-bar", - "pages": ["user-guide/reporting/reporting-overview"] + "pages": [ + "user-guide/reporting/reporting-overview" + ] }, { "group": "Settings", @@ -131,7 +133,9 @@ { "group": "Pricing", "icon": "credit-card", - "pages": ["user-guide/pricing/billing-and-pricing-faq"] + "pages": [ + "user-guide/pricing/billing-and-pricing-faq" + ] }, { "group": "Resources", @@ -147,7 +151,8 @@ "tab": "Developers", "groups": [ { - "group": "Developers" + "group": "Developers", + "pages": [] }, { "group": "Getting Started", @@ -200,7 +205,9 @@ }, { "group": "Feedback", - "pages": ["twenty-ui/progress-bar"] + "pages": [ + "twenty-ui/progress-bar" + ] }, { "group": "Input", @@ -260,10 +267,10 @@ "language": "fr", "tabs": [ { - "tab": "Guide utilisateur", + "tab": "Guide de l'utilisateur", "groups": [ { - "group": "Prise en main", + "group": "Commencer", "icon": "rocket", "pages": [ "l/fr/user-guide/introduction", @@ -329,7 +336,7 @@ ] }, { - "group": "Intégrations et API", + "group": "Intégrations & API", "icon": "plug", "pages": [ "l/fr/user-guide/integrations-api/apis-overview", @@ -340,7 +347,9 @@ { "group": "Rapports", "icon": "chart-bar", - "pages": ["l/fr/user-guide/reporting/reporting-overview"] + "pages": [ + "l/fr/user-guide/reporting/reporting-overview" + ] }, { "group": "Paramètres", @@ -358,9 +367,11 @@ ] }, { - "group": "Tarification", + "group": "Tarifs", "icon": "credit-card", - "pages": ["l/fr/user-guide/pricing/billing-and-pricing-faq"] + "pages": [ + "l/fr/user-guide/pricing/billing-and-pricing-faq" + ] }, { "group": "Ressources", @@ -380,7 +391,7 @@ "pages": [] }, { - "group": "Prise en main", + "group": "Commencer", "icon": "rocket", "pages": [ "l/fr/developers/introduction", @@ -405,12 +416,12 @@ ] }, { - "group": "Contribution", + "group": "Contribuer", "icon": "code-branch", "pages": [ "l/fr/developers/bug-and-requests", { - "group": "Développement frontend", + "group": "Développement du frontend", "pages": [ "l/fr/developers/frontend-development/storybook", { @@ -418,7 +429,7 @@ "pages": [ "l/fr/twenty-ui/introduction", { - "group": "Affichage", + "group": "Afficher", "pages": [ "l/fr/twenty-ui/display/checkmark", "l/fr/twenty-ui/display/chip", @@ -429,11 +440,13 @@ ] }, { - "group": "Retours", - "pages": ["l/fr/twenty-ui/progress-bar"] + "group": "Vos commentaires", + "pages": [ + "l/fr/twenty-ui/progress-bar" + ] }, { - "group": "Saisie", + "group": "Input", "pages": [ "l/fr/twenty-ui/input/buttons", "l/fr/twenty-ui/input/color-scheme", @@ -469,7 +482,7 @@ ] }, { - "group": "Développement backend", + "group": "Développement du backend", "pages": [ "l/fr/developers/backend-development/server-commands", "l/fr/developers/backend-development/feature-flags", @@ -485,6 +498,2838 @@ ] } ] + }, + { + "language": "ar", + "tabs": [ + { + "tab": "دليل المستخدم", + "groups": [ + { + "group": "البدء", + "icon": "rocket", + "pages": [ + "l/ar/user-guide/introduction", + "l/ar/user-guide/getting-started/what-is-twenty", + "l/ar/user-guide/getting-started/create-workspace", + "l/ar/user-guide/getting-started/getting-around-twenty", + "l/ar/user-guide/getting-started/configure-your-workspace", + "l/ar/user-guide/getting-started/implementation-services", + "l/ar/user-guide/getting-started/migrating-from-other-crms", + "l/ar/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "نموذج البيانات", + "icon": "database", + "pages": [ + "l/ar/user-guide/data-model/customize-your-data-model", + "l/ar/user-guide/data-model/objects", + "l/ar/user-guide/data-model/fields", + "l/ar/user-guide/data-model/creating-records", + "l/ar/user-guide/data-model/relation-fields", + "l/ar/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "أساسيات CRM", + "icon": "users", + "pages": [ + "l/ar/user-guide/crm-essentials/contact-and-account-management", + "l/ar/user-guide/crm-essentials/pipeline", + "l/ar/user-guide/crm-essentials/view-management", + "l/ar/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "العروض", + "icon": "table", + "pages": [ + "l/ar/user-guide/views/kanban-views", + "l/ar/user-guide/views/views-sort-filter" + ] + }, + { + "group": "سير العمل", + "icon": "bolt", + "pages": [ + "l/ar/user-guide/workflows/getting-started-workflows", + "l/ar/user-guide/workflows/workflow-features", + "l/ar/user-guide/workflows/internal-automations", + "l/ar/user-guide/workflows/external-tool-integration", + "l/ar/user-guide/workflows/workflow-troubleshooting", + "l/ar/user-guide/workflows/workflow-credits", + "l/ar/user-guide/workflows/professional-services" + ] + }, + { + "group": "التعاون", + "icon": "envelope", + "pages": [ + "l/ar/user-guide/collaboration/emails-and-calendars", + "l/ar/user-guide/collaboration/notes", + "l/ar/user-guide/collaboration/tasks" + ] + }, + { + "group": "التكاملات & API", + "icon": "plug", + "pages": [ + "l/ar/user-guide/integrations-api/apis-overview", + "l/ar/user-guide/integrations-api/api-webhooks", + "l/ar/user-guide/integrations-api/integrations" + ] + }, + { + "group": "التقارير", + "icon": "chart-bar", + "pages": [ + "l/ar/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "الإعدادات", + "icon": "gear", + "pages": [ + "l/ar/user-guide/settings/profile-settings", + "l/ar/user-guide/settings/experience-settings", + "l/ar/user-guide/settings/email-calendar-setup", + "l/ar/user-guide/settings/workspace-settings", + "l/ar/user-guide/settings/member-management", + "l/ar/user-guide/settings/permissions", + "l/ar/user-guide/settings/domains-settings", + "l/ar/user-guide/settings/releases-settings", + "l/ar/user-guide/settings/settings-faq" + ] + }, + { + "group": "التسعير", + "icon": "credit-card", + "pages": [ + "l/ar/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "الموارد", + "icon": "book-open", + "pages": [ + "l/ar/user-guide/resources/glossary", + "l/ar/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "المطورون", + "groups": [ + { + "group": "المطورين", + "pages": [] + }, + { + "group": "بدء العمل", + "icon": "rocket", + "pages": [ + "l/ar/developers/introduction", + "l/ar/developers/local-setup", + { + "group": "الاستضافة الذاتية", + "pages": [ + "l/ar/developers/self-hosting/docker-compose", + "l/ar/developers/self-hosting/setup", + "l/ar/developers/self-hosting/upgrade-guide", + "l/ar/developers/self-hosting/cloud-providers", + "l/ar/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API و Webhooks", + "pages": [ + "l/ar/developers/api-and-webhooks/api", + "l/ar/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "المساهمة", + "icon": "code-branch", + "pages": [ + "l/ar/developers/bug-and-requests", + { + "group": "تطوير الواجهة", + "pages": [ + "l/ar/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/ar/twenty-ui/introduction", + { + "group": "عرض", + "pages": [ + "l/ar/twenty-ui/display/checkmark", + "l/ar/twenty-ui/display/chip", + "l/ar/twenty-ui/display/icons", + "l/ar/twenty-ui/display/soon-pill", + "l/ar/twenty-ui/display/tag", + "l/ar/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "الملاحظات", + "pages": [ + "l/ar/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/ar/twenty-ui/input/buttons", + "l/ar/twenty-ui/input/color-scheme", + "l/ar/twenty-ui/input/text", + "l/ar/twenty-ui/input/checkbox", + "l/ar/twenty-ui/input/icon-picker", + "l/ar/twenty-ui/input/image-input", + "l/ar/twenty-ui/input/radio", + "l/ar/twenty-ui/input/select", + "l/ar/twenty-ui/input/toggle", + "l/ar/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/ar/twenty-ui/navigation", + "l/ar/twenty-ui/navigation/breadcrumb", + "l/ar/twenty-ui/navigation/links", + "l/ar/twenty-ui/navigation/menu-item", + "l/ar/twenty-ui/navigation/navigation-bar", + "l/ar/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/ar/developers/frontend-development/frontend-commands", + "l/ar/developers/frontend-development/work-with-figma", + "l/ar/developers/frontend-development/best-practices-front", + "l/ar/developers/frontend-development/style-guide", + "l/ar/developers/frontend-development/folder-architecture-front", + "l/ar/developers/frontend-development/hotkeys" + ] + }, + { + "group": "تطوير الخلفية", + "pages": [ + "l/ar/developers/backend-development/server-commands", + "l/ar/developers/backend-development/feature-flags", + "l/ar/developers/backend-development/folder-architecture-server", + "l/ar/developers/backend-development/zapier", + "l/ar/developers/backend-development/best-practices-server", + "l/ar/developers/backend-development/custom-objects", + "l/ar/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "cs", + "tabs": [ + { + "tab": "Uživatelská příručka", + "groups": [ + { + "group": "Začněme", + "icon": "rocket", + "pages": [ + "l/cs/user-guide/introduction", + "l/cs/user-guide/getting-started/what-is-twenty", + "l/cs/user-guide/getting-started/create-workspace", + "l/cs/user-guide/getting-started/getting-around-twenty", + "l/cs/user-guide/getting-started/configure-your-workspace", + "l/cs/user-guide/getting-started/implementation-services", + "l/cs/user-guide/getting-started/migrating-from-other-crms", + "l/cs/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Datový model", + "icon": "database", + "pages": [ + "l/cs/user-guide/data-model/customize-your-data-model", + "l/cs/user-guide/data-model/objects", + "l/cs/user-guide/data-model/fields", + "l/cs/user-guide/data-model/creating-records", + "l/cs/user-guide/data-model/relation-fields", + "l/cs/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "CRM základy", + "icon": "users", + "pages": [ + "l/cs/user-guide/crm-essentials/contact-and-account-management", + "l/cs/user-guide/crm-essentials/pipeline", + "l/cs/user-guide/crm-essentials/view-management", + "l/cs/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Pohledy", + "icon": "table", + "pages": [ + "l/cs/user-guide/views/kanban-views", + "l/cs/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Pracovní postupy", + "icon": "bolt", + "pages": [ + "l/cs/user-guide/workflows/getting-started-workflows", + "l/cs/user-guide/workflows/workflow-features", + "l/cs/user-guide/workflows/internal-automations", + "l/cs/user-guide/workflows/external-tool-integration", + "l/cs/user-guide/workflows/workflow-troubleshooting", + "l/cs/user-guide/workflows/workflow-credits", + "l/cs/user-guide/workflows/professional-services" + ] + }, + { + "group": "Spolupráce", + "icon": "envelope", + "pages": [ + "l/cs/user-guide/collaboration/emails-and-calendars", + "l/cs/user-guide/collaboration/notes", + "l/cs/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integrace & API", + "icon": "plug", + "pages": [ + "l/cs/user-guide/integrations-api/apis-overview", + "l/cs/user-guide/integrations-api/api-webhooks", + "l/cs/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Reportování", + "icon": "chart-bar", + "pages": [ + "l/cs/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Nastavení", + "icon": "gear", + "pages": [ + "l/cs/user-guide/settings/profile-settings", + "l/cs/user-guide/settings/experience-settings", + "l/cs/user-guide/settings/email-calendar-setup", + "l/cs/user-guide/settings/workspace-settings", + "l/cs/user-guide/settings/member-management", + "l/cs/user-guide/settings/permissions", + "l/cs/user-guide/settings/domains-settings", + "l/cs/user-guide/settings/releases-settings", + "l/cs/user-guide/settings/settings-faq" + ] + }, + { + "group": "Ceny", + "icon": "credit-card", + "pages": [ + "l/cs/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Zdroje", + "icon": "book-open", + "pages": [ + "l/cs/user-guide/resources/glossary", + "l/cs/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Vývojáři", + "groups": [ + { + "group": "Vývojáři", + "pages": [] + }, + { + "group": "Začněme", + "icon": "rocket", + "pages": [ + "l/cs/developers/introduction", + "l/cs/developers/local-setup", + { + "group": "Samohostování", + "pages": [ + "l/cs/developers/self-hosting/docker-compose", + "l/cs/developers/self-hosting/setup", + "l/cs/developers/self-hosting/upgrade-guide", + "l/cs/developers/self-hosting/cloud-providers", + "l/cs/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API a Webhooky", + "pages": [ + "l/cs/developers/api-and-webhooks/api", + "l/cs/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Přispěje", + "icon": "code-branch", + "pages": [ + "l/cs/developers/bug-and-requests", + { + "group": "Vývoj frontendu", + "pages": [ + "l/cs/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/cs/twenty-ui/introduction", + { + "group": "Zobrazení", + "pages": [ + "l/cs/twenty-ui/display/checkmark", + "l/cs/twenty-ui/display/chip", + "l/cs/twenty-ui/display/icons", + "l/cs/twenty-ui/display/soon-pill", + "l/cs/twenty-ui/display/tag", + "l/cs/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Komentář", + "pages": [ + "l/cs/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/cs/twenty-ui/input/buttons", + "l/cs/twenty-ui/input/color-scheme", + "l/cs/twenty-ui/input/text", + "l/cs/twenty-ui/input/checkbox", + "l/cs/twenty-ui/input/icon-picker", + "l/cs/twenty-ui/input/image-input", + "l/cs/twenty-ui/input/radio", + "l/cs/twenty-ui/input/select", + "l/cs/twenty-ui/input/toggle", + "l/cs/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/cs/twenty-ui/navigation", + "l/cs/twenty-ui/navigation/breadcrumb", + "l/cs/twenty-ui/navigation/links", + "l/cs/twenty-ui/navigation/menu-item", + "l/cs/twenty-ui/navigation/navigation-bar", + "l/cs/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/cs/developers/frontend-development/frontend-commands", + "l/cs/developers/frontend-development/work-with-figma", + "l/cs/developers/frontend-development/best-practices-front", + "l/cs/developers/frontend-development/style-guide", + "l/cs/developers/frontend-development/folder-architecture-front", + "l/cs/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Vývoj backendu", + "pages": [ + "l/cs/developers/backend-development/server-commands", + "l/cs/developers/backend-development/feature-flags", + "l/cs/developers/backend-development/folder-architecture-server", + "l/cs/developers/backend-development/zapier", + "l/cs/developers/backend-development/best-practices-server", + "l/cs/developers/backend-development/custom-objects", + "l/cs/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "de", + "tabs": [ + { + "tab": "Benutzerhandbuch", + "groups": [ + { + "group": "Erste Schritte", + "icon": "rocket", + "pages": [ + "l/de/user-guide/introduction", + "l/de/user-guide/getting-started/what-is-twenty", + "l/de/user-guide/getting-started/create-workspace", + "l/de/user-guide/getting-started/getting-around-twenty", + "l/de/user-guide/getting-started/configure-your-workspace", + "l/de/user-guide/getting-started/implementation-services", + "l/de/user-guide/getting-started/migrating-from-other-crms", + "l/de/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Datenmodell", + "icon": "database", + "pages": [ + "l/de/user-guide/data-model/customize-your-data-model", + "l/de/user-guide/data-model/objects", + "l/de/user-guide/data-model/fields", + "l/de/user-guide/data-model/creating-records", + "l/de/user-guide/data-model/relation-fields", + "l/de/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "CRM-Grundlagen", + "icon": "users", + "pages": [ + "l/de/user-guide/crm-essentials/contact-and-account-management", + "l/de/user-guide/crm-essentials/pipeline", + "l/de/user-guide/crm-essentials/view-management", + "l/de/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Ansichten", + "icon": "table", + "pages": [ + "l/de/user-guide/views/kanban-views", + "l/de/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Workflows", + "icon": "bolt", + "pages": [ + "l/de/user-guide/workflows/getting-started-workflows", + "l/de/user-guide/workflows/workflow-features", + "l/de/user-guide/workflows/internal-automations", + "l/de/user-guide/workflows/external-tool-integration", + "l/de/user-guide/workflows/workflow-troubleshooting", + "l/de/user-guide/workflows/workflow-credits", + "l/de/user-guide/workflows/professional-services" + ] + }, + { + "group": "Zusammenarbeit", + "icon": "envelope", + "pages": [ + "l/de/user-guide/collaboration/emails-and-calendars", + "l/de/user-guide/collaboration/notes", + "l/de/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integrationen & API", + "icon": "plug", + "pages": [ + "l/de/user-guide/integrations-api/apis-overview", + "l/de/user-guide/integrations-api/api-webhooks", + "l/de/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Berichterstattung", + "icon": "chart-bar", + "pages": [ + "l/de/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Einstellungen", + "icon": "gear", + "pages": [ + "l/de/user-guide/settings/profile-settings", + "l/de/user-guide/settings/experience-settings", + "l/de/user-guide/settings/email-calendar-setup", + "l/de/user-guide/settings/workspace-settings", + "l/de/user-guide/settings/member-management", + "l/de/user-guide/settings/permissions", + "l/de/user-guide/settings/domains-settings", + "l/de/user-guide/settings/releases-settings", + "l/de/user-guide/settings/settings-faq" + ] + }, + { + "group": "Preisgestaltung", + "icon": "credit-card", + "pages": [ + "l/de/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Ressourcen", + "icon": "book-open", + "pages": [ + "l/de/user-guide/resources/glossary", + "l/de/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Entwickler", + "groups": [ + { + "group": "Entwickler", + "pages": [] + }, + { + "group": "Erste Schritte", + "icon": "rocket", + "pages": [ + "l/de/developers/introduction", + "l/de/developers/local-setup", + { + "group": "Selbst-Hosting", + "pages": [ + "l/de/developers/self-hosting/docker-compose", + "l/de/developers/self-hosting/setup", + "l/de/developers/self-hosting/upgrade-guide", + "l/de/developers/self-hosting/cloud-providers", + "l/de/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API und Webhooks", + "pages": [ + "l/de/developers/api-and-webhooks/api", + "l/de/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Mitwirken", + "icon": "code-branch", + "pages": [ + "l/de/developers/bug-and-requests", + { + "group": "Frontend-Entwicklung", + "pages": [ + "l/de/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/de/twenty-ui/introduction", + { + "group": "Anzeige", + "pages": [ + "l/de/twenty-ui/display/checkmark", + "l/de/twenty-ui/display/chip", + "l/de/twenty-ui/display/icons", + "l/de/twenty-ui/display/soon-pill", + "l/de/twenty-ui/display/tag", + "l/de/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Feedback", + "pages": [ + "l/de/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/de/twenty-ui/input/buttons", + "l/de/twenty-ui/input/color-scheme", + "l/de/twenty-ui/input/text", + "l/de/twenty-ui/input/checkbox", + "l/de/twenty-ui/input/icon-picker", + "l/de/twenty-ui/input/image-input", + "l/de/twenty-ui/input/radio", + "l/de/twenty-ui/input/select", + "l/de/twenty-ui/input/toggle", + "l/de/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/de/twenty-ui/navigation", + "l/de/twenty-ui/navigation/breadcrumb", + "l/de/twenty-ui/navigation/links", + "l/de/twenty-ui/navigation/menu-item", + "l/de/twenty-ui/navigation/navigation-bar", + "l/de/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/de/developers/frontend-development/frontend-commands", + "l/de/developers/frontend-development/work-with-figma", + "l/de/developers/frontend-development/best-practices-front", + "l/de/developers/frontend-development/style-guide", + "l/de/developers/frontend-development/folder-architecture-front", + "l/de/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Backend-Entwicklung", + "pages": [ + "l/de/developers/backend-development/server-commands", + "l/de/developers/backend-development/feature-flags", + "l/de/developers/backend-development/folder-architecture-server", + "l/de/developers/backend-development/zapier", + "l/de/developers/backend-development/best-practices-server", + "l/de/developers/backend-development/custom-objects", + "l/de/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "es", + "tabs": [ + { + "tab": "Guía de usuario", + "groups": [ + { + "group": "Comenzando", + "icon": "rocket", + "pages": [ + "l/es/user-guide/introduction", + "l/es/user-guide/getting-started/what-is-twenty", + "l/es/user-guide/getting-started/create-workspace", + "l/es/user-guide/getting-started/getting-around-twenty", + "l/es/user-guide/getting-started/configure-your-workspace", + "l/es/user-guide/getting-started/implementation-services", + "l/es/user-guide/getting-started/migrating-from-other-crms", + "l/es/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Modelo de datos", + "icon": "database", + "pages": [ + "l/es/user-guide/data-model/customize-your-data-model", + "l/es/user-guide/data-model/objects", + "l/es/user-guide/data-model/fields", + "l/es/user-guide/data-model/creating-records", + "l/es/user-guide/data-model/relation-fields", + "l/es/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "Esenciales de CRM", + "icon": "users", + "pages": [ + "l/es/user-guide/crm-essentials/contact-and-account-management", + "l/es/user-guide/crm-essentials/pipeline", + "l/es/user-guide/crm-essentials/view-management", + "l/es/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Vistas", + "icon": "table", + "pages": [ + "l/es/user-guide/views/kanban-views", + "l/es/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Workflows", + "icon": "bolt", + "pages": [ + "l/es/user-guide/workflows/getting-started-workflows", + "l/es/user-guide/workflows/workflow-features", + "l/es/user-guide/workflows/internal-automations", + "l/es/user-guide/workflows/external-tool-integration", + "l/es/user-guide/workflows/workflow-troubleshooting", + "l/es/user-guide/workflows/workflow-credits", + "l/es/user-guide/workflows/professional-services" + ] + }, + { + "group": "Colaboración", + "icon": "envelope", + "pages": [ + "l/es/user-guide/collaboration/emails-and-calendars", + "l/es/user-guide/collaboration/notes", + "l/es/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integraciones y API", + "icon": "plug", + "pages": [ + "l/es/user-guide/integrations-api/apis-overview", + "l/es/user-guide/integrations-api/api-webhooks", + "l/es/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Informes", + "icon": "chart-bar", + "pages": [ + "l/es/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Configuración", + "icon": "gear", + "pages": [ + "l/es/user-guide/settings/profile-settings", + "l/es/user-guide/settings/experience-settings", + "l/es/user-guide/settings/email-calendar-setup", + "l/es/user-guide/settings/workspace-settings", + "l/es/user-guide/settings/member-management", + "l/es/user-guide/settings/permissions", + "l/es/user-guide/settings/domains-settings", + "l/es/user-guide/settings/releases-settings", + "l/es/user-guide/settings/settings-faq" + ] + }, + { + "group": "Precios", + "icon": "credit-card", + "pages": [ + "l/es/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Recursos", + "icon": "book-open", + "pages": [ + "l/es/user-guide/resources/glossary", + "l/es/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Desarrolladores", + "groups": [ + { + "group": "Desarrolladores", + "pages": [] + }, + { + "group": "Comenzando", + "icon": "rocket", + "pages": [ + "l/es/developers/introduction", + "l/es/developers/local-setup", + { + "group": "Autoalojamiento", + "pages": [ + "l/es/developers/self-hosting/docker-compose", + "l/es/developers/self-hosting/setup", + "l/es/developers/self-hosting/upgrade-guide", + "l/es/developers/self-hosting/cloud-providers", + "l/es/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API y Webhooks", + "pages": [ + "l/es/developers/api-and-webhooks/api", + "l/es/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Contribuciones", + "icon": "code-branch", + "pages": [ + "l/es/developers/bug-and-requests", + { + "group": "Desarrollo Frontend", + "pages": [ + "l/es/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/es/twenty-ui/introduction", + { + "group": "Mostrar", + "pages": [ + "l/es/twenty-ui/display/checkmark", + "l/es/twenty-ui/display/chip", + "l/es/twenty-ui/display/icons", + "l/es/twenty-ui/display/soon-pill", + "l/es/twenty-ui/display/tag", + "l/es/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Retroalimentación", + "pages": [ + "l/es/twenty-ui/progress-bar" + ] + }, + { + "group": "Entrada", + "pages": [ + "l/es/twenty-ui/input/buttons", + "l/es/twenty-ui/input/color-scheme", + "l/es/twenty-ui/input/text", + "l/es/twenty-ui/input/checkbox", + "l/es/twenty-ui/input/icon-picker", + "l/es/twenty-ui/input/image-input", + "l/es/twenty-ui/input/radio", + "l/es/twenty-ui/input/select", + "l/es/twenty-ui/input/toggle", + "l/es/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navegación", + "pages": [ + "l/es/twenty-ui/navigation", + "l/es/twenty-ui/navigation/breadcrumb", + "l/es/twenty-ui/navigation/links", + "l/es/twenty-ui/navigation/menu-item", + "l/es/twenty-ui/navigation/navigation-bar", + "l/es/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/es/developers/frontend-development/frontend-commands", + "l/es/developers/frontend-development/work-with-figma", + "l/es/developers/frontend-development/best-practices-front", + "l/es/developers/frontend-development/style-guide", + "l/es/developers/frontend-development/folder-architecture-front", + "l/es/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Desarrollo de backend", + "pages": [ + "l/es/developers/backend-development/server-commands", + "l/es/developers/backend-development/feature-flags", + "l/es/developers/backend-development/folder-architecture-server", + "l/es/developers/backend-development/zapier", + "l/es/developers/backend-development/best-practices-server", + "l/es/developers/backend-development/custom-objects", + "l/es/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "it", + "tabs": [ + { + "tab": "Guida Utente", + "groups": [ + { + "group": "Per Iniziare", + "icon": "rocket", + "pages": [ + "l/it/user-guide/introduction", + "l/it/user-guide/getting-started/what-is-twenty", + "l/it/user-guide/getting-started/create-workspace", + "l/it/user-guide/getting-started/getting-around-twenty", + "l/it/user-guide/getting-started/configure-your-workspace", + "l/it/user-guide/getting-started/implementation-services", + "l/it/user-guide/getting-started/migrating-from-other-crms", + "l/it/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Modello dati", + "icon": "database", + "pages": [ + "l/it/user-guide/data-model/customize-your-data-model", + "l/it/user-guide/data-model/objects", + "l/it/user-guide/data-model/fields", + "l/it/user-guide/data-model/creating-records", + "l/it/user-guide/data-model/relation-fields", + "l/it/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "Essentials CRM", + "icon": "users", + "pages": [ + "l/it/user-guide/crm-essentials/contact-and-account-management", + "l/it/user-guide/crm-essentials/pipeline", + "l/it/user-guide/crm-essentials/view-management", + "l/it/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Viste", + "icon": "table", + "pages": [ + "l/it/user-guide/views/kanban-views", + "l/it/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Workflows", + "icon": "bolt", + "pages": [ + "l/it/user-guide/workflows/getting-started-workflows", + "l/it/user-guide/workflows/workflow-features", + "l/it/user-guide/workflows/internal-automations", + "l/it/user-guide/workflows/external-tool-integration", + "l/it/user-guide/workflows/workflow-troubleshooting", + "l/it/user-guide/workflows/workflow-credits", + "l/it/user-guide/workflows/professional-services" + ] + }, + { + "group": "Collaborazione", + "icon": "envelope", + "pages": [ + "l/it/user-guide/collaboration/emails-and-calendars", + "l/it/user-guide/collaboration/notes", + "l/it/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integrazioni & API", + "icon": "plug", + "pages": [ + "l/it/user-guide/integrations-api/apis-overview", + "l/it/user-guide/integrations-api/api-webhooks", + "l/it/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Reportistica", + "icon": "chart-bar", + "pages": [ + "l/it/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Impostazioni", + "icon": "gear", + "pages": [ + "l/it/user-guide/settings/profile-settings", + "l/it/user-guide/settings/experience-settings", + "l/it/user-guide/settings/email-calendar-setup", + "l/it/user-guide/settings/workspace-settings", + "l/it/user-guide/settings/member-management", + "l/it/user-guide/settings/permissions", + "l/it/user-guide/settings/domains-settings", + "l/it/user-guide/settings/releases-settings", + "l/it/user-guide/settings/settings-faq" + ] + }, + { + "group": "Prezzi", + "icon": "credit-card", + "pages": [ + "l/it/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Risorse", + "icon": "book-open", + "pages": [ + "l/it/user-guide/resources/glossary", + "l/it/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Sviluppatori", + "groups": [ + { + "group": "Sviluppatori", + "pages": [] + }, + { + "group": "Per Iniziare", + "icon": "rocket", + "pages": [ + "l/it/developers/introduction", + "l/it/developers/local-setup", + { + "group": "Auto-Hosting", + "pages": [ + "l/it/developers/self-hosting/docker-compose", + "l/it/developers/self-hosting/setup", + "l/it/developers/self-hosting/upgrade-guide", + "l/it/developers/self-hosting/cloud-providers", + "l/it/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API e Webhook", + "pages": [ + "l/it/developers/api-and-webhooks/api", + "l/it/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Contribuire", + "icon": "code-branch", + "pages": [ + "l/it/developers/bug-and-requests", + { + "group": "Sviluppo Frontend", + "pages": [ + "l/it/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/it/twenty-ui/introduction", + { + "group": "Visualizzazione", + "pages": [ + "l/it/twenty-ui/display/checkmark", + "l/it/twenty-ui/display/chip", + "l/it/twenty-ui/display/icons", + "l/it/twenty-ui/display/soon-pill", + "l/it/twenty-ui/display/tag", + "l/it/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Feedback", + "pages": [ + "l/it/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/it/twenty-ui/input/buttons", + "l/it/twenty-ui/input/color-scheme", + "l/it/twenty-ui/input/text", + "l/it/twenty-ui/input/checkbox", + "l/it/twenty-ui/input/icon-picker", + "l/it/twenty-ui/input/image-input", + "l/it/twenty-ui/input/radio", + "l/it/twenty-ui/input/select", + "l/it/twenty-ui/input/toggle", + "l/it/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/it/twenty-ui/navigation", + "l/it/twenty-ui/navigation/breadcrumb", + "l/it/twenty-ui/navigation/links", + "l/it/twenty-ui/navigation/menu-item", + "l/it/twenty-ui/navigation/navigation-bar", + "l/it/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/it/developers/frontend-development/frontend-commands", + "l/it/developers/frontend-development/work-with-figma", + "l/it/developers/frontend-development/best-practices-front", + "l/it/developers/frontend-development/style-guide", + "l/it/developers/frontend-development/folder-architecture-front", + "l/it/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Sviluppo Backend", + "pages": [ + "l/it/developers/backend-development/server-commands", + "l/it/developers/backend-development/feature-flags", + "l/it/developers/backend-development/folder-architecture-server", + "l/it/developers/backend-development/zapier", + "l/it/developers/backend-development/best-practices-server", + "l/it/developers/backend-development/custom-objects", + "l/it/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "ja", + "tabs": [ + { + "tab": "ユーザーガイド", + "groups": [ + { + "group": "始めに", + "icon": "rocket", + "pages": [ + "l/ja/user-guide/introduction", + "l/ja/user-guide/getting-started/what-is-twenty", + "l/ja/user-guide/getting-started/create-workspace", + "l/ja/user-guide/getting-started/getting-around-twenty", + "l/ja/user-guide/getting-started/configure-your-workspace", + "l/ja/user-guide/getting-started/implementation-services", + "l/ja/user-guide/getting-started/migrating-from-other-crms", + "l/ja/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "データモデル", + "icon": "database", + "pages": [ + "l/ja/user-guide/data-model/customize-your-data-model", + "l/ja/user-guide/data-model/objects", + "l/ja/user-guide/data-model/fields", + "l/ja/user-guide/data-model/creating-records", + "l/ja/user-guide/data-model/relation-fields", + "l/ja/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "CRM の基本", + "icon": "users", + "pages": [ + "l/ja/user-guide/crm-essentials/contact-and-account-management", + "l/ja/user-guide/crm-essentials/pipeline", + "l/ja/user-guide/crm-essentials/view-management", + "l/ja/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "ビュー", + "icon": "table", + "pages": [ + "l/ja/user-guide/views/kanban-views", + "l/ja/user-guide/views/views-sort-filter" + ] + }, + { + "group": "ワークフロー", + "icon": "bolt", + "pages": [ + "l/ja/user-guide/workflows/getting-started-workflows", + "l/ja/user-guide/workflows/workflow-features", + "l/ja/user-guide/workflows/internal-automations", + "l/ja/user-guide/workflows/external-tool-integration", + "l/ja/user-guide/workflows/workflow-troubleshooting", + "l/ja/user-guide/workflows/workflow-credits", + "l/ja/user-guide/workflows/professional-services" + ] + }, + { + "group": "コラボレーション", + "icon": "envelope", + "pages": [ + "l/ja/user-guide/collaboration/emails-and-calendars", + "l/ja/user-guide/collaboration/notes", + "l/ja/user-guide/collaboration/tasks" + ] + }, + { + "group": "連携とAPI", + "icon": "plug", + "pages": [ + "l/ja/user-guide/integrations-api/apis-overview", + "l/ja/user-guide/integrations-api/api-webhooks", + "l/ja/user-guide/integrations-api/integrations" + ] + }, + { + "group": "レポーティング", + "icon": "chart-bar", + "pages": [ + "l/ja/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "設定", + "icon": "gear", + "pages": [ + "l/ja/user-guide/settings/profile-settings", + "l/ja/user-guide/settings/experience-settings", + "l/ja/user-guide/settings/email-calendar-setup", + "l/ja/user-guide/settings/workspace-settings", + "l/ja/user-guide/settings/member-management", + "l/ja/user-guide/settings/permissions", + "l/ja/user-guide/settings/domains-settings", + "l/ja/user-guide/settings/releases-settings", + "l/ja/user-guide/settings/settings-faq" + ] + }, + { + "group": "料金", + "icon": "credit-card", + "pages": [ + "l/ja/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "リソース", + "icon": "book-open", + "pages": [ + "l/ja/user-guide/resources/glossary", + "l/ja/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "開発者", + "groups": [ + { + "group": "開発者", + "pages": [] + }, + { + "group": "始めに", + "icon": "rocket", + "pages": [ + "l/ja/developers/introduction", + "l/ja/developers/local-setup", + { + "group": "セルフホスティング", + "pages": [ + "l/ja/developers/self-hosting/docker-compose", + "l/ja/developers/self-hosting/setup", + "l/ja/developers/self-hosting/upgrade-guide", + "l/ja/developers/self-hosting/cloud-providers", + "l/ja/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "APIとWebhooks", + "pages": [ + "l/ja/developers/api-and-webhooks/api", + "l/ja/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "貢献", + "icon": "code-branch", + "pages": [ + "l/ja/developers/bug-and-requests", + { + "group": "フロントエンド開発", + "pages": [ + "l/ja/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/ja/twenty-ui/introduction", + { + "group": "表示", + "pages": [ + "l/ja/twenty-ui/display/checkmark", + "l/ja/twenty-ui/display/chip", + "l/ja/twenty-ui/display/icons", + "l/ja/twenty-ui/display/soon-pill", + "l/ja/twenty-ui/display/tag", + "l/ja/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "フィードバック", + "pages": [ + "l/ja/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/ja/twenty-ui/input/buttons", + "l/ja/twenty-ui/input/color-scheme", + "l/ja/twenty-ui/input/text", + "l/ja/twenty-ui/input/checkbox", + "l/ja/twenty-ui/input/icon-picker", + "l/ja/twenty-ui/input/image-input", + "l/ja/twenty-ui/input/radio", + "l/ja/twenty-ui/input/select", + "l/ja/twenty-ui/input/toggle", + "l/ja/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/ja/twenty-ui/navigation", + "l/ja/twenty-ui/navigation/breadcrumb", + "l/ja/twenty-ui/navigation/links", + "l/ja/twenty-ui/navigation/menu-item", + "l/ja/twenty-ui/navigation/navigation-bar", + "l/ja/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/ja/developers/frontend-development/frontend-commands", + "l/ja/developers/frontend-development/work-with-figma", + "l/ja/developers/frontend-development/best-practices-front", + "l/ja/developers/frontend-development/style-guide", + "l/ja/developers/frontend-development/folder-architecture-front", + "l/ja/developers/frontend-development/hotkeys" + ] + }, + { + "group": "バックエンド開発", + "pages": [ + "l/ja/developers/backend-development/server-commands", + "l/ja/developers/backend-development/feature-flags", + "l/ja/developers/backend-development/folder-architecture-server", + "l/ja/developers/backend-development/zapier", + "l/ja/developers/backend-development/best-practices-server", + "l/ja/developers/backend-development/custom-objects", + "l/ja/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "ko", + "tabs": [ + { + "tab": "User Guide", + "groups": [ + { + "group": "Getting Started", + "icon": "rocket", + "pages": [ + "l/ko/user-guide/introduction", + "l/ko/user-guide/getting-started/what-is-twenty", + "l/ko/user-guide/getting-started/create-workspace", + "l/ko/user-guide/getting-started/getting-around-twenty", + "l/ko/user-guide/getting-started/configure-your-workspace", + "l/ko/user-guide/getting-started/implementation-services", + "l/ko/user-guide/getting-started/migrating-from-other-crms", + "l/ko/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Data Model", + "icon": "database", + "pages": [ + "l/ko/user-guide/data-model/customize-your-data-model", + "l/ko/user-guide/data-model/objects", + "l/ko/user-guide/data-model/fields", + "l/ko/user-guide/data-model/creating-records", + "l/ko/user-guide/data-model/relation-fields", + "l/ko/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "CRM Essentials", + "icon": "users", + "pages": [ + "l/ko/user-guide/crm-essentials/contact-and-account-management", + "l/ko/user-guide/crm-essentials/pipeline", + "l/ko/user-guide/crm-essentials/view-management", + "l/ko/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Views", + "icon": "table", + "pages": [ + "l/ko/user-guide/views/kanban-views", + "l/ko/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Workflows", + "icon": "bolt", + "pages": [ + "l/ko/user-guide/workflows/getting-started-workflows", + "l/ko/user-guide/workflows/workflow-features", + "l/ko/user-guide/workflows/internal-automations", + "l/ko/user-guide/workflows/external-tool-integration", + "l/ko/user-guide/workflows/workflow-troubleshooting", + "l/ko/user-guide/workflows/workflow-credits", + "l/ko/user-guide/workflows/professional-services" + ] + }, + { + "group": "Collaboration", + "icon": "envelope", + "pages": [ + "l/ko/user-guide/collaboration/emails-and-calendars", + "l/ko/user-guide/collaboration/notes", + "l/ko/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integrations & API", + "icon": "plug", + "pages": [ + "l/ko/user-guide/integrations-api/apis-overview", + "l/ko/user-guide/integrations-api/api-webhooks", + "l/ko/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Reporting", + "icon": "chart-bar", + "pages": [ + "l/ko/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Settings", + "icon": "gear", + "pages": [ + "l/ko/user-guide/settings/profile-settings", + "l/ko/user-guide/settings/experience-settings", + "l/ko/user-guide/settings/email-calendar-setup", + "l/ko/user-guide/settings/workspace-settings", + "l/ko/user-guide/settings/member-management", + "l/ko/user-guide/settings/permissions", + "l/ko/user-guide/settings/domains-settings", + "l/ko/user-guide/settings/releases-settings", + "l/ko/user-guide/settings/settings-faq" + ] + }, + { + "group": "Pricing", + "icon": "credit-card", + "pages": [ + "l/ko/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Resources", + "icon": "book-open", + "pages": [ + "l/ko/user-guide/resources/glossary", + "l/ko/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Developers", + "groups": [ + { + "group": "Developers", + "pages": [] + }, + { + "group": "Getting Started", + "icon": "rocket", + "pages": [ + "l/ko/developers/introduction", + "l/ko/developers/local-setup", + { + "group": "Self-Hosting", + "pages": [ + "l/ko/developers/self-hosting/docker-compose", + "l/ko/developers/self-hosting/setup", + "l/ko/developers/self-hosting/upgrade-guide", + "l/ko/developers/self-hosting/cloud-providers", + "l/ko/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API and Webhooks", + "pages": [ + "l/ko/developers/api-and-webhooks/api", + "l/ko/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Contributing", + "icon": "code-branch", + "pages": [ + "l/ko/developers/bug-and-requests", + { + "group": "Frontend Development", + "pages": [ + "l/ko/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/ko/twenty-ui/introduction", + { + "group": "Display", + "pages": [ + "l/ko/twenty-ui/display/checkmark", + "l/ko/twenty-ui/display/chip", + "l/ko/twenty-ui/display/icons", + "l/ko/twenty-ui/display/soon-pill", + "l/ko/twenty-ui/display/tag", + "l/ko/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Feedback", + "pages": [ + "l/ko/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/ko/twenty-ui/input/buttons", + "l/ko/twenty-ui/input/color-scheme", + "l/ko/twenty-ui/input/text", + "l/ko/twenty-ui/input/checkbox", + "l/ko/twenty-ui/input/icon-picker", + "l/ko/twenty-ui/input/image-input", + "l/ko/twenty-ui/input/radio", + "l/ko/twenty-ui/input/select", + "l/ko/twenty-ui/input/toggle", + "l/ko/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/ko/twenty-ui/navigation", + "l/ko/twenty-ui/navigation/breadcrumb", + "l/ko/twenty-ui/navigation/links", + "l/ko/twenty-ui/navigation/menu-item", + "l/ko/twenty-ui/navigation/navigation-bar", + "l/ko/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/ko/developers/frontend-development/frontend-commands", + "l/ko/developers/frontend-development/work-with-figma", + "l/ko/developers/frontend-development/best-practices-front", + "l/ko/developers/frontend-development/style-guide", + "l/ko/developers/frontend-development/folder-architecture-front", + "l/ko/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Backend Development", + "pages": [ + "l/ko/developers/backend-development/server-commands", + "l/ko/developers/backend-development/feature-flags", + "l/ko/developers/backend-development/folder-architecture-server", + "l/ko/developers/backend-development/zapier", + "l/ko/developers/backend-development/best-practices-server", + "l/ko/developers/backend-development/custom-objects", + "l/ko/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "pt", + "tabs": [ + { + "tab": "Manual do Usuário", + "groups": [ + { + "group": "Começando", + "icon": "rocket", + "pages": [ + "l/pt/user-guide/introduction", + "l/pt/user-guide/getting-started/what-is-twenty", + "l/pt/user-guide/getting-started/create-workspace", + "l/pt/user-guide/getting-started/getting-around-twenty", + "l/pt/user-guide/getting-started/configure-your-workspace", + "l/pt/user-guide/getting-started/implementation-services", + "l/pt/user-guide/getting-started/migrating-from-other-crms", + "l/pt/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Modelo de Dados", + "icon": "database", + "pages": [ + "l/pt/user-guide/data-model/customize-your-data-model", + "l/pt/user-guide/data-model/objects", + "l/pt/user-guide/data-model/fields", + "l/pt/user-guide/data-model/creating-records", + "l/pt/user-guide/data-model/relation-fields", + "l/pt/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "Essenciais do CRM", + "icon": "users", + "pages": [ + "l/pt/user-guide/crm-essentials/contact-and-account-management", + "l/pt/user-guide/crm-essentials/pipeline", + "l/pt/user-guide/crm-essentials/view-management", + "l/pt/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Visualizações", + "icon": "table", + "pages": [ + "l/pt/user-guide/views/kanban-views", + "l/pt/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Workflows", + "icon": "bolt", + "pages": [ + "l/pt/user-guide/workflows/getting-started-workflows", + "l/pt/user-guide/workflows/workflow-features", + "l/pt/user-guide/workflows/internal-automations", + "l/pt/user-guide/workflows/external-tool-integration", + "l/pt/user-guide/workflows/workflow-troubleshooting", + "l/pt/user-guide/workflows/workflow-credits", + "l/pt/user-guide/workflows/professional-services" + ] + }, + { + "group": "Colaboração", + "icon": "envelope", + "pages": [ + "l/pt/user-guide/collaboration/emails-and-calendars", + "l/pt/user-guide/collaboration/notes", + "l/pt/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integrações e API", + "icon": "plug", + "pages": [ + "l/pt/user-guide/integrations-api/apis-overview", + "l/pt/user-guide/integrations-api/api-webhooks", + "l/pt/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Relatórios", + "icon": "chart-bar", + "pages": [ + "l/pt/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Configurações", + "icon": "gear", + "pages": [ + "l/pt/user-guide/settings/profile-settings", + "l/pt/user-guide/settings/experience-settings", + "l/pt/user-guide/settings/email-calendar-setup", + "l/pt/user-guide/settings/workspace-settings", + "l/pt/user-guide/settings/member-management", + "l/pt/user-guide/settings/permissions", + "l/pt/user-guide/settings/domains-settings", + "l/pt/user-guide/settings/releases-settings", + "l/pt/user-guide/settings/settings-faq" + ] + }, + { + "group": "Preços", + "icon": "credit-card", + "pages": [ + "l/pt/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Recursos", + "icon": "book-open", + "pages": [ + "l/pt/user-guide/resources/glossary", + "l/pt/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Desenvolvedores", + "groups": [ + { + "group": "Desenvolvedores", + "pages": [] + }, + { + "group": "Começando", + "icon": "rocket", + "pages": [ + "l/pt/developers/introduction", + "l/pt/developers/local-setup", + { + "group": "Auto-Hospedagem", + "pages": [ + "l/pt/developers/self-hosting/docker-compose", + "l/pt/developers/self-hosting/setup", + "l/pt/developers/self-hosting/upgrade-guide", + "l/pt/developers/self-hosting/cloud-providers", + "l/pt/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API e Webhooks", + "pages": [ + "l/pt/developers/api-and-webhooks/api", + "l/pt/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Contribuindo", + "icon": "code-branch", + "pages": [ + "l/pt/developers/bug-and-requests", + { + "group": "Desenvolvimento Frontend", + "pages": [ + "l/pt/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/pt/twenty-ui/introduction", + { + "group": "Exibição", + "pages": [ + "l/pt/twenty-ui/display/checkmark", + "l/pt/twenty-ui/display/chip", + "l/pt/twenty-ui/display/icons", + "l/pt/twenty-ui/display/soon-pill", + "l/pt/twenty-ui/display/tag", + "l/pt/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Feedback", + "pages": [ + "l/pt/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/pt/twenty-ui/input/buttons", + "l/pt/twenty-ui/input/color-scheme", + "l/pt/twenty-ui/input/text", + "l/pt/twenty-ui/input/checkbox", + "l/pt/twenty-ui/input/icon-picker", + "l/pt/twenty-ui/input/image-input", + "l/pt/twenty-ui/input/radio", + "l/pt/twenty-ui/input/select", + "l/pt/twenty-ui/input/toggle", + "l/pt/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/pt/twenty-ui/navigation", + "l/pt/twenty-ui/navigation/breadcrumb", + "l/pt/twenty-ui/navigation/links", + "l/pt/twenty-ui/navigation/menu-item", + "l/pt/twenty-ui/navigation/navigation-bar", + "l/pt/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/pt/developers/frontend-development/frontend-commands", + "l/pt/developers/frontend-development/work-with-figma", + "l/pt/developers/frontend-development/best-practices-front", + "l/pt/developers/frontend-development/style-guide", + "l/pt/developers/frontend-development/folder-architecture-front", + "l/pt/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Desenvolvimento de backend", + "pages": [ + "l/pt/developers/backend-development/server-commands", + "l/pt/developers/backend-development/feature-flags", + "l/pt/developers/backend-development/folder-architecture-server", + "l/pt/developers/backend-development/zapier", + "l/pt/developers/backend-development/best-practices-server", + "l/pt/developers/backend-development/custom-objects", + "l/pt/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "ro", + "tabs": [ + { + "tab": "Ghid de utilizator", + "groups": [ + { + "group": "Noțiuni de bază", + "icon": "rocket", + "pages": [ + "l/ro/user-guide/introduction", + "l/ro/user-guide/getting-started/what-is-twenty", + "l/ro/user-guide/getting-started/create-workspace", + "l/ro/user-guide/getting-started/getting-around-twenty", + "l/ro/user-guide/getting-started/configure-your-workspace", + "l/ro/user-guide/getting-started/implementation-services", + "l/ro/user-guide/getting-started/migrating-from-other-crms", + "l/ro/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Model de date", + "icon": "database", + "pages": [ + "l/ro/user-guide/data-model/customize-your-data-model", + "l/ro/user-guide/data-model/objects", + "l/ro/user-guide/data-model/fields", + "l/ro/user-guide/data-model/creating-records", + "l/ro/user-guide/data-model/relation-fields", + "l/ro/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "Elemente esențiale CRM", + "icon": "users", + "pages": [ + "l/ro/user-guide/crm-essentials/contact-and-account-management", + "l/ro/user-guide/crm-essentials/pipeline", + "l/ro/user-guide/crm-essentials/view-management", + "l/ro/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Vizualizări", + "icon": "table", + "pages": [ + "l/ro/user-guide/views/kanban-views", + "l/ro/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Fluxuri de lucru", + "icon": "bolt", + "pages": [ + "l/ro/user-guide/workflows/getting-started-workflows", + "l/ro/user-guide/workflows/workflow-features", + "l/ro/user-guide/workflows/internal-automations", + "l/ro/user-guide/workflows/external-tool-integration", + "l/ro/user-guide/workflows/workflow-troubleshooting", + "l/ro/user-guide/workflows/workflow-credits", + "l/ro/user-guide/workflows/professional-services" + ] + }, + { + "group": "Colaborare", + "icon": "envelope", + "pages": [ + "l/ro/user-guide/collaboration/emails-and-calendars", + "l/ro/user-guide/collaboration/notes", + "l/ro/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integrări & API", + "icon": "plug", + "pages": [ + "l/ro/user-guide/integrations-api/apis-overview", + "l/ro/user-guide/integrations-api/api-webhooks", + "l/ro/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Raportare", + "icon": "chart-bar", + "pages": [ + "l/ro/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Setări", + "icon": "gear", + "pages": [ + "l/ro/user-guide/settings/profile-settings", + "l/ro/user-guide/settings/experience-settings", + "l/ro/user-guide/settings/email-calendar-setup", + "l/ro/user-guide/settings/workspace-settings", + "l/ro/user-guide/settings/member-management", + "l/ro/user-guide/settings/permissions", + "l/ro/user-guide/settings/domains-settings", + "l/ro/user-guide/settings/releases-settings", + "l/ro/user-guide/settings/settings-faq" + ] + }, + { + "group": "Prețuri", + "icon": "credit-card", + "pages": [ + "l/ro/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Resurse", + "icon": "book-open", + "pages": [ + "l/ro/user-guide/resources/glossary", + "l/ro/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Dezvoltatori", + "groups": [ + { + "group": "Dezvoltatori", + "pages": [] + }, + { + "group": "Noțiuni de bază", + "icon": "rocket", + "pages": [ + "l/ro/developers/introduction", + "l/ro/developers/local-setup", + { + "group": "Găzduire proprie", + "pages": [ + "l/ro/developers/self-hosting/docker-compose", + "l/ro/developers/self-hosting/setup", + "l/ro/developers/self-hosting/upgrade-guide", + "l/ro/developers/self-hosting/cloud-providers", + "l/ro/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API și Webhooks", + "pages": [ + "l/ro/developers/api-and-webhooks/api", + "l/ro/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Contribuții", + "icon": "code-branch", + "pages": [ + "l/ro/developers/bug-and-requests", + { + "group": "Dezvoltare Frontend", + "pages": [ + "l/ro/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/ro/twenty-ui/introduction", + { + "group": "Afișare", + "pages": [ + "l/ro/twenty-ui/display/checkmark", + "l/ro/twenty-ui/display/chip", + "l/ro/twenty-ui/display/icons", + "l/ro/twenty-ui/display/soon-pill", + "l/ro/twenty-ui/display/tag", + "l/ro/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Feedback", + "pages": [ + "l/ro/twenty-ui/progress-bar" + ] + }, + { + "group": "Intrare", + "pages": [ + "l/ro/twenty-ui/input/buttons", + "l/ro/twenty-ui/input/color-scheme", + "l/ro/twenty-ui/input/text", + "l/ro/twenty-ui/input/checkbox", + "l/ro/twenty-ui/input/icon-picker", + "l/ro/twenty-ui/input/image-input", + "l/ro/twenty-ui/input/radio", + "l/ro/twenty-ui/input/select", + "l/ro/twenty-ui/input/toggle", + "l/ro/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/ro/twenty-ui/navigation", + "l/ro/twenty-ui/navigation/breadcrumb", + "l/ro/twenty-ui/navigation/links", + "l/ro/twenty-ui/navigation/menu-item", + "l/ro/twenty-ui/navigation/navigation-bar", + "l/ro/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/ro/developers/frontend-development/frontend-commands", + "l/ro/developers/frontend-development/work-with-figma", + "l/ro/developers/frontend-development/best-practices-front", + "l/ro/developers/frontend-development/style-guide", + "l/ro/developers/frontend-development/folder-architecture-front", + "l/ro/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Dezvoltare Backend", + "pages": [ + "l/ro/developers/backend-development/server-commands", + "l/ro/developers/backend-development/feature-flags", + "l/ro/developers/backend-development/folder-architecture-server", + "l/ro/developers/backend-development/zapier", + "l/ro/developers/backend-development/best-practices-server", + "l/ro/developers/backend-development/custom-objects", + "l/ro/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "ru", + "tabs": [ + { + "tab": "Руководство пользователя", + "groups": [ + { + "group": "Начало работы", + "icon": "rocket", + "pages": [ + "l/ru/user-guide/introduction", + "l/ru/user-guide/getting-started/what-is-twenty", + "l/ru/user-guide/getting-started/create-workspace", + "l/ru/user-guide/getting-started/getting-around-twenty", + "l/ru/user-guide/getting-started/configure-your-workspace", + "l/ru/user-guide/getting-started/implementation-services", + "l/ru/user-guide/getting-started/migrating-from-other-crms", + "l/ru/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Модель данных", + "icon": "database", + "pages": [ + "l/ru/user-guide/data-model/customize-your-data-model", + "l/ru/user-guide/data-model/objects", + "l/ru/user-guide/data-model/fields", + "l/ru/user-guide/data-model/creating-records", + "l/ru/user-guide/data-model/relation-fields", + "l/ru/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "Основы CRM", + "icon": "users", + "pages": [ + "l/ru/user-guide/crm-essentials/contact-and-account-management", + "l/ru/user-guide/crm-essentials/pipeline", + "l/ru/user-guide/crm-essentials/view-management", + "l/ru/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Представления", + "icon": "table", + "pages": [ + "l/ru/user-guide/views/kanban-views", + "l/ru/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Рабочие процессы", + "icon": "bolt", + "pages": [ + "l/ru/user-guide/workflows/getting-started-workflows", + "l/ru/user-guide/workflows/workflow-features", + "l/ru/user-guide/workflows/internal-automations", + "l/ru/user-guide/workflows/external-tool-integration", + "l/ru/user-guide/workflows/workflow-troubleshooting", + "l/ru/user-guide/workflows/workflow-credits", + "l/ru/user-guide/workflows/professional-services" + ] + }, + { + "group": "Сотрудничество", + "icon": "envelope", + "pages": [ + "l/ru/user-guide/collaboration/emails-and-calendars", + "l/ru/user-guide/collaboration/notes", + "l/ru/user-guide/collaboration/tasks" + ] + }, + { + "group": "Интеграции и API", + "icon": "plug", + "pages": [ + "l/ru/user-guide/integrations-api/apis-overview", + "l/ru/user-guide/integrations-api/api-webhooks", + "l/ru/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Отчеты", + "icon": "chart-bar", + "pages": [ + "l/ru/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Настройки", + "icon": "gear", + "pages": [ + "l/ru/user-guide/settings/profile-settings", + "l/ru/user-guide/settings/experience-settings", + "l/ru/user-guide/settings/email-calendar-setup", + "l/ru/user-guide/settings/workspace-settings", + "l/ru/user-guide/settings/member-management", + "l/ru/user-guide/settings/permissions", + "l/ru/user-guide/settings/domains-settings", + "l/ru/user-guide/settings/releases-settings", + "l/ru/user-guide/settings/settings-faq" + ] + }, + { + "group": "Цены", + "icon": "credit-card", + "pages": [ + "l/ru/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Ресурсы", + "icon": "book-open", + "pages": [ + "l/ru/user-guide/resources/glossary", + "l/ru/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Разработчики", + "groups": [ + { + "group": "Разработчики", + "pages": [] + }, + { + "group": "Начало работы", + "icon": "rocket", + "pages": [ + "l/ru/developers/introduction", + "l/ru/developers/local-setup", + { + "group": "Самостоятельный хостинг", + "pages": [ + "l/ru/developers/self-hosting/docker-compose", + "l/ru/developers/self-hosting/setup", + "l/ru/developers/self-hosting/upgrade-guide", + "l/ru/developers/self-hosting/cloud-providers", + "l/ru/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API и вебхуки", + "pages": [ + "l/ru/developers/api-and-webhooks/api", + "l/ru/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Вклад", + "icon": "code-branch", + "pages": [ + "l/ru/developers/bug-and-requests", + { + "group": "Разработка интерфейса", + "pages": [ + "l/ru/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/ru/twenty-ui/introduction", + { + "group": "Отображение", + "pages": [ + "l/ru/twenty-ui/display/checkmark", + "l/ru/twenty-ui/display/chip", + "l/ru/twenty-ui/display/icons", + "l/ru/twenty-ui/display/soon-pill", + "l/ru/twenty-ui/display/tag", + "l/ru/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Обратная связь", + "pages": [ + "l/ru/twenty-ui/progress-bar" + ] + }, + { + "group": "Ввод", + "pages": [ + "l/ru/twenty-ui/input/buttons", + "l/ru/twenty-ui/input/color-scheme", + "l/ru/twenty-ui/input/text", + "l/ru/twenty-ui/input/checkbox", + "l/ru/twenty-ui/input/icon-picker", + "l/ru/twenty-ui/input/image-input", + "l/ru/twenty-ui/input/radio", + "l/ru/twenty-ui/input/select", + "l/ru/twenty-ui/input/toggle", + "l/ru/twenty-ui/input/block-editor" + ] + }, + { + "group": "Навигация", + "pages": [ + "l/ru/twenty-ui/navigation", + "l/ru/twenty-ui/navigation/breadcrumb", + "l/ru/twenty-ui/navigation/links", + "l/ru/twenty-ui/navigation/menu-item", + "l/ru/twenty-ui/navigation/navigation-bar", + "l/ru/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/ru/developers/frontend-development/frontend-commands", + "l/ru/developers/frontend-development/work-with-figma", + "l/ru/developers/frontend-development/best-practices-front", + "l/ru/developers/frontend-development/style-guide", + "l/ru/developers/frontend-development/folder-architecture-front", + "l/ru/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Бэкенд разработка", + "pages": [ + "l/ru/developers/backend-development/server-commands", + "l/ru/developers/backend-development/feature-flags", + "l/ru/developers/backend-development/folder-architecture-server", + "l/ru/developers/backend-development/zapier", + "l/ru/developers/backend-development/best-practices-server", + "l/ru/developers/backend-development/custom-objects", + "l/ru/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "tr", + "tabs": [ + { + "tab": "User Guide", + "groups": [ + { + "group": "Getting Started", + "icon": "rocket", + "pages": [ + "l/tr/user-guide/introduction", + "l/tr/user-guide/getting-started/what-is-twenty", + "l/tr/user-guide/getting-started/create-workspace", + "l/tr/user-guide/getting-started/getting-around-twenty", + "l/tr/user-guide/getting-started/configure-your-workspace", + "l/tr/user-guide/getting-started/implementation-services", + "l/tr/user-guide/getting-started/migrating-from-other-crms", + "l/tr/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "Data Model", + "icon": "database", + "pages": [ + "l/tr/user-guide/data-model/customize-your-data-model", + "l/tr/user-guide/data-model/objects", + "l/tr/user-guide/data-model/fields", + "l/tr/user-guide/data-model/creating-records", + "l/tr/user-guide/data-model/relation-fields", + "l/tr/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "CRM Essentials", + "icon": "users", + "pages": [ + "l/tr/user-guide/crm-essentials/contact-and-account-management", + "l/tr/user-guide/crm-essentials/pipeline", + "l/tr/user-guide/crm-essentials/view-management", + "l/tr/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "Views", + "icon": "table", + "pages": [ + "l/tr/user-guide/views/kanban-views", + "l/tr/user-guide/views/views-sort-filter" + ] + }, + { + "group": "Workflows", + "icon": "bolt", + "pages": [ + "l/tr/user-guide/workflows/getting-started-workflows", + "l/tr/user-guide/workflows/workflow-features", + "l/tr/user-guide/workflows/internal-automations", + "l/tr/user-guide/workflows/external-tool-integration", + "l/tr/user-guide/workflows/workflow-troubleshooting", + "l/tr/user-guide/workflows/workflow-credits", + "l/tr/user-guide/workflows/professional-services" + ] + }, + { + "group": "Collaboration", + "icon": "envelope", + "pages": [ + "l/tr/user-guide/collaboration/emails-and-calendars", + "l/tr/user-guide/collaboration/notes", + "l/tr/user-guide/collaboration/tasks" + ] + }, + { + "group": "Integrations & API", + "icon": "plug", + "pages": [ + "l/tr/user-guide/integrations-api/apis-overview", + "l/tr/user-guide/integrations-api/api-webhooks", + "l/tr/user-guide/integrations-api/integrations" + ] + }, + { + "group": "Reporting", + "icon": "chart-bar", + "pages": [ + "l/tr/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "Settings", + "icon": "gear", + "pages": [ + "l/tr/user-guide/settings/profile-settings", + "l/tr/user-guide/settings/experience-settings", + "l/tr/user-guide/settings/email-calendar-setup", + "l/tr/user-guide/settings/workspace-settings", + "l/tr/user-guide/settings/member-management", + "l/tr/user-guide/settings/permissions", + "l/tr/user-guide/settings/domains-settings", + "l/tr/user-guide/settings/releases-settings", + "l/tr/user-guide/settings/settings-faq" + ] + }, + { + "group": "Pricing", + "icon": "credit-card", + "pages": [ + "l/tr/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "Resources", + "icon": "book-open", + "pages": [ + "l/tr/user-guide/resources/glossary", + "l/tr/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "Developers", + "groups": [ + { + "group": "Developers", + "pages": [] + }, + { + "group": "Getting Started", + "icon": "rocket", + "pages": [ + "l/tr/developers/introduction", + "l/tr/developers/local-setup", + { + "group": "Self-Hosting", + "pages": [ + "l/tr/developers/self-hosting/docker-compose", + "l/tr/developers/self-hosting/setup", + "l/tr/developers/self-hosting/upgrade-guide", + "l/tr/developers/self-hosting/cloud-providers", + "l/tr/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API and Webhooks", + "pages": [ + "l/tr/developers/api-and-webhooks/api", + "l/tr/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "Contributing", + "icon": "code-branch", + "pages": [ + "l/tr/developers/bug-and-requests", + { + "group": "Frontend Development", + "pages": [ + "l/tr/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/tr/twenty-ui/introduction", + { + "group": "Display", + "pages": [ + "l/tr/twenty-ui/display/checkmark", + "l/tr/twenty-ui/display/chip", + "l/tr/twenty-ui/display/icons", + "l/tr/twenty-ui/display/soon-pill", + "l/tr/twenty-ui/display/tag", + "l/tr/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "Feedback", + "pages": [ + "l/tr/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/tr/twenty-ui/input/buttons", + "l/tr/twenty-ui/input/color-scheme", + "l/tr/twenty-ui/input/text", + "l/tr/twenty-ui/input/checkbox", + "l/tr/twenty-ui/input/icon-picker", + "l/tr/twenty-ui/input/image-input", + "l/tr/twenty-ui/input/radio", + "l/tr/twenty-ui/input/select", + "l/tr/twenty-ui/input/toggle", + "l/tr/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/tr/twenty-ui/navigation", + "l/tr/twenty-ui/navigation/breadcrumb", + "l/tr/twenty-ui/navigation/links", + "l/tr/twenty-ui/navigation/menu-item", + "l/tr/twenty-ui/navigation/navigation-bar", + "l/tr/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/tr/developers/frontend-development/frontend-commands", + "l/tr/developers/frontend-development/work-with-figma", + "l/tr/developers/frontend-development/best-practices-front", + "l/tr/developers/frontend-development/style-guide", + "l/tr/developers/frontend-development/folder-architecture-front", + "l/tr/developers/frontend-development/hotkeys" + ] + }, + { + "group": "Backend Development", + "pages": [ + "l/tr/developers/backend-development/server-commands", + "l/tr/developers/backend-development/feature-flags", + "l/tr/developers/backend-development/folder-architecture-server", + "l/tr/developers/backend-development/zapier", + "l/tr/developers/backend-development/best-practices-server", + "l/tr/developers/backend-development/custom-objects", + "l/tr/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] + }, + { + "language": "zh", + "tabs": [ + { + "tab": "用户指南", + "groups": [ + { + "group": "正在开始", + "icon": "rocket", + "pages": [ + "l/zh/user-guide/introduction", + "l/zh/user-guide/getting-started/what-is-twenty", + "l/zh/user-guide/getting-started/create-workspace", + "l/zh/user-guide/getting-started/getting-around-twenty", + "l/zh/user-guide/getting-started/configure-your-workspace", + "l/zh/user-guide/getting-started/implementation-services", + "l/zh/user-guide/getting-started/migrating-from-other-crms", + "l/zh/user-guide/getting-started/import-export-data" + ] + }, + { + "group": "数据模型", + "icon": "database", + "pages": [ + "l/zh/user-guide/data-model/customize-your-data-model", + "l/zh/user-guide/data-model/objects", + "l/zh/user-guide/data-model/fields", + "l/zh/user-guide/data-model/creating-records", + "l/zh/user-guide/data-model/relation-fields", + "l/zh/user-guide/data-model/data-model-faq" + ] + }, + { + "group": "CRM要点", + "icon": "users", + "pages": [ + "l/zh/user-guide/crm-essentials/contact-and-account-management", + "l/zh/user-guide/crm-essentials/pipeline", + "l/zh/user-guide/crm-essentials/view-management", + "l/zh/user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "group": "视图", + "icon": "table", + "pages": [ + "l/zh/user-guide/views/kanban-views", + "l/zh/user-guide/views/views-sort-filter" + ] + }, + { + "group": "工作流", + "icon": "bolt", + "pages": [ + "l/zh/user-guide/workflows/getting-started-workflows", + "l/zh/user-guide/workflows/workflow-features", + "l/zh/user-guide/workflows/internal-automations", + "l/zh/user-guide/workflows/external-tool-integration", + "l/zh/user-guide/workflows/workflow-troubleshooting", + "l/zh/user-guide/workflows/workflow-credits", + "l/zh/user-guide/workflows/professional-services" + ] + }, + { + "group": "协作", + "icon": "envelope", + "pages": [ + "l/zh/user-guide/collaboration/emails-and-calendars", + "l/zh/user-guide/collaboration/notes", + "l/zh/user-guide/collaboration/tasks" + ] + }, + { + "group": "集成和 API", + "icon": "plug", + "pages": [ + "l/zh/user-guide/integrations-api/apis-overview", + "l/zh/user-guide/integrations-api/api-webhooks", + "l/zh/user-guide/integrations-api/integrations" + ] + }, + { + "group": "报告", + "icon": "chart-bar", + "pages": [ + "l/zh/user-guide/reporting/reporting-overview" + ] + }, + { + "group": "设置", + "icon": "gear", + "pages": [ + "l/zh/user-guide/settings/profile-settings", + "l/zh/user-guide/settings/experience-settings", + "l/zh/user-guide/settings/email-calendar-setup", + "l/zh/user-guide/settings/workspace-settings", + "l/zh/user-guide/settings/member-management", + "l/zh/user-guide/settings/permissions", + "l/zh/user-guide/settings/domains-settings", + "l/zh/user-guide/settings/releases-settings", + "l/zh/user-guide/settings/settings-faq" + ] + }, + { + "group": "定价", + "icon": "credit-card", + "pages": [ + "l/zh/user-guide/pricing/billing-and-pricing-faq" + ] + }, + { + "group": "资源", + "icon": "book-open", + "pages": [ + "l/zh/user-guide/resources/glossary", + "l/zh/user-guide/resources/github" + ] + } + ] + }, + { + "tab": "开发者", + "groups": [ + { + "group": "开发者", + "pages": [] + }, + { + "group": "正在开始", + "icon": "rocket", + "pages": [ + "l/zh/developers/introduction", + "l/zh/developers/local-setup", + { + "group": "自我主机", + "pages": [ + "l/zh/developers/self-hosting/docker-compose", + "l/zh/developers/self-hosting/setup", + "l/zh/developers/self-hosting/upgrade-guide", + "l/zh/developers/self-hosting/cloud-providers", + "l/zh/developers/self-hosting/troubleshooting" + ] + }, + { + "group": "API 和 Webhooks", + "pages": [ + "l/zh/developers/api-and-webhooks/api", + "l/zh/developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "group": "贡献中", + "icon": "code-branch", + "pages": [ + "l/zh/developers/bug-and-requests", + { + "group": "前端开发", + "pages": [ + "l/zh/developers/frontend-development/storybook", + { + "group": "Twenty UI", + "pages": [ + "l/zh/twenty-ui/introduction", + { + "group": "显示", + "pages": [ + "l/zh/twenty-ui/display/checkmark", + "l/zh/twenty-ui/display/chip", + "l/zh/twenty-ui/display/icons", + "l/zh/twenty-ui/display/soon-pill", + "l/zh/twenty-ui/display/tag", + "l/zh/twenty-ui/display/app-tooltip" + ] + }, + { + "group": "反馈", + "pages": [ + "l/zh/twenty-ui/progress-bar" + ] + }, + { + "group": "Input", + "pages": [ + "l/zh/twenty-ui/input/buttons", + "l/zh/twenty-ui/input/color-scheme", + "l/zh/twenty-ui/input/text", + "l/zh/twenty-ui/input/checkbox", + "l/zh/twenty-ui/input/icon-picker", + "l/zh/twenty-ui/input/image-input", + "l/zh/twenty-ui/input/radio", + "l/zh/twenty-ui/input/select", + "l/zh/twenty-ui/input/toggle", + "l/zh/twenty-ui/input/block-editor" + ] + }, + { + "group": "Navigation", + "pages": [ + "l/zh/twenty-ui/navigation", + "l/zh/twenty-ui/navigation/breadcrumb", + "l/zh/twenty-ui/navigation/links", + "l/zh/twenty-ui/navigation/menu-item", + "l/zh/twenty-ui/navigation/navigation-bar", + "l/zh/twenty-ui/navigation/step-bar" + ] + } + ] + }, + "l/zh/developers/frontend-development/frontend-commands", + "l/zh/developers/frontend-development/work-with-figma", + "l/zh/developers/frontend-development/best-practices-front", + "l/zh/developers/frontend-development/style-guide", + "l/zh/developers/frontend-development/folder-architecture-front", + "l/zh/developers/frontend-development/hotkeys" + ] + }, + { + "group": "后端开发", + "pages": [ + "l/zh/developers/backend-development/server-commands", + "l/zh/developers/backend-development/feature-flags", + "l/zh/developers/backend-development/folder-architecture-server", + "l/zh/developers/backend-development/zapier", + "l/zh/developers/backend-development/best-practices-server", + "l/zh/developers/backend-development/custom-objects", + "l/zh/developers/backend-development/queue" + ] + } + ] + } + ] + } + ] } ] }, diff --git a/packages/twenty-docs/l/aa/navigation.json b/packages/twenty-docs/l/aa/navigation.json new file mode 100644 index 00000000000..bd1bdf71f32 --- /dev/null +++ b/packages/twenty-docs/l/aa/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "crwdns64362:0crwdne64362:0", + "groups": { + "gettingStarted": { + "label": "crwdns64364:0crwdne64364:0" + }, + "dataModel": { + "label": "crwdns64366:0crwdne64366:0" + }, + "crmEssentials": { + "label": "crwdns64368:0crwdne64368:0" + }, + "views": { + "label": "crwdns64370:0crwdne64370:0" + }, + "workflows": { + "label": "crwdns64372:0crwdne64372:0" + }, + "collaboration": { + "label": "crwdns64374:0crwdne64374:0" + }, + "integrationsApi": { + "label": "crwdns64376:0crwdne64376:0" + }, + "reporting": { + "label": "crwdns64378:0crwdne64378:0" + }, + "settings": { + "label": "crwdns64380:0crwdne64380:0" + }, + "pricing": { + "label": "crwdns64382:0crwdne64382:0" + }, + "resources": { + "label": "crwdns64384:0crwdne64384:0" + } + } + }, + "developers": { + "label": "crwdns64386:0crwdne64386:0", + "groups": { + "developersGroup": { + "label": "crwdns64388:0crwdne64388:0" + }, + "devGettingStarted": { + "label": "crwdns64390:0crwdne64390:0", + "groups": { + "selfHosting": { + "label": "crwdns64392:0crwdne64392:0" + }, + "apiAndWebhooks": { + "label": "crwdns64394:0crwdne64394:0" + } + } + }, + "contributing": { + "label": "crwdns64396:0crwdne64396:0", + "groups": { + "frontendDevelopment": { + "label": "crwdns64398:0crwdne64398:0", + "groups": { + "twentyUi": { + "label": "crwdns64400:0crwdne64400:0", + "groups": { + "display": { + "label": "crwdns64402:0crwdne64402:0" + }, + "feedback": { + "label": "crwdns64404:0crwdne64404:0" + }, + "input": { + "label": "crwdns64406:0crwdne64406:0" + }, + "navigation": { + "label": "crwdns64408:0crwdne64408:0" + } + } + } + } + }, + "backendDevelopment": { + "label": "crwdns64410:0crwdne64410:0" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/ar/navigation.json b/packages/twenty-docs/l/ar/navigation.json new file mode 100644 index 00000000000..56edda9b60c --- /dev/null +++ b/packages/twenty-docs/l/ar/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "دليل المستخدم", + "groups": { + "gettingStarted": { + "label": "البدء" + }, + "dataModel": { + "label": "نموذج البيانات" + }, + "crmEssentials": { + "label": "أساسيات CRM" + }, + "views": { + "label": "العروض" + }, + "workflows": { + "label": "سير العمل" + }, + "collaboration": { + "label": "التعاون" + }, + "integrationsApi": { + "label": "التكاملات & API" + }, + "reporting": { + "label": "التقارير" + }, + "settings": { + "label": "الإعدادات" + }, + "pricing": { + "label": "التسعير" + }, + "resources": { + "label": "الموارد" + } + } + }, + "developers": { + "label": "المطورون", + "groups": { + "developersGroup": { + "label": "المطورين" + }, + "devGettingStarted": { + "label": "بدء العمل", + "groups": { + "selfHosting": { + "label": "الاستضافة الذاتية" + }, + "apiAndWebhooks": { + "label": "API و Webhooks" + } + } + }, + "contributing": { + "label": "المساهمة", + "groups": { + "frontendDevelopment": { + "label": "تطوير الواجهة", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "عرض" + }, + "feedback": { + "label": "الملاحظات" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "تطوير الخلفية" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/ar/user-guide/workflows/workflow-troubleshooting.mdx b/packages/twenty-docs/l/ar/user-guide/workflows/workflow-troubleshooting.mdx index b105a4b1b30..2d4557a456b 100644 --- a/packages/twenty-docs/l/ar/user-guide/workflows/workflow-troubleshooting.mdx +++ b/packages/twenty-docs/l/ar/user-guide/workflows/workflow-troubleshooting.mdx @@ -57,7 +57,7 @@ sectionInfo: أتمتة العمليات والاندماج مع الأدوات **المشكلة**: الوصول إلى حد 100 سير عمل متزامن لكل مساحة عمل. -لا يمكنك تشغيل أكثر من 100 سير عمل بالتوازي في أي وقت لكل مساحة عمل. +لا يمكنك تشغيل أكثر من 100 سير عمل بالتوازي في أي وقت لكل مساحة عمل. **حلول**: diff --git a/packages/twenty-docs/l/cs/navigation.json b/packages/twenty-docs/l/cs/navigation.json new file mode 100644 index 00000000000..f5cc2e32722 --- /dev/null +++ b/packages/twenty-docs/l/cs/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Uživatelská příručka", + "groups": { + "gettingStarted": { + "label": "Začněme" + }, + "dataModel": { + "label": "Datový model" + }, + "crmEssentials": { + "label": "CRM základy" + }, + "views": { + "label": "Pohledy" + }, + "workflows": { + "label": "Pracovní postupy" + }, + "collaboration": { + "label": "Spolupráce" + }, + "integrationsApi": { + "label": "Integrace & API" + }, + "reporting": { + "label": "Reportování" + }, + "settings": { + "label": "Nastavení" + }, + "pricing": { + "label": "Ceny" + }, + "resources": { + "label": "Zdroje" + } + } + }, + "developers": { + "label": "Vývojáři", + "groups": { + "developersGroup": { + "label": "Vývojáři" + }, + "devGettingStarted": { + "label": "Začněme", + "groups": { + "selfHosting": { + "label": "Samohostování" + }, + "apiAndWebhooks": { + "label": "API a Webhooky" + } + } + }, + "contributing": { + "label": "Přispěje", + "groups": { + "frontendDevelopment": { + "label": "Vývoj frontendu", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Zobrazení" + }, + "feedback": { + "label": "Komentář" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Vývoj backendu" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/da/navigation.json b/packages/twenty-docs/l/da/navigation.json new file mode 100644 index 00000000000..3e104b2ea09 --- /dev/null +++ b/packages/twenty-docs/l/da/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Brugervejledning", + "groups": { + "gettingStarted": { + "label": "Kom i gang" + }, + "dataModel": { + "label": "Datamodel" + }, + "crmEssentials": { + "label": "CRM Essentials" + }, + "views": { + "label": "Visninger" + }, + "workflows": { + "label": "Arbejdsgange" + }, + "collaboration": { + "label": "Samarbejde" + }, + "integrationsApi": { + "label": "Integrationer Og API" + }, + "reporting": { + "label": "Rapportering" + }, + "settings": { + "label": "Indstillinger" + }, + "pricing": { + "label": "Prissætning" + }, + "resources": { + "label": "Ressourcer" + } + } + }, + "developers": { + "label": "Udviklere", + "groups": { + "developersGroup": { + "label": "Udviklere" + }, + "devGettingStarted": { + "label": "Kom i gang", + "groups": { + "selfHosting": { + "label": "Selv-Hosting" + }, + "apiAndWebhooks": { + "label": "API og Webhooks" + } + } + }, + "contributing": { + "label": "Bidrag", + "groups": { + "frontendDevelopment": { + "label": "Frontend Udvikling", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Vis" + }, + "feedback": { + "label": "Tilbagemelding" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Backend Udvikling" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/de/navigation.json b/packages/twenty-docs/l/de/navigation.json new file mode 100644 index 00000000000..bffc3d1c7f3 --- /dev/null +++ b/packages/twenty-docs/l/de/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Benutzerhandbuch", + "groups": { + "gettingStarted": { + "label": "Erste Schritte" + }, + "dataModel": { + "label": "Datenmodell" + }, + "crmEssentials": { + "label": "CRM-Grundlagen" + }, + "views": { + "label": "Ansichten" + }, + "workflows": { + "label": "Workflows" + }, + "collaboration": { + "label": "Zusammenarbeit" + }, + "integrationsApi": { + "label": "Integrationen & API" + }, + "reporting": { + "label": "Berichterstattung" + }, + "settings": { + "label": "Einstellungen" + }, + "pricing": { + "label": "Preisgestaltung" + }, + "resources": { + "label": "Ressourcen" + } + } + }, + "developers": { + "label": "Entwickler", + "groups": { + "developersGroup": { + "label": "Entwickler" + }, + "devGettingStarted": { + "label": "Erste Schritte", + "groups": { + "selfHosting": { + "label": "Selbst-Hosting" + }, + "apiAndWebhooks": { + "label": "API und Webhooks" + } + } + }, + "contributing": { + "label": "Mitwirken", + "groups": { + "frontendDevelopment": { + "label": "Frontend-Entwicklung", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Anzeige" + }, + "feedback": { + "label": "Feedback" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Backend-Entwicklung" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/el/navigation.json b/packages/twenty-docs/l/el/navigation.json new file mode 100644 index 00000000000..49ea743f20c --- /dev/null +++ b/packages/twenty-docs/l/el/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Οδηγός Χρήσης", + "groups": { + "gettingStarted": { + "label": "Ξεκινώντας" + }, + "dataModel": { + "label": "Μοντέλο Δεδομένων" + }, + "crmEssentials": { + "label": "Βασικά Στοιχεία CRM" + }, + "views": { + "label": "Προβολές" + }, + "workflows": { + "label": "Ροές Εργασίας" + }, + "collaboration": { + "label": "Συνεργασία" + }, + "integrationsApi": { + "label": "Ενσωματώσεις & API" + }, + "reporting": { + "label": "Αναφορά" + }, + "settings": { + "label": "Ρυθμίσεις" + }, + "pricing": { + "label": "Τιμολόγηση" + }, + "resources": { + "label": "Πόροι" + } + } + }, + "developers": { + "label": "Προγραμματιστές", + "groups": { + "developersGroup": { + "label": "Προγραμματιστές" + }, + "devGettingStarted": { + "label": "Ξεκινώντας", + "groups": { + "selfHosting": { + "label": "Αυτο-φιλοξενία" + }, + "apiAndWebhooks": { + "label": "API και Webhooks" + } + } + }, + "contributing": { + "label": "Συνεισφέροντας", + "groups": { + "frontendDevelopment": { + "label": "Ανάπτυξη Περιοχής Περιβάλλοντος", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Εμφάνιση" + }, + "feedback": { + "label": "Σχόλια" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Ανάπτυξη Συστήματος Υποστήριξης" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/es/navigation.json b/packages/twenty-docs/l/es/navigation.json new file mode 100644 index 00000000000..5bfa7cb7ea1 --- /dev/null +++ b/packages/twenty-docs/l/es/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Guía de usuario", + "groups": { + "gettingStarted": { + "label": "Comenzando" + }, + "dataModel": { + "label": "Modelo de datos" + }, + "crmEssentials": { + "label": "Esenciales de CRM" + }, + "views": { + "label": "Vistas" + }, + "workflows": { + "label": "Workflows" + }, + "collaboration": { + "label": "Colaboración" + }, + "integrationsApi": { + "label": "Integraciones y API" + }, + "reporting": { + "label": "Informes" + }, + "settings": { + "label": "Configuración" + }, + "pricing": { + "label": "Precios" + }, + "resources": { + "label": "Recursos" + } + } + }, + "developers": { + "label": "Desarrolladores", + "groups": { + "developersGroup": { + "label": "Desarrolladores" + }, + "devGettingStarted": { + "label": "Comenzando", + "groups": { + "selfHosting": { + "label": "Autoalojamiento" + }, + "apiAndWebhooks": { + "label": "API y Webhooks" + } + } + }, + "contributing": { + "label": "Contribuciones", + "groups": { + "frontendDevelopment": { + "label": "Desarrollo Frontend", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Mostrar" + }, + "feedback": { + "label": "Retroalimentación" + }, + "input": { + "label": "Entrada" + }, + "navigation": { + "label": "Navegación" + } + } + } + } + }, + "backendDevelopment": { + "label": "Desarrollo de backend" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/es/user-guide/settings/settings-faq.mdx b/packages/twenty-docs/l/es/user-guide/settings/settings-faq.mdx index c04282e91ac..da69f1c44e8 100644 --- a/packages/twenty-docs/l/es/user-guide/settings/settings-faq.mdx +++ b/packages/twenty-docs/l/es/user-guide/settings/settings-faq.mdx @@ -16,12 +16,12 @@ sectionInfo: Configura los ajustes y preferencias de tu espacio de trabajo en Tw Absolutamente. Puedes crear un nuevo espacio de trabajo haciendo clic en el menú desplegable en la parte superior izquierda de la pantalla (el que contiene el nombre de tu espacio de trabajo), en los tres puntos y luego en `Crear espacio de trabajo`. -Simplemente elimina los espacios de trabajo que ya no necesitas, puedes hacerlo en `Configuración → Configuración del espacio de trabajo`. +Ve a `Configuración → Experiencia` para personalizar: -No elimines tu cuenta (accesible en Configuración → Configuración de perfil): tu cuenta se comparte entre los diferentes espacios de trabajo. +No elimines tu cuenta (accesible en Configuración → Configuración de perfil): tu cuenta se comparte entre los diferentes espacios de trabajo. -Si solo deseas desactivar tu espacio de trabajo (no eliminarlo), ve a `Configuración → Facturación` y haz clic en `Cancelar plan`. +Si solo deseas desactivar tu espacio de trabajo (no eliminarlo), ve a `Configuración → Facturación` y haz clic en `Cancelar plan`. Puedes hacerlo en `Configuración → Configuración del espacio de trabajo`. ¡Esperamos verte pronto, gracias por probar Twenty! @@ -63,10 +63,6 @@ Sí! Ve a `Configuración → Dominios` para configurar un dominio personalizado Las funciones de laboratorio son capacidades experimentales que puedes probar antes de que sean lanzadas oficialmente. Accede a ellas en `Configuración → Lanzamientos → Laboratorio`. Funciones como la selección de Carpetas de mensajes son estables y útiles, pero recuerda que las funciones de laboratorio pueden cambiar o ser eliminadas en futuros lanzamientos. -Ve a `Configuración → Experiencia` para personalizar: -- **Tema**: Claro, oscuro o basado en el sistema -- **Configuraciones Regionales**: Idioma, zona horaria, formatos de fecha/número -- **Formato del Calendario**: Primer día de la semana, formato de hora (12/24 horas) - +**Formato del Calendario**: Primer día de la semana, formato de hora (12/24 horas) diff --git a/packages/twenty-docs/l/es/user-guide/workflows/workflow-troubleshooting.mdx b/packages/twenty-docs/l/es/user-guide/workflows/workflow-troubleshooting.mdx index 8d3fa3aded4..d9fa09bbcca 100644 --- a/packages/twenty-docs/l/es/user-guide/workflows/workflow-troubleshooting.mdx +++ b/packages/twenty-docs/l/es/user-guide/workflows/workflow-troubleshooting.mdx @@ -57,7 +57,7 @@ Los formularios están diseñados actualmente solo para disparadores manuales. P **Problema**: Se alcanza el límite de 100 flujos de trabajo concurrentes por espacio de trabajo. -No puedes ejecutar más de 100 flujos de trabajo en paralelo en cualquier momento por espacio de trabajo. +No puedes ejecutar más de 100 flujos de trabajo en paralelo en cualquier momento por espacio de trabajo. **Soluciones**: diff --git a/packages/twenty-docs/l/fi/navigation.json b/packages/twenty-docs/l/fi/navigation.json new file mode 100644 index 00000000000..d37145c08e9 --- /dev/null +++ b/packages/twenty-docs/l/fi/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Käyttäjän Opas", + "groups": { + "gettingStarted": { + "label": "Aloittaminen" + }, + "dataModel": { + "label": "Tietomalli" + }, + "crmEssentials": { + "label": "CRM Essentials" + }, + "views": { + "label": "Näkymät" + }, + "workflows": { + "label": "Työnkulut" + }, + "collaboration": { + "label": "Yhteistyö" + }, + "integrationsApi": { + "label": "Integraatiot & API" + }, + "reporting": { + "label": "Raportointi" + }, + "settings": { + "label": "Asetukset" + }, + "pricing": { + "label": "Hinnoittelu" + }, + "resources": { + "label": "Resurssit" + } + } + }, + "developers": { + "label": "Kehittäjät", + "groups": { + "developersGroup": { + "label": "Kehittäjät" + }, + "devGettingStarted": { + "label": "Aloittaminen", + "groups": { + "selfHosting": { + "label": "Itsehoitava" + }, + "apiAndWebhooks": { + "label": "API ja verkkokoukut" + } + } + }, + "contributing": { + "label": "Osallistuminen", + "groups": { + "frontendDevelopment": { + "label": "Julkisivun Kehitys", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Näyttö" + }, + "feedback": { + "label": "Palaute" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Taustaosan Kehitys" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/fr/navigation.json b/packages/twenty-docs/l/fr/navigation.json new file mode 100644 index 00000000000..1c7f64dad9d --- /dev/null +++ b/packages/twenty-docs/l/fr/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Guide de l'utilisateur", + "groups": { + "gettingStarted": { + "label": "Commencer" + }, + "dataModel": { + "label": "Modèle de données" + }, + "crmEssentials": { + "label": "Essentiels du CRM" + }, + "views": { + "label": "Vues" + }, + "workflows": { + "label": "Flux de travail" + }, + "collaboration": { + "label": "Collaboration" + }, + "integrationsApi": { + "label": "Intégrations & API" + }, + "reporting": { + "label": "Rapports" + }, + "settings": { + "label": "Paramètres" + }, + "pricing": { + "label": "Tarifs" + }, + "resources": { + "label": "Ressources" + } + } + }, + "developers": { + "label": "Développeurs", + "groups": { + "developersGroup": { + "label": "Développeurs" + }, + "devGettingStarted": { + "label": "Commencer", + "groups": { + "selfHosting": { + "label": "Auto-hébergement" + }, + "apiAndWebhooks": { + "label": "API et webhooks" + } + } + }, + "contributing": { + "label": "Contribuer", + "groups": { + "frontendDevelopment": { + "label": "Développement du frontend", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Afficher" + }, + "feedback": { + "label": "Vos commentaires" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Développement du backend" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/it/navigation.json b/packages/twenty-docs/l/it/navigation.json new file mode 100644 index 00000000000..42201c9dac4 --- /dev/null +++ b/packages/twenty-docs/l/it/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Guida Utente", + "groups": { + "gettingStarted": { + "label": "Per Iniziare" + }, + "dataModel": { + "label": "Modello dati" + }, + "crmEssentials": { + "label": "Essentials CRM" + }, + "views": { + "label": "Viste" + }, + "workflows": { + "label": "Workflows" + }, + "collaboration": { + "label": "Collaborazione" + }, + "integrationsApi": { + "label": "Integrazioni & API" + }, + "reporting": { + "label": "Reportistica" + }, + "settings": { + "label": "Impostazioni" + }, + "pricing": { + "label": "Prezzi" + }, + "resources": { + "label": "Risorse" + } + } + }, + "developers": { + "label": "Sviluppatori", + "groups": { + "developersGroup": { + "label": "Sviluppatori" + }, + "devGettingStarted": { + "label": "Per Iniziare", + "groups": { + "selfHosting": { + "label": "Auto-Hosting" + }, + "apiAndWebhooks": { + "label": "API e Webhook" + } + } + }, + "contributing": { + "label": "Contribuire", + "groups": { + "frontendDevelopment": { + "label": "Sviluppo Frontend", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Visualizzazione" + }, + "feedback": { + "label": "Feedback" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Sviluppo Backend" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/ja/developers/backend-development/feature-flags.mdx b/packages/twenty-docs/l/ja/developers/backend-development/feature-flags.mdx index b24afaed597..a72b4899f80 100644 --- a/packages/twenty-docs/l/ja/developers/backend-development/feature-flags.mdx +++ b/packages/twenty-docs/l/ja/developers/backend-development/feature-flags.mdx @@ -7,7 +7,7 @@ image: /images/user-guide/table-views/table.png Header -機能フラグは試験的な機能を隠すために使用されます。 Twentyでは、それらはワークスペースレベルで設定されており、ユーザーレベルではありません。 +機能フラグは試験的な機能を隠すために使用されます。 機能フラグは試験的な機能を隠すために使用されます。 Twentyでは、それらはワークスペースレベルで設定されており、ユーザーレベルではありません。 ## 新しい機能フラグの追加 diff --git a/packages/twenty-docs/l/ja/developers/backend-development/server-commands.mdx b/packages/twenty-docs/l/ja/developers/backend-development/server-commands.mdx index a77dc8c2ed9..92199471dfc 100644 --- a/packages/twenty-docs/l/ja/developers/backend-development/server-commands.mdx +++ b/packages/twenty-docs/l/ja/developers/backend-development/server-commands.mdx @@ -9,6 +9,7 @@ image: /images/user-guide/kanban-views/kanban.png ## 便利なコマンド +これらのコマンドは packages/twenty-server フォルダから実行してください。 これらのコマンドは packages/twenty-server フォルダから実行してください。 From any other folder you can run `npx nx {command} twenty-server` (or `npx nx run twenty-server:{command}`). @@ -76,7 +77,7 @@ npx nx run twenty-server:command workspace:sync-metadata -f Twenty は主にバックエンドに NestJS を使用しています。 -最初に使用した ORM は Prisma でした。 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. 現在のプロジェクトでは TypeORM を使用しています。 +最初に使用した ORM は Prisma でした。 最初に使用した ORM は Prisma でした。 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. 現在のプロジェクトでは TypeORM を使用しています。 現在の技術スタックは次のようになっています。 diff --git a/packages/twenty-docs/l/ja/developers/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/ja/developers/frontend-development/best-practices-front.mdx index 2365569305b..607e5d8f884 100644 --- a/packages/twenty-docs/l/ja/developers/frontend-development/best-practices-front.mdx +++ b/packages/twenty-docs/l/ja/developers/frontend-development/best-practices-front.mdx @@ -152,7 +152,7 @@ Recoil ファミリー状態とセレクターは、再レンダリングを回 ## コンソールログ -`console.log` は開発中において、変数の値やコードの流れについてリアルタイムの洞察を提供するために有効です。 しかし、これをプロダクションコードに残すと、いくつかの問題を引き起こす可能性があります。 +`console.log` は開発中において、変数の値やコードの流れについてリアルタイムの洞察を提供するために有効です。 しかし、これをプロダクションコードに残すと、いくつかの問題を引き起こす可能性があります。 しかし、これをプロダクションコードに残すと、いくつかの問題を引き起こす可能性があります。 1. **パフォーマンス**: 過剰なログはクライアントサイドアプリケーションのランタイムパフォーマンスに影響を与える可能性があります。 @@ -263,7 +263,7 @@ Reactがコンポーネントを認識するためには、PascalCaseを使用 ## プロップのドリリングを最小限に抑える -Reactのコンテキストでのプロップドリリングとは、多くのコンポーネントレイヤーを通じて状態変数やそのセットを渡すことを意味します。中間のコンポーネントがそれを使用していない場合であってもです。 時には必要ですが、過度のプロップドリリングは次の結果を導きかねません。 +Reactのコンテキストでのプロップドリリングとは、多くのコンポーネントレイヤーを通じて状態変数やそのセットを渡すことを意味します。中間のコンポーネントがそれを使用していない場合であってもです。 時には必要ですが、過度のプロップドリリングは次の結果を導きかねません。 時には必要ですが、過度のプロップドリリングは次の結果を導きかねません。 1. **可読性の低下**:プロップがどこから始まり、どこで使われているかを追跡するのが、深くネストされたコンポーネント構造では複雑になり得ます。 diff --git a/packages/twenty-docs/l/ja/developers/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/ja/developers/frontend-development/hotkeys.mdx index 9d2280f83a3..c0b5927d63e 100644 --- a/packages/twenty-docs/l/ja/developers/frontend-development/hotkeys.mdx +++ b/packages/twenty-docs/l/ja/developers/frontend-development/hotkeys.mdx @@ -138,7 +138,7 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => { ## ホットキースコープとは? -ホットキースコープは、ホットキーがアクティブなコンテキストを表す文字列です。 通常、enumとしてエンコードされます。 +ホットキースコープは、ホットキーがアクティブなコンテキストを表す文字列です。 通常、enumとしてエンコードされます。 通常、enumとしてエンコードされます。 ホットキースコープを変更すると、このスコープをリッスンしているホットキーが有効になり、他のスコープをリッスンしているホットキーが無効になります。 @@ -174,7 +174,7 @@ export const currentHotkeyScopeState = createState({ }); ``` -しかし、このRecoilステートは手動で処理しないでください! 次のセクションでその使用方法を見ていきます。 +しかし、このRecoilステートは手動で処理しないでください! 次のセクションでその使用方法を見ていきます。 次のセクションでその使用方法を見ていきます。 ## 内部的にはどう機能しているのか? diff --git a/packages/twenty-docs/l/ja/developers/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/ja/developers/frontend-development/work-with-figma.mdx index 8e0fe0e1058..c40df065a6b 100644 --- a/packages/twenty-docs/l/ja/developers/frontend-development/work-with-figma.mdx +++ b/packages/twenty-docs/l/ja/developers/frontend-development/work-with-figma.mdx @@ -10,6 +10,7 @@ image: /images/user-guide/objects/objects.png Figma は、デザイナーと開発者の間のコミュニケーションの壁を埋めるのを助ける協働インターフェース設計ツールです。 このガイドは、Figma を使って共同作業する方法を説明します。 +このガイドは、Figma を使って共同作業する方法を説明します。 ## アクセス @@ -25,11 +26,11 @@ Figma は、デザイナーと開発者の間のコミュニケーションの ## Figma 構造 -左側のサイドバーで、Twenty の Figma の異なるページにアクセスできます。 それらは次のように整理されています: +左側のサイドバーで、Twenty の Figma の異なるページにアクセスできます。 それらは次のように整理されています: それらは次のように整理されています: - **コンポーネントページ:** これは最初のページです。 デザイナーはこれを使用して、デザインファイル全体で使用される再利用可能なデザイン要素を作成および整理します。 例えば、ボタン、アイコン、シンボル、またはその他の再利用可能なコンポーネントとして使用されます。 これにより、デザイン全体で一貫性を保つことができます。 -- **メインページ:** 2 番目のページはメインページで、プロジェクトの完全なユーザーインターフェースを示しています。 _**再生**_ を押すことで、アプリプロトタイプを完全に使用できます。 -- **特徴ページ:** その他のページは、通常、進行中の機能に専念しています。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 +- **メインページ:** 2 番目のページはメインページで、プロジェクトの完全なユーザーインターフェースを示しています。 _**再生**_ を押すことで、アプリプロトタイプを完全に使用できます。 _**再生**_ を押すことで、アプリプロトタイプを完全に使用できます。 +- **特徴ページ:** その他のページは、通常、進行中の機能に専念しています。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 ## 役立つヒント @@ -58,8 +59,9 @@ Figma プラットフォームの学習に関するより包括的な詳細と [Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension) を使用すると、デザインファイルのナビゲート、検査、デザイナーとのコラボレーション、変更の追跡、実装の促進ができます - すべてをテキストエディターから離れることなく行えます。 これは推奨拡張機能の一部です。 +これは推奨拡張機能の一部です。 ## コラボレーション 1. **コメントの使用:** ツールバーの左側にあるバブルアイコンをクリックしてコメント機能を使用できます。 -2. **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 +2. **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 diff --git a/packages/twenty-docs/l/ja/developers/self-hosting/cloud-providers.mdx b/packages/twenty-docs/l/ja/developers/self-hosting/cloud-providers.mdx index 2fec6c670aa..97e0d3dcb3e 100644 --- a/packages/twenty-docs/l/ja/developers/self-hosting/cloud-providers.mdx +++ b/packages/twenty-docs/l/ja/developers/self-hosting/cloud-providers.mdx @@ -8,7 +8,9 @@ image: /images/user-guide/notes/notes_header.png + このドキュメントはコミュニティによって管理されています。 問題を含む可能性があります。 + 問題を含む可能性があります。 ## Terraformとマニフェストを通したKubernetes @@ -17,7 +19,7 @@ Kubernetesデプロイメントに関するコミュニティ主導のドキュ ### Coolify -Coolifyを使用してサーバーにTwentyをデプロイします。 (Coolify上の公式イメージは近日公開予定です) +Coolifyを使用してサーバーにTwentyをデプロイします。 (Coolify上の公式イメージは近日公開予定です) (Coolify上の公式イメージは近日公開予定です) [Coolifyのドキュメント](https://coolify.io/docs/get-started/introduction) diff --git a/packages/twenty-docs/l/ja/navigation.json b/packages/twenty-docs/l/ja/navigation.json new file mode 100644 index 00000000000..ce12486516a --- /dev/null +++ b/packages/twenty-docs/l/ja/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "ユーザーガイド", + "groups": { + "gettingStarted": { + "label": "始めに" + }, + "dataModel": { + "label": "データモデル" + }, + "crmEssentials": { + "label": "CRM の基本" + }, + "views": { + "label": "ビュー" + }, + "workflows": { + "label": "ワークフロー" + }, + "collaboration": { + "label": "コラボレーション" + }, + "integrationsApi": { + "label": "連携とAPI" + }, + "reporting": { + "label": "レポーティング" + }, + "settings": { + "label": "設定" + }, + "pricing": { + "label": "料金" + }, + "resources": { + "label": "リソース" + } + } + }, + "developers": { + "label": "開発者", + "groups": { + "developersGroup": { + "label": "開発者" + }, + "devGettingStarted": { + "label": "始めに", + "groups": { + "selfHosting": { + "label": "セルフホスティング" + }, + "apiAndWebhooks": { + "label": "APIとWebhooks" + } + } + }, + "contributing": { + "label": "貢献", + "groups": { + "frontendDevelopment": { + "label": "フロントエンド開発", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "表示" + }, + "feedback": { + "label": "フィードバック" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "バックエンド開発" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx index 66048cc6571..5f170e5cc27 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/display/app-tooltip.mdx @@ -51,7 +51,7 @@ export const MyComponent = () => { | noArrow | ブール型 | `true`の場合、ツールチップの矢印を非表示にします | | isOpen | ブール型 | `true`の場合、ツールチップはデフォルトで開かれています | | place | `react-tooltip`からの`PlacesType`文字列 | ツールチップの配置を指定します。 値は`bottom`、`left`、`right`、`top`、`top-start`、`top-end`、`right-start`、`right-end`、`bottom-start`、`bottom-end`、`left-start`、`left-end`などがあります | -| positionStrategy | `react-tooltip`からの`PositionStrategy`文字列 | ツールチップの位置戦略。 2つの値があります: `absolute` と `fixed` | +| positionStrategy | `react-tooltip`からの`PositionStrategy`文字列 | ツールチップの位置戦略。 ツールチップの位置戦略。 2つの値があります: `absolute` と `fixed` | diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx index 0488e7a246a..bac96ece60b 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/display/chip.mdx @@ -38,15 +38,15 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| ------------ | ----------------------- | -------------------------------------------------------- | -| linkToEntity | string | エンティティへのリンク | -| entityId | string | エンティティの一意識別子 | -| 名前 | string | エンティティの名前 | -| pictureUrl | string | 写真", | -| avatarType | アバタータイプ | 表示したいアバターのタイプ。 オプションは2つ:`rounded` と `squared` | -| バリアント | `EntityChipVariant` 列挙型 | 表示したいエンティティチップのバリアント。 オプションは2つ:`regular` と `transparent` | -| 左アイコン | アイコンコンポーネント | アイコンを表す React コンポーネント。 チップの左側に表示されます | +| プロパティ | タイプ | 説明 | +| ------------ | ----------------------- | ------------------------------------------------------------------------------ | +| linkToEntity | string | エンティティへのリンク | +| entityId | string | エンティティの一意識別子 | +| 名前 | string | エンティティの名前 | +| pictureUrl | string | 写真", | +| avatarType | アバタータイプ | 表示したいアバターのタイプ。 表示したいアバターのタイプ。 オプションは2つ:`rounded` と `squared` | +| バリアント | `EntityChipVariant` 列挙型 | 表示したいエンティティチップのバリアント。 表示したいエンティティチップのバリアント。 オプションは2つ:`regular` と `transparent` | +| 左アイコン | アイコンコンポーネント | アイコンを表す React コンポーネント。 チップの左側に表示されます チップの左側に表示されます | @@ -134,15 +134,15 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| ------------ | ----------------------- | -------------------------------------------------------- | -| linkToEntity | string | エンティティへのリンク | -| entityId | string | エンティティの一意識別子 | -| 名前 | string | エンティティの名前 | -| pictureUrl | string | 写真", | -| avatarType | アバタータイプ | 表示したいアバターのタイプ。 オプションは2つ:`rounded` と `squared` | -| バリアント | `EntityChipVariant` 列挙型 | 表示したいエンティティチップのバリアント。 オプションは2つ:`regular` と `transparent` | -| 左アイコン | アイコンコンポーネント | アイコンを表す React コンポーネント。 チップの左側に表示されます | +| プロパティ | タイプ | 説明 | +| ------------ | ----------------------- | ------------------------------------------------------------------------------ | +| linkToEntity | string | エンティティへのリンク | +| entityId | string | エンティティの一意識別子 | +| 名前 | string | エンティティの名前 | +| pictureUrl | string | 写真", | +| avatarType | アバタータイプ | 表示したいアバターのタイプ。 表示したいアバターのタイプ。 オプションは2つ:`rounded` と `squared` | +| バリアント | `EntityChipVariant` 列挙型 | 表示したいエンティティチップのバリアント。 表示したいエンティティチップのバリアント。 オプションは2つ:`regular` と `transparent` | +| 左アイコン | アイコンコンポーネント | アイコンを表す React コンポーネント。 チップの左側に表示されます チップの左側に表示されます | diff --git a/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx index 20c22996c9d..e7177a695ab 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/display/tag.mdx @@ -32,12 +32,12 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| --------- | ------ | ---------------------------------------------------------------------------------------------- | -| className | string | 追加のスタイリングのためのオプション名 | -| カラー | string | タグの色。 オプションは次のとおりです: `緑`, `トルコ石`, `空`, `青`, `紫`, `ピンク`, `赤`, `オレンジ`, `黄`, `灰色` | -| テキスト | string | タグの内容 | -| onClick | 機能 | ユーザーがタグをクリックすると呼び出される任意の関数 | +| プロパティ | タイプ | 説明 | +| --------- | ------ | ---------------------------------------------------------------------------------------------------- | +| className | string | 追加のスタイリングのためのオプション名 | +| カラー | string | タグの色。 タグの色。 オプションは次のとおりです: `緑`, `トルコ石`, `空`, `青`, `紫`, `ピンク`, `赤`, `オレンジ`, `黄`, `灰色` | +| テキスト | string | タグの内容 | +| onClick | 機能 | ユーザーがタグをクリックすると呼び出される任意の関数 | diff --git a/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx index c5df7a58ff5..7e9671ba0cd 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/input/icon-picker.mdx @@ -42,15 +42,15 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| --------------- | ------ | ------------------------------------------------------------------------------ | -| disabled | ブール型 | `true` に設定されるとアイコンピッカーは無効になります | -| onChange | 機能 | ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります | -| selectedIconKey | string | 最初に選択されたアイコンのキー | -| onClickOutside | 機能 | ユーザーがドロップダウン外をクリックしたときにトリガーされるコールバック関数 | -| onClose | 機能 | ドロップダウンが閉じられたときにトリガーされるコールバック関数 | -| onOpen | 機能 | ドロップダウンが開かれたときにトリガーされるコールバック関数 | -| バリアント | string | クリック可能なアイコンのビジュアルスタイルバリアント。 オプションには `primary`、 `secondary`、 `tertiary` が含まれます | +| プロパティ | タイプ | 説明 | +| --------------- | ------ | ---------------------------------------------------------------------------------------------------------------- | +| disabled | ブール型 | `true` に設定されるとアイコンピッカーは無効になります | +| onChange | 機能 | ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります | +| selectedIconKey | string | 最初に選択されたアイコンのキー | +| onClickOutside | 機能 | ユーザーがドロップダウン外をクリックしたときにトリガーされるコールバック関数 | +| onClose | 機能 | ドロップダウンが閉じられたときにトリガーされるコールバック関数 | +| onOpen | 機能 | ドロップダウンが開かれたときにトリガーされるコールバック関数 | +| バリアント | string | クリック可能なアイコンのビジュアルスタイルバリアント。 オプションには `primary`、 `secondary`、 `tertiary` が含まれます | diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx index a1bcaa0888a..86a937de600 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx @@ -35,10 +35,10 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| --------- | ------ | --------------------------------------------------------------------------------------------------------------------- | -| className | string | 追加のスタイリングのためのオプションクラス名 | -| リンク | array | 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトには `children` プロパティ(リンクのテキストコンテンツ)とオプションの `href` プロパティ(リンクをクリックしたときに移動するURL)が含まれています。 | +| プロパティ | タイプ | 説明 | +| --------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------- | +| className | string | 追加のスタイリングのためのオプションクラス名 | +| リンク | array | 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトには `children` プロパティ(リンクのテキストコンテンツ)とオプションの `href` プロパティ(リンクをクリックしたときに移動するURL)が含まれています。 | diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx index d07f21f822a..3e3fa350e8d 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx @@ -157,12 +157,12 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| -------- | ----------------- | ------------------------------------------------------- | -| href | string | リンクのターゲットURLまたはパス | -| children | `React.ReactNode` | リンク内に表示されるコンテンツ | -| タイプ | string | ソーシャルリンクの種類です。 オプションには、`url`、`LinkedIn`、`Twitter`があります。 | -| onClick | 機能 | リンクがクリックされるとトリガーされるコールバック関数 | +| プロパティ | タイプ | 説明 | +| -------- | ----------------- | ---------------------------------------------------------------------- | +| href | string | リンクのターゲットURLまたはパス | +| children | `React.ReactNode` | リンク内に表示されるコンテンツ | +| タイプ | string | ソーシャルリンクの種類です。 ソーシャルリンクの種類です。 オプションには、`url`、`LinkedIn`、`Twitter`があります。 | +| onClick | 機能 | リンクがクリックされるとトリガーされるコールバック関数 | diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx index 39b1be481ec..86c7477760a 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/navigation-bar.mdx @@ -43,10 +43,10 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| -------------- | ------ | ------------------------------------------------------------------------------------------------------------------- | -| activeItemName | string | 現在アクティブなナビゲーション項目の名前 | -| アイテム | array | 各ナビゲーションアイテムを表すオブジェクトの配列。 各オブジェクトには、アイテムの `name`、表示する `Icon` コンポーネント、およびアイテムがクリックされたときに呼び出される `onClick` 関数が含まれています。 | +| プロパティ | タイプ | 説明 | +| -------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------- | +| activeItemName | string | 現在アクティブなナビゲーション項目の名前 | +| アイテム | array | 各ナビゲーションアイテムを表すオブジェクトの配列。 各ナビゲーションアイテムを表すオブジェクトの配列。 各オブジェクトには、アイテムの `name`、表示する `Icon` コンポーネント、およびアイテムがクリックされたときに呼び出される `onClick` 関数が含まれています。 | diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx index a1506864d58..02348b2e420 100644 --- a/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx +++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/step-bar.mdx @@ -7,7 +7,7 @@ image: /images/user-guide/api/api.png Header -アクティブなステップをハイライトして、一連の番号付きステップの進行状況を表示します。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 +アクティブなステップをハイライトして、一連の番号付きステップの進行状況を表示します。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 @@ -30,9 +30,9 @@ export const MyComponent = () => { -| プロパティ | タイプ | 説明 | -| --------- | --- | ----------------------------------------------------- | -| アクティブステップ | 数 | 現在アクティブなステップのインデックス。 これにより、どのステップを視覚的にハイライトするかが決まります。 | +| プロパティ | タイプ | 説明 | +| --------- | --- | -------------------------------------------------------------------------------------- | +| アクティブステップ | 数 | 現在アクティブなステップのインデックス。 これにより、どのステップを視覚的にハイライトするかが決まります。 これにより、どのステップを視覚的にハイライトするかが決まります。 | diff --git a/packages/twenty-docs/l/ja/user-guide/collaboration/emails-and-calendars.mdx b/packages/twenty-docs/l/ja/user-guide/collaboration/emails-and-calendars.mdx index 1af01afedce..08fc20ffa77 100644 --- a/packages/twenty-docs/l/ja/user-guide/collaboration/emails-and-calendars.mdx +++ b/packages/twenty-docs/l/ja/user-guide/collaboration/emails-and-calendars.mdx @@ -21,7 +21,7 @@ Twentyは、接続されたメールボックスからのメールを関連す - **人物**:特定の連絡先との交換されたすべてのメールを表示 - **会社**:会社およびその従業員に関連するすべてのメールを表示 -- **機会**:この機会にリンクされた会社に関連するメールスレッドにアクセス。 この機会での個人のメールスレッドはまだ表示されません。 +- **機会**:この機会にリンクされた会社に関連するメールスレッドにアクセス。 この機会での個人のメールスレッドはまだ表示されません。 この機会での個人のメールスレッドはまだ表示されません。 ### メールスレッドの表示 diff --git a/packages/twenty-docs/l/ja/user-guide/crm-essentials/contact-and-account-management.mdx b/packages/twenty-docs/l/ja/user-guide/crm-essentials/contact-and-account-management.mdx index 693d4ea02af..f0d693c25bd 100644 --- a/packages/twenty-docs/l/ja/user-guide/crm-essentials/contact-and-account-management.mdx +++ b/packages/twenty-docs/l/ja/user-guide/crm-essentials/contact-and-account-management.mdx @@ -21,21 +21,21 @@ Twentyを使用し始めると、連絡先と会社をシステムに取り込 ### CSVインポート -スプレッドシートや他のシステムから既存のデータがある場合、CSVインポートが最も速いオプションです。 ExcelやGoogleシートでデータを準備して、一度にアップロードできます。 これは、別のCRMから移行する場合や、誰かがスプレッドシートで連絡先を追跡していた場合に特に便利です。 [データのインポート/エクスポート](/l/ja/user-guide/getting-started/import-export-data) ガイドがその手順を説明します。 +スプレッドシートや他のシステムから既存のデータがある場合、CSVインポートが最も速いオプションです。 ExcelやGoogleシートでデータを準備して、一度にアップロードできます。 これは、別のCRMから移行する場合や、誰かがスプレッドシートで連絡先を追跡していた場合に特に便利です。 [データのインポート/エクスポート](/l/ja/user-guide/getting-started/import-export-data) ガイドがその手順を説明します。 ExcelやGoogleシートでデータを準備して、一度にアップロードできます。 これは、別のCRMから移行する場合や、誰かがスプレッドシートで連絡先を追跡していた場合に特に便利です。 [データのインポート/エクスポート](/l/ja/user-guide/getting-started/import-export-data) ガイドがその手順を説明します。 ### 自動データキャプチャ 継続的なリード生成のために、データを直接Twentyに取り込む自動化ワークフローを設定できます。 -**ウェブサイトフォーム**:ウェブサイトで誰かがフォームを記入すると、その情報をTwentyに自動的に送信するように設定できます。 フォームの送信がウェブフックをトリガーし、Twentyでワークフローを起動し、手動作業なしで新規連絡先レコードを作成します。 +**ウェブサイトフォーム**:ウェブサイトで誰かがフォームを記入すると、その情報をTwentyに自動的に送信するように設定できます。 フォームの送信がウェブフックをトリガーし、Twentyでワークフローを起動し、手動作業なしで新規連絡先レコードを作成します。 フォームの送信がウェブフックをトリガーし、Twentyでワークフローを起動し、手動作業なしで新規連絡先レコードを作成します。 -**他のシステムとの連携**:他のビジネスツールを使用している場合、API呼び出しとワークフローを使ってTwentyに接続できます。 これにより、システム間でデータを自動的に同期できます。例えば、請求システムから新しい顧客を、またはマーケティングプラットフォームからリードを取り込むことができます。 +**他のシステムとの連携**:他のビジネスツールを使用している場合、API呼び出しとワークフローを使ってTwentyに接続できます。 これにより、システム間でデータを自動的に同期できます。例えば、請求システムから新しい顧客を、またはマーケティングプラットフォームからリードを取り込むことができます。 これにより、システム間でデータを自動的に同期できます。例えば、請求システムから新しい顧客を、またはマーケティングプラットフォームからリードを取り込むことができます。 こうした自動データフローの設定方法の詳細は、[ワークフロー](/l/ja/user-guide/workflows/getting-started-workflows) セクションをご覧ください。 ### メールとカレンダーの同期 -メールボックスとカレンダーをTwentyに接続すると、システムが自動的にメールしたり会ったりした人の `People` と `Companies` レコードを作成できます。 CRMにまだ存在しない相手にメールを送信した場合、その人のために新しい `People` レコードを作成できます。 新しい連絡先との会議をカレンダーでスケジュールする際にも同じことが起こります。 +メールボックスとカレンダーをTwentyに接続すると、システムが自動的にメールしたり会ったりした人の `People` と `Companies` レコードを作成できます。 メールボックスとカレンダーをTwentyに接続すると、システムが自動的にメールしたり会ったりした人の `People` と `Companies` レコードを作成できます。 CRMにまだ存在しない相手にメールを送信した場合、その人のために新しい `People` レコードを作成できます。 新しい連絡先との会議をカレンダーでスケジュールする際にも同じことが起こります。 新しい連絡先との会議をカレンダーでスケジュールする際にも同じことが起こります。 これは常に新しい人々に会う営業や事業開発チームに特に便利です。 すべての新しい連絡先を手動で追加する代わりに、Twentyがコミュニケーション中に自動的に取得します。 これを設定する方法を学ぶには、[メールとカレンダー](/l/ja/user-guide/collaboration/emails-and-calendars) ガイドを参照してください。 @@ -49,11 +49,11 @@ Twentyを使用し始めると、連絡先と会社をシステムに取り込 Twentyは自動的に一意性を強制し、データを整理します。 それぞれの人のメールアドレスは一意の識別子として機能します。同じメールを持つ2人の人がいることはできません。 同様に、会社のドメインも一意であるため、誤って重複する会社を作成することはありません。 -ビジネスニーズに応じて他のフィールドを一意にする必要がある場合(電話番号やリファレンスコードなど)、データモデルでこれを設定できます。 お使いのビジネスニーズに応じた追加の一意性制約を設定する方法は、[データモデル](/l/ja/user-guide/data-model/customize-your-data-model) セクションをご覧ください。 +ビジネスニーズに応じて他のフィールドを一意にする必要がある場合(電話番号やリファレンスコードなど)、データモデルでこれを設定できます。 お使いのビジネスニーズに応じた追加の一意性制約を設定する方法は、[データモデル](/l/ja/user-guide/data-model/customize-your-data-model) セクションをご覧ください。 お使いのビジネスニーズに応じた追加の一意性制約を設定する方法は、[データモデル](/l/ja/user-guide/data-model/customize-your-data-model) セクションをご覧ください。 ### 重複の処理 -時々、重複するレコードを持つことになります。 Twentyには、`People` と `Companies` のマージ機能があります。情報を失うことなく重複したレコードを組み合わせて、データベースをクリーンに保つことができます。 +時々、重複するレコードを持つことになります。 時々、重複するレコードを持つことになります。 Twentyには、`People` と `Companies` のマージ機能があります。情報を失うことなく重複したレコードを組み合わせて、データベースをクリーンに保つことができます。 レコードをマージするには、2つのレコードを選択し、Macの場合は `Cmd+K`、Windowsの場合は `Ctrl+K` のコマンドメニューを開き、`Merge Records` をクリックしてください。 @@ -63,7 +63,7 @@ Twentyは自動的に一意性を強制し、データを整理します。 そ ### ビューのカスタマイズ -異なるチームメンバーが異なる情報を見る必要があるかもしれません。 異なる目的のために異なる列を示すカスタムビューを作成できます。例えば、営業チームは取引ステージを見る必要がある一方、サポートチームは連絡先の詳細に焦点を当てることがあります。 詳細については、[ビュー管理](/l/ja/user-guide/crm-essentials/view-management) 記事をご覧ください。 +異なるチームメンバーが異なる情報を見る必要があるかもしれません。 異なるチームメンバーが異なる情報を見る必要があるかもしれません。 異なる目的のために異なる列を示すカスタムビューを作成できます。例えば、営業チームは取引ステージを見る必要がある一方、サポートチームは連絡先の詳細に焦点を当てることがあります。 詳細については、[ビュー管理](/l/ja/user-guide/crm-essentials/view-management) 記事をご覧ください。 詳細については、[ビュー管理](/l/ja/user-guide/crm-essentials/view-management) 記事をご覧ください。 ## レコードを扱う @@ -80,7 +80,7 @@ Twentyは自動的に一意性を強制し、データを整理します。 そ - **メール**: この連絡先とのメールスレッド(チームがメールボックスを接続している場合) - **カレンダー**: このコンタクトとのミーティングとアポイントメント -メールとカレンダーのタブは特に強力です: チーム内の誰かがTwentyにメールボックスを接続した場合、すべてのメール交換とミーティングを自動的に表示します。 この設定方法については、[メールとカレンダー](/l/ja/user-guide/collaboration/emails-and-calendars)ガイドで詳しく学べます。 +メールとカレンダーのタブは特に強力です: チーム内の誰かがTwentyにメールボックスを接続した場合、すべてのメール交換とミーティングを自動的に表示します。 この設定方法については、[メールとカレンダー](/l/ja/user-guide/collaboration/emails-and-calendars)ガイドで詳しく学べます。 この設定方法については、[メールとカレンダー](/l/ja/user-guide/collaboration/emails-and-calendars)ガイドで詳しく学べます。 ### 必要なフィールドを追加する @@ -88,8 +88,8 @@ Twentyは自動的に一意性を強制し、データを整理します。 そ ## 削除されたレコードの管理 -Twentyでレコードを削除すると、それは永遠に消えるわけではありません。 レコードは「ソフト削除」され、非表示になりますが、必要に応じて復元可能です。 +Twentyでレコードを削除すると、それは永遠に消えるわけではありません。 レコードは「ソフト削除」され、非表示になりますが、必要に応じて復元可能です。 レコードは「ソフト削除」され、非表示になりますが、必要に応じて復元可能です。 -削除されたレコードにアクセスするには、Macではコマンドメニュー `Cmd+K` を、Windowsでは `Ctrl+K` を開いた後、`削除されたレコードを表示` をクリックします。 そこから、レコードを復元するか、必要ないと確信した場合は完全に削除することができます。 +削除されたレコードにアクセスするには、Macではコマンドメニュー `Cmd+K` を、Windowsでは `Ctrl+K` を開いた後、`削除されたレコードを表示` をクリックします。 そこから、レコードを復元するか、必要ないと確信した場合は完全に削除することができます。 そこから、レコードを復元するか、必要ないと確信した場合は完全に削除することができます。 このセーフティネットにより、重要な情報を誤って失うことを心配せずにデータベースを整理できます。 diff --git a/packages/twenty-docs/l/ja/user-guide/crm-essentials/sales-use-cases.mdx b/packages/twenty-docs/l/ja/user-guide/crm-essentials/sales-use-cases.mdx index b51d9abe290..0632c2ddb79 100644 --- a/packages/twenty-docs/l/ja/user-guide/crm-essentials/sales-use-cases.mdx +++ b/packages/twenty-docs/l/ja/user-guide/crm-essentials/sales-use-cases.mdx @@ -13,4 +13,4 @@ sectionInfo: "リード、販売、顧客を管理するための基本的な CR GTM チームは、リードスコアリング、データエンリッチメント、ラウンドロビン、テリトリー割り当て、自動リマインダー、メールシーケンスなどの高度な販売機能をしばしば必要とします。 これらは Twenty に組み込まれた機能ではありませんが、柔軟なワークフローシステムを使用して、すべてを特定のニーズに合わせて設定および調整することができます。 -これらの自動化をステップバイステップで構築する方法については、[ワークフローセクション](/l/ja/user-guide/workflows/getting-started-workflows)をご覧ください。 詳細例については、[内部自動化](/l/ja/user-guide/workflows/internal-automations) および [外部ツール統合](/l/ja/user-guide/workflows/external-tool-integration) ガイドをご覧ください。 +これらの自動化をステップバイステップで構築する方法については、[ワークフローセクション](/l/ja/user-guide/workflows/getting-started-workflows)をご覧ください。 詳細例については、[内部自動化](/l/ja/user-guide/workflows/internal-automations) および [外部ツール統合](/l/ja/user-guide/workflows/external-tool-integration) ガイドをご覧ください。 詳細例については、[内部自動化](/l/ja/user-guide/workflows/internal-automations) および [外部ツール統合](/l/ja/user-guide/workflows/external-tool-integration) ガイドをご覧ください。 diff --git a/packages/twenty-docs/l/ja/user-guide/data-model/customize-your-data-model.mdx b/packages/twenty-docs/l/ja/user-guide/data-model/customize-your-data-model.mdx index 625b8086184..e21bad22eaf 100644 --- a/packages/twenty-docs/l/ja/user-guide/data-model/customize-your-data-model.mdx +++ b/packages/twenty-docs/l/ja/user-guide/data-model/customize-your-data-model.mdx @@ -11,7 +11,7 @@ sectionInfo: 柔軟なデータモデルは、独自のビジネスプロセス ## データモデルとは何ですか? -データモデルは、CRMにおける情報がどのように整理されるかを定義する構造です。 それは、どのオブジェクトが存在するか(会社、人、機会など)、それらが持つプロパティ(フィールド)が何か、そしてそれらがどのように関連しているかを決定します。 それを顧客データの地図として考えることができます。 +データモデルは、CRMにおける情報がどのように整理されるかを定義する構造です。 それは、どのオブジェクトが存在するか(会社、人、機会など)、それらが持つプロパティ(フィールド)が何か、そしてそれらがどのように関連しているかを決定します。 それを顧客データの地図として考えることができます。 それは、どのオブジェクトが存在するか(会社、人、機会など)、それらが持つプロパティ(フィールド)が何か、そしてそれらがどのように関連しているかを決定します。 それを顧客データの地図として考えることができます。 ## なぜデータモデルをカスタマイズすべきですか? @@ -20,17 +20,17 @@ Twentyは、日常をサポートする最適なデータモデルを形成す ## データモデルを設計するためのヒント -データモデルを構築する方法は一つだけではありません。 以下のヒントを参考にして自分のモデルを構築してください。 +データモデルを構築する方法は一つだけではありません。 以下のヒントを参考にして自分のモデルを構築してください。 以下のヒントを参考にして自分のモデルを構築してください。 **1. 主要なオブジェクトから始めましょう。** あなたが扱う主要な概念を特定します(例:会社、人、機会)。 これら3つのオブジェクトは頻繁に使用されるため既に利用可能です。 しかし、必要な他のオブジェクトについても考えてみてください。 例:Stripeではオブジェクト`サブスクリプション`が、Airbnbではオブジェクト`旅行`が、スタートアップアクセラレーターではオブジェクト`バッチ`が必要でしょう。 **2. バリエーションにはフィールドを使い、新しいオブジェクトは使わないでください。** -既存のオブジェクトの特性に過ぎないもの(例:会社の「業種」や機会の「ステータス」)はフィールドにします。 カテゴリ、ラベル、属性にはフィールドが最適です。 +既存のオブジェクトの特性に過ぎないもの(例:会社の「業種」や機会の「ステータス」)はフィールドにします。 カテゴリ、ラベル、属性にはフィールドが最適です。 カテゴリ、ラベル、属性にはフィールドが最適です。 **3. 単独で存在する場合には新しいオブジェクトを作成してください。** -概念が独自のライフサイクル、プロパティ、または関係を持つ場合、それは通常オブジェクトに値します。 例えば: +概念が独自のライフサイクル、プロパティ、または関係を持つ場合、それは通常オブジェクトに値します。 例えば: 例えば: - **プロジェクト**:独自の期限、所有者、タスクを持つもの - **サブスクリプション**:会社、製品、請求書を結ぶもの @@ -39,16 +39,16 @@ Twentyは、日常をサポートする最適なデータモデルを形成す これらは単一のフィールドを超えており、独自のデータと関係を有しています。 **4. 関連するレコードの数が不定である場合にオブジェクトを作成します。** -リンクする回数が多く、その数が不明な場合、独自のオブジェクトとする方が良いです。 例えば、`製品1`や`製品2`などといったフィールドを作成する代わりに、`製品`オブジェクトを定義し、元のレコードに関連付けてください。 こうすることにより、1つでも100の製品があっても、モデルを変更せずにサポートできます。 +リンクする回数が多く、その数が不明な場合、独自のオブジェクトとする方が良いです。 例えば、`製品1`や`製品2`などといったフィールドを作成する代わりに、`製品`オブジェクトを定義し、元のレコードに関連付けてください。 こうすることにより、1つでも100の製品があっても、モデルを変更せずにサポートできます。 例えば、`製品1`や`製品2`などといったフィールドを作成する代わりに、`製品`オブジェクトを定義し、元のレコードに関連付けてください。 こうすることにより、1つでも100の製品があっても、モデルを変更せずにサポートできます。 **5. まずはシンプルに保ちましょう。** -フィールドから始めます。 フィールドが多すぎたり、記録が繰り返されたり、関係が収まらないと感じたときに新しいオブジェクトに移行します。 +フィールドから始めます。 フィールドが多すぎたり、記録が繰り返されたり、関係が収まらないと感じたときに新しいオブジェクトに移行します。 フィールドが多すぎたり、記録が繰り返されたり、関係が収まらないと感じたときに新しいオブジェクトに移行します。 ### 人、会社、機会に関する特別な注意事項 -- **`人`、`会社`、`機会`は、メールボックスやカレンダーから同期されたメールと会議にアクセスできる唯一のオブジェクトです。** できるだけこれらを使用することをお勧めします。 `人`や`会社`のカテゴリを作成する必要がある場合は、新しいオブジェクトよりもフィールドを使用してください。 +- **`人`、`会社`、`機会`は、メールボックスやカレンダーから同期されたメールと会議にアクセスできる唯一のオブジェクトです。** できるだけこれらを使用することをお勧めします。 `人`や`会社`のカテゴリを作成する必要がある場合は、新しいオブジェクトよりもフィールドを使用してください。 `人`や`会社`のカテゴリを作成する必要がある場合は、新しいオブジェクトよりもフィールドを使用してください。 - 例:`人`オブジェクトは、見込み客やパートナーの両方に使用するのが最適で、「人物の種類」というフィールドを追加します。 `パートナー`オブジェクトを作成しないでください。そうするとメールスレッドにアクセスできなくなります。 代わりに、`人`に以下のような異なるビューを作成します:1つはパートナーを表示し、もう1つは見込み客を表示します。 + 例:`人`オブジェクトは、見込み客やパートナーの両方に使用するのが最適で、「人物の種類」というフィールドを追加します。 例:`人`オブジェクトは、見込み客やパートナーの両方に使用するのが最適で、「人物の種類」というフィールドを追加します。 `パートナー`オブジェクトを作成しないでください。そうするとメールスレッドにアクセスできなくなります。 代わりに、`人`に以下のような異なるビューを作成します:1つはパートナーを表示し、もう1つは見込み客を表示します。 代わりに、`人`に以下のような異なるビューを作成します:1つはパートナーを表示し、もう1つは見込み客を表示します。 - 上記の点を考慮すると、すべての記録に適用されないフィールドがあってもかまいません。 例:`人`の下では、`人物タイプ = パートナー`のときにのみ関連する`紹介リンク`フィールドを追加することができます。 これで問題ありません: 必要のないビューからこのフィールドを非表示にすることができます。 ### 選択を導く質問 @@ -64,6 +64,6 @@ Twentyは、日常をサポートする最適なデータモデルを形成す ## 助けが必要ですか? -私たちのチームは、必要なデータモデルの設計と作成を支援します。 私たちのオンボーディングパックを[ここ](https://twenty.com/onboarding-packages)で紹介しています。 +私たちのチームは、必要なデータモデルの設計と作成を支援します。 私たちのオンボーディングパックを[ここ](https://twenty.com/onboarding-packages)で紹介しています。 私たちのオンボーディングパックを[ここ](https://twenty.com/onboarding-packages)で紹介しています。 diff --git a/packages/twenty-docs/l/ja/user-guide/resources/glossary.mdx b/packages/twenty-docs/l/ja/user-guide/resources/glossary.mdx index b8a0cee9f59..dfa84cb8662 100644 --- a/packages/twenty-docs/l/ja/user-guide/resources/glossary.mdx +++ b/packages/twenty-docs/l/ja/user-guide/resources/glossary.mdx @@ -46,11 +46,11 @@ CRMには基本的な2つの種類のレコードがあります: ## かんばん -`Kanban`は、カンバン方式でカードとコラムを使用してビジネスプロセスを視覚的に追跡する方法です。 各コラムはプロセスの各ステージ(例:新規、進行中、勝利、敗北)を表し、レコードをこれらのステージに進めながら移動させます。 +`Kanban`は、カンバン方式でカードとコラムを使用してビジネスプロセスを視覚的に追跡する方法です。 各コラムはプロセスの各ステージ(例:新規、進行中、勝利、敗北)を表し、レコードをこれらのステージに進めながら移動させます。 各コラムはプロセスの各ステージ(例:新規、進行中、勝利、敗北)を表し、レコードをこれらのステージに進めながら移動させます。 ## オブジェクト -オブジェクトは、CRMにおける特定のエンティティを表すデータ構造です(例:人々、会社、機会)。 オブジェクトは標準(ビルトイン)またはカスタム(あなたによって作成)することができます。 +オブジェクトは、CRMにおける特定のエンティティを表すデータ構造です(例:人々、会社、機会)。 オブジェクトは標準(ビルトイン)またはカスタム(あなたによって作成)することができます。 オブジェクトは標準(ビルトイン)またはカスタム(あなたによって作成)することができます。 ## 商談 @@ -91,5 +91,5 @@ Webhooksは、特定のイベントが発生したときにTwentyから他のア ## ワークスペースメンバー -ワークスペースメンバーは、ワークスペースにアクセスできるチームのTwentyユーザーです。 それらはレコードの所有者またはアサインとして割り当てることができます。 +ワークスペースメンバーは、ワークスペースにアクセスできるチームのTwentyユーザーです。 それらはレコードの所有者またはアサインとして割り当てることができます。 それらはレコードの所有者またはアサインとして割り当てることができます。 diff --git a/packages/twenty-docs/l/ja/user-guide/workflows/external-tool-integration.mdx b/packages/twenty-docs/l/ja/user-guide/workflows/external-tool-integration.mdx index cedf0e25e1b..059d29c1126 100644 --- a/packages/twenty-docs/l/ja/user-guide/workflows/external-tool-integration.mdx +++ b/packages/twenty-docs/l/ja/user-guide/workflows/external-tool-integration.mdx @@ -217,4 +217,4 @@ sectionInfo: プロセスを自動化し、外部ツールと統合します - ワークスペースにつき100の同時ワークフロー制限を覚えておく - 複数のレコードを処理する際には手動トリガーに「バルク」提供を利用(詳細については[Workflow Features](/l/ja/user-guide/workflows/workflow-features)を参照) - ワークフローがアクティブになる前にサンプルデータでテスト -統合問題のトラブルシューティングについては、[Workflow Troubleshooting](/l/ja/user-guide/workflows/workflow-troubleshooting)ガイドをご覧ください。 複雑な統合を実装するためのサポートが必要な場合は、[Professional Services](/l/ja/user-guide/workflows/professional-services)を検討してください。 +統合問題のトラブルシューティングについては、[Workflow Troubleshooting](/l/ja/user-guide/workflows/workflow-troubleshooting)ガイドをご覧ください。 複雑な統合を実装するためのサポートが必要な場合は、[Professional Services](/l/ja/user-guide/workflows/professional-services)を検討してください。 複雑な統合を実装するためのサポートが必要な場合は、[Professional Services](/l/ja/user-guide/workflows/professional-services)を検討してください。 diff --git a/packages/twenty-docs/l/nl/navigation.json b/packages/twenty-docs/l/nl/navigation.json new file mode 100644 index 00000000000..ddca441efd9 --- /dev/null +++ b/packages/twenty-docs/l/nl/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Gebruikers gids", + "groups": { + "gettingStarted": { + "label": "Aan de slag" + }, + "dataModel": { + "label": "Gegevensmodel" + }, + "crmEssentials": { + "label": "CRM-essentials" + }, + "views": { + "label": "Weergaven" + }, + "workflows": { + "label": "Workstrooms" + }, + "collaboration": { + "label": "Samenwerking" + }, + "integrationsApi": { + "label": "Integraties & API" + }, + "reporting": { + "label": "Rapportage" + }, + "settings": { + "label": "Instellingen" + }, + "pricing": { + "label": "Prijzen" + }, + "resources": { + "label": "Bronnen" + } + } + }, + "developers": { + "label": "Ontwikkelaars", + "groups": { + "developersGroup": { + "label": "Ontwikkelaars" + }, + "devGettingStarted": { + "label": "Aan de slag", + "groups": { + "selfHosting": { + "label": "Zelfhosting" + }, + "apiAndWebhooks": { + "label": "API en Webhooks" + } + } + }, + "contributing": { + "label": "Bijdragen", + "groups": { + "frontendDevelopment": { + "label": "Frontend ontwikkeling", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Weergeven" + }, + "feedback": { + "label": "Terugkoppeling" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Backend Ontwikkeling" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/no/navigation.json b/packages/twenty-docs/l/no/navigation.json new file mode 100644 index 00000000000..3c2de3dde2f --- /dev/null +++ b/packages/twenty-docs/l/no/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Bruker Guide", + "groups": { + "gettingStarted": { + "label": "Komme i gang" + }, + "dataModel": { + "label": "Datamodell" + }, + "crmEssentials": { + "label": "CRM Essentials" + }, + "views": { + "label": "Visninger" + }, + "workflows": { + "label": "Arbeidsflyter" + }, + "collaboration": { + "label": "Samarbeid" + }, + "integrationsApi": { + "label": "Integrasjoner & API" + }, + "reporting": { + "label": "Rapportering" + }, + "settings": { + "label": "Innstillinger" + }, + "pricing": { + "label": "Priser" + }, + "resources": { + "label": "Ressurser" + } + } + }, + "developers": { + "label": "Utviklere", + "groups": { + "developersGroup": { + "label": "Utviklere" + }, + "devGettingStarted": { + "label": "Komme i gang", + "groups": { + "selfHosting": { + "label": "Egen hosting" + }, + "apiAndWebhooks": { + "label": "API og Webhooks" + } + } + }, + "contributing": { + "label": "Bidra", + "groups": { + "frontendDevelopment": { + "label": "Frontend utvikling", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Visning" + }, + "feedback": { + "label": "Tilbakemelding" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Backend utvikling" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/pl/navigation.json b/packages/twenty-docs/l/pl/navigation.json new file mode 100644 index 00000000000..71c7bcd1f8b --- /dev/null +++ b/packages/twenty-docs/l/pl/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Poradnik użytkownika", + "groups": { + "gettingStarted": { + "label": "Pierwsze kroki" + }, + "dataModel": { + "label": "Model danych" + }, + "crmEssentials": { + "label": "CRM Essentials" + }, + "views": { + "label": "Widoki" + }, + "workflows": { + "label": "Przepływy pracy" + }, + "collaboration": { + "label": "Współpraca" + }, + "integrationsApi": { + "label": "Integracje i API" + }, + "reporting": { + "label": "Raportowanie" + }, + "settings": { + "label": "Ustawienia" + }, + "pricing": { + "label": "Cennik" + }, + "resources": { + "label": "Zasoby" + } + } + }, + "developers": { + "label": "Deweloperzy", + "groups": { + "developersGroup": { + "label": "Deweloperzy" + }, + "devGettingStarted": { + "label": "Pierwsze kroki", + "groups": { + "selfHosting": { + "label": "Samodzielne hostowanie" + }, + "apiAndWebhooks": { + "label": "API i Webhooki" + } + } + }, + "contributing": { + "label": "Przyczynianie się", + "groups": { + "frontendDevelopment": { + "label": "Rozwój Frontendu", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Wyświetl" + }, + "feedback": { + "label": "Informacje zwrotne" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Rozwój zaplecza" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/pt/developers/api-and-webhooks/webhooks.mdx b/packages/twenty-docs/l/pt/developers/api-and-webhooks/webhooks.mdx index 07d399aca39..2e924a27b8d 100644 --- a/packages/twenty-docs/l/pt/developers/api-and-webhooks/webhooks.mdx +++ b/packages/twenty-docs/l/pt/developers/api-and-webhooks/webhooks.mdx @@ -10,31 +10,31 @@ info: Descubra como usar nossos Webhooks. ## Visão geral -Os webhooks no Twenty complementam a API ao permitir **notificações em tempo real** para suas próprias aplicações quando certos eventos acontecem em seu CRM. Em vez de continuar a perguntar à API sobre alterações, você pode configurar webhooks para que o Twenty **envie** dados para seu sistema sempre que eventos específicos ocorrerem (por exemplo, quando um novo registro é criado ou um registro existente é atualizado). Isso ajuda a manter os sistemas externos em sincronia com o Twenty de forma instantânea e eficiente. +Os webhooks no Twenty complementam a API permitindo **notificações em tempo real** para suas próprias aplicações quando certos eventos acontecem no seu CRM. Em vez de consultar continuamente a API por alterações, você pode configurar webhooks para que o Twenty **envie** dados para o seu sistema sempre que eventos específicos ocorrerem (por exemplo, quando um novo registro é criado ou um registro existente é atualizado). Isso ajuda a manter os sistemas externos sincronizados com o Twenty de maneira instantânea e eficiente. -Com webhooks, o Twenty enviará uma solicitação HTTP POST para um URL que você especificar, contendo detalhes sobre o evento. Você pode então manipular esses dados em sua aplicação (por exemplo, para atualizar seu banco de dados externo, acionar fluxos de trabalho ou enviar alertas). +Com webhooks, o Twenty enviará uma solicitação HTTP POST para uma URL que você especificar, contendo detalhes sobre o evento. Depois, você pode manipular esses dados em sua aplicação (por exemplo, para atualizar seu banco de dados externo, acionar fluxos de trabalho ou enviar alertas). ## Configurando um Webhook -Para criar um webhook no Twenty, use as configurações de **APIs & Webhooks** em seu aplicativo Twenty: +Para criar um webhook no Twenty, use as configurações de **APIs & Webhooks** no seu aplicativo Twenty: -1. **Vá para Configurações:** No seu aplicativo Twenty, vá para **Configurações → APIs & Webhooks**. +1. **Navegue até Configurações:** No seu aplicativo Twenty, vá para **Configurações → APIs & Webhooks**. 2. **Crie um Webhook:** Sob **Webhooks** clique em **+ Criar webhook**. -3. **Digite o URL:** Forneça o endpoint URL no seu servidor onde você deseja que o Twenty envie solicitações de webhook. Este deve ser um URL publicamente acessível que pode lidar com solicitações POST. +3. **Insira a URL:** Forneça a URL do endpoint no seu servidor onde você deseja que o Twenty envie solicitações de webhook. Esta deve ser uma URL acessível publicamente que possa manejar solicitações POST. 4. **Salvar:** Clique em **Salvar** para criar o webhook. O novo webhook estará ativo imediatamente. -Você pode criar vários webhooks se precisar enviar eventos diferentes para diferentes endpoints. Cada webhook é essencialmente uma assinatura para todos os eventos relevantes (neste momento, o Twenty envia todos os tipos de eventos para o URL fornecido; o filtro de tipos de eventos específicos pode ser configurável na UI). Se você precisar remover um webhook, poderá excluí-lo da mesma página de configurações (selecione o webhook e escolha excluir). +Você pode criar múltiplos webhooks se precisar enviar diferentes eventos para diferentes endpoints. Cada webhook é essencialmente uma inscrição para todos os eventos relevantes (neste momento, o Twenty envia todos os tipos de eventos para a URL fornecida; filtrar tipos específicos de eventos pode ser configurável na UI). Se algum dia precisar remover um webhook, você pode deletá-lo através da mesma página de configurações (selecione o webhook e escolha deletar). -## Events and Payloads +## Eventos e Cargas -Uma vez que um webhook esteja configurado, o Twenty enviará uma solicitação HTTP POST para o URL especificado sempre que um evento disparador ocorrer em seus dados CRM. Eventos comuns que disparam webhooks incluem: +Uma vez que um webhook está configurado, o Twenty enviará uma solicitação HTTP POST para a URL especificada sempre que um evento de gatilho ocorrer em seus dados de CRM. Eventos comuns que disparam webhooks incluem: - **Registro Criado:** por exemplo, uma nova pessoa é adicionada (`person.created`), uma nova empresa é criada (`company.created`), uma nota é criada (`note.created`), etc. -- **Registro Atualizado:** por exemplo, as informações de uma pessoa existente são atualizadas (`person.updated`), o registro de uma empresa é editado (`company.updated`), etc. -- **Registro Excluído:** por exemplo, uma pessoa ou empresa é excluída (`person.deleted`, `company.deleted`). +- **Registro Atualizado:** por exemplo, as informações de uma pessoa existente são atualizadas (`person.updated`), um registro de empresa é editado (`company.updated`), etc. +- **Registro Deletado:** por exemplo, uma pessoa ou empresa é deletada (`person.deleted`, `company.deleted`). - **Outros Eventos:** Se aplicável, outros eventos de objetos ou gatilhos personalizados (por exemplo, se tarefas ou outros objetos forem atualizados, tipos de eventos semelhantes seriam usados como `task.created`, `note.updated`, etc.). -A solicitação POST do webhook contém uma carga útil JSON em seu corpo. A carga útil geralmente incluirá pelo menos duas coisas: o tipo de evento e os dados relacionados a esse evento (geralmente o registro que foi criado/atualizado). Por exemplo, um webhook para uma pessoa recém-criada pode enviar uma carga útil como: +A solicitação POST do webhook contém uma carga JSON em seu corpo. A carga geralmente incluirá pelo menos duas coisas: o tipo de evento e os dados relacionados a esse evento (geralmente o registro que foi criado/atualizado). Por exemplo, um webhook para uma pessoa recém-criada pode enviar uma carga como: ``` { @@ -54,24 +54,24 @@ A solicitação POST do webhook contém uma carga útil JSON em seu corpo. A car Neste exemplo: - `"event"` especifica o que aconteceu (`person.created`). -- `"data"` contém os detalhes do novo registro (as mesmas informações que você obteria se solicitasse essa pessoa via a API). -- `"timestamp"` é quando o evento ocorreu (em UTC). +- `"data"` contém os detalhes do novo registro (as mesmas informações que você obteria se solicitasse essa pessoa via API). +- `"timestamp"` indica quando o evento ocorreu (em UTC). -Seu endpoint deve estar preparado para receber esses dados JSON via POST. Normalmente, você analisará o JSON, observará o tipo de `"event"` para entender o que aconteceu e então usará os `"data"` conforme necessário (por exemplo, criar um novo contato em seu sistema ou atualizar um já existente). +Seu endpoint deve estar preparado para receber tais dados JSON via POST. Geralmente, você irá analisar o JSON, observar o tipo de `"event"` para entender o que aconteceu e então usar os `"data"` conforme necessário (por exemplo, criar um novo contato no seu sistema ou atualizar um existente). -**Nota:** É importante responder com um **status HTTP 2xx** do seu endpoint de webhook para reconhecer o recebimento bem-sucedido. Se o remetente de webhook do Twenty não obtiver uma resposta 2xx, ele pode considerar a entrega falhada. (In the future, retry logic might attempt to resend failed webhooks, so always strive to return a 200 OK as quickly as possible after processing the data.) +**Nota:** É importante responder com um **status HTTP 2xx** do seu endpoint de webhook para reconhecer o recebimento bem-sucedido. Se o remetente do webhook Twenty não obter uma resposta 2xx, ele pode considerar que a entrega falhou. (No futuro, uma lógica de repetição pode tentar reenviar webhooks falhados, então sempre esforce-se para retornar um 200 OK assim que possível após processar os dados.) ## Validação de Webhook -Para garantir a segurança de seus endpoints de webhook, o Twenty inclui uma assinatura no cabeçalho `X-Twenty-Webhook-Signature`. +Para assegurar a segurança dos seus endpoints de webhook, o Twenty inclui uma assinatura no cabeçalho `X-Twenty-Webhook-Signature`. -Essa assinatura é um hash HMAC SHA256 da carga útil da solicitação, computado usando seu segredo de webhook. +Essa assinatura é um hash HMAC SHA256 da carga da solicitação, computado usando seu segredo de webhook. Para validar a assinatura, você precisará: -1. Concatenar o timestamp (do cabeçalho `X-Twenty-Webhook-Timestamp`), uma cólon, e a string JSON da carga útil -2. Calcular o hash HMAC SHA256 usando seu segredo de webhook como chave -3. Comparar o digest hexadecimal resultante com o cabeçalho da assinatura +1. Concatenar o timestamp (do cabeçalho `X-Twenty-Webhook-Timestamp`), uma cólon e a string JSON da carga +2. Computar o hash HMAC SHA256 usando seu segredo de webhook como chave. +3. Comparar o digest em hexadecimal resultante com o cabeçalho da assinatura. Aqui está um exemplo em Node.js: diff --git a/packages/twenty-docs/l/pt/developers/bug-and-requests.mdx b/packages/twenty-docs/l/pt/developers/bug-and-requests.mdx index d8bad44e104..b6042c5817c 100644 --- a/packages/twenty-docs/l/pt/developers/bug-and-requests.mdx +++ b/packages/twenty-docs/l/pt/developers/bug-and-requests.mdx @@ -1,5 +1,5 @@ --- -title: Bugs e Solicitações +title: Bugs e Solicitações de Funcionalidades image: /images/user-guide/api/api.png info: Peça ajuda no GitHub ou Discord --- @@ -8,12 +8,12 @@ info: Peça ajuda no GitHub ou Discord Header -## Reporting Bugs +## Relatar Erros -Para relatar um bug, por favor [crie um problema no GitHub](https://github.com/twentyhq/twenty/issues/new). +Para relatar um erro, por favor [crie um problema no GitHub](https://github.com/twentyhq/twenty/issues/new). Você também pode pedir ajuda no [Discord](https://discord.gg/cx5n4Jzs57). -## Solicitações de Recursos +## Solicitações de Funcionalidades -Se você não tem certeza se é um bug, e acha que está mais próximo de uma solicitação de recurso, então você provavelmente deveria [abrir uma discussão em vez disso](https://github.com/twentyhq/twenty/discussions/new). +Se você não tem certeza se é um erro e sente que está mais próximo de uma solicitação de funcionalidade, então você provavelmente deve [abrir uma discussão em vez disso](https://github.com/twentyhq/twenty/discussions/new). diff --git a/packages/twenty-docs/l/pt/developers/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/pt/developers/frontend-development/folder-architecture-front.mdx index 3b2e2240fe9..bfd9db2232d 100644 --- a/packages/twenty-docs/l/pt/developers/frontend-development/folder-architecture-front.mdx +++ b/packages/twenty-docs/l/pt/developers/frontend-development/folder-architecture-front.mdx @@ -1,6 +1,6 @@ --- title: Arquitetura de Pastas -info: Uma visão detalhada da nossa arquitetura de pastas +info: Um olhar detalhado sobre nossa arquitetura de pastas image: /images/user-guide/fields/field.png --- @@ -8,9 +8,9 @@ image: /images/user-guide/fields/field.png Header -Neste guia, você explorará os detalhes da estrutura de diretórios do projeto e como ela contribui para a organização e manutenção do Twenty. +Neste guia, você explorará os detalhes da estrutura de diretórios do projeto e como isso contribui para a organização e manutenção do Twenty. -Ao seguir esta convenção de arquitetura de pastas, é mais fácil encontrar os arquivos relacionados a recursos específicos e garantir que o aplicativo seja escalável e de fácil manutenção. +Seguindo esta convenção de arquitetura de pastas, é mais fácil encontrar os arquivos relacionados a funcionalidades específicas e garantir que a aplicação seja escalável e sustentável. ``` front @@ -29,12 +29,12 @@ front ## Páginas -Inclui os componentes de nível superior definidos pelas rotas da aplicação. Eles importam mais componentes de baixo nível da pasta de módulos (mais detalhes abaixo). +Inclui os componentes de nível superior definidos pelas rotas da aplicação. Eles importam componentes mais de baixo nível da pasta de módulos (mais detalhes abaixo). ## Módulos -Cada módulo representa um recurso ou um grupo de recursos, compreendendo seus componentes específicos, estados e lógica operacional. -Todos devem seguir a estrutura abaixo. Você pode aninhar módulos dentro de módulos (referido como submódulos) e as mesmas regras se aplicarão. +Cada módulo representa uma funcionalidade ou um grupo de funcionalidades, compreendendo seus componentes específicos, estados e lógica operacional. +Todos devem seguir a estrutura abaixo. Você pode aninhar módulos dentro de módulos (referidos como submódulos) e as mesmas regras se aplicarão. ``` module1 @@ -57,58 +57,58 @@ module1 ### Contextos -Um contexto é uma forma de passar dados através da árvore de componentes sem precisar passar props manualmente em cada nível. +Um contexto é uma maneira de passar dados através da árvore de componentes sem ter que passar propriedades manualmente em cada nível. -See [React Context](https://react.dev/reference/react#context-hooks) for more details. +Veja [React Context](https://react.dev/reference/react#context-hooks) para mais detalhes. -### GraphQL +### "GraphQL" Inclui fragmentos, consultas e mutações. -See [GraphQL](https://graphql.org/learn/) for more details. +Veja [GraphQL](https://graphql.org/learn/) para mais detalhes. - Fragmentos -Um fragmento é uma parte reutilizável de uma consulta, que pode ser usada em diferentes lugares. Ao usar fragmentos, é mais fácil evitar duplicação de código. +Um fragmento é uma parte reutilizável de uma consulta, que você pode usar em diferentes lugares. Usando fragmentos, é mais fácil evitar duplicar código. -See [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) for more details. +Veja [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) para mais detalhes. - Consultas -See [GraphQL Queries](https://graphql.org/learn/queries/) for more details. +Veja [GraphQL Queries](https://graphql.org/learn/queries/) para mais detalhes. - Mutações -See [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) for more details. +Veja [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) para mais detalhes. -### Ganchos +### Hooks -See [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) for more details. +Veja [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) para mais detalhes. ### Estados -Contém a lógica de gerenciamento de estado. [RecoilJS](https://recoiljs.org) trata disso. +Contém a lógica de gerenciamento de estado. [RecoilJS](https://recoiljs.org) lida com isso. -- Selectors: See [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) for more details. +- Seletores: Veja [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) para mais detalhes. -O gerenciamento de estado interno do React ainda controla o estado dentro de um componente. +O gerenciamento de estado embutido do React ainda lida com o estado dentro de um componente. -### Utils +### Utilitários -Deve apenas conter funções puras reutilizáveis. Caso contrário, crie ganchos personalizados na pasta `hooks`. +Deve conter apenas funções puras reutilizáveis. Caso contrário, crie hooks personalizados na pasta `hooks`. ## UI -Contém todos os componentes de UI reutilizáveis utilizados na aplicação. +Contém todos os componentes reutilizáveis de UI usados na aplicação. -Esta pasta pode conter subpastas, como `data`, `display`, `feedback` e `input` para tipos específicos de componentes. Cada componente deve ser autônomo e reutilizável, para que você possa usá-lo em diferentes partes da aplicação. +Esta pasta pode conter subpastas, como `data`, `display`, `feedback` e `input` para tipos específicos de componentes. Cada componente deve ser autocontido e reutilizável, de modo que você possa usá-lo em diferentes partes da aplicação. -Ao separar os componentes de UI dos outros componentes na pasta `modules`, fica mais fácil manter um design consistente e fazer mudanças na UI sem afetar outras partes (lógica de negócios) do código. +Ao separar os componentes de UI dos outros componentes na pasta `modules`, é mais fácil manter um design consistente e fazer alterações na UI sem afetar outras partes (lógica de negócios) do código. ## Interface e dependências -Você pode importar código de outros módulos de qualquer módulo, exceto da pasta `ui`. Isso manterá seu código fácil de testar. +Você pode importar outros códigos de módulo de qualquer módulo, exceto para a pasta `ui`. Isso manterá seu código fácil de testar. ### Interno -Cada parte (ganchos, estados, ...) de um módulo pode ter uma pasta `interno`, que contém partes usadas apenas dentro do módulo. +Cada parte (hooks, estados, ...) de um módulo pode ter uma pasta `internal`, que contém partes que são usadas apenas dentro do módulo. diff --git a/packages/twenty-docs/l/pt/developers/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/pt/developers/frontend-development/frontend-commands.mdx index 6cd72f600a4..b4d2ea3858a 100644 --- a/packages/twenty-docs/l/pt/developers/frontend-development/frontend-commands.mdx +++ b/packages/twenty-docs/l/pt/developers/frontend-development/frontend-commands.mdx @@ -1,5 +1,5 @@ --- -title: Comandos de Frontend +title: Comandos do Frontend image: /images/user-guide/create-workspace/workspace-cover.png --- @@ -7,15 +7,15 @@ image: /images/user-guide/create-workspace/workspace-cover.png Header -## Comandos úteis +## Comandos Úteis -### Iniciando o app +### Iniciando o aplicativo ```bash npx nx start twenty-front ``` -### Regenerate graphql schema based on API graphql schema +### Regenerar esquema GraphQL baseado no esquema de API GraphQL ```bash npx nx run twenty-front:graphql:generate --configuration=metadata @@ -49,11 +49,11 @@ npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running) ``` -## Pilha Tecnológica +## Pilha de Tecnologias -O projeto tem uma pilha limpa e simples, com código boilerplate mínimo. +O projeto possui uma pilha limpa e simples, com pouco código boilerplate. -**App** +**Aplicativo** - [React](https://react.dev/) - [Apollo](https://www.apollographql.com/docs/) @@ -76,21 +76,21 @@ O projeto tem uma pilha limpa e simples, com código boilerplate mínimo. ### Roteamento -[React Router](https://reactrouter.com/) lida com o roteamento. +[React Router](https://reactrouter.com/) gerencia o roteamento. -Para evitar [re-renderizações](/l/pt/developers/frontend-development/best-practices-front#managing-re-renders) desnecessárias, toda a lógica de roteamento está em um `useEffect` em `PageChangeEffect`. +Para evitar [re-renderizações](/l/pt/developers/frontend-development/best-practices-front#managing-re-renders) desnecessárias, toda a lógica de roteamento está em um `useEffect` no `PageChangeEffect`. ### Gerenciamento de Estado -[Recoil](https://recoiljs.org/docs/introduction/core-concepts) lida com o gerenciamento de estado. +[Recoil](https://recoiljs.org/docs/introduction/core-concepts) gerencia o estado. -Veja [melhores práticas](/l/pt/developers/frontend-development/best-practices-front#state-management) para mais informações sobre o gerenciamento de estado. +Veja [melhores práticas](/l/pt/developers/frontend-development/best-practices-front#state-management) para mais informações sobre gerenciamento de estado. ## Testes -[Jest](https://jestjs.io/) serve como ferramenta para testes unitários enquanto [Storybook](https://storybook.js.org/) é para testes de componentes. +[Jest](https://jestjs.io/) serve como ferramenta para testes unitários enquanto [Storybook](https://storybook.js.org/) para teste de componentes. -Jest é utilizado principalmente para testar funções utilitárias, não os próprios componentes. +Jest é principalmente para testar funções utilitárias, e não os componentes em si. -Storybook destina-se a testar o comportamento de componentes isolados, bem como a exibir o sistema de design. +Storybook é para testar o comportamento de componentes isolados, bem como exibir o sistema de design. diff --git a/packages/twenty-docs/l/pt/developers/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/pt/developers/frontend-development/hotkeys.mdx index fd2486a2f9d..2162fedf43d 100644 --- a/packages/twenty-docs/l/pt/developers/frontend-development/hotkeys.mdx +++ b/packages/twenty-docs/l/pt/developers/frontend-development/hotkeys.mdx @@ -1,5 +1,5 @@ --- -title: Atalhos de Teclado +title: Teclas de atalho image: /images/user-guide/table-views/table.png --- @@ -9,37 +9,37 @@ image: /images/user-guide/table-views/table.png ## Introdução -When you need to listen to a hotkey, you would normally use the `onKeyDown` event listener. +Quando você precisa ouvir uma tecla de atalho, normalmente usaria o listener de evento `onKeyDown`. -No `twenty-front` no entanto, você pode ter conflitos entre as mesmas teclas de atalho que são usadas em diferentes componentes, montados ao mesmo tempo. +No entanto, em `twenty-front`, você pode ter conflitos entre as mesmas teclas de atalho que são usadas em diferentes componentes, montados ao mesmo tempo. -Por exemplo, se você tiver uma página que escuta a tecla Enter, e um modal que escuta a tecla Enter, com um componente Select dentro desse modal que escuta a tecla Enter, você pode ter um conflito quando todos estão montados ao mesmo tempo. +Por exemplo, se você tem uma página que escuta a tecla Enter, e um modal que escuta a tecla Enter, com um componente Select dentro desse modal que escuta a tecla Enter, você pode ter um conflito quando todos são montados ao mesmo tempo. -## The `useScopedHotkeys` hook +## O hook `useScopedHotkeys` -Para lidar com esse problema, temos um gancho personalizado que permite ouvir teclas de atalho sem nenhum conflito. +Para lidar com esse problema, temos um hook personalizado que permite ouvir as teclas de atalho sem qualquer conflito. -Você o coloca em um componente, e ele só escutará as teclas de atalho quando o componente estiver montado E quando o **escopo de atalho** especificado estiver ativo. +Você o coloca em um componente, e ele ouvirá as teclas de atalho somente quando o componente estiver montado E quando o **escopo da tecla de atalho** especificado estiver ativo. ## Como ouvir teclas de atalho na prática? -Há duas etapas envolvidas na configuração da escuta de teclas de atalho: +Há dois passos envolvidos na configuração da escuta de teclas de atalho : -1. Defina o [escopo de atalho](#what-is-a-hotkey-scope-) que escutará as teclas de atalho -2. Use the `useScopedHotkeys` hook to listen to hotkeys +1. Defina o [escopo da tecla de atalho](#what-is-a-hotkey-scope-) que ouvirá as teclas de atalho +2. Use o hook `useScopedHotkeys` para ouvir as teclas de atalho -Configurar escopos de atalhos é necessário mesmo em páginas simples, porque outros elementos da interface do usuário, como o menu da esquerda ou o menu de comandos, também podem escutar teclas de atalho. +Configurar escopos de teclas de atalho é necessário mesmo em páginas simples, porque outros elementos de UI como o menu à esquerda ou o menu de comando também podem ouvir teclas de atalho. ## Casos de uso para teclas de atalho -Geralmente, você terá dois casos de uso que requerem teclas de atalho: +Em geral, você terá dois casos de uso que requerem teclas de atalho : 1. Em uma página ou um componente montado em uma página -2. Em um componente do tipo modal que obtém o foco devido a uma ação do usuário +2. Em um componente do tipo modal que assume o foco devido a uma ação do usuário -O segundo caso de uso pode ocorrer de forma recursiva: um dropdown em um modal, por exemplo. +O segundo caso de uso pode ocorrer de forma recursiva : um dropdown em um modal, por exemplo. -### Escutando teclas de atalho em uma página +### Ouvindo teclas de atalho em uma página Exemplo : @@ -76,9 +76,9 @@ const PageListeningEnter = () => { }; ``` -### Escutando teclas de atalho em um componente do tipo modal +### Ouvindo teclas de atalho em um componente do tipo modal -Para este exemplo, usaremos um componente modal que escuta a tecla Escape para avisar seu pai para fechá-lo. +Neste exemplo, usaremos um componente modal que ouve a tecla Escape para informar ao pai que feche. Aqui, a interação do usuário está mudando o escopo. @@ -113,7 +113,7 @@ const ExamplePageWithModal = () => { }; ``` -Então, no componente modal: +Então no componente modal : ```tsx const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => { @@ -132,19 +132,19 @@ const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => { }; ``` -É importante usar este padrão quando você não tem certeza se apenas usar um useEffect com montagem/desmontagem será suficiente para evitar conflitos. +É importante usar esse padrão quando você não está seguro de que apenas usar um useEffect com mount/unmount será suficiente para evitar conflitos. Esses conflitos podem ser difíceis de depurar, e pode acontecer com mais frequência do que o esperado com useEffects. -## O que é um escopo de atalho? +## O que é um escopo de tecla de atalho? -Um escopo de atalho é uma string que representa um contexto no qual as teclas de atalho estão ativas. É geralmente codificado como um enum. +Um escopo de tecla de atalho é uma string que representa um contexto no qual as teclas de atalho estão ativas. Geralmente é codificado como um enum. -Quando você muda o escopo de atalho, as teclas de atalho que estão ouvindo esse escopo serão habilitadas e as que estão ouvindo outros escopos serão desabilitadas. +Quando você altera o escopo da tecla de atalho, as teclas associadas a esse escopo serão ativadas e as teclas associadas a outros escopos serão desativadas. Você pode definir apenas um escopo por vez. -Como exemplo, os escopos de atalho para cada página são definidos no enum `PageHotkeyScope`: +Como exemplo, os escopos de tecla de atalho para cada página são definidos no enum `PageHotkeyScope`: ```tsx export enum PageHotkeyScope { @@ -165,7 +165,7 @@ export enum PageHotkeyScope { } ``` -Internamente, o escopo atualmente selecionado é armazenado em um estado do Recoil que é compartilhado em toda a aplicação: +Internamente, o escopo atualmente selecionado é armazenado em um estado Recoil que é compartilhado por toda a aplicação : ```tsx export const currentHotkeyScopeState = createState({ @@ -178,6 +178,6 @@ Mas esse estado Recoil nunca deve ser manipulado manualmente! Veremos como usá- ## Como funciona internamente? -Fizemos um wrapper fino em cima do [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) que o torna mais performático e evita re-renderizações desnecessárias. +Criamos um wrapper leve em cima de [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) que o torna mais eficiente e evita renderizações desnecessárias. -Também criamos um estado do Recoil para gerenciar o estado do escopo de atalho e torná-lo disponível em toda a aplicação. \ No newline at end of file +Também criamos um estado Recoil para gerenciar o estado do escopo da tecla de atalho e torná-lo disponível em toda a aplicação. \ No newline at end of file diff --git a/packages/twenty-docs/l/pt/developers/frontend-development/storybook.mdx b/packages/twenty-docs/l/pt/developers/frontend-development/storybook.mdx index 0abb5d1921f..62e7a9ebf20 100644 --- a/packages/twenty-docs/l/pt/developers/frontend-development/storybook.mdx +++ b/packages/twenty-docs/l/pt/developers/frontend-development/storybook.mdx @@ -1,8 +1,8 @@ --- title: Storybook -description: Navegue pela biblioteca de componentes de interface do usuário do Twenty +description: Navegue pela biblioteca de componentes UI do Twenty --- -View our complete component library and documentation in Storybook. +Veja toda a nossa biblioteca de componentes e documentação no Storybook. -[Open Storybook →](https://storybook.twenty.com) +[Abra o Storybook →](https://storybook.twenty.com) diff --git a/packages/twenty-docs/l/pt/developers/frontend-development/style-guide.mdx b/packages/twenty-docs/l/pt/developers/frontend-development/style-guide.mdx index e8f901d58be..4a85d23dddf 100644 --- a/packages/twenty-docs/l/pt/developers/frontend-development/style-guide.mdx +++ b/packages/twenty-docs/l/pt/developers/frontend-development/style-guide.mdx @@ -9,21 +9,21 @@ image: /images/user-guide/notes/notes_header.png Este documento inclui as regras a seguir ao escrever código. -O objetivo aqui é ter uma base de código consistente, que seja fácil de ler e fácil de manter. +O objetivo aqui é ter uma base de código consistente, fácil de ler e fácil de manter. Para isso, é melhor ser um pouco mais detalhado do que ser muito conciso. -Lembre-se sempre de que as pessoas leem código com mais frequência do que escrevem, especialmente em um projeto de código aberto, onde qualquer um pode contribuir. +Sempre tenha em mente que as pessoas leem código mais frequentemente do que o escrevem, especialmente em um projeto de código aberto, onde qualquer um pode contribuir. -Existem muitas regras que não estão definidas aqui, mas que são verificadas automaticamente por linters. +Há muitas regras que não estão definidas aqui, mas que são verificadas automaticamente por linters. ## React ### Use componentes funcionais -Sempre use componentes funcionais TSX. +Use sempre componentes funcionais TSX. -Não use `import` padrão com `const`, porque é mais difícil de ler e mais difícil de importar com autocompletar. +Não use `import` padrão com `const`, pois é mais difícil de ler e mais difícil de importar com autocomplete. ```tsx // ❌ Bad, harder to read, harder to import with code completion @@ -39,11 +39,11 @@ export function MyComponent() { }; ``` -### Props +### Propriedades -Crie o tipo das props e chame de `(NomeDoComponente)Props` se não houver necessidade de exportá-lo. +Crie o tipo das propriedades e chame-o de `(NomeDoComponente)Props` se não houver necessidade de exportá-lo. -Use destruturação de props. +Use destructuring de props. ```tsx // ❌ Bad, no type @@ -57,7 +57,7 @@ type MyComponentProps = { export const MyComponent = ({ name }: MyComponentProps) =>
Hello {name}
; ``` -#### Abstenha-se de usar `React.FC` ou `React.FunctionComponent` para definir tipos de props +#### Evite usar `React.FC` ou `React.FunctionComponent` para definir tipos de props ```tsx /* ❌ - Bad, defines the component type annotations with `FC` @@ -86,9 +86,9 @@ const EmailField = ({ value }: EmailFieldProps) => ( ); ``` -#### Nenhuma propagação de prop de variável única em elementos JSX +#### Proibição de Prop Spreading de Variável Única em Elementos JSX -Evite usar propagação de prop de variável única em elementos JSX, como `{...props}`. Essa prática geralmente resulta em um código menos legível e mais difícil de manter, pois não está claro quais props o componente está recebendo. +Evite usar o espalhamento de props de variável única em elementos JSX, como `{...props}`. Essa prática muitas vezes resulta em código menos legível e mais difícil de manter, pois não está claro quais props o componente está recebendo. ```tsx /* ❌ - Bad, spreads a single variable prop into the underlying component @@ -107,11 +107,11 @@ const MyComponent = ({ prop1, prop2, prop3 }: MyComponentProps) => { }; ``` -Racional: +Justificativa: -- De relance, fica mais claro quais props o código está passando, tornando-o mais fácil de entender e manter. -- Ajuda a evitar o acoplamento apertado entre componentes por meio de suas props. -- As ferramentas de linting facilitam a identificação de props com erros ortográficos ou não utilizadas quando você lista explicitamente as props. +- À primeira vista, é mais claro quais props o código passa, tornando mais fácil de entender e manter. +- Ajuda a evitar o acoplamento forte entre componentes via suas props. +- Ferramentas de linting tornam mais fácil identificar props mal digitadas ou não utilizadas quando você lista props explicitamente. ## JavaScript @@ -139,7 +139,7 @@ onClick?.(); ### Use `type` em vez de `interface` -Sempre use `type` em vez de `interface`, porque quase sempre se sobrepõem, e `type` é mais flexível. +Sempre use `type` em vez de `interface`, porque elas quase sempre se sobrepõem e `type` é mais flexível. ```tsx // ❌ Bad @@ -155,9 +155,9 @@ type MyType = { ### Use literais de string em vez de enums -[Literals de string](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) são a maneira ideal de lidar com valores que se assemelham a enum em TypeScript. Eles são mais fáceis de estender com Pick e Omit, e oferecem uma melhor experiência de desenvolvedor, especialmente com autocompletar. +[Literals de string](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#literal-types) são o caminho a seguir para lidar com valores tipo enum no TypeScript. Eles são mais fáceis de estender com Pick e Omit, e oferecem uma melhor experiência de desenvolvedor, especialmente com autocomplete. -Você pode ver por que TypeScript recomenda evitar enums [aqui](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums). +Você pode ver porque o TypeScript recomenda evitar enums [aqui](https://www.typescriptlang.org/docs/handbook/2/everyday-types.html#enums). ```tsx // ❌ Bad, utilizes an enum @@ -178,9 +178,9 @@ let color: "red" | "green" | "blue" = "red"; #### GraphQL e bibliotecas internas -Você deve usar enums que o codegen GraphQL gera. +Você deve usar enums que o GraphQL codegen gera. -Também é melhor usar um enum ao usar uma biblioteca interna, para que a biblioteca interna não precise expor um tipo de literal de string que não está relacionado à API interna. +É melhor usar um enum ao usar uma biblioteca interna, para que a biblioteca interna não precise expor um tipo literal de string que não está relacionado à API interna. Exemplo: @@ -231,15 +231,15 @@ const StyledTitle = styled.div` ### Tematização -Utilizar o tema para a maioria das estilizações de componentes é a abordagem preferida. +Utilizar o tema para a maioria da estilização dos componentes é a abordagem preferida. #### Unidades de medida -Evite usar valores `px` ou `rem` diretamente dentro dos componentes estilizados. Os valores necessários geralmente já estão definidos no tema, por isso é recomendável usar o tema para esses fins. +Evite usar valores `px` ou `rem` diretamente dentro dos componentes estilizados. Os valores necessários geralmente já estão definidos no tema, por isso é recomendável fazer uso do tema para esses fins. #### Cores -Abstenha-se de introduzir novas cores; em vez disso, use a paleta existente do tema. Caso haja uma situação onde a paleta não se alinhe, por favor, deixe um comentário para que a equipe possa corrigi-la. +Evite introduzir novas cores; em vez disso, use a paleta existente do tema. Se houver uma situação em que a paleta não se alinhe, por favor, deixe um comentário para que a equipe possa corrigi-la. ```tsx // ❌ Bad, directly specifies style values without utilizing the theme @@ -263,9 +263,9 @@ const StyledButton = styled.button` `; ``` -## Imposição de Importações Sem Tipo +## Impor Importações Sem Tipo -Evite importações de tipo. Para garantir esse padrão, uma regra do ESLint verifica e reporta todas as importações de tipo. Isso ajuda a manter a consistência e a legibilidade no código TypeScript. +Evite importações de tipo. Para impor esse padrão, uma regra do ESLint verifica e relata qualquer violação de importação de tipos. Isso ajuda a manter a consistência e a legibilidade no código TypeScript. ```tsx // ❌ Bad @@ -278,18 +278,18 @@ import type { Meta, StoryObj } from '@storybook/react'; import { Meta, StoryObj } from '@storybook/react'; ``` -### Por que Importações Sem Tipo +### Por Que Não Usar Importações de Tipo -- **Consistência**: Ao evitar importações de tipo e usar uma abordagem única para importações de tipo e valor, a base de código permanece consistente em seu estilo de importação de módulos. +- **Consistência**: Ao evitar importações de tipo e usar uma única abordagem para importações de tipo e valor, a base de código permanece consistente em seu estilo de importação de módulo. -- **Legibilidade**: Importações sem tipo melhoram a legibilidade do código, deixando claro quando você está importando valores ou tipos. Isso reduz a ambiguidade e facilita a compreensão do propósito dos símbolos importados. +- **Legibilidade**: Importações sem tipo melhoram a legibilidade do código, tornando claro quando você está importando valores ou tipos. Isso reduz a ambiguidade e facilita a compreensão do propósito dos símbolos importados. -- **Manutenibilidade**: Melhora a manutenibilidade da base de código porque os desenvolvedores podem identificar e localizar importações apenas de tipo ao revisar ou modificar o código. +- **Manutenção**: Melhora a manutenibilidade da base de código porque os desenvolvedores podem identificar e localizar importações somente de tipo ao revisar ou modificar o código. -### Regra do ESLint +### Regra ESLint -An ESLint rule, `@typescript-eslint/consistent-type-imports`, enforces the no-type import standard. Esta regra gerará erros ou avisos para quaisquer violações de importação de tipo. +Uma regra do ESLint, `@typescript-eslint/consistent-type-imports`, aplica o padrão de importação sem tipo. Esta regra gerará erros ou avisos para qualquer violação de importação de tipo. -Observe que esta regra aborda especificamente casos raros em que ocorrem importações de tipo não intencionais. O próprio TypeScript desencoraja essa prática, conforme mencionado nas [notas de lançamento do TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). Na maioria das situações, você não deve precisar usar importações apenas de tipo. +Observe que esta regra trata especificamente de casos isolados onde importações de tipos não intencionais ocorrem. O próprio TypeScript desencoraja essa prática, conforme mencionado nas [notas de lançamento do TypeScript 3.8](https://www.typescriptlang.org/docs/handbook/release-notes/typescript-3-8.html). Na maioria das situações, não é necessário usar importações somente de tipo. Para garantir que seu código esteja em conformidade com essa regra, certifique-se de executar o ESLint como parte do seu fluxo de trabalho de desenvolvimento. diff --git a/packages/twenty-docs/l/pt/navigation.json b/packages/twenty-docs/l/pt/navigation.json new file mode 100644 index 00000000000..a07c6910024 --- /dev/null +++ b/packages/twenty-docs/l/pt/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Manual do Usuário", + "groups": { + "gettingStarted": { + "label": "Começando" + }, + "dataModel": { + "label": "Modelo de Dados" + }, + "crmEssentials": { + "label": "Essenciais do CRM" + }, + "views": { + "label": "Visualizações" + }, + "workflows": { + "label": "Workflows" + }, + "collaboration": { + "label": "Colaboração" + }, + "integrationsApi": { + "label": "Integrações e API" + }, + "reporting": { + "label": "Relatórios" + }, + "settings": { + "label": "Configurações" + }, + "pricing": { + "label": "Preços" + }, + "resources": { + "label": "Recursos" + } + } + }, + "developers": { + "label": "Desenvolvedores", + "groups": { + "developersGroup": { + "label": "Desenvolvedores" + }, + "devGettingStarted": { + "label": "Começando", + "groups": { + "selfHosting": { + "label": "Auto-Hospedagem" + }, + "apiAndWebhooks": { + "label": "API e Webhooks" + } + } + }, + "contributing": { + "label": "Contribuindo", + "groups": { + "frontendDevelopment": { + "label": "Desenvolvimento Frontend", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Exibição" + }, + "feedback": { + "label": "Feedback" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Desenvolvimento de backend" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx index b75ede58cf0..ccabb2baad4 100644 --- a/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx +++ b/packages/twenty-docs/l/pt/twenty-ui/display/app-tooltip.mdx @@ -7,7 +7,7 @@ image: /images/user-guide/tips/light-bulb.png Header -Uma breve mensagem que exibe informações adicionais quando um usuário interage com um elemento. +Uma mensagem breve que exibe informações adicionais quando um usuário interage com um elemento. @@ -41,25 +41,25 @@ export const MyComponent = () => { -| Props | Tipo | Descrição | -| ---------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| className | Nome opcional para estilização adicional | Classe CSS opcional para estilização adicional | -| anchorSelect | Seletor CSS | Selector for the tooltip anchor (the element that triggers the tooltip) | -| content | Nome opcional para estilização adicional | O conteúdo que você deseja exibir dentro da dica | -| delayHide | número | The delay in seconds before hiding the tooltip after the cursor leaves the anchor | -| offset | número | O deslocamento em pixels para posicionamento da dica | -| noArrow | booleano | Se `true`, oculta a seta na dica | -| isOpen | booleano | Se `true`, a dica é aberta por padrão | -| place | string `PlacesType` do `react-tooltip` | Especifica a posição da dica. Os valores incluem `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start` e `left-end` | -| positionStrategy | string `PositionStrategy` do `react-tooltip` | Estratégia de posicionamento para a dica. Possui dois valores: `absolute` e `fixed` | +| Propriedades | Tipo | Descrição | +| ---------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| className | string | Classe CSS opcional para estilização adicional | +| anchorSelect | Seleção CSS | Seletor para o âncora da dica (o elemento que aciona a dica) | +| conteúdo | string | O conteúdo que deseja exibir na dica | +| delayHide | número | O atraso em segundos antes de ocultar a dica após o cursor deixar a âncora. | +| offset | número | O deslocamento em pixels para posicionar a dica. | +| noArrow | booleano | Se `true`, oculta a seta na dica. | +| isOpen | booleano | Se `true`, a dica está aberta por padrão. | +| local | string `PlacesType` de `react-tooltip` | Especifica o posicionamento da dica. Os valores incluem `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, e `left-end`. | +| positionStrategy | string `PositionStrategy` de `react-tooltip` | Estratégia de posição para a dica. Possui dois valores: `absolute` e `fixed`. | -## Texto Transbordante com Dica +## Texto Overflow com Dica -Lida com texto transbordante e exibe uma dica quando o texto transborda. +Lida com texto em excesso e exibe uma dica quando o texto transborda. @@ -79,9 +79,9 @@ export const MyComponent = () => { -| Props | Tipo | Descrição | -| ----- | ---------------------------------------- | ---------------------------------------------------------------- | -| texto | Nome opcional para estilização adicional | O conteúdo que você deseja exibir na área de texto transbordante | +| Propriedades | Tipo | Descrição | +| ------------ | ------ | ----------------------------------------------------------------------------- | +| texto | string | O conteúdo que você deseja exibir na área de texto excessivo. | diff --git a/packages/twenty-docs/l/pt/user-guide/data-model/relation-fields.mdx b/packages/twenty-docs/l/pt/user-guide/data-model/relation-fields.mdx index db4bf4a4ec6..07282063b96 100644 --- a/packages/twenty-docs/l/pt/user-guide/data-model/relation-fields.mdx +++ b/packages/twenty-docs/l/pt/user-guide/data-model/relation-fields.mdx @@ -1,8 +1,8 @@ --- title: Campos de Relação -info: Aprenda como criar relacionamentos entre objetos usando campos de relação e configurar relacionamentos 1-para-muitos. +info: Aprenda a criar relações entre objetos usando campos de relação e configure relações 1-para-muitos. image: /images/user-guide/fields/relations_field.png -sectionInfo: Modelo de dados flexível projetado para suportar seus processos de negócios únicos +sectionInfo: Modelo de dados flexível projetado para suportar seus processos empresariais exclusivos. --- @@ -11,11 +11,11 @@ sectionInfo: Modelo de dados flexível projetado para suportar seus processos de ## O que são Campos de Relação? -Campos de relação conectam registros de um objeto a registros em outro objeto. Por exemplo: +Campos de relação vinculam registros de um objeto a registros em outro objeto. Por exemplo: - **Pessoas** → **Empresas** (cada pessoa trabalha para uma empresa) - **Oportunidades** → **Pessoas** (cada negócio tem uma pessoa de contato) -- **Tarefas** → **Oportunidades** (cada tarefa está relacionada a um negócio específico) +- **Tarefas** → **Oportunidades** (cada tarefa se relaciona a um negócio específico) ## Criando Campos de Relação @@ -27,36 +27,36 @@ Vá para **Configurações → Modelo de Dados → [Seu Objeto]** e clique em ** - **Tipo de Campo**: Selecione "Relação" - **Objeto Alvo**: Escolha qual objeto conectar -- **Relacionamento**: Atualmente suporta apenas relações **1-para-muitos**. Certifique-se de criar a relação na direção certa. +- **Relação**: Atualmente suporta apenas relações **1-para-muitos**. Certifique-se de criar a relação na direção correta. -### 3. Configurar Nomes dos Campos +### 3. Configure Nomes de Campo Você precisará definir nomes para ambos os lados da relação: - **Nome do campo de origem**: Como o campo aparece no seu objeto atual -- **Nome do campo alvo**: Como o campo reverso aparece no objeto alvo +- **Nome do campo alvo**: Como o campo reverso aparece no objeto de destino -Os nomes dos campos não podem ser editados uma vez que a relação é salva, pois isso impacta a estrutura da API. Escolha com cuidado. +Os nomes dos campos não podem ser editados após a relação ser salva, pois isso impacta a estrutura da API. Escolha com cuidado. -## Relating to Team Members +## Relacionando-se com Integrantes da Equipe -You can create relations to any object, including **Workspace Members** (your Twenty team users). This is useful for creating ownership fields: +Você pode criar relações para qualquer objeto, incluindo **Membros do Workspace** (os usuários da sua equipe Twenty). Isso é útil para criar campos de propriedade: - **Proprietário da Conta**: Vincule uma Empresa a um membro da equipe que a gerencia - **Proprietário do Negócio**: Atribua uma Oportunidade a um vendedor específico -When you create a relation to`Workspace Members`, you'll see your team members' names in dropdown selections, making it easy to assign ownership and responsibilities. +Quando você cria uma relação com `Membros do Workspace`, verá os nomes dos membros da sua equipe nas seleções suspensas, facilitando a atribuição de propriedade e responsabilidades. ## Melhores Práticas -- **Planeje seus relacionamentos** antes de criá-los -- **Use nomes claros e descritivos** para ambos os nomes de campos -- **Teste os relacionamentos** com dados de amostra antes da implementação completa +- **Planeje suas relações** antes de criá-las +- **Use nomes claros e descritivos** para ambos os nomes de campo +- **Teste as relações** com dados de exemplo antes da implementação completa ## Recursos Futuros -- **Relações Morph Many** (Previsto para Q4 2025) -- **Relações muitos-para-muitos** (Previsto para Q1 2026) +- **Relações Morph Many** (Vindo no Q4 2025) +- **Relações muitos-para-muitos** (Vindo no Q1 2026) diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/getting-started-workflows.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/getting-started-workflows.mdx index 6bd91f59692..78c299e4c08 100644 --- a/packages/twenty-docs/l/pt/user-guide/workflows/getting-started-workflows.mdx +++ b/packages/twenty-docs/l/pt/user-guide/workflows/getting-started-workflows.mdx @@ -1,6 +1,6 @@ --- -title: Primeiros Passos com Workflows -info: "Aprenda a adicionar automações e ideias para começar." +title: Iniciando Com Workflows +info: "Aprenda como adicionar automações e ideias para começar." image: /images/user-guide/workflows/workflow.png sectionInfo: Automatize processos e integre com ferramentas externas --- @@ -9,69 +9,69 @@ sectionInfo: Automatize processos e integre com ferramentas externas Header -## Por que os Workflows são Importantes +## Por que Workflows Importam -O Twenty foi criado para oferecer máxima flexibilidade aos seus usuários. Em vez de forçar você a adaptar seus processos de negócios a recursos rígidos e pré-construídos, os workflows permitem que você construa automações que criam o CRM que melhor atende a seus casos de uso empresariais únicos. +Twenty foi criado para trazer flexibilidade máxima aos seus usuários. Em vez de forçá-lo a adaptar seus processos de negócios a recursos rígidos e pré-construídos, os workflows permitem que você crie automações que criem o CRM que melhor apoie seus casos de uso de negócios exclusivos. -Os Workflows são o recurso dentro do app do Twenty para construir essas automações. Eles fornecem os blocos para criar exatamente o que sua empresa precisa, quando precisar. +Workflows são o recurso interno de Twenty para criar essas automações. Eles oferecem os blocos de construção para criar exatamente o que seu negócio precisa, quando precisa. -## O que posso fazer com Workflows? +## O que posso fazer com workflows? -Recomendamos construir automações para dois principais propósitos: +Recomendamos a construção de automações para dois principais propósitos: -1. **Automação Interna para facilitar o dia a dia da sua equipe**: Reduza a quantidade de registros manuais e tarefas repetitivas que desaceleram sua equipe. -2. **Traga dados para dentro e fora do Twenty**: Conecte o Twenty via chamadas de API e webhooks ao seu banco de dados e outras ferramentas. +1. **Automações internas para facilitar o dia a dia da sua equipe**: Reduza a quantidade de entradas manuais e tarefas repetitivas que retardam sua equipe. +2. **Traga dados para dentro e para fora do Twenty**: Conecte-se ao Twenty por meio de chamadas de API e webhooks para seu banco de dados e outras ferramentas. -Let's explore examples of what's possible before diving into the how. +Vamos explorar exemplos do que é possível antes de mergulhar no como. -## 1. Automação Interna +## 1. Automações Internas -Seu CRM só é útil se os dados estiverem atualizados, mas ninguém gosta de atualizá-lo. Use workflows para automatizar tarefas repetíveis de baixo valor e mantenha sua equipe focada no que realmente importa. +Seu CRM só é útil se os dados estiverem atualizados, mas ninguém gosta de atualizá-lo. Use workflows para automatizar tarefas de baixo valor e repetitivas e manter sua equipe focada no que importa. Exemplos do que você pode automatizar internamente: -- **Gerenciamento de dados**: Auto-marcar e-mails pessoais, atribuição de leads, validação de dados -- **Processos de vendas**: Atualizações por estágio, gestão de churn, alertas de oportunidade inativa -- **Produtividade**: Lembretes semanais de tarefas, acompanhamento de reuniões, sincronização de campos entre objetos +- **Gestão de dados**: Marcação automática de e-mails pessoais, atribuição de leads, validação de dados +- **Processos de vendas**: Atualizações baseadas em estágio, gerenciamento de churn, alertas de oportunidades inativas +- **Produtividade**: Lembretes de tarefas semanais, acompanhamentos de reuniões, sincronização de campos entre objetos -Para exemplos detalhados e orientação passo a passo, veja nosso guia de [Automação Interna](/l/pt/user-guide/workflows/internal-automations). +Para exemplos detalhados e orientação passo-a-passo, veja nosso guia de [Automações Internas](/l/pt/user-guide/workflows/internal-automations). ## 2. Integrações Externas -Conecte o Twenty com suas outras ferramentas e fontes de dados para criar um sistema de negócios unificado. Você pode trazer dados para o Twenty de formulários web, bancos de dados de produtos, gravadores de chamadas e serviços de enriquecimento. Você também pode enviar dados para ferramentas de email marketing, sistemas de cobrança, e outros aplicativos de negócios. +Conecte o Twenty com suas outras ferramentas e fontes de dados para criar um sistema de negócios unificado. Você pode trazer dados para o Twenty a partir de formulários web, bancos de dados de produtos, gravadores de chamadas e serviços de enriquecimento. Você também pode enviar dados para fora para ferramentas de marketing por e-mail, sistemas de faturamento e outros aplicativos de negócios. Exemplos do que você pode integrar: - **Ingestão de dados**: Envio de formulários web, sincronização de dados de produtos, notas de reuniões, enriquecimento de dados -- **Distribuição de dados**: Gestão de newsletters, sequência de e-mails, pontuação de leads, geração de faturas +- **Distribuição de dados**: Gestão de newsletters, sequências de emails, pontuação de leads, geração de faturas -Para padrões de integração detalhados e orientações de implementação, consulte nosso guia de [Integração de Ferramentas Externas](/l/pt/user-guide/workflows/external-tool-integration). +Para padrões de integração detalhados e orientações de implementação, veja nosso guia de [Integração com Ferramentas Externas](/l/pt/user-guide/workflows/external-tool-integration). ### E se eu não quiser construir essas conexões? -Oferecemos [Serviços Profissionais](/l/pt/user-guide/workflows/professional-services) para ajudar você a criar as automações necessárias. -Dependendo do alcance do seu projeto, sugeriremos um [Pacote de Onboarding](https://twenty.com/onboarding-packages) ou colocaremos você em contato com nossos parceiros de implementação certificados. Eles podem criar seu modelo de dados, migrar seus dados e construir seus workflows. +Oferecemos [Serviços Profissionais](/l/pt/user-guide/workflows/professional-services) para ajudá-lo a criar as automações que você precisa. +Dependendo do escopo do seu projeto, sugeriremos um [Pacote de Integração](https://twenty.com/onboarding-packages) ou o colocaremos em contato com nossos parceiros de implementação certificados. Eles podem criar seu modelo de dados, migrar seus dados e construir seus Workflows. ### Não tenho certeza se a conexão que preciso é viável -Envie-nos uma mensagem e ajudaremos você a avaliar a viabilidade. +Envie-nos uma mensagem e nós ajudaremos a avaliar a viabilidade. ## Melhores Práticas de Workflows -Ao começar a construir workflows, mantenha estas dicas em mente: +Ao começar a construir Workflows, mantenha essas dicas em mente: -- **Edite os nomes das etapas**: Renomeie as etapas do seu workflow para descrever claramente o que cada uma faz. Isso ajuda na manutenção e facilita a passagem para colegas de trabalho. -- **Aproveite os dados das etapas anteriores**: Você pode usar campos de registros retornados por qualquer etapa anterior em seu workflow -- **Comece simples**: Inicie com workflows básicos e adicione complexidade ao longo do tempo à medida que se sentir mais confortável com o sistema -- **Planeje antes de construir**: Mapeie a lógica do seu workflow antes de começar a construir para evitar travar no meio do caminho -- **Use as ramificações com sabedoria**: Após uma etapa de `Buscar Registros`, crie ramificações para lidar com cenários "atualizar registro existente" e "criar novo registro", depois junte novamente os caminhos +- **Editar nomes de etapas**: Renomeie as etapas do seu Workflow para descrever claramente o que cada uma faz. Isso ajuda na manutenção e facilita a transferência para colegas +- **Aproveitar dados de etapas anteriores**: Você pode usar campos de registros retornados por qualquer etapa anterior no seu Workflow +- **Comece simples**: Inicie com Workflows básicos e adicione complexidade ao longo do tempo à medida que se sentir mais confortável com o sistema +- **Planeje antes de construir**: Mapeie a lógica do seu Workflow antes de começar a construir para evitar ficar preso no meio do caminho +- **Use ramificações sabiamente**: Após uma etapa de `Procurar Registros`, crie ramificações para lidar com cenários de "atualizar registro existente" e "criar novo registro", depois una os caminhos novamente ## No que estamos trabalhando -Aqui estão os principais itens em que estamos trabalhando para melhorar os workflows: +Aqui estão os principais itens em que estamos trabalhando para melhorar os Workflows: -- Loops (O Iterador está atualmente em beta, ative em Configurações → Lançamentos → Lab) -- Etapa If / Else -- Agente de IA para criar workflows em seu nome +- Loops (Iterador está atualmente em beta, ative-o em Configurações → Releases → Laboratório) +- Etapa Se / Senão +- Agente de IA para construir Workflows em seu nome diff --git a/packages/twenty-docs/l/pt/user-guide/workflows/workflow-credits.mdx b/packages/twenty-docs/l/pt/user-guide/workflows/workflow-credits.mdx index cc1ed2f3aa4..e0d97957dba 100644 --- a/packages/twenty-docs/l/pt/user-guide/workflows/workflow-credits.mdx +++ b/packages/twenty-docs/l/pt/user-guide/workflows/workflow-credits.mdx @@ -1,6 +1,6 @@ --- title: Créditos de Fluxo de Trabalho -info: Conheça o consumo de créditos de fluxo de trabalho, monitoramento e gestão de custos das suas automações. +info: Compreenda o consumo, monitoramento e gestão de custos de créditos de fluxo de trabalho para suas automações. image: /images/user-guide/workflows/workflow-credits.png sectionInfo: Automatize processos e integre com ferramentas externas --- @@ -9,85 +9,85 @@ sectionInfo: Automatize processos e integre com ferramentas externas Header -Workflow credits power your automations in Twenty. Entender como eles funcionam ajuda a otimizar custos e gerenciar seu orçamento de automação de forma eficaz. +Os créditos de fluxo de trabalho alimentam suas automações no Twenty. Entender como eles funcionam ajuda você a otimizar custos e gerenciar seu orçamento de automação de maneira eficaz. ## Alocação de Créditos por Plano -Os créditos de fluxo de trabalho são alocados por workspace com base no seu plano de assinatura: +Os créditos de fluxo de trabalho são alocados por espaço de trabalho com base no seu plano de assinatura: - **Teste**: 5 milhões de créditos - **Plano Pro**: 10 milhões de créditos por mês -- **Plano Organizaçāo**: 20 milhões de créditos por mês +- **Plano Organizacional**: 20 milhões de créditos por mês ## Como Funciona o Consumo de Créditos -Os créditos são consumidos quando os fluxos de trabalho são executados, não quando você os cria. Cada ação do fluxo de trabalho consome créditos baseados em sua complexidade: +Os créditos são consumidos quando os fluxos de trabalho são executados, não quando você os cria. Cada ação de fluxo de trabalho consome créditos com base em sua complexidade: -### Consumo de Crédito por Tipo de Ação +### Consumo de Créditos por Tipo de Ação -- **Operações internas básicas**: Consumo de crédito muito baixo +- **Operações internas básicas**: Consumo de créditos muito baixo - Pesquisar Registros - Criar Registro - Atualizar Registro - Excluir Registro - - Form actions + - Ações de formulário -- **Operações complexas**: Maior consumo de crédito +- **Operações complexas**: Maior consumo de créditos - Ações de código (execução de JavaScript) - Solicitações HTTP para serviços externos -- **Recursos de IA**: Consumo significativo de crédito (em breve) - - AI prompts and processing will consume credits based on usage +- **Recursos de IA**: Consumo significativo de créditos (em breve) + - Os prompts e o processamento de IA consumirão créditos com base no uso ### Dedução em Tempo Real Os créditos são deduzidos em tempo real à medida que os fluxos de trabalho são executados. Isso significa: - Fluxos de trabalho em rascunho não consomem créditos -- Somente fluxos de trabalho ativos e em execução usam sua alocação de crédito -- Fluxos de trabalho falhados ainda consomem créditos para etapas concluídas +- Apenas fluxos de trabalho ativos e em execução usam sua alocação de crédito +- Fluxos de trabalho com falha ainda consomem créditos para etapas concluídas -## Gerenciando Créditos +## Gerenciamento de Créditos ### Verificar Uso de Créditos -1. Vá para **Configurações → Cobrança** -2. Veja seu consumo atual de crédito e saldo restante +1. Vá para **Configurações → Faturamento** +2. Veja o seu consumo atual de créditos e o saldo restante 3. Monitore padrões de uso para otimizar seus fluxos de trabalho -### Comprando Créditos Adicionais +### Compra de Créditos Adicionais -Se precisar de mais créditos além da alocação do seu plano: +Se você precisar de mais créditos além da alocação do seu plano: -1. Vá para **Configurações → Cobrança** -2. Clique na opção para comprar créditos adicionais. Pacotes de tamanhos diferentes estão disponíveis. +1. Vá para **Configurações → Faturamento** +2. Clique na opção para comprar créditos adicionais. Pacotes de diferentes tamanhos estão disponíveis. 3. Os créditos são adicionados ao seu saldo atual ## Melhores Práticas -### Design Eficiente de Fluxos de Trabalho +### Design Eficiente de Fluxo de Trabalho - **Comece Simples**: Inicie com ações básicas e adicione complexidade gradualmente -- **Teste em Rascunho**: Teste minuciosamente os fluxos de trabalho antes da ativação para evitar desperdício de créditos com erros +- **Teste em Rascunho**: Teste cuidadosamente os fluxos de trabalho antes da ativação para evitar desperdiçar créditos em erros - **Minimize Solicitações HTTP**: Use critérios de pesquisa eficientes e combine operações quando possível - **Processamento em Lote**: Use operações em massa e ações de Iterador de forma eficiente -- **Tratamento de Erros**: Implemente tratamento de erros adequado para evitar retentativas desnecessárias -- **Otimização de Disparo Manual**: Para gatilhos manuais, escolha a disponibilidade de `Em Lote` para processar vários registros em uma única execução de fluxo de trabalho (consulte [Recursos de Fluxo de Trabalho](/l/pt/user-guide/workflows/workflow-features) para detalhes) +- **Tratamento de Erros**: Implemente um tratamento de erros adequado para evitar tentativas desnecessárias +- **Otimização de Gatilhos Manuais**: Para gatilhos manuais, escolha a disponibilidade `Em Massa` para processar vários registros em uma única execução de fluxo de trabalho (veja [Recursos de Fluxo de Trabalho](/l/pt/user-guide/workflows/workflow-features) para detalhes) -### Otimização de Ações +### Otimização de Ação -- Use operações internas básicas sempre que possível (menor consumo de créditos) -- Otimize ações de código para eficiência +- Use operações internas básicas quando possível (menor consumo de créditos) +- Otimize as ações de código para eficiência - Considere gatilhos manuais para processos não urgentes -- Agrupe operações para reduzir chamadas individuais de ações +- Operações em lote para reduzir chamadas de ação individual -### Gerenciamento de Créditos +### Gestão de Créditos -- **Monitoramento Regular**: Verifique seu uso de crédito semanalmente em Configurações → Cobrança -- **Rastreamento de Uso**: Acompanhe os padrões de consumo para evitar excedentes inesperados -- **Planejamento Adequado**: Considere atualizar seu plano se você precisar consistentemente de mais créditos -- **Revisão de Fluxos de Trabalho**: Revise regularmente fluxos de trabalho de alto consumo e desative os não utilizados -- **Planejamento Estratégico**: Planeje a implantação do fluxo de trabalho com base na disponibilidade de créditos +- **Monitoramento Regular**: Verifique seu uso de créditos semanalmente em Configurações → Faturamento +- **Rastreamento de Uso**: Acompanhe os padrões de consumo para evitar excedente inesperado +- **Planeje de Acordo**: Considere atualizar seu plano se você precisar consistentemente de mais créditos +- **Revisão de Fluxo de Trabalho**: Revise regularmente os fluxos de trabalho de alto consumo e desative os não utilizados +- **Planejamento Estratégico**: Planeje a implementação do fluxo de trabalho com base na disponibilidade de créditos -Para informações detalhadas de cobrança e gerenciamento de créditos, visite **Configurações → Cobrança** no seu workspace do Twenty. +Para informações detalhadas sobre faturamento e gerenciamento de créditos, visite **Configurações → Faturamento** no seu espaço de trabalho do Twenty. diff --git a/packages/twenty-docs/l/ro/navigation.json b/packages/twenty-docs/l/ro/navigation.json new file mode 100644 index 00000000000..753fb5ad02d --- /dev/null +++ b/packages/twenty-docs/l/ro/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Ghid de utilizator", + "groups": { + "gettingStarted": { + "label": "Noțiuni de bază" + }, + "dataModel": { + "label": "Model de date" + }, + "crmEssentials": { + "label": "Elemente esențiale CRM" + }, + "views": { + "label": "Vizualizări" + }, + "workflows": { + "label": "Fluxuri de lucru" + }, + "collaboration": { + "label": "Colaborare" + }, + "integrationsApi": { + "label": "Integrări & API" + }, + "reporting": { + "label": "Raportare" + }, + "settings": { + "label": "Setări" + }, + "pricing": { + "label": "Prețuri" + }, + "resources": { + "label": "Resurse" + } + } + }, + "developers": { + "label": "Dezvoltatori", + "groups": { + "developersGroup": { + "label": "Dezvoltatori" + }, + "devGettingStarted": { + "label": "Noțiuni de bază", + "groups": { + "selfHosting": { + "label": "Găzduire proprie" + }, + "apiAndWebhooks": { + "label": "API și Webhooks" + } + } + }, + "contributing": { + "label": "Contribuții", + "groups": { + "frontendDevelopment": { + "label": "Dezvoltare Frontend", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Afișare" + }, + "feedback": { + "label": "Feedback" + }, + "input": { + "label": "Intrare" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Dezvoltare Backend" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/ru/navigation.json b/packages/twenty-docs/l/ru/navigation.json new file mode 100644 index 00000000000..ddedd98e517 --- /dev/null +++ b/packages/twenty-docs/l/ru/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Руководство пользователя", + "groups": { + "gettingStarted": { + "label": "Начало работы" + }, + "dataModel": { + "label": "Модель данных" + }, + "crmEssentials": { + "label": "Основы CRM" + }, + "views": { + "label": "Представления" + }, + "workflows": { + "label": "Рабочие процессы" + }, + "collaboration": { + "label": "Сотрудничество" + }, + "integrationsApi": { + "label": "Интеграции и API" + }, + "reporting": { + "label": "Отчеты" + }, + "settings": { + "label": "Настройки" + }, + "pricing": { + "label": "Цены" + }, + "resources": { + "label": "Ресурсы" + } + } + }, + "developers": { + "label": "Разработчики", + "groups": { + "developersGroup": { + "label": "Разработчики" + }, + "devGettingStarted": { + "label": "Начало работы", + "groups": { + "selfHosting": { + "label": "Самостоятельный хостинг" + }, + "apiAndWebhooks": { + "label": "API и вебхуки" + } + } + }, + "contributing": { + "label": "Вклад", + "groups": { + "frontendDevelopment": { + "label": "Разработка интерфейса", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Отображение" + }, + "feedback": { + "label": "Обратная связь" + }, + "input": { + "label": "Ввод" + }, + "navigation": { + "label": "Навигация" + } + } + } + } + }, + "backendDevelopment": { + "label": "Бэкенд разработка" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/sv/navigation.json b/packages/twenty-docs/l/sv/navigation.json new file mode 100644 index 00000000000..31dd03dd181 --- /dev/null +++ b/packages/twenty-docs/l/sv/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Användarhandbok", + "groups": { + "gettingStarted": { + "label": "Kom igång" + }, + "dataModel": { + "label": "Datamodell" + }, + "crmEssentials": { + "label": "CRM-grunderna" + }, + "views": { + "label": "Visningar" + }, + "workflows": { + "label": "Arbetsflöden" + }, + "collaboration": { + "label": "Samarbete" + }, + "integrationsApi": { + "label": "Integrationer & API" + }, + "reporting": { + "label": "Rapportering" + }, + "settings": { + "label": "Inställningar" + }, + "pricing": { + "label": "Prissättning" + }, + "resources": { + "label": "Resurser" + } + } + }, + "developers": { + "label": "Utvecklare", + "groups": { + "developersGroup": { + "label": "Utvecklare" + }, + "devGettingStarted": { + "label": "Kom igång", + "groups": { + "selfHosting": { + "label": "Själv-Hosting" + }, + "apiAndWebhooks": { + "label": "API och Webhooks" + } + } + }, + "contributing": { + "label": "Bidra", + "groups": { + "frontendDevelopment": { + "label": "Frontend Utveckling", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Visa" + }, + "feedback": { + "label": "Återkoppling" + }, + "input": { + "label": "Inmatning" + }, + "navigation": { + "label": "Navigering" + } + } + } + } + }, + "backendDevelopment": { + "label": "Backend Utveckling" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/uk/navigation.json b/packages/twenty-docs/l/uk/navigation.json new file mode 100644 index 00000000000..5d6b24a90c8 --- /dev/null +++ b/packages/twenty-docs/l/uk/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "Посібник користувача", + "groups": { + "gettingStarted": { + "label": "З чого почати" + }, + "dataModel": { + "label": "Модель даних" + }, + "crmEssentials": { + "label": "Основи CRM" + }, + "views": { + "label": "Перегляди" + }, + "workflows": { + "label": "Робочі процеси" + }, + "collaboration": { + "label": "Співпраця" + }, + "integrationsApi": { + "label": "Інтеграція & API" + }, + "reporting": { + "label": "Звітування" + }, + "settings": { + "label": "Налаштування" + }, + "pricing": { + "label": "Ціноутворення" + }, + "resources": { + "label": "Ресурси" + } + } + }, + "developers": { + "label": "Розробники", + "groups": { + "developersGroup": { + "label": "Розробники" + }, + "devGettingStarted": { + "label": "З чого почати", + "groups": { + "selfHosting": { + "label": "Самохостинг" + }, + "apiAndWebhooks": { + "label": "API і вебхуки" + } + } + }, + "contributing": { + "label": "Співпраця", + "groups": { + "frontendDevelopment": { + "label": "Фронтенд розробка", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Відображати" + }, + "feedback": { + "label": "Відгуки" + }, + "input": { + "label": "Вхідні дані" + }, + "navigation": { + "label": "Навігація" + } + } + } + } + }, + "backendDevelopment": { + "label": "Бекенд розробка" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/zh/developers/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/zh/developers/backend-development/best-practices-server.mdx index baf74c9e2b5..99726ba5d20 100644 --- a/packages/twenty-docs/l/zh/developers/backend-development/best-practices-server.mdx +++ b/packages/twenty-docs/l/zh/developers/backend-development/best-practices-server.mdx @@ -18,10 +18,10 @@ image: /images/user-guide/tips/light-bulb.png 始終創建具有明確和單一責任的服務,以增加代碼的可讀性和可維護性。 為服務命名應具描述性且一致。 -您也應該暴露希望在其他模組中使用的服務。 通過 NestJS 強大的依賴注入系統,可以將服務暴露給其他模組,這促進了組件之間的低耦合。 +您也應該暴露希望在其他模組中使用的服務。 您也應該暴露希望在其他模組中使用的服務。 通過 NestJS 強大的依賴注入系統,可以將服務暴露給其他模組,這促進了組件之間的低耦合。 ## 避免使用 `any` 類型 -當您將變量聲明為 `any` 類型時,TypeScript 的類型檢查器不會進行任何類型檢查,使得可以將任何類型的值分配給該變量。 TypeScript 使用類型推斷來根據值確定變量的類型。 通過將其聲明為 `any` 類型,TypeScript 就無法再推斷類型。 這使得在開發期間難以捕捉與類型相關的錯誤,導致運行時錯誤,使代碼的可維護性、可靠性降低,並難以讓其他人理解。 +當您將變量聲明為 `any` 類型時,TypeScript 的類型檢查器不會進行任何類型檢查,使得可以將任何類型的值分配給該變量。 TypeScript 使用類型推斷來根據值確定變量的類型。 通過將其聲明為 `any` 類型,TypeScript 就無法再推斷類型。 這使得在開發期間難以捕捉與類型相關的錯誤,導致運行時錯誤,使代碼的可維護性、可靠性降低,並難以讓其他人理解。 TypeScript 使用類型推斷來根據值確定變量的類型。 通過將其聲明為 `any` 類型,TypeScript 就無法再推斷類型。 這使得在開發期間難以捕捉與類型相關的錯誤,導致運行時錯誤,使代碼的可維護性、可靠性降低,並難以讓其他人理解。 這就是為什麼一切都應有明確的類型。 因此,如果您創建一個包含名字和姓氏的新對象,您應該創建一個包含名字和姓氏的接口或類型,以定義您正在操作對象的形狀。 diff --git a/packages/twenty-docs/l/zh/developers/backend-development/custom-objects.mdx b/packages/twenty-docs/l/zh/developers/backend-development/custom-objects.mdx index 8eae36db009..1502f983bc7 100644 --- a/packages/twenty-docs/l/zh/developers/backend-development/custom-objects.mdx +++ b/packages/twenty-docs/l/zh/developers/backend-development/custom-objects.mdx @@ -9,7 +9,7 @@ image: /images/user-guide/objects/objects.png 對象是允許您儲存特定於組織的數據 (記錄、屬性和值) 的結構。 Twenty 提供標準對象和自定義對象。 -標準對象是內建的對象,具有可供所有用戶使用的一組屬性。 Twenty 中標準對象的例子包括公司和人員。 標準對象具有標準欄位,例如 Company.displayName,這些欄位同樣供所有 Twenty 用戶使用。 +標準對象是內建的對象,具有可供所有用戶使用的一組屬性。 Twenty 中標準對象的例子包括公司和人員。 標準對象是內建的對象,具有可供所有用戶使用的一組屬性。 Twenty 中標準對象的例子包括公司和人員。 標準對象具有標準欄位,例如 Company.displayName,這些欄位同樣供所有 Twenty 用戶使用。 自定義對象是您可以創建來儲存獨特於您的組織的信息的對象。 它們並非內建;您的工作區成員可以創建和定制自定義對象來儲存標準對象不合適的信息。 diff --git a/packages/twenty-docs/l/zh/developers/backend-development/folder-architecture-server.mdx b/packages/twenty-docs/l/zh/developers/backend-development/folder-architecture-server.mdx index 604fa41403e..73e87b6f644 100644 --- a/packages/twenty-docs/l/zh/developers/backend-development/folder-architecture-server.mdx +++ b/packages/twenty-docs/l/zh/developers/backend-development/folder-architecture-server.mdx @@ -1,6 +1,6 @@ --- -title: 資料夾架構 -info: 深入了解我們的伺服器資料夾架構 +title: 文件夹架构 +info: 详细了解我们的服务器文件夹架构 image: /images/user-guide/fields/field.png --- @@ -8,7 +8,7 @@ image: /images/user-guide/fields/field.png Header -後端目錄結構如下: +后端目录结构如下: ``` server @@ -26,37 +26,37 @@ server └───utils ``` -## Ability +## 能力 -定義每個實體的權限並包含處理程序。 +定义权限并为每个实体提供处理程序。 -## 裝飾器 +## 装饰器 -Defines custom decorators in NestJS for added functionality. +为增强功能在NestJS中定义自定义装饰器。 -查看[自訂修飾器](https://docs.nestjs.com/custom-decorators)以獲取更多詳細資訊。 +有关更多详细信息,请参阅[自定义装饰器](https://docs.nestjs.com/custom-decorators)。 -## 篩選 +## 过滤器 -包含例外過濾器以處理可能在 GraphQL 端點上發生的例外。 +包含异常过滤器,以处理可能在GraphQL端点中出现的异常。 -## 守衛 +## 守卫 -查看[守衛](https://docs.nestjs.com/guards)以獲取更多詳細資訊。 +有关更多详细信息,请参见[守卫](https://docs.nestjs.com/guards)。 -## Health +## 健康 -包含一個可公開訪問的 REST API(healthz),返回 JSON 以確認數據庫運行正常。 +包含一个公开可用的REST API(healthz),返回JSON以确认数据库是否按预期工作。 -## 元數據 +## 元数据 -定義自訂物件並提供一個 GraphQL API (graphql/metadata)。 +定义自定义对象并提供GraphQL API(graphql/metadata)。 -## 工作區 +## 工作区 -根據元數據生成並提供自訂 GraphQL 結構。 +生成并提供基于元数据的自定义GraphQL架构。 -### 工作空間目錄結構 +### 工作空间目录结构 ``` workspace @@ -88,43 +88,43 @@ workspace └───workspace.factory.ts ``` -工作空間目錄的根目錄包含 `workspace.factory.ts`,一個包含 `createGraphQLSchema` 函數的文件。 該函數使用元數據生成工作區特定的結構,以便為個別工作空間定制結構。 通過將結構和解決器構建分開,我們使用 `makeExecutableSchema` 函數,將這些離散元素結合在一起。 +工作空间目录的根目录包含`workspace.factory.ts`,其中包含`createGraphQLSchema`函数。 此函数通过使用元数据为各个工作空间定制架构来生成工作空间特定的架构。 通过分离架构和解析程序的构建,我们使用`makeExecutableSchema`函数,该函数结合这些离散元素。 -此策略不僅關乎組織,還有助於優化,例如緩存生成的類型定義以提高性能和擴展性。 +这个策略不仅仅是关于组织,它还有助于优化,比如缓存生成的类型定义以提高性能和可扩展性。 -### 工作空間結構生成器 +### 工作空间架构生成器 -生成 GraphQL 結構,包含: +生成GraphQL架构,并包括: -#### 工廠: +#### 工厂: -專門構造生成與 GraphQL 相關的構建。 +专门的构造函数用于生成与GraphQL相关的结构。 -- type.factory 使用 `TypeMapperService` 轉換字段元數據為 GraphQL 類型。 -- type-definition.factory 創建從 `objectMetadata` 派生的 GraphQL 輸入或輸出物件。 +- type.factory使用`TypeMapperService`将字段元数据翻译为GraphQL类型。 +- type-definition.factory创建从`objectMetadata`派生的GraphQL输入或输出对象。 -#### GraphQL 類型 +#### GraphQL类型 -包括枚舉、輸入、物件和標量,並作為結構構建的基本組件。 +包括枚举、输入、对象和标量,并作为架构构建的基石。 -#### 介面和物件定義 +#### 接口和对象定义 -包含 GraphQL 實體藍圖,包含預定義和自訂類型如`MONEY`或 `URL`。 +包含GraphQL实体的蓝图,包括诸如`MONEY`或`URL`之类的预定义和自定义类型。 -#### 服務 +#### 服务 -包含將 FieldMetadataType 與其適當的 GraphQL 標量或查詢修改器關聯的服務。 +包含负责将FieldMetadataType与其适当GraphQL标量或查询修饰符相关联的服务。 -#### 存儲 +#### 存储 -包含 `TypeDefinitionsStorage` 類,該類包含可重複使用的類型定義,防止重複 GraphQL 類型。 +包含`TypeDefinitionsStorage`类,其中包含可重用的类型定义,防止重复GraphQL类型。 -### 工作空間解析器生成器 +### 工作空间解析器生成器 -創建用於查詢和變更 GraphQL 結構的解析器函數。 +创建用于查询和修改GraphQL架构的解析器函数。 -此目錄中的每個工廠都負責生成一個獨特的解析器類型,例如 `FindManyResolverFactory`,設計用於跨各種表的適應性應用。 +此目录中的每个工厂负责生成不同类型的解析器,如`FindManyResolverFactory`,旨在跨各种表灵活应用。 -### 工作空間查詢運行器 +### 工作空间查询运行器 -在資料庫上運行生成的查詢並解析結果。 +在数据库上运行生成的查询并解析结果。 diff --git a/packages/twenty-docs/l/zh/developers/backend-development/queue.mdx b/packages/twenty-docs/l/zh/developers/backend-development/queue.mdx index 4026f238241..cc4e0652327 100644 --- a/packages/twenty-docs/l/zh/developers/backend-development/queue.mdx +++ b/packages/twenty-docs/l/zh/developers/backend-development/queue.mdx @@ -1,5 +1,5 @@ --- -title: Message Queue +title: 消息队列 image: /images/user-guide/emails/emails_header.png --- @@ -7,19 +7,19 @@ image: /images/user-guide/emails/emails_header.png Header -佇列促進異步操作的執行。 它們可用於執行背景任務,例如在註冊時發送歡迎電子郵件。 -每個用例都有其自己的佇列類,以 `MessageQueueServiceBase` 為基礎進行擴展。 +队列支持异步操作的执行。 它们可用于执行后台任务,例如在注册时发送欢迎邮件。 +每个用例都将拥有一个继承自 `MessageQueueServiceBase` 的队列类。 -目前,我們僅支持 `bull-mq`[bull-mq](https://bullmq.io/) 作為佇列驅動。 +当前,我们仅支持使用 `bull-mq`[bull-mq](https://bullmq.io/) 作为队列驱动。 -## 創建和使用新佇列的步驟 +## 创建和使用新队列的步骤 -1. 在 enum `MESSAGE_QUEUES` 下為您的新佇列添加佇列名稱。 -2. 提供佇列的工廠實現,佇列名稱作為依賴注入標記。 -3. 在需要的模塊/服務中注入您創建的佇列,佇列名稱作為依賴注入標記。 -4. 添加與生產者類似的基於標記注入的工作類。 +1. 在枚举 `MESSAGE_QUEUES` 下为您的新队列添加队列名称。 +2. 提供以队列名称为依赖令牌的队列工厂实现。 +3. 在所需模块/服务中以队列名称作为依赖令牌注入您创建的队列。 +4. 添加与生产者相同令牌注入的工作类。 -### 使用範例 +### 示例用法 ```ts class Resolver { diff --git a/packages/twenty-docs/l/zh/developers/frontend-development/best-practices-front.mdx b/packages/twenty-docs/l/zh/developers/frontend-development/best-practices-front.mdx index 1c48e6f28e4..e4c40c83878 100644 --- a/packages/twenty-docs/l/zh/developers/frontend-development/best-practices-front.mdx +++ b/packages/twenty-docs/l/zh/developers/frontend-development/best-practices-front.mdx @@ -172,7 +172,7 @@ Recoil 家族狀態和選擇器是避免重繪的好方法。 #### 通用名稱的問題 -程序中的通用名稱並不理想,因為它們缺乏特⾊,導致模糊並降低代碼可讀性。 這類名稱未能傳達變量或函數的目的,使開發者難以在不深入調查的情況下理解代碼目的。 這會導致調試時間增加,更容易出錯,維護和合作困難。 相比之下,描述性命名使代碼自我解釋且更易於管理,提高代碼質量和開發者的生產力。 +程序中的通用名稱並不理想,因為它們缺乏特⾊,導致模糊並降低代碼可讀性。 這類名稱未能傳達變量或函數的目的,使開發者難以在不深入調查的情況下理解代碼目的。 這會導致調試時間增加,更容易出錯,維護和合作困難。 相比之下,描述性命名使代碼自我解釋且更易於管理,提高代碼質量和開發者的生產力。 這類名稱未能傳達變量或函數的目的,使開發者難以在不深入調查的情況下理解代碼目的。 這會導致調試時間增加,更容易出錯,維護和合作困難。 相比之下,描述性命名使代碼自我解釋且更易於管理,提高代碼質量和開發者的生產力。 ```tsx // ❌ Bad, uses a generic name that doesn't communicate its diff --git a/packages/twenty-docs/l/zh/developers/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/zh/developers/frontend-development/folder-architecture-front.mdx index 49994253fbb..96e9f17c371 100644 --- a/packages/twenty-docs/l/zh/developers/frontend-development/folder-architecture-front.mdx +++ b/packages/twenty-docs/l/zh/developers/frontend-development/folder-architecture-front.mdx @@ -1,6 +1,6 @@ --- -title: 資料夾架構 -info: 深入了解我們的資料夾架構 +title: 文件夹架构 +info: 深入了解我们的文件夹架构 image: /images/user-guide/fields/field.png --- @@ -8,9 +8,9 @@ image: /images/user-guide/fields/field.png Header -In this guide, you will explore the details of the project directory structure and how it contributes to the organization and maintainability of Twenty. +在本指南中,您将探索项目目录结构的详细信息,以及它如何促进 Twenty 的组织和可维护性。 -通過遵循這種資料夾架構慣例,更容易找到與特定功能相關的文件,確保應用程序具有可擴展性和可維護性。 +遵循此文件夹架构约定,可以更轻松地找到与特定功能相关的文件,并确保应用程序的可扩展性和可维护性。 ``` front @@ -27,14 +27,14 @@ front └───... ``` -## Pages +## 页面 -包含應用程序路由所定義的頂層組件。 它們從模組資料夾中導入更多低級別的組件(詳情如下)。 +包含由应用程序路由定义的顶级组件。 它们从模块文件夹中导入更多低级组件(详细信息见下文)。 -## 模組 +## 模块 -每個模組代表一個功能或一組功能,包括其專屬的組件、狀態和運行邏輯。 -它們應遵循以下結構。 您可以在模組內嵌套模組(稱為子模組),同樣的規則適用。 +每个模块代表一个功能或一组功能,包括其特定组件、状态和操作逻辑。 +它们都应遵循以下结构。 您可以在模块中嵌套模块(称为子模块),同样的规则将适用。 ``` module1 @@ -57,58 +57,58 @@ module1 ### 上下文 -上下文是一種通過組件樹傳遞數據的方法,不必在每個層次手動向下傳遞 props。 +上下文是一种通过组件树传递数据的方法,不必在每个级别手动传 props。 -詳情請參閱 [React 上下文](https://react.dev/reference/react#context-hooks)。 +详情请参阅 [React Context](https://react.dev/reference/react#context-hooks)。 ### GraphQL -包括片段、查詢和變更。 +包含片段、查询和变更。 -更多詳情參閱 [GraphQL](https://graphql.org/learn/)。 +详情请参阅 [GraphQL](https://graphql.org/learn/)。 - 片段 -片段是可重用的查詢部分,您可以在不同的地方使用。 通過使用片段,可以更容易避免重複代碼。 +片段是查询的可重用部分,可以在不同地方使用。 使用片段可以更容易地避免代码重复。 -更多詳情請參閱 [GraphQL 片段](https://graphql.org/learn/queries/#fragments)。 +详情请参阅 [GraphQL Fragments](https://graphql.org/learn/queries/#fragments)。 -- 查詢 +- 查询 -更多詳情請參閱 [GraphQL 查詢](https://graphql.org/learn/queries/)。 +详情请参阅 [GraphQL Queries](https://graphql.org/learn/queries/)。 -- Mutations +- 变更 -更多詳情請參閱 [GraphQL 變更](https://graphql.org/learn/queries/#mutations)。 +详情请参阅 [GraphQL Mutations](https://graphql.org/learn/queries/#mutations)。 -### 鉤子 +### 钩子 -詳情請參閱 [鉤子](https://react.dev/learn/reusing-logic-with-custom-hooks)。 +详情请参阅 [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks)。 -### 狀態 +### 状态 -包含狀態管理邏輯。 [RecoilJS](https://recoiljs.org) 負責。 +包含状态管理逻辑。 [RecoilJS](https://recoiljs.org) 处理这部分。 -- 選擇器: 更多詳情請參閱 [RecoilJS 選擇器](https://recoiljs.org/docs/basic-tutorial/selectors)。 +- 选择器:详情请参阅 [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors)。 -React 的內建狀態管理仍然在組件內部處理狀態。 +React 内置状态管理仍然在组件内处理状态。 -### 實用工具 +### 工具 -應只包含可重用的純函數。 否則,請在 `hooks` 資料夾中創建自定義鉤子。 +应仅包含可重用的纯函数。 否则,请在 `hooks` 文件夹中创建自定义钩子。 ## UI -包含應用程序中使用的所有可重用用戶介面組件。 +包含应用程序中使用的所有可重用的 UI 组件。 -此資料夾可以包含子資料夾,例如 `data`、`display`、`feedback` 和 `input` 針對特定組件類型。 每個組件應該是自成一體且可重用的,以便在應用程序的不同部分重複使用。 +这个文件夹可以包含子文件夹,像 `data`、`display`、`feedback` 和 `input`,用于特定类型的组件。 每个组件都应是自包含和可重用的,以便您可以在应用程序的不同部分使用它。 -透過將用戶介面組件與模組資料夾中的其他組件分開,可以更容易維持一致的設計,且在不影響代碼庫其他部分(業務邏輯)的情況下進行用戶介面變更。 +通过将 UI 组件与 `modules` 文件夹中的其他组件分开,可以更轻松地保持一致的设计,并在更改 UI 时不影响其他部分(业务逻辑)的代码库。 -## 介面和相依 +## 界面和依赖关系 -您可以從任何模組導入其他模組代碼,但 `ui` 資料夾除外。 這將使其代碼易於測試。 +您可以从任何模块中导入其他模块代码,但 `ui` 文件夹除外。 这将使代码易于测试。 -### 內部 +### 内部 -每個部分(鉤子、狀態等) 模組可以有一個 `internal` 資料夾,其中包含僅在模組內使用的部分。 +模块的每个部分(钩子、状态等) 都可以有一个 `internal` 文件夹,其中包含仅在模块内使用的部分。 diff --git a/packages/twenty-docs/l/zh/developers/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/zh/developers/frontend-development/frontend-commands.mdx index 811166d7fba..5a11f603532 100644 --- a/packages/twenty-docs/l/zh/developers/frontend-development/frontend-commands.mdx +++ b/packages/twenty-docs/l/zh/developers/frontend-development/frontend-commands.mdx @@ -7,15 +7,15 @@ image: /images/user-guide/create-workspace/workspace-cover.png Header -## 有用的命令 +## 实用命令 -### 啟動應用 +### 启动应用 ```bash npx nx start twenty-front ``` -### Regenerate graphql schema based on API graphql schema +### 根据API graphql schema重新生成graphql schema ```bash npx nx run twenty-front:graphql:generate --configuration=metadata @@ -27,20 +27,20 @@ npx nx run twenty-front:graphql:generate --configuration=metadata npx nx run twenty-front:graphql:generate ``` -### 語法檢查 +### 代码检查 ```bash npx nx run twenty-front:lint # pass --fix to fix lint errors ``` -## 翻譯 +## 翻译 ```bash npx nx run twenty-front:lingui:extract npx nx run twenty-front:lingui:compile ``` -### 測試 +### 测试 ```bash npx nx run twenty-front:test # run jest tests @@ -49,19 +49,19 @@ npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running) ``` -## 技術棧 +## 技术栈 -The project has a clean and simple stack, with minimal boilerplate code. +项目有一个干净且简单的技术栈,使用最少的样板代码。 -**應用** +**应用** - [React](https://react.dev/) - [Apollo](https://www.apollographql.com/docs/) -- [GraphQL Codegen](https://the-guild.dev/graphql/codegen) +- [GraphQL 代码生成](https://the-guild.dev/graphql/codegen) - [Recoil](https://recoiljs.org/docs/introduction/core-concepts) - [TypeScript](https://www.typescriptlang.org/) -**測試** +**测试** - [Jest](https://jestjs.io/) - [Storybook](https://storybook.js.org/) @@ -72,25 +72,25 @@ The project has a clean and simple stack, with minimal boilerplate code. - [Craco](https://craco.js.org/docs/) - [ESLint](https://eslint.org/) -## 架構 +## 架构 ### 路由 -[React Router](https://reactrouter.com/) 負責路由操作。 +[React Router](https://reactrouter.com/) 负责处理路由。 -為了避免不必要的[重新渲染](/l/zh/developers/frontend-development/best-practices-front#managing-re-renders),所有路由邏輯位於 `PageChangeEffect` 的 `useEffect` 中。 +为了避免不必要的[重新渲染](/l/zh/developers/frontend-development/best-practices-front#managing-re-renders),所有路由逻辑都在 `PageChangeEffect` 的 `useEffect` 中。 -### 狀態管理 +### 状态管理 -[Recoil](https://recoiljs.org/docs/introduction/core-concepts) 負責狀態管理。 +[Recoil](https://recoiljs.org/docs/introduction/core-concepts) 处理状态管理。 -查看[最佳實踐](/l/zh/developers/frontend-development/best-practices-front#state-management),了解有關狀態管理的更多信息。 +查看[最佳实践](/l/zh/developers/frontend-development/best-practices-front#state-management)以获取有关状态管理的更多信息。 -## 測試 +## 测试 -[Jest](https://jestjs.io/) 用作單元測試工具,而 [Storybook](https://storybook.js.org/) 用於元件測試。 +[Jest](https://jestjs.io/) 用于单元测试,而 [Storybook](https://storybook.js.org/) 用于组件测试。 -Jest 主要用於測試實用函數,而不是元件本身。 +Jest 主要用于测试工具函数,而不是组件本身。 -Storybook 用於測試隔離元件的行為同時展示設計系統。 +Storybook 用于测试隔离组件的行为,以及展示设计系统。 diff --git a/packages/twenty-docs/l/zh/developers/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/zh/developers/frontend-development/hotkeys.mdx index 09f41bfb6e1..9f49ddd5aaa 100644 --- a/packages/twenty-docs/l/zh/developers/frontend-development/hotkeys.mdx +++ b/packages/twenty-docs/l/zh/developers/frontend-development/hotkeys.mdx @@ -174,7 +174,7 @@ export const currentHotkeyScopeState = createState({ }); ``` -但這個 Recoil 狀態永遠不應被手動處理! 我們將在下一節中討論如何使用它。 +但這個 Recoil 狀態永遠不應被手動處理! 我們將在下一節中討論如何使用它。 我們將在下一節中討論如何使用它。 ## 它內部如何運作? diff --git a/packages/twenty-docs/l/zh/developers/frontend-development/storybook.mdx b/packages/twenty-docs/l/zh/developers/frontend-development/storybook.mdx index 7bd3fb7e3ea..1a6e63662a3 100644 --- a/packages/twenty-docs/l/zh/developers/frontend-development/storybook.mdx +++ b/packages/twenty-docs/l/zh/developers/frontend-development/storybook.mdx @@ -1,8 +1,8 @@ --- title: Storybook -description: 瀏覽 Twenty 的 UI 元件庫 +description: 浏览 Twenty 的 UI 组件库 --- -View our complete component library and documentation in Storybook. +在 Storybook 中查看我们完整的组件库和文档。 -[Open Storybook →](https://storybook.twenty.com) +[打开 Storybook →](https://storybook.twenty.com) diff --git a/packages/twenty-docs/l/zh/developers/self-hosting/cloud-providers.mdx b/packages/twenty-docs/l/zh/developers/self-hosting/cloud-providers.mdx index 1d5ff4302b8..6ca029a2cab 100644 --- a/packages/twenty-docs/l/zh/developers/self-hosting/cloud-providers.mdx +++ b/packages/twenty-docs/l/zh/developers/self-hosting/cloud-providers.mdx @@ -17,7 +17,7 @@ image: /images/user-guide/notes/notes_header.png ### Coolify -使用 Coolify 部署 Twenty 到伺服器。 (官方 Coolify 映像即將推出) +使用 Coolify 部署 Twenty 到伺服器。 (官方 Coolify 映像即將推出) (官方 Coolify 映像即將推出) [Coolify 文件](https://coolify.io/docs/get-started/introduction) diff --git a/packages/twenty-docs/l/zh/navigation.json b/packages/twenty-docs/l/zh/navigation.json new file mode 100644 index 00000000000..c6b3651a063 --- /dev/null +++ b/packages/twenty-docs/l/zh/navigation.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "用户指南", + "groups": { + "gettingStarted": { + "label": "正在开始" + }, + "dataModel": { + "label": "数据模型" + }, + "crmEssentials": { + "label": "CRM要点" + }, + "views": { + "label": "视图" + }, + "workflows": { + "label": "工作流" + }, + "collaboration": { + "label": "协作" + }, + "integrationsApi": { + "label": "集成和 API" + }, + "reporting": { + "label": "报告" + }, + "settings": { + "label": "设置" + }, + "pricing": { + "label": "定价" + }, + "resources": { + "label": "资源" + } + } + }, + "developers": { + "label": "开发者", + "groups": { + "developersGroup": { + "label": "开发者" + }, + "devGettingStarted": { + "label": "正在开始", + "groups": { + "selfHosting": { + "label": "自我主机" + }, + "apiAndWebhooks": { + "label": "API 和 Webhooks" + } + } + }, + "contributing": { + "label": "贡献中", + "groups": { + "frontendDevelopment": { + "label": "前端开发", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "显示" + }, + "feedback": { + "label": "反馈" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "后端开发" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx index a55901c76ff..5b4819a5c3e 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/display/app-tooltip.mdx @@ -41,17 +41,17 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ---------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 類名稱 | 字串 | 用於額外樣式的可選 CSS 類 | -| anchorSelect | CSS 選擇器 | 提示錨 (觸發提示的元素) 的選擇器 | -| content | 字串 | 您希望在工具提示中顯示的內容 | -| delayHide | 數字 | 將滑鼠游標離開錨定後,工具提示隱藏的秒數延遲 | -| offset | 數字 | 定位工具提示的像素偏移量 | -| noArrow | 布爾值 | 如果為 `true`,則隱藏工具提示上的箭頭 | -| isOpen | 布爾值 | 如果為 `true`,則默認情況下工具提示是開啟的 | -| place | 來自 `react-tooltip` 的 `PlacesType` 字符串 | 指定工具提示的位置。 值包括 `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, 和 `left-end` | -| positionStrategy | 來自 `react-tooltip` 的 `PositionStrategy` 字符串 | 工具提示的定位策略。 有兩個值:`absolute` 和 `fixed` | +| 屬性 | 類型 | 描述 | +| ---------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| 類名稱 | 字串 | 用於額外樣式的可選 CSS 類 | +| anchorSelect | CSS 選擇器 | 提示錨 (觸發提示的元素) 的選擇器 | +| content | 字串 | 您希望在工具提示中顯示的內容 | +| delayHide | 數字 | 將滑鼠游標離開錨定後,工具提示隱藏的秒數延遲 | +| offset | 數字 | 定位工具提示的像素偏移量 | +| noArrow | 布爾值 | 如果為 `true`,則隱藏工具提示上的箭頭 | +| isOpen | 布爾值 | 如果為 `true`,則默認情況下工具提示是開啟的 | +| place | 來自 `react-tooltip` 的 `PlacesType` 字符串 | 指定工具提示的位置。 指定工具提示的位置。 值包括 `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, 和 `left-end` | +| positionStrategy | 來自 `react-tooltip` 的 `PositionStrategy` 字符串 | 工具提示的定位策略。 有兩個值:`absolute` 和 `fixed` | diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx index 56ace0bae76..4f60dd18706 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/display/soon-pill.mdx @@ -1,5 +1,5 @@ --- -title: Soon Pill +title: 即将推出的小徽章或 "药丸"。 image: /images/user-guide/kanban-views/kanban.png --- @@ -7,7 +7,7 @@ image: /images/user-guide/kanban-views/kanban.png Header -A small badge or "pill" to indicate something is coming soon. +指示某物即将出现的小徽章或 "药丸" 。 ```jsx import { SoonPill } from "@/ui/display/pill/components/SoonPill"; diff --git a/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx b/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx index 521e4e610db..878d0c02f39 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/display/tag.mdx @@ -32,12 +32,12 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| --- | -------- | --------------------------------------------------------------- | -| 類名稱 | 字串 | 附加樣式的可選名稱 | -| 顏色 | 字串 | 標籤的顏色。 選項包括:`綠色`,`松石色`,`天空藍`,`藍色`,`紫色`,`粉色`,`紅色`,`橙色`,`黃色`,`灰色` | -| 文本 | 字串 | 標籤的內容 | -| 點擊 | function | 當用戶點擊標籤時調用的可選功能 | +| 屬性 | 類型 | 描述 | +| --- | -------- | ---------------------------------------------------------------------- | +| 類名稱 | 字串 | 附加樣式的可選名稱 | +| 顏色 | 字串 | 標籤的顏色。 標籤的顏色。 選項包括:`綠色`,`松石色`,`天空藍`,`藍色`,`紫色`,`粉色`,`紅色`,`橙色`,`黃色`,`灰色` | +| 文本 | 字串 | 標籤的內容 | +| 點擊 | function | 當用戶點擊標籤時調用的可選功能 | diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx index 1bc4731e5eb..b33a54f43b4 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/input/icon-picker.mdx @@ -1,5 +1,5 @@ --- -title: 圖示選擇器 +title: 图标选择器 image: /images/user-guide/github/github-header.png --- @@ -7,7 +7,7 @@ image: /images/user-guide/github/github-header.png Header -一個基於下拉列表的圖示選擇器,允許使用者從清單中選擇圖示。 +一个基于下拉菜单的图标选择器,允许用户从列表中选择图标。 @@ -42,15 +42,15 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| --------------- | -------- | ------------------------------------------------------------------------------------------------------- | -| 禁用 | 布爾值 | 如果設為 `true`,將停用圖示選擇器 | -| 變更事件 | function | 用戶選擇圖示時觸發的回調函數。 接收一個具有 `iconKey` 和 `Icon` 屬性的對象 | -| selectedIconKey | 字串 | 最初選擇的圖示的鍵值 | -| onClickOutside | function | 當用戶點擊下拉列表外部時觸發的回調函數 | -| onClose | function | 下拉列表關閉時觸發的回調函數 | -| onOpen | function | 下拉列表打開時觸發的回調函數 | -| 變體 | 字串 | The visual style variant of the clickable icon. 選項包括:`primary`,`secondary` 和 `tertiary` | +| 属性 | 类型 | 描述 | +| --------------- | -------- | ------------------------------------------------------ | +| disabled | 布尔值 | 如果设置为 `true`,则禁用图标选择器 | +| onChange | 函数 | 当用户选择图标时触发的回调函数。 它接收一个具有 `iconKey` 和 `Icon` 属性的对象 | +| selectedIconKey | 字符串 | 初始选中的图标键 | +| onClickOutside | 函数 | 当用户点击下拉菜单外部时触发的回调函数 | +| onClose | 函数 | 当下拉菜单关闭时触发的回调函数 | +| onOpen | function | 当下拉菜单打开时触发的回调函数 | +| 变体 | 字符串 | 可点击图标的视觉风格变体。 可选项包括:`primary`、`secondary` 和 `tertiary` | diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx index 84f81cf7453..2f7b70688ee 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/input/radio.mdx @@ -1,5 +1,5 @@ --- -title: Radio +title: 单选按钮 image: /images/user-guide/create-workspace/workspace-cover.png --- @@ -7,7 +7,7 @@ image: /images/user-guide/create-workspace/workspace-cover.png Header -當用戶只能從一系列選項中選擇一個時使用。 +当用户只能从一系列选项中选择一个时使用。 @@ -44,24 +44,24 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| --------------- | -------------- | --------------------------------------------- | -| 樣式 | `React.CSS` 屬性 | 為組件提供額外的內聯樣式 | -| 類名稱 | 字串 | 用於額外樣式的可選 CSS 類 | -| 選中 | 布爾值 | Indicates whether the radio button is checked | -| 值 | 字串 | 與單選按鈕相關聯的標籤或文本 | -| 變更事件 | function | 選定的單選按鈕變更時調用的函數 | -| onCheckedChange | function | 單選按鈕的 `checked` 狀態改變時調用的函數 | -| 大小 | 字串 | 單選按鈕的大小。 選項包括:`large` 和 `small` | -| 禁用 | 布爾值 | 如果為`true`,則單選按鈕被禁用且無法點擊 | -| 標籤位置 | 字串 | 標籤文本相對於單選按鈕的位置。 具有兩個選項:`left` 和 `right` | +| 属性 | 类型 | 描述 | +| --------------- | -------------- | ------------------------------- | +| 样式 | `React.CSS` 属性 | 组件的附加行内样式 | +| 类名 | 字符串 | 用于额外样式的可选 CSS 类 | +| 选中 | 布尔值 | 指示单选按钮是否被选中 | +| 值 | 字符串 | 与单选按钮相关联的标签或文本 | +| onChange | function | 选择的单选按钮改变时调用的函数 | +| onCheckedChange | function | 当单选按钮的 `checked` 状态改变时调用的函数 | +| 大小 | 字符串 | 单选按钮的尺寸。 选项包括:`大` 和 `小` | +| disabled | 布尔值 | 如果为 `true`,则单选按钮将被禁用且不可点击 | +| 标签位置 | 字符串 | 标签文字相对于单选按钮的位置。 有两个选项:`左` 和 `右` | -## Radio Group +## 单选按钮组 -將相關的單選按鈕組合在一起。 +将相关的单选按钮组合在一起。 @@ -92,12 +92,12 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ----- | ----------------- | ---------------------------------- | -| 值 | 字串 | 當前選中單選按鈕的值 | -| 變更事件 | function | 單選按鈕變更時觸發的回調函數 | -| 變更值事件 | function | 選定值變更時觸發的回調函數。 | -| 子元素 | `React.ReactNode` | 允許將 React 組件(例如 Radio)作為子項傳遞給單選按鈕組 | +| 属性 | 类型 | 描述 | +| ------------- | ----------------- | -------------------------------- | +| 值 | 字符串 | 当前选中单选按钮的值 | +| onChange | function | 当单选按钮改变时触发的回调函数 | +| onValueChange | function | 当组中选定的值发生变化时触发的回调函数。 | +| 子元素 | `React.ReactNode` | 允许您将 React 组件(如单选按钮)作为子项传递给单选按钮组 | diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx index 51ee8166385..13aca04d2a6 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/input/select.mdx @@ -1,5 +1,5 @@ --- -title: 選擇 +title: 选择 image: /images/user-guide/what-is-twenty/20.png --- @@ -7,7 +7,7 @@ image: /images/user-guide/what-is-twenty/20.png Header -允許用戶從預定義選項列表中選擇一個值。 +允许用户从预定义选项列表中选择一个值。 @@ -41,14 +41,14 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ---- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 類名稱 | 字串 | 用於額外樣式的可選 CSS 類 | -| 禁用 | 布爾值 | 當設置為`true`時,禁用用戶與該組件的互動 | -| 標籤 | 字串 | The label to describe the purpose of the `Select` component | -| 變更事件 | function | The function called when the selected values change | -| 選項 | 數組 | Represents the options available for the `Selected` component. It's an array of objects where each object has a `value` (the unique identifier), `label` (the unique identifier), and an optional `Icon` | -| 值 | 字串 | 表示當前選定的值。 它應該與`options`數組中的一個`value`屬性匹配 | +| 属性 | 类型 | 描述 | +| -------- | -------- | ---------------------------------------------------------------- | +| 类名 | 字符串 | 用于额外样式的可选 CSS 类 | +| disabled | 布尔值 | 当设置为`true`时,禁用用户与组件的交互 | +| 标签 | 字符串 | 描述`选择`组件用途的标签 | +| onChange | function | 当所选值更改时调用的函数 | +| 选项 | 数组 | 表示`选择`组件的可用选项。 它是一个对象数组,每个对象具有一个`值`(唯一标识符)、`标签`(唯一标识符)和一个可选的`图标` | +| 值 | 字符串 | 表示当前选择的值。 它应匹配`选项`数组中的一个`值`属性 | diff --git a/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx b/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx index f99f46b81ef..386b53eeaaf 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/input/text.mdx @@ -100,15 +100,15 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ----------- | -------- | --------------------------------------- | -| onValidate | function | 用戶驗證輸入時要觸發的回調函數 | -| minRows | 數字 | 文本區域的最小行數 | -| placeholder | 字串 | 當文本區域為空時要顯示的佔位符文本 | -| onFocus | function | 當文本區域獲取焦點時要觸發的回調函數 | -| 變體 | 字串 | 輸入的變體。 選項包括:`default`、`icon` 和 `button` | -| buttonTitle | 字串 | 按鈕的標題(僅適用於按鈕變體) | -| 值 | 字串 | 文本區域的初始值 | +| 屬性 | 類型 | 描述 | +| ----------- | -------- | ---------------------------------------------- | +| onValidate | function | 用戶驗證輸入時要觸發的回調函數 | +| minRows | 數字 | 文本區域的最小行數 | +| placeholder | 字串 | 當文本區域為空時要顯示的佔位符文本 | +| onFocus | function | 當文本區域獲取焦點時要觸發的回調函數 | +| 變體 | 字串 | 輸入的變體。 輸入的變體。 選項包括:`default`、`icon` 和 `button` | +| buttonTitle | 字串 | 按鈕的標題(僅適用於按鈕變體) | +| 值 | 字串 | 文本區域的初始值 | diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx index 562c48b6d31..cdbb0d85246 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx @@ -1,5 +1,5 @@ --- -title: Breadcrumb +title: 面包屑 image: /images/user-guide/fields/field.png --- @@ -7,7 +7,7 @@ image: /images/user-guide/fields/field.png Header -Renders a breadcrumb navigation bar. +呈现一个面包屑导航栏。 @@ -35,10 +35,10 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| --- | -- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| 類名稱 | 字串 | 附加樣式的可選類名 | -| 連結 | 數組 | An array of objects, each representing a breadcrumb link. 每個對象有一個 `children` 屬性 (連結的文本內容) 和一個可選的 `href` 屬性 (點擊連結時要導航到的 URL) | +| 属性 | 类型 | 描述 | +| -- | --- | -------------------------------------------------------------------------------- | +| 类名 | 字符串 | 用于额外样式的可选类名 | +| 链接 | 数组 | 对象数组,每个代表一个面包屑链接。 每个对象都有一个 `children` 属性(链接的文本内容)和一个可选的 `href` 属性(点击链接时导航到的URL)。 | diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx index 35a21517391..546d8aea31e 100644 --- a/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx +++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx @@ -1,5 +1,5 @@ --- -title: 連結 +title: 链接 image: /images/user-guide/what-is-twenty/20.png --- @@ -7,9 +7,9 @@ image: /images/user-guide/what-is-twenty/20.png Header -## 聯絡連結 +## 联系链接 -A stylized link component for displaying contact information. +用于显示联系信息的样式化链接组件。 @@ -41,20 +41,20 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ---- | ----------------- | ------------- | -| 類名稱 | 字串 | 附加樣式的可選名稱 | -| href | 字串 | 連結的目標URL或路徑 | -| 點擊 | function | 當點擊連結時觸發的回調函數 | -| 子元素 | `React.ReactNode` | 要顯示在連結內的內容 | +| 属性 | 类型 | 描述 | +| ------- | ----------------- | ------------- | +| 类名 | 字符串 | 用于附加样式的可选名称 | +| href | 字符串 | 链接的目标网址或路径 | +| onClick | 函数 | 链接被点击时触发的回调函数 | +| 子元素 | `React.ReactNode` | 在链接中显示的内容 | -## 原生連結 +## 原始链接 -用于顯示連結的樣式化連結組件。 +用于显示链接的风格化链接组件。 @@ -82,19 +82,19 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ---- | ----------------- | ------------- | -| 類名稱 | 字串 | 附加樣式的可選名稱 | -| href | 字串 | 連結的目標URL或路徑 | -| 點擊 | function | 當點擊連結時觸發的回調函數 | -| 子元素 | `React.ReactNode` | 要顯示在連結內的內容 | +| 属性 | 类型 | 描述 | +| ------- | ----------------- | ------------- | +| 类名 | 字符串 | 用于附加样式的可选名称 | +| href | 字符串 | 链接的目标网址或路径 | +| onClick | function | 链接被点击时触发的回调函数 | +| 子元素 | `React.ReactNode` | 在链接中显示的内容 | -## 圓角連結 +## 圆形链接 -帶有Chip元件的圓角樣式連結。 +以 Chip 组件风格显示的圆形链接。 @@ -122,18 +122,18 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ---- | ----------------- | ------------- | -| href | 字串 | 連結的目標URL或路徑 | -| 子元素 | `React.ReactNode` | 要顯示在連結內的內容 | -| 點擊 | function | 當點擊連結時觸發的回調函數 | +| 属性 | 类型 | 描述 | +| ------- | ----------------- | ------------- | +| href | 字符串 | 链接的目标网址或路径 | +| 子元素 | `React.ReactNode` | 在链接中显示的内容 | +| onClick | 函数 | 链接被点击时触发的回调函数 | -## 社交連結 +## 社交链接 -樣式化的社交連結,支持各種社交連結類型,例如URL、LinkedIn和X(或Twitter)。 +风格化的社交链接,支持各种社交链接类型,如网址、LinkedIn 和 X(或 Twitter)。 @@ -157,12 +157,12 @@ export const MyComponent = () => { -| 屬性 | 類型 | 描述 | -| ---- | ----------------- | ---------------------------------------- | -| href | 字串 | 連結的目標URL或路徑 | -| 子元素 | `React.ReactNode` | 要顯示在連結內的內容 | -| 類型 | 字串 | 社交連結的類型。 選項包括:`url`、`LinkedIn`和`Twitter` | -| 點擊 | function | 當點擊連結時觸發的回調函數 | +| 属性 | 类型 | 描述 | +| ------- | ----------------- | ------------------------------------------ | +| href | 字符串 | 链接的目标网址或路径 | +| 子元素 | `React.ReactNode` | 在链接中显示的内容 | +| 类型 | 字符串 | 社交链接的类型。 选项包括:`url`、`LinkedIn` 和 `Twitter` | +| onClick | 函数 | 链接被点击时触发的回调函数 | diff --git a/packages/twenty-docs/l/zh/user-guide/crm-essentials/sales-use-cases.mdx b/packages/twenty-docs/l/zh/user-guide/crm-essentials/sales-use-cases.mdx index a219140399e..41b2ab84bca 100644 --- a/packages/twenty-docs/l/zh/user-guide/crm-essentials/sales-use-cases.mdx +++ b/packages/twenty-docs/l/zh/user-guide/crm-essentials/sales-use-cases.mdx @@ -1,16 +1,16 @@ --- -title: Sales Use Cases -info: "探索可以使用 Twenty 的工作流程系統構建的先進銷售功能。" +title: 销售用例 +info: "发现可以使用Twenty的工作流系统构建的高级销售功能。" image: /images/user-guide/workflows/sales-use-cases.png -sectionInfo: "管理潛在客戶、銷售和客戶的重要 CRM 功能" +sectionInfo: "管理线索、销售和客户的基本CRM功能" --- Header -## 先進的銷售功能 +## 高级销售功能 -GTM 團隊經常需要如線索評分、數據豐富化、輪轉分配、地域分配、自動提醒和電子郵件序列等先進銷售功能。 雖然這些功能不是 Twenty 的內建功能,但可以透過我們靈活的工作流程系統進行配置和量身訂做,以滿足您的具體需求。 +GTM团队通常需要高级销售功能,如潜在客户评分、数据增强、循环分配、地区分配、自动提醒和电子邮件序列。 尽管这些不是Twenty系统中的内置功能,但利用我们的灵活工作流系统可以根据您的特定需求进行配置和定制。 -訪問我們的[工作流程部分](/l/zh/user-guide/workflows/getting-started-workflows)以一步一步學習如何構建這些自動化。 For detailed examples, see our [Internal Automations](/l/zh/user-guide/workflows/internal-automations) and [External Tool Integration](/l/zh/user-guide/workflows/external-tool-integration) guides. +访问我们的[工作流部分](/l/zh/user-guide/workflows/getting-started-workflows),了解如何逐步构建这些自动化。 有关详细示例,请参阅我们的[内部自动化](/l/zh/user-guide/workflows/internal-automations)和[外部工具集成](/l/zh/user-guide/workflows/external-tool-integration)指南。 diff --git a/packages/twenty-docs/l/zh/user-guide/integrations-api/apis-overview.mdx b/packages/twenty-docs/l/zh/user-guide/integrations-api/apis-overview.mdx index b1cf2e1f3a0..af50fb43e3f 100644 --- a/packages/twenty-docs/l/zh/user-guide/integrations-api/apis-overview.mdx +++ b/packages/twenty-docs/l/zh/user-guide/integrations-api/apis-overview.mdx @@ -9,7 +9,7 @@ sectionInfo: 學習如何將 Twenty 連接到您的其他工具。 Header -Twenty 被設計為對開發者友好,提供強大的 API,可以適應您的自定義數據模型。 我們提供四種不同的 API 類型,以滿足不同的集成需求。 +Twenty 被設計為對開發者友好,提供強大的 API,可以適應您的自定義數據模型。 我們提供四種不同的 API 類型,以滿足不同的集成需求。 我們提供四種不同的 API 類型,以滿足不同的集成需求。 ## 開發者優先策略 @@ -21,7 +21,9 @@ Twenty 特別為您的數據模型生成 API,這意味著: - **自定義文件**:專為您的工作區數據模型生成 + 您的自定義 API 會生成個性化文件,通過設置→ API 和 Webhooks 獲取 API 鍵後即可訪問。 此文件反映了您的具體數據模型和字段配置。 + 此文件反映了您的具體數據模型和字段配置。 ## 四種 API 類型 diff --git a/packages/twenty-docs/l/zh/user-guide/settings/permissions.mdx b/packages/twenty-docs/l/zh/user-guide/settings/permissions.mdx index b0e357a58a6..bb0a0a2c0e9 100644 --- a/packages/twenty-docs/l/zh/user-guide/settings/permissions.mdx +++ b/packages/twenty-docs/l/zh/user-guide/settings/permissions.mdx @@ -1,106 +1,106 @@ --- -title: 權限 -info: "了解如何控制訪問:分配角色和設置權限。" +title: 权限 +info: "了解如何控制访问:分配角色并设置权限。" image: /images/user-guide/permissions/permissions.png -sectionInfo: 配置您的Twenty工作區設置和偏好 +sectionInfo: 配置您的Twenty工作空间设置和偏好 --- Header -Twenty的權限系統允許您控制訪問三個主要區域: +Twenty 的权限系统允许您控制对三个主要区域的访问: -- **對象和字段**:控制誰能查看、編輯或刪除記錄和單個字段 -- **設置**:管理對工作區配置和管理功能的訪問權 -- **操作**:控制一般工作區操作,如導入數據或發送電子郵件 +- **对象和字段**:控制谁可以查看、编辑或删除记录和单个字段 +- **设置**:管理对工作区配置和管理功能的访问 +- **操作**:控制一般工作区操作,如导入数据或发送邮件 -## 創建角色 +## 创建角色 -要創建新角色: +要创建新角色: -1. 進入**設置 → 角色** -2. 在**所有角色**下,點擊\*\*+ 創建角色\*\* -3. 輸入角色名稱 -4. 在默認的**權限**選項卡中,配置權限 -5. 點擊**保存**完成 +1. 进入 **设置 → 角色** +2. 在 **所有角色** 下,单击 **+ 创建角色** +3. 输入角色名称 +4. 在默认的 **权限** 选项卡中配置权限 +5. 单击 **保存** 完成 -## 刪除角色 +## 删除角色 -要刪除角色: +要删除角色: -1. 進入**設置 → 角色** -2. 點擊您想要刪除的角色 -3. 打開**設置**選項卡,然後點擊**刪除角色** -4. 在模態中點擊**確認** +1. 进入 **设置 → 角色** +2. 单击您要删除的角色 +3. 打开 **设置** 选项卡,然后单击 **删除角色** +4. 在模态框中单击 **确认** -注意:如果刪除角色,任何分配了該角色的工作區成員將自動重新分配到默認角色。 除了**管理員**角色外,所有角色都可以刪除。 必須始終至少有一名成員分配到**管理員**角色。 +注意:如果角色被删除,任何分配此角色的工作区成员将自动重新分配到默认角色。 除了 **管理员** 角色外,所有角色都可以被删除。 必须始终至少有一个成员分配到 **管理员** 角色。 -## 將角色分配給成員 +## 将角色分配给成员 -### 查看當前分配 +### 查看当前分配 -- 進入**設置 → 角色** -- 查看所有角色以及每個角色分配了多少成員 -- 查看哪些成員擁有哪些角色 +- 进入 **设置 → 角色** +- 查看所有角色以及分配给每个角色的成员数 +- 查看哪些成员具有哪些角色 -### 為成員分配角色 +### 将角色分配给成员 -1. 進入**設置 → 角色** -2. 點擊您想要分配的角色 -3. Open the **Assignment** tab -4. Click **+ Assign to member** -5. 從列表中選擇工作區成員 -6. 確認分配 +1. 进入 **设置 → 角色** +2. 单击您要分配的角色 +3. 打开 **分配** 选项卡 +4. 单击 **+ 分配给成员** +5. 从列表中选择工作区成员 +6. 确认分配 -### 設置默認角色 +### 设置默认角色 -1. 進入**設置 → 角色** -2. 在**選項**部分,找到**默認角色** -3. 選擇新成員應自動接收的角色 -4. 當新工作區成員加入時,將被分配此角色 +1. 进入 **设置 → 角色** +2. 在 **选项** 部分,找到 **默认角色** +3. 选择新成员应该自动接收的角色 +4. 新工作区成员加入时将被分配此角色 -**注意**:您只能將角色分配給現有的工作區成員。 要邀請新成員,請使用[成員管理](/l/zh/user-guide/settings/member-management)。 +**注意**:您只能为现有工作区成员分配角色。 要邀请新成员,请使用 [成员管理](/l/zh/user-guide/settings/member-management)。 -## 自定義權限 +## 自定义权限 -權限決定每個角色能夠訪問或修改在您的工作區中的內容,包括工作區對象的記錄、設置和操作。 +权限决定每个角色在您的工作区中可以访问或修改的内容,包括工作区对象记录、设置和操作。 -### 對象和字段權限 +### 对象和字段权限 -控制訪問記錄和單個字段: +控制对记录和单个字段的访问: -#### 物件級權限 +#### 对象级别权限 -- 在**所有對象**下,應用如**查看記錄**、**編輯記錄**、**刪除記錄**或**銷毀記錄**等權限到所有對象 -- 在**對象級別權限**下,為個別對象配置例外情況。 這些設定將覆蓋**所有對象**的設定 +- 在 **所有对象** 下,应用诸如 **查看记录**、**编辑记录**、**删除记录** 或 **销毁记录** 的权限到所有对象 +- 在 **对象级权限** 下,为每个对象配置例外情况。 这些设置将覆盖 **所有对象** 中的设置 -#### 字段級別權限 +#### 字段级权限 -- 為每個對象中的單個字段配置權限 -- 控制誰可以**查看字段**、**編輯字段**或對特定字段有**無訪問權限** -- 字段權限的運作方式與對象權限相同,包含繼承和覆蓋 +- 为每个对象中的单个字段配置权限 +- 控制谁可以 **查看字段**、**编辑字段** 或对特定字段 **无访问** +- 字段权限与对象权限的工作方式相同,具有继承和覆盖 -#### 管理權限覆蓋 +#### 管理权限覆盖 -要覆蓋父權限並應用更嚴格的規則: +要覆盖父权限并应用更严格的规则: -- 點擊**X**移除繼承的規則 -- 選擇所選對象或字段的具體權限 -- 點擊橙色的**撤銷**圖標(圓形箭頭)來恢復更改 +- 单击 **X** 以移除继承的规则 +- 选择所选对象或字段的特定权限 +- 单击橙色 **撤销** 图标(圆形箭头)以还原更改 -完成後,點擊**完成**,然後在重定向到角色頁面後點擊**保存**。 +完成后,单击 **完成**,然后在重定向到角色页面后单击 **保存**。 -### 工作區設置權限 +### 工作区设置权限 -以兩種方式控制訪問工作區設置: +有两种方式控制对工作区设置的访问: -- 切換**設置全部訪問**以授予完整訪問權限 -- 或啟用具體權限(例如,API密鑰生成、工作區偏好、角色分配、數據模型配置、安全設置和工作流管理) +- 切换 **设置全访问** 以授予完全访问权限 +- 或者启用特定权限(例如,API 密钥生成、工作区首选项、角色分配、数据模型配置、安全设置和工作流管理) -### 工作區操作權限 +### 工作区操作权限 -控制訪問常規工作區行動: +控制对一般工作区操作的访问: -- 切換**應用程序全部訪問**以授予完整權限 -- 或啟用個別操作,如**發送電子郵件**、**導入CSV** 和 **導出CSV** +- 切换 **应用全访问** 以授予所有权限 +- 或者启用个人操作,例如 **发送电子邮件**、**导入 CSV** 和 **导出 CSV** diff --git a/packages/twenty-docs/l/zh/user-guide/settings/profile-settings.mdx b/packages/twenty-docs/l/zh/user-guide/settings/profile-settings.mdx index 3bd71837f30..37eedb97155 100644 --- a/packages/twenty-docs/l/zh/user-guide/settings/profile-settings.mdx +++ b/packages/twenty-docs/l/zh/user-guide/settings/profile-settings.mdx @@ -1,50 +1,50 @@ --- -title: 個人資料設定 -info: "管理您的個人資料及安全設定。" +title: 个人资料设置 +info: "管理您的个人资料和安全设置。" image: /images/user-guide/setup/profile.png -sectionInfo: 配置您的Twenty工作區設置和偏好 +sectionInfo: 配置您的Twenty工作空间设置和偏好 --- Header -## 個人資訊 +## 个人信息 -### 姓名和電子郵件 +### 姓名和邮箱 -- **Display Name**: Update how your name appears to other workspace members -- **電子郵件地址**:更改您的登錄電子郵件(需要驗證) -- **個人資料圖片**:上載自定義頭像或使用您的縮寫 +- **显示名称**:更新您的姓名对其他工作空间成员的显示方式 +- **电子邮件地址**:更改您的登录电子邮件(需要验证) +- **个人头像**:上传自定义头像或使用您的姓名首字母 -## 安全設定 +## 安全设置 -### Two-Factor Authentication (2FA) +### 双因素认证 (2FA) -啟用 2FA 以增加一層額外的安全性在您的帳號上: +启用 2FA 为您的帐户增加一个额外的安全层: -1. 前往 **設定 → 個人資料設定** -2. 點擊 **啟用 2FA** -3. 使用您的驗證器應用掃描 QR Code -4. 輸入驗證碼進行確認 +1. 转到 **设置 → 个人资料设置** +2. 单击 **启用 2FA** +3. 使用您的身份验证应用扫描 QR 码 +4. 输入验证码以确认 -### 密碼管理 +### 密码管理 -- **更改密碼**:更新您當前的密碼 -- **Password Requirements**: Must be at least 8 characters long +- **更改密码**:更新您当前的密码 +- **密码要求**:至少 8 个字符 -## 個人資料管理 +## 个人资料管理 -### 刪除帳號 +### 删除帐户 -刪除您的帳號將永久移除您對所有工作空間的訪問。 此操作無法撤銷,您將失去所有工作空間權限,如您只想退出特定的團隊,應考慮退出個別的工作空間。 +删除您的帐户将永久移除您对所有工作空间的访问权限。 此操作无法撤销。您将失去对所有工作空间的访问权限。如果您只想退出特定团队,您应该考虑单独退出工作空间。 -要刪除帳號: +要删除您的帐户: -1. 前往 **設定 → 個人資料設定** -2. 滾動至 **危險區域** -3. 點擊 **刪除帳號** -4. 通過輸入您的電子郵件地址確認 +1. 转到 **设置 → 个人资料设置** +2. 滚动至 **危险区** +3. 单击 **删除帐户** +4. 输入您的电子邮箱地址以确认 diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/external-tool-integration.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/external-tool-integration.mdx index c8207248f3a..f32ed0be2ce 100644 --- a/packages/twenty-docs/l/zh/user-guide/workflows/external-tool-integration.mdx +++ b/packages/twenty-docs/l/zh/user-guide/workflows/external-tool-integration.mdx @@ -1,220 +1,220 @@ --- -title: 外部工具整合 -info: 這些工作流程專注於通過 API 調用和 Webhooks 將數據導入和導出 Twenty。 +title: 外部工具集成 +info: 这些工作流的重点是通过 API 调用和 Webhooks 将数据导入和导出 Twenty。 image: /images/user-guide/integrations/plug.png -sectionInfo: 自動化流程並與外部工具集成 +sectionInfo: 自动化流程并与外部工具集成 --- Header -Below are workflow examples you could roll out to connect Twenty with the rest of your stack. +以下是一些您可以推出的工作流示例,以连接 Twenty 与您的其他工具。 -## Data Ingestion Use Cases +## 数据摄取用例 -### 網頁表單提交 +### 网页表单提交 -**問題**: 您需要從網站表單、著陸頁或聯絡表中捕獲線索並直接導入 Twenty。 +**问题**:您需要从网站表单、着陆页或联系表单中直接捕获潜在客户进入 Twenty。 -**解決方案**: 使用 Webhook 觸發器自動從表單提交創建記錄。 +**解决方案**:使用 Webhook 触发器自动创建表单提交记录。 -**設置**: +**设置**: -- 創建具有 Webhook 觸發器的工作流程 -- 配置 Webhook 以期望接收表單數據(姓名、電子郵件、公司等) -- 將 Webhook 方法設置為 POST -- 在觸發器中定義預期的數據結構 +- 创建一个带有 Webhook 触发器的工作流 +- 配置 Webhook 以接收表单数据(姓名、电子邮件、公司等) +- 将 Webhook 方法设置为 POST +- 在触发器中定义预期的主体结构 -**觸發器**: Webhook(由您的表單發送的 POST 請求) +**触发器**:Webhook(来自您的表单的 POST 请求) -**操作**: +**操作**: -- 搜索記錄以檢查人員/公司是否已存在 -- 分支:如果存在 → 更新記錄,如果不存在 → 創建記錄 -- 創建記錄以為業務代表分配跟進任務 -- 發送電子郵件通知給銷售團隊 +- 搜索记录以检查人员/公司是否已存在 +- 分支:如果存在 → 更新记录,否则 → 创建记录 +- 为分配给销售代表的后续任务创建记录 +- 发送电子邮件通知销售团队 -### 產品數據同步 +### 产品数据同步 -**問題**: 您的銷售團隊需要對儲存在您的數據倉庫中的產品使用情況、計費或功能採用數據的可見性。 +**问题**:您的销售团队需要了解存储在数据仓库中的产品使用情况、计费或功能采纳数据。 -**解決方案**: 定期將產品數據同步到 Twenty,為銷售提供客戶的背景信息。 +**解决方案**:定期将产品数据同步到 Twenty,以便销售人员了解其客户。 -**觸發器**: 按排程(每日或每週) +**触发器**:根据计划(每日或每周) -**操作**: +**操作**: -- 向數據倉庫 API 發送 HTTP 請求 -- 編寫代碼以處理和格式化數據 -- 使用迭代器功能進行接下來的步驟 -- 搜索記錄以查找匹配的公司記錄 -- 更新記錄以新增產品使用指標 -- 當使用量低於阈值時創建任務記錄 +- HTTP 请求到您的数据仓库 API +- 代码操作以处理和格式化数据 +- 使用迭代器功能执行以下步骤 +- 搜索记录以查找匹配的公司记录 +- 更新记录以添加产品使用指标 +- 当使用情况低于阈值时为任务创建记录 -### 通話記錄員的會議筆記 +### 从呼叫记录器获取会议记录 -**問題**: 銷售電話中的重要見解常常丟失或未能妥善記錄在 CRM 中。 +**问题**:销售电话中的重要见解丢失或未在 CRM 中正确记录。 -**解決方案**: 自動從通話錄音系統創建筆記和動作項目。 +**解决方案**:自动从呼叫记录系统创建笔记和操作项目。 -**觸發器**: Webhook(來自通話錄音平台) +**触发器**:Webhook(来自呼叫记录平台) -**操作**: +**操作**: -- 編寫代碼以提取會議摘要和行動項目 -- 搜索記錄以找到相關的機會或聯絡人 -- 創建會議摘要的筆記記錄 -- 基於行動項目的後續任務創建記錄 -- 發送電子郵件給參與者,附上摘要和後續步驟 +- 代码操作以提取会议摘要和行动项目 +- 搜索记录以找到相关机会或联系人 +- 创建会议摘要笔记的记录 +- 基于行动项目创建后续任务记录 +- 向与会者发送电子邮件,其中包含摘要和下一步行动 -### 數據增強 +### 数据充实 -**問題**: 您的聯絡人和公司記錄缺少重要的人口和公司信息。 +**问题**:您的联系人和公司记录缺乏重要的人口统计和细分市场信息。 -**解決方案**: 使用外部數據供應商自動增強記錄。 +**解决方案**:使用外部数据提供商自动丰富记录。 -**觸發器**: 記錄被創建(人員或公司對象) +**触发器**:创建记录(人员或公司对象) -**操作**: +**操作**: -- 向增強 API 發送 HTTP 請求 -- 編寫代碼以處理增強響應 -- 使用迭代器功能進行接下來的步驟 -- 使用額外的公司/聯絡人信息更新記錄 -- 當標識出高價值潛在客戶時創建銷售任務記錄 -- 若增強揭示關鍵購入信號,則發送電子郵件警報 +- HTTP 请求到充实 API +- 代码操作以处理充实响应 +- 使用迭代器功能执行以下步骤 +- 使用附加的公司/联系信息更新记录 +- 如果识别到高价值潜在客户则创建销售任务记录 +- 如果充实揭示关键信号则发送电子邮件通知 -## 數據分發用例 +## 数据分发用例 -### 新聞稿訂戶管理 +### 通讯订阅者管理 -**問題**: 您希望使用專業的電子郵件工具向您的 CRM 數據中的特定細分發送營銷電子郵件。 +**问题**:您希望使用专业的电子邮件工具向 CRM 数据的特定分段发送营销电子邮件。 -**解決方案**: 在需要時將訂戶列表匯出到您的電子郵件行銷平台。 +**解决方案**:在需要时将订阅者列表导出到您的电子邮件营销平台。 -**設置**: 在 Twenty 中創建一個檢視來顯示所有的新聞稿接收者 +**设置**:在 Twenty 中创建一个包含所有通讯接收者的视图 -**觸發器**: 手動啟動(當沒有選擇記錄時) +**触发器**:手动启动(当未选择任何记录时) -**操作**: +**操作**: -- 使用新聞稿檢視條件搜尋記錄 -- 編寫代碼以格式化電子郵件平台的電子郵件地址 -- 通過 HTTP 請求將訂戶新增到您的電子郵件行銷工具 -- Create Record for campaign tracking -- Send Email confirmation to marketing team +- 使用通讯视图标准搜索记录 +- 编码操作以为您的电子邮件平台格式化电子邮件地址 +- HTTP 请求将订阅者添加到您的电子邮件营销工具 +- 创建记录以进行活动跟踪 +- 向营销团队发送电子邮件确认 -### 電子郵件序列觸發器 +### 电子邮件序列触发 -**問題**: 您希望根據 CRM 活動觸發複雜的電子郵件序列,使用專用的電子郵件自動化工具。 +**问题**:您希望使用专用的电子邮件自动化工具根据 CRM 事件触发复杂的电子邮件序列。 -**解決方案**: 當特定事件發生時,將新潛在客戶或顧客發送到您的電子郵件自動化平台。 +**解决方案**:在特定事件发生时将新线索或客户发送到您的电子邮件自动化平台。 -**觸發器**: 紀錄被創建(符合特定條件的人員對象) +**触发器**:创建记录(具有特定条件的人员对象) -**操作**: +**操作**: -- 編寫代碼以確定適當的電子郵件序列 -- 通過 HTTP 請求將聯絡人新增到電子郵件自動化平台 -- Update Record to track sequence enrollment -- Create Record for follow-up task to monitor engagement +- 代码操作以确定适当的电子邮件序列 +- HTTP 请求将联系人添加到电子邮件自动化平台 +- 更新记录以跟踪序列注册 +- 创建记录以进行后续任务监测参与度 -### 潛在客戶得分集成 +### 线索评分集成 -**問題**: 您需要運用 CRM 數據與外部信號結合的高級潛在客戶評分。 +**问题**:您需要结合 CRM 数据和外部信号的复杂线索评分。 -**解決方案**: 將潛在客戶數據發送到外部評分工具或在工作流程中實施評分邏輯。 +**解决方案**:将线索数据发送到外部评分工具或在工作流中实施评分逻辑。 -**選項 1 - 外部工具**: +**选项 1 - 外部工具**: -**觸發器**: 紀錄被更新(人員對象) +**触发器**:记录已更新(人员对象) -**操作**: +**操作**: -- 通過 HTTP 請求將潛在客戶數據發送到評分平台 -- 編寫代碼以處理評分回應 -- 更新紀錄以保留潛在客戶評分 -- 如果評分超出閾值,則創建業務任務的紀錄 +- HTTP 请求将线索数据发送到评分平台 +- 代码操作以处理评分响应 +- 更新记录以显示线索分数 +- 如果分数超过阈值,则为销售任务创建记录 -**選項 2 - 內部邏輯**: +**选项 2 - 内部逻辑**: -**觸發器**: 紀錄被更新(人員對象) +**触发器**:记录已更新(人员对象) -**操作**: +**操作**: -- 編寫代碼與評分算法(公司規模、行業、行為) -- 使用計算得分更新紀錄 -- 發送電子郵件警報給高評比分的業務代表 +- 使用评分算法(公司规模、行业、行为)进行编码操作 +- 用计算得出的分数更新记录 +- 向销售代表发送高分线索电子邮件提醒 -### 發票生成 +### 发票生成 -**問題**: 當交易結束時,您的計費系統需要更新客戶和交易資訊。 +**问题**:当交易关闭时,您的计费系统需要更新客户和交易信息。 -**解決方案**: 當機會贏得時,自動將交易數據發送到您的發票系統。 +**解决方案**:在赢得商机时自动将交易数据发送到您的开票系统。 -**觸發器**: 紀錄被更新(機會對象,階段 = "關閉並贏得") +**触发器**:记录已更新(机会对象,阶段= "完成胜利") -**操作**: +**操作**: -- 搜索紀錄以獲取完整的客戶信息 -- 編寫代碼以格式化計費系統的數據 -- 通過 HTTP 請求在計費平台中創建客戶 -- 通過 HTTP 請求生成發票 -- 更新紀錄以儲存發票參考 -- 將發票詳情發送給財務團隊 +- 搜索记录以获取完整的客户信息 +- 代码操作以为计费系统格式化数据 +- HTTP 请求在计费平台中创建客户 +- HTTP 请求生成发票 +- 更新记录以存储发票参考 +- 向财务团队发送包含发票详细信息的电子邮件 -## 高級集成模式 +## 高级集成模式 -### 雙向同步 +### 双向同步 -**問題**: 您需要將 Twenty 和另一個系統的數據雙向同步。 +**问题**:您需要在 Twenty 和另一个系统之间双向同步数据。 -**Solution**: Combine scheduled workflows with webhook triggers for real-time sync. +**解决方案**:结合计划的工作流和 Webhook 触发器以实现实时同步。 -**從 Twenty 到外部系統**: +**从 Twenty 到外部系统**: -**觸發器**: 紀錄被更新(任何相關對象) +**触发器**:记录已更新(任何相关对象) -**操作**: +**操作**: -- 通過 HTTP 請求更新外部系統 -- 更新紀錄以跟蹤同步狀態和時間戳記 +- HTTP 请求更新外部系统 +- 更新记录以跟踪同步状态和时间戳 -**從外部系統到 Twenty**: +**从外部系统到 Twenty**: -**觸發器**: Webhook(來自外部系統) +**触发器**:Webhook(来自外部系统) -**操作**: +**操作**: -- 搜索紀錄以找到匹配的紀錄 -- 使用外部系統的新數據更新紀錄 -- 如果需要,創建紀錄以解決衝突任務 +- 搜索记录以查找匹配的记录 +- 用外部系统的新数据更新记录 +- 如有需要,为冲突解决任务创建记录 -### 多步驟數據處理 +### 多步骤数据处理 -**問題**: 來自外部來源的數據需要進行複雜的處理,然後才能在 Twenty 中使用。 +**问题**:来自外部来源的数据需要复杂的处理才能在 Twenty 中使用。 -**解決方案**: 使用代碼操作進行數據轉換和驗證。 +**解决方案**:使用代码操作进行数据转换和验证。 -**觸發器**: Webhook 或按計劃 +**触发器**:Webhook 或按计划 -**操作**: +**操作**: -- 編寫代碼以驗證輸入數據格式 -- 編寫代碼以轉換數據結構 -- 編寫代碼以應用業務規則和計算 -- 搜索紀錄以檢查重複項 -- 使用處理過的數據創建或更新紀錄 -- 如果檢測到數據質量問題,則發送電子郵件警報 +- 代码操作验证传入数据格式 +- 代码操作转换数据结构 +- 代码操作应用业务规则和计算 +- 搜索记录以检查重复项 +- 使用处理后的数据创建或更新记录 +- 如果检测到数据质量问题,发送电子邮件提醒 -## 實施提示 +## 实施提示 -- 安全地將 API 金鑰儲存在“設置”→“API 和 Webhooks”中 -- 使用 HTTPS 對所有外部 API 請求 -- 注意 API 限速 - 儘可能使用計劃的工作流程 -- 當不需要實時處理時,考慮“按計劃”批量更新 -- Remember the 100 concurrent workflow limit per workspace - use "Bulk" availability for manual triggers when processing multiple records (see [Workflow Features](/l/zh/user-guide/workflows/workflow-features) for details) -- Test with sample data before activating workflows +- 在 设置 → API & Webhook 中安全地存储 API 密钥 +- 所有外部 API 调用都使用 HTTPS +- 注意 API 速率限制 - 尽可能使用计划的工作流 +- 当不需要实时处理时,考虑批量更新 "按计划" +- 记住每个工作区的 100 个并发工作流限制 - 在处理多个记录时为手动触发器使用 "批量" 可用性(参见 [工作流功能](/l/zh/user-guide/workflows/workflow-features) 以获取详细信息) +- 在激活工作流前用示例数据测试 -關於集成問題的故障排除,請參閱我們的[工作流故障排除](/l/zh/user-guide/workflows/workflow-troubleshooting)指南。 關於實施複雜集成的幫助,請考慮我們的[專業服務](/l/zh/user-guide/workflows/professional-services)。 +有关排除集成问题,请参阅我们的 [工作流故障排除](/l/zh/user-guide/workflows/workflow-troubleshooting) 指南。 如果在实施复杂集成时需要帮助,请考虑我们的 [专业服务](/l/zh/user-guide/workflows/professional-services)。 diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/professional-services.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/professional-services.mdx index 0d1f34ae973..17e9524a1a5 100644 --- a/packages/twenty-docs/l/zh/user-guide/workflows/professional-services.mdx +++ b/packages/twenty-docs/l/zh/user-guide/workflows/professional-services.mdx @@ -32,6 +32,6 @@ sectionInfo: 自動化流程並與外部工具集成 ### 實施合作夥伴 -與認證合作夥伴合作進行高級定制。 通過 contact@twenty.com 聯繫我們以接洽我們的[實施合作夥伴](https://twenty.com/implementation-services)。 +與認證合作夥伴合作進行高級定制。 與認證合作夥伴合作進行高級定制。 通過 contact@twenty.com 聯繫我們以接洽我們的[實施合作夥伴](https://twenty.com/implementation-services)。 diff --git a/packages/twenty-docs/l/zh/user-guide/workflows/workflow-credits.mdx b/packages/twenty-docs/l/zh/user-guide/workflows/workflow-credits.mdx index bbeb87e8d3b..76fc194a8c7 100644 --- a/packages/twenty-docs/l/zh/user-guide/workflows/workflow-credits.mdx +++ b/packages/twenty-docs/l/zh/user-guide/workflows/workflow-credits.mdx @@ -9,7 +9,7 @@ sectionInfo: 自動化流程並與外部工具集成 Header -工作流程點數為您在Twenty 的自動化提供動力。 理解工作方式可以幫助您優化成本並有效地管理您的自動化預算。 +工作流程點數為您在Twenty 的自動化提供動力。 工作流程點數為您在Twenty 的自動化提供動力。 理解工作方式可以幫助您優化成本並有效地管理您的自動化預算。 ## 按方案分配點數 diff --git a/packages/twenty-docs/navigation/navigation-schema.json b/packages/twenty-docs/navigation/navigation-schema.json new file mode 100644 index 00000000000..1e1782934f3 --- /dev/null +++ b/packages/twenty-docs/navigation/navigation-schema.json @@ -0,0 +1,254 @@ +{ + "tabs": [ + { + "key": "userGuide", + "label": "User Guide", + "groups": [ + { + "key": "gettingStarted", + "label": "Getting Started", + "icon": "rocket", + "pages": [ + "user-guide/introduction", + "user-guide/getting-started/what-is-twenty", + "user-guide/getting-started/create-workspace", + "user-guide/getting-started/getting-around-twenty", + "user-guide/getting-started/configure-your-workspace", + "user-guide/getting-started/implementation-services", + "user-guide/getting-started/migrating-from-other-crms", + "user-guide/getting-started/import-export-data" + ] + }, + { + "key": "dataModel", + "label": "Data Model", + "icon": "database", + "pages": [ + "user-guide/data-model/customize-your-data-model", + "user-guide/data-model/objects", + "user-guide/data-model/fields", + "user-guide/data-model/creating-records", + "user-guide/data-model/relation-fields", + "user-guide/data-model/data-model-faq" + ] + }, + { + "key": "crmEssentials", + "label": "CRM Essentials", + "icon": "users", + "pages": [ + "user-guide/crm-essentials/contact-and-account-management", + "user-guide/crm-essentials/pipeline", + "user-guide/crm-essentials/view-management", + "user-guide/crm-essentials/sales-use-cases" + ] + }, + { + "key": "views", + "label": "Views", + "icon": "table", + "pages": [ + "user-guide/views/kanban-views", + "user-guide/views/views-sort-filter" + ] + }, + { + "key": "workflows", + "label": "Workflows", + "icon": "bolt", + "pages": [ + "user-guide/workflows/getting-started-workflows", + "user-guide/workflows/workflow-features", + "user-guide/workflows/internal-automations", + "user-guide/workflows/external-tool-integration", + "user-guide/workflows/workflow-troubleshooting", + "user-guide/workflows/workflow-credits", + "user-guide/workflows/professional-services" + ] + }, + { + "key": "collaboration", + "label": "Collaboration", + "icon": "envelope", + "pages": [ + "user-guide/collaboration/emails-and-calendars", + "user-guide/collaboration/notes", + "user-guide/collaboration/tasks" + ] + }, + { + "key": "integrationsApi", + "label": "Integrations & API", + "icon": "plug", + "pages": [ + "user-guide/integrations-api/apis-overview", + "user-guide/integrations-api/api-webhooks", + "user-guide/integrations-api/integrations" + ] + }, + { + "key": "reporting", + "label": "Reporting", + "icon": "chart-bar", + "pages": ["user-guide/reporting/reporting-overview"] + }, + { + "key": "settings", + "label": "Settings", + "icon": "gear", + "pages": [ + "user-guide/settings/profile-settings", + "user-guide/settings/experience-settings", + "user-guide/settings/email-calendar-setup", + "user-guide/settings/workspace-settings", + "user-guide/settings/member-management", + "user-guide/settings/permissions", + "user-guide/settings/domains-settings", + "user-guide/settings/releases-settings", + "user-guide/settings/settings-faq" + ] + }, + { + "key": "pricing", + "label": "Pricing", + "icon": "credit-card", + "pages": ["user-guide/pricing/billing-and-pricing-faq"] + }, + { + "key": "resources", + "label": "Resources", + "icon": "book-open", + "pages": [ + "user-guide/resources/glossary", + "user-guide/resources/github" + ] + } + ] + }, + { + "key": "developers", + "label": "Developers", + "groups": [ + { + "key": "developersGroup", + "label": "Developers", + "pages": [] + }, + { + "key": "devGettingStarted", + "label": "Getting Started", + "icon": "rocket", + "pages": [ + "developers/introduction", + "developers/local-setup", + { + "key": "selfHosting", + "label": "Self-Hosting", + "pages": [ + "developers/self-hosting/docker-compose", + "developers/self-hosting/setup", + "developers/self-hosting/upgrade-guide", + "developers/self-hosting/cloud-providers", + "developers/self-hosting/troubleshooting" + ] + }, + { + "key": "apiAndWebhooks", + "label": "API and Webhooks", + "pages": [ + "developers/api-and-webhooks/api", + "developers/api-and-webhooks/webhooks" + ] + } + ] + }, + { + "key": "contributing", + "label": "Contributing", + "icon": "code-branch", + "pages": [ + "developers/bug-and-requests", + { + "key": "frontendDevelopment", + "label": "Frontend Development", + "pages": [ + "developers/frontend-development/storybook", + { + "key": "twentyUi", + "label": "Twenty UI", + "pages": [ + "twenty-ui/introduction", + { + "key": "display", + "label": "Display", + "pages": [ + "twenty-ui/display/checkmark", + "twenty-ui/display/chip", + "twenty-ui/display/icons", + "twenty-ui/display/soon-pill", + "twenty-ui/display/tag", + "twenty-ui/display/app-tooltip" + ] + }, + { + "key": "feedback", + "label": "Feedback", + "pages": ["twenty-ui/progress-bar"] + }, + { + "key": "input", + "label": "Input", + "pages": [ + "twenty-ui/input/buttons", + "twenty-ui/input/color-scheme", + "twenty-ui/input/text", + "twenty-ui/input/checkbox", + "twenty-ui/input/icon-picker", + "twenty-ui/input/image-input", + "twenty-ui/input/radio", + "twenty-ui/input/select", + "twenty-ui/input/toggle", + "twenty-ui/input/block-editor" + ] + }, + { + "key": "navigation", + "label": "Navigation", + "pages": [ + "twenty-ui/navigation", + "twenty-ui/navigation/breadcrumb", + "twenty-ui/navigation/links", + "twenty-ui/navigation/menu-item", + "twenty-ui/navigation/navigation-bar", + "twenty-ui/navigation/step-bar" + ] + } + ] + }, + "developers/frontend-development/frontend-commands", + "developers/frontend-development/work-with-figma", + "developers/frontend-development/best-practices-front", + "developers/frontend-development/style-guide", + "developers/frontend-development/folder-architecture-front", + "developers/frontend-development/hotkeys" + ] + }, + { + "key": "backendDevelopment", + "label": "Backend Development", + "pages": [ + "developers/backend-development/server-commands", + "developers/backend-development/feature-flags", + "developers/backend-development/folder-architecture-server", + "developers/backend-development/zapier", + "developers/backend-development/best-practices-server", + "developers/backend-development/custom-objects", + "developers/backend-development/queue" + ] + } + ] + } + ] + } + ] +} diff --git a/packages/twenty-docs/navigation/navigation.template.json b/packages/twenty-docs/navigation/navigation.template.json new file mode 100644 index 00000000000..e664ed486dc --- /dev/null +++ b/packages/twenty-docs/navigation/navigation.template.json @@ -0,0 +1,91 @@ +{ + "tabs": { + "userGuide": { + "label": "User Guide", + "groups": { + "gettingStarted": { + "label": "Getting Started" + }, + "dataModel": { + "label": "Data Model" + }, + "crmEssentials": { + "label": "CRM Essentials" + }, + "views": { + "label": "Views" + }, + "workflows": { + "label": "Workflows" + }, + "collaboration": { + "label": "Collaboration" + }, + "integrationsApi": { + "label": "Integrations & API" + }, + "reporting": { + "label": "Reporting" + }, + "settings": { + "label": "Settings" + }, + "pricing": { + "label": "Pricing" + }, + "resources": { + "label": "Resources" + } + } + }, + "developers": { + "label": "Developers", + "groups": { + "developersGroup": { + "label": "Developers" + }, + "devGettingStarted": { + "label": "Getting Started", + "groups": { + "selfHosting": { + "label": "Self-Hosting" + }, + "apiAndWebhooks": { + "label": "API and Webhooks" + } + } + }, + "contributing": { + "label": "Contributing", + "groups": { + "frontendDevelopment": { + "label": "Frontend Development", + "groups": { + "twentyUi": { + "label": "Twenty UI", + "groups": { + "display": { + "label": "Display" + }, + "feedback": { + "label": "Feedback" + }, + "input": { + "label": "Input" + }, + "navigation": { + "label": "Navigation" + } + } + } + } + }, + "backendDevelopment": { + "label": "Backend Development" + } + } + } + } + } + } +} diff --git a/packages/twenty-docs/navigation/supported-languages.ts b/packages/twenty-docs/navigation/supported-languages.ts new file mode 100644 index 00000000000..c9680a11572 --- /dev/null +++ b/packages/twenty-docs/navigation/supported-languages.ts @@ -0,0 +1,21 @@ +export const DEFAULT_LANGUAGE = 'en' as const; + +export const SUPPORTED_LANGUAGES = [ + DEFAULT_LANGUAGE, + 'fr', + 'ar', + 'cs', + 'de', + 'es', + 'it', + 'ja', + 'ko', + 'pt', + 'ro', + 'ru', + 'tr', + 'zh', +] as const; + +export type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number]; + diff --git a/packages/twenty-docs/scripts/generate-docs-json.ts b/packages/twenty-docs/scripts/generate-docs-json.ts new file mode 100644 index 00000000000..35522a39a56 --- /dev/null +++ b/packages/twenty-docs/scripts/generate-docs-json.ts @@ -0,0 +1,168 @@ +import fs from 'fs'; +import path from 'path'; + +import { + DEFAULT_LANGUAGE, + SUPPORTED_LANGUAGES, +} from '../navigation/supported-languages'; + +type BasePage = string | BaseGroup; + +type BaseGroup = { + key: string; + label: string; + icon?: string; + pages: BasePage[]; +}; + +type BaseTab = { + key: string; + label: string; + groups: BaseGroup[]; +}; + +type BaseStructure = { + tabs: BaseTab[]; +}; + +type TranslationGroupEntry = { + label: string; + groups?: Record; +}; + +type TranslationTabEntry = { + label: string; + groups: Record; +}; + +type TranslationFile = { + tabs: Record; +}; + +type TranslationMaps = { + tabLabels: Map; + groupLabels: Map; +}; + +type GeneratedLanguage = { + language: string; + tabs: Array<{ + tab: string; + groups: GeneratedGroup[]; + }>; +}; + +type GeneratedGroup = { + group: string; + icon?: string; + pages: Array; +}; + +const baseStructurePath = path.resolve( + __dirname, + '../navigation/navigation-schema.json', +); +const docsPath = path.resolve(__dirname, '../docs.json'); +const localesRoot = path.resolve(__dirname, '../l'); + +const baseStructure: BaseStructure = JSON.parse( + fs.readFileSync(baseStructurePath, 'utf8'), +); + +const docsConfig = JSON.parse(fs.readFileSync(docsPath, 'utf8')); + +const collectTranslations = ( + file: TranslationFile | null, +): TranslationMaps => { + const tabLabels = new Map(); + const groupLabels = new Map(); + + const collectGroups = ( + groups?: Record, + ) => { + if (!groups) { + return; + } + + Object.entries(groups).forEach(([key, group]) => { + groupLabels.set(key, group.label); + collectGroups(group.groups); + }); + }; + + Object.entries(file?.tabs ?? {}).forEach(([key, tab]) => { + tabLabels.set(key, tab.label); + collectGroups(tab.groups); + }); + + return { tabLabels, groupLabels }; +}; + +const loadTranslationFile = (language: string): TranslationFile | null => { + const translationPath = path.join( + localesRoot, + language, + 'navigation.json', + ); + + if (!fs.existsSync(translationPath)) { + return null; + } + + return JSON.parse(fs.readFileSync(translationPath, 'utf8')) as TranslationFile; +}; + +const buildLanguageEntry = (language: string): GeneratedLanguage => { + const translationFile = + language === DEFAULT_LANGUAGE ? null : loadTranslationFile(language); + const translationMaps = collectTranslations(translationFile); + + return { + language, + tabs: baseStructure.tabs.map((tab) => ({ + tab: translationMaps.tabLabels.get(tab.key) ?? tab.label, + groups: tab.groups.map((group) => + buildGroup(group, translationMaps, language), + ), + })), + }; +}; + +const buildGroup = ( + group: BaseGroup, + translations: TranslationMaps, + language: string, +): GeneratedGroup => ({ + group: translations.groupLabels.get(group.key) ?? group.label, + ...(group.icon ? { icon: group.icon } : {}), + pages: group.pages.map((page) => + typeof page === 'string' + ? formatPageSlug(page, language) + : buildGroup(page, translations, language), + ), +}); + +const formatPageSlug = (slug: string, language: string): string => + language === DEFAULT_LANGUAGE ? slug : `l/${language}/${slug}`; + +const hasLocaleContent = (language: string): boolean => { + if (language === DEFAULT_LANGUAGE) { + return true; + } + + const localeDir = path.join(localesRoot, language); + return fs.existsSync(localeDir); +}; + +const languages = SUPPORTED_LANGUAGES.filter(hasLocaleContent).map( + buildLanguageEntry, +); + +if (!docsConfig.navigation) { + docsConfig.navigation = {}; +} + +docsConfig.navigation.languages = languages; + +fs.writeFileSync(docsPath, `${JSON.stringify(docsConfig, null, 2)}\n`); + diff --git a/packages/twenty-docs/scripts/generate-navigation-template.ts b/packages/twenty-docs/scripts/generate-navigation-template.ts new file mode 100644 index 00000000000..364143a062b --- /dev/null +++ b/packages/twenty-docs/scripts/generate-navigation-template.ts @@ -0,0 +1,81 @@ +import fs from 'fs'; +import path from 'path'; + +type BasePage = string | BaseGroup; + +type BaseGroup = { + key: string; + label: string; + pages: BasePage[]; +}; + +type BaseTab = { + key: string; + label: string; + groups: BaseGroup[]; +}; + +type BaseStructure = { + tabs: BaseTab[]; +}; + +type TemplateGroup = { + label: string; + groups?: Record; +}; + +type TemplateTab = { + label: string; + groups: Record; +}; + +type TemplateFile = { + tabs: Record; +}; + +const baseStructurePath = path.resolve( + __dirname, + '../navigation/navigation-schema.json', +); +const templatePath = path.resolve( + __dirname, + '../navigation/navigation.template.json', +); + +const baseStructure: BaseStructure = JSON.parse( + fs.readFileSync(baseStructurePath, 'utf8'), +); + +const buildGroupMap = ( + groups: BaseGroup[], +): Record => + groups.reduce>((acc, group) => { + const nestedGroups = group.pages.filter( + (page): page is BaseGroup => typeof page !== 'string', + ); + + acc[group.key] = { + label: group.label, + ...(nestedGroups.length > 0 + ? { groups: buildGroupMap(nestedGroups) } + : {}), + }; + + return acc; + }, {}); + +const template: TemplateFile = { + tabs: baseStructure.tabs.reduce>( + (acc, tab) => ({ + ...acc, + [tab.key]: { + label: tab.label, + groups: buildGroupMap(tab.groups), + }, + }), + {}, + ), +}; + +fs.writeFileSync(templatePath, `${JSON.stringify(template, null, 2)}\n`); +