diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..5e40ef3bbb
--- /dev/null
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: كائنات مخصصة
+---
+
+الكائنات هي هياكل تسمح لك بتخزين البيانات (السجلات، السمات والقيم) الخاصة بالمؤسسة. توفر Twenty كلاً من الكائنات القياسية والمخصصة.
+
+الكائنات القياسية هي كائنات مدمجة مع مجموعة من السمات المتاحة لجميع المستخدمين. تتضمن الأمثلة على الكائنات القياسية في Twenty الشركات والأشخاص. الكائنات القياسية تحتوي على حقول قياسية تتوفر أيضاً لجميع مستخدمي Twenty، مثل Company.displayName.
+
+الكائنات المخصصة هي كائنات يمكنك إنشاؤها لتخزين المعلومات التي تخص مؤسستك. هذه الكائنات ليست مدمجة؛ يمكن لأعضاء مساحة العمل الخاصة بك إنشاء وتخصيص الكائنات المخصصة للاحتفاظ بالمعلومات التي لا تناسبها الكائنات القياسية.
+
+## مخطط على مستوى عالي
+
+
+
+
+
+
+
+## كيف يعمل
+
+الكائنات المخصصة تأتي من جداول الميتاداتا التي تحدد شكل، اسم، ونوع الكائنات. كل هذه المعلومات موجودة في قاعدة بيانات المخطط البياني للبيانات الوصفية، والتي تتكون من جداول:
+
+* **مصدر البيانات**: يشير إلى مكان وجود البيانات.
+* **الكائن**: يصف الكائن ويرتبط بمصدر البيانات.
+* **الحقل**: يحدد حقول الكائن ويرتبط بالكائن.
+
+لإضافة كائن مخصص، سيقوم عضو مساحة العمل بالاستعلام عن واجهة برمجة التطبيقات /metadata. يقوم هذا بتحديث البيانات الوصفية وفقًا لذلك ويحسب مخطط GraphQL استنادًا إلى البيانات الوصفية، ويخزنها في ذاكرة GQL للاستخدام لاحقًا.
+
+
+
+
+
+
+
+لجلب البيانات، تتضمن العملية إجراء استعلامات من خلال نقطة النهاية /graphql وتمريرها من خلال محلل الاستعلام.
+
+
+
+
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..1bf77436c1
--- /dev/null
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,83 @@
+---
+title: تطبيق Zapier
+---
+
+قم بمزامنة Twenty مع أكثر من 3000 تطبيق باستخدام [Zapier](https://zapier.com/) بسهولة. قم بأتمتة المهام، وزيادة الإنتاجية، وتعزيز علاقاتك مع العملاء!
+
+## حول Zapier
+
+Zapier هي أداة تتيح لك أتمتة سير العمل من خلال ربط التطبيقات التي يستخدمها فريقك يوميًا. المفهوم الأساسي ل Zapier هو سير العمل الآلي، المسمى Zaps، والذي يتضمن محفزات وإجراءات.
+
+يمكنك معرفة المزيد حول كيفية عمل Zapier [هنا](https://zapier.com/how-it-works).
+
+## إعداد
+
+### الخطوة 1: تثبيت حزم Zapier
+
+```bash
+cd packages/twenty-zapier
+
+yarn
+```
+
+### الخطوة 2: تسجيل الدخول باستخدام CLI
+
+استخدم بيانات اعتماد Zapier الخاصة بك لتسجيل الدخول باستخدام CLI:
+
+```bash
+zapier login
+```
+
+### الخطوة 3: تعيين متغيرات البيئة
+
+من مجلد `packages/twenty-zapier`، قم بتشغيل:
+
+```bash
+cp .env.example .env
+```
+
+شغل التطبيق محليًا، اذهب إلى [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks)، وولد مفتاح API.
+
+استبدل قيمة **YOUR_API_KEY** في ملف `.env` بمفتاح API الذي قمت بتوليده للتو.
+
+## التطوير
+
+
+ تأكد من تشغيل `yarn build` قبل أي أمر `zapier`.
+
+
+### تجربة
+
+```bash
+yarn test
+```
+
+### Lint
+
+```bash
+yarn format
+```
+
+### راقب وقم بالتحويل عند تحرير الكود
+
+```bash
+yarn watch
+```
+
+### تحقق من صحة تطبيق Zapier الخاص بك
+
+```bash
+yarn validate
+```
+
+### قم بنشر تطبيق Zapier الخاص بك
+
+```bash
+yarn deploy
+```
+
+### اعرض جميع أوامر Zapier CLI
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
new file mode 100644
index 0000000000..e805ba1b8f
--- /dev/null
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -0,0 +1,109 @@
+---
+title: هيكلية المجلدات
+info: نظرة مفصلة على هيكل المجلدات الخاصة بنا
+---
+
+في هذا الدليل، ستستكشف تفاصيل هيكل دليل المشروع وكيف يساهم في تنظيم Twenty وسهولة صيانتها.
+
+باتباع اصطلاح هيكل المجلدات هذا، يسهل العثور على الملفات المتعلقة بميزات محددة وضمان أن يكون التطبيق قابلاً للتوسّع والصيانة.
+
+```
+front
+└───modules
+│ └───module1
+│ │ └───submodule1
+│ └───module2
+│ └───ui
+│ │ └───display
+│ │ └───inputs
+│ │ │ └───buttons
+│ │ └───...
+└───pages
+└───...
+```
+
+## الصفحات
+
+تشمل المكونات عالية المستوى المحددة من قبل مسارات التطبيق. وتستورد مكوّنات منخفضة المستوى من مجلد الوحدات (تفاصيل إضافية أدناه).
+
+## الوحدات
+
+تمثّل كل وحدة ميزة أو مجموعة من الميزات، وتضم مكوّناتها الخاصة وحالاتها ومنطقها التشغيلي.
+يجب أن تتبع جميعها البنية المذكورة أدناه. يمكنك تعشيق الوحدات داخل الوحدات (تُعرف بالوحدات الفرعية) وستطبق نفس القواعد.
+
+```
+module1
+ └───components
+ │ └───component1
+ │ └───component2
+ └───constants
+ └───contexts
+ └───graphql
+ │ └───fragments
+ │ └───queries
+ │ └───mutations
+ └───hooks
+ │ └───internal
+ └───states
+ │ └───selectors
+ └───types
+ └───utils
+```
+
+### السياقات
+
+السياق هو وسيلة لتمرير البيانات عبر شجرة المكوّنات دون الحاجة إلى تمرير الخصائص يدويًا في كل مستوى.
+
+انظر [React Context](https://react.dev/reference/react#context-hooks) لمزيد من التفاصيل.
+
+### جراف كيو إل
+
+تشمل الأجزاء، الاستعلامات والتحويرات.
+
+انظر [GraphQL](https://graphql.org/learn/) لمزيد من التفاصيل.
+
+* الأجزاء
+
+الجزء هو جزء قابل لإعادة الاستخدام من استعلام، والذي يمكنك استخدامه في أماكن مختلفة. باستخدام الأجزاء، يصبح من الأسهل تجنب تكرار التعليمات البرمجية.
+
+انظر [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) لمزيد من التفاصيل.
+
+* الاستعلامات
+
+انظر [GraphQL Queries](https://graphql.org/learn/queries/) لمزيد من التفاصيل.
+
+* التحويرات
+
+انظر [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) لمزيد من التفاصيل.
+
+### الخطافات
+
+انظر [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) لمزيد من التفاصيل.
+
+### الحالات
+
+تشمل منطق إدارة الحالة. [RecoilJS](https://recoiljs.org) يتولّى ذلك.
+
+* المحددات: انظر [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) لمزيد من التفاصيل.
+
+لا تزال إدارة الحالة المدمجة في React تتولّى الحالة داخل المكوّن.
+
+### الأدوات
+
+يجب أن تحتوي فقط على دوال نقية قابلة لإعادة الاستخدام. بخلاف ذلك، أنشئ خطافات مخصصة في مجلد `hooks`.
+
+## واجهة المستخدم
+
+تحتوي على جميع مكونات واجهة المستخدم القابلة لإعادة الاستخدام المستخدمة في التطبيق.
+
+يمكن أن يحتوي هذا المجلد على مجلّدات فرعية، مثل `data`، `display`، `feedback`، و `input` لأنواع معينة من المكوّنات. يجب أن يكون كل مكون مستقلًا وقابلًا لإعادة الاستخدام، حتى تتمكن من استخدامه في أجزاء مختلفة من التطبيق.
+
+من خلال فصل مكونات واجهة المستخدم عن المكونات الأخرى في مجلد `modules`، يسهل الحفاظ على تصميم متسق وإجراء تغييرات على واجهة المستخدم دون التأثير على الأجزاء الأخرى (منطق الأعمال) من قاعدة الشيفرة.
+
+## الواجهة والتبعيات
+
+يمكنك استيراد شيفرة وحدة أخرى من أي وحدة باستثناء مجلد `ui`. سيجعل هذا شيفرته سهلة الاختبار.
+
+### داخلي
+
+كل جزء (خطافات، حالات، ...) من الممكن أن يحتوي جزء من الوحدة على مجلد `internal`، والذي يحتوي على الأجزاء التي تُستخدم فقط داخل الوحدة.
diff --git a/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..5b88f6bae7
--- /dev/null
+++ b/packages/twenty-docs/l/ar/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,86 @@
+---
+title: أوامر الواجهة الأمامية
+---
+
+## الأوامر المفيدة
+
+### "بدء التطبيق"
+
+```bash
+"npx nx start twenty-front"
+```
+
+### "إعادة توليد مخطط graphql بناءً على مخطط API graphql"
+
+```bash
+"npx nx run twenty-front:graphql:generate --configuration=metadata"
+```
+
+"أو"
+
+```bash
+"npx nx run twenty-front:graphql:generate"
+```
+
+### Lint
+
+```bash
+"npx nx run twenty-front:lint # مرر --fix لإصلاح أخطاء التدقيق"
+```
+
+## "الترجمات"
+
+```bash
+"npx nx run twenty-front:lingui:extract\nnpx nx run twenty-front:lingui:compile"
+```
+
+### تجربة
+
+```bash
+"npx nx run twenty-front:test # تشغيل اختبارات jest\nnpx nx run twenty-front:storybook:serve:dev # تشغيل storybook\nnpx nx run twenty-front:storybook:test # تشغيل الاختبارات # (يحتاج إلى تشغيل yarn storybook:serve:dev)\nnpx nx run twenty-front:storybook:coverage # (يحتاج إلى تشغيل yarn storybook:serve:dev)"
+```
+
+## "التقنية المستخدمة"
+
+"المشروع يحتوي على تقنية بسيطة ونظيفة، مع الحد الأدنى من كود البويلر بليت."
+
+"**التطبيق**"
+
+* "[React](https://react.dev/)"
+* "[Apollo](https://www.apollographql.com/docs/)"
+* "[GraphQL Codegen](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/)"
+
+**الأدوات**
+
+* [Yarn](https://yarnpkg.com/)
+* "[Craco](https://craco.js.org/docs/)"
+* [ESLint](https://eslint.org/)
+
+## "الهيكلية"
+
+### "التوجيه"
+
+"[React Router](https://reactrouter.com/) يتعامل مع التوجيه."
+
+"لتجنب [إعادة العرض](/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) غير الضرورية، يوجد منطق التوجيه في `useEffect` في `PageChangeEffect`."
+
+### "إدارة الحالة"
+
+"[Recoil](https://recoiljs.org/docs/introduction/core-concepts) يتعامل مع إدارة الحالة."
+
+"راجع [أفضل الممارسات](/l/ar/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) لمزيد من المعلومات حول إدارة الحالة."
+
+## "الاختبار"
+
+"[Jest](https://jestjs.io/) يعمل كأداة لاختبار الوحدات بينما يعمل [Storybook](https://storybook.js.org/) لاختبار المكونات."
+
+"يستخدم Jest بشكل رئيسي لاختبار دوال الأدوات وليس المكونات نفسها."
+
+"Storybook لاختبار سلوك المكونات المعزولة، وكذلك عرض نظام التصميم."
diff --git a/packages/twenty-docs/l/ar/twenty-ui/input.mdx b/packages/twenty-docs/l/ar/twenty-ui/input.mdx
index d9147a43fb..daaef26518 100644
--- a/packages/twenty-docs/l/ar/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/ar/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx
index 9a47a96362..6b232d5662 100644
--- a/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/ar/twenty-ui/navigation/navigation-bar.mdx
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
يستعرض شريط التنقل الذي يحتوي على عدة مكونات `NavigationBarItem`.
-
+
+ ```jsx
+ استيراد { IconHome, IconUser, IconSettings } من '@tabler/icons-react';
+ استيراد { NavigationBar } من "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "الصفحة الرئيسية",
+ Icon: IconHome,
+ onClick: () => console.log("تم النقر على الصفحة الرئيسية"),
+ },
+ {
+ name: "الملف الشخصي",
+ Icon: IconUser,
+ onClick: () => console.log("تم النقر على الملف الشخصي"),
+ },
+ {
+ name: "الإعدادات",
+ Icon: IconSettings,
+ onClick: () => console.log("تم النقر على الإعدادات"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| المحددات | النوع | الوصف |
-| ---------------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| اسم العنصر النشط | string | اسم العنصر النشط حاليًا في قائمة التنقل |
-| العناصر | array | مصفوفة من الكائنات التي تمثل كل عنصر من عناصر التنقل. كل كائن يحتوي على `الاسم` للعنصر، ومكون `الأيقونة` للعرض، ودالة `onClick` التي تستدعي عند النقر على العنصر |
-
-
+
+ | المحددات | النوع | الوصف |
+ | ---------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | اسم العنصر النشط | نص | اسم العنصر النشط حاليًا في قائمة التنقل |
+ | العناصر | مصفوفة | مصفوفة من الكائنات التي تمثل كل عنصر من عناصر التنقل. كل كائن يحتوي على `الاسم` للعنصر، ومكون `الأيقونة` للعرض، ودالة `onClick` التي تستدعي عند النقر على العنصر |
+
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..72cd6dcfcd
--- /dev/null
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Vlastní objekty
+---
+
+Objekty jsou struktury, které vám umožňují ukládat data (záznamy, atributy a hodnoty) specifická pro organizaci. Twenty poskytuje jak standardní, tak vlastní objekty.
+
+Standardní objekty jsou vestavěné objekty se sadou atributů dostupných pro všechny uživatele. Příklady standardních objektů v Twenty zahrnují Firma a Osoba. Standardní objekty mají standardní pole, která jsou také dostupná pro všechny uživatele Twenty, jako například Firma.displayName.
+
+Vlastní objekty jsou objekty, které můžete vytvářet pro ukládání informací specifických pro vaši organizaci. Nejsou vestavěné; členové vaší pracovní skupiny mohou vytvářet a upravovat vlastní objekty pro ukládání informací, které nejsou vhodné pro standardní objekty.
+
+## Schema na vysoké úrovni
+
+
+
+
+
+
+
+## Jak to funguje
+
+Vlastní objekty pocházejí z tabulek metadat, které určují tvar, název a typ objektů. Veškeré tyto informace jsou přítomny v databázi schémat metadat, která se skládá z následujících tabulek:
+
+* **Zdroj dat**: Definuje, kde se data nacházejí.
+* **Objekt**: Popisuje objekt a odkazuje na DataSource.
+* **Pole**: Vymezuje pole objektu a připojuje je k objektu.
+
+Pro přidání vlastního objektu vyhledá člen pracovní skupiny rozhraní /metadata API. To aktualizuje metadata odpovídajícím způsobem a generuje GraphQL schéma na základě metadat, které se ukládá v GQL cache pro pozdější použití.
+
+
+
+
+
+
+
+Pro načtení dat proces zahrnuje provádění dotazů přes /graphql endpoint a jejich předání přes Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/feature-flags.mdx
new file mode 100644
index 0000000000..1bb5e8640c
--- /dev/null
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -0,0 +1,46 @@
+---
+title: Příznaky funkcí
+---
+
+Příznaky funkcí slouží k skrytí zkušebních funkcí. Pro Twenty jsou nastaveny na úrovni pracovního prostoru, nikoli na úrovni uživatele.
+
+## Přidání nového příznaku funkce
+
+V `FeatureFlagKey.ts` přidat příznak funkce:
+
+```ts
+type FeatureFlagKey =
+ | 'IS_FEATURENAME_ENABLED'
+ | ...;
+```
+
+Také jej přidejte do výčtu v `feature-flag.entity.ts`:
+
+```ts
+enum FeatureFlagKeys {
+ IsFeatureNameEnabled = 'IS_FUNKCEPOVOLENA',
+ ...
+}
+```
+
+Pro uplatnění příznaku funkce na **backendové** funkci použijte:
+
+```ts
+@Gate({
+ featureFlag: 'IS_FEATURENAME_ENABLED',
+})
+```
+
+Pro uplatnění příznaku funkce na **frontendové** funkci použijte:
+
+```ts
+const isFeatureNameEnabled = useIsFeatureEnabled('IS_FUNKCEPOVOLENA');
+```
+
+## Nakonfigurujte příznaky funkcí pro nasazení
+
+Změnit odpovídající záznam v tabulce `core.featureFlag`:
+
+| id | klíč | workspaceId | hodnota |
+| ------- | ------------------- | ----------- | -------- |
+| Náhodný | `IS_FUNKCEPOVOLENA` | WorkspaceID | `pravda` |
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..0702077543
--- /dev/null
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Fronta zpráv
+---
+
+Fronty usnadňují provádění asynchronních operací. Mohou být použity pro provádění úkolů na pozadí, jako je například zaslání uvítacího e-mailu při registraci.
+Každý případ použití bude mít svou vlastní třídu fronty rozšířenou z `MessageQueueServiceBase`.
+
+Aktuálně podporujeme pouze `bull-mq`[bull-mq](https://bullmq.io/) jako ovladač fronty.
+
+## Kroky pro vytvoření a použití nové fronty
+
+1. Přidejte název fronty pro vaši novou frontu pod výčtem `MESSAGE_QUEUES`.
+2. Poskytněte implementaci továrny fronty s názvem fronty jako token závislosti.
+3. Injektujte frontu, kterou jste vytvořili, do požadovaného modulu/služby s názvem fronty jako token závislosti.
+4. Přidejte třídu pracovníka s injekcí založenou na tokenu stejně jako producent.
+
+### Ukázkové použití
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //business logic
+ await this.queue.add(someData);
+ }
+}
+
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..ec1495f8b5
--- /dev/null
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,81 @@
+---
+title: Zapier App
+---
+
+Snadno synchronizujte Twenty s více než 3000 aplikacemi pomocí [Zapier](https://zapier.com/). Automatizujte úkoly, zvyšte produktivitu a zlepšete vztahy se zákazníky!
+
+## O Zapier
+
+Zapier je nástroj, který umožňuje automatizovat pracovní postupy připojením aplikací, které váš tým používá každý den. Základním konceptem Zapier je automatizace pracovních postupů, nazývaných Zaps, které zahrnují spouštěče a akce.
+
+Více o tom, jak Zapier funguje, se dozvíte [zde](https://zapier.com/how-it-works).
+
+## Nastavení
+
+### Krok 1: Nainstalujte balíčky Zapier
+
+```bash
+cd packages/twenty-zapier\n\nyarn
+```
+
+### Krok 2: Přihlaste se pomocí CLI
+
+Použijte své Zapier přihlašovací údaje k přihlášení pomocí CLI:
+
+```bash
+zapier login
+```
+
+### Krok 3: Nastavte proměnné prostředí
+
+Z adresáře `packages/twenty-zapier` spusťte:
+
+```bash
+cp .env.example .env
+```
+
+Spusťte aplikaci lokálně, přejděte na [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks), a vygenerujte klíč API.
+
+Nahraďte hodnotu **YOUR_API_KEY** v souboru `.env` klíčem API, který jste právě vygenerovali.
+
+## Vývoj
+
+
+ Ujistěte se, že před jakýmkoli příkazem `zapier` spustíte `yarn build`.
+
+
+### Testovat
+
+```bash
+yarn test
+```
+
+### Linter
+
+```bash
+yarn format
+```
+
+### Sledování a kompilace při úpravě kódu
+
+```bash
+yarn watch
+```
+
+### Ověřte svou aplikaci Zapier
+
+```bash
+yarn validate
+```
+
+### Nasazení vaší aplikace Zapier
+
+```bash
+yarn deploy
+```
+
+### Seznam všech příkazů Zapier CLI
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..53c860b687
--- /dev/null
+++ b/packages/twenty-docs/l/cs/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Klávesové zkratky
+---
+
+## Úvod
+
+Pokud potřebujete poslouchat klávesovou zkratku, obvykle použijete posluchač událostí `onKeyDown`.
+
+Ve `twenty-front` však můžete mít konflikty mezi stejnými klávesovými zkratkami, které jsou použity v různých komponentách, nasazených současně.
+
+Například, pokud máte stránku, která poslouchá klávesu Enter, a modal, který poslouchá klávesu Enter, s komponentou Select uvnitř tohoto modalu, která poslouchá klávesu Enter, můžete mít konflikt, když jsou všechny nasazeny současně.
+
+## Funkce hook `useScopedHotkeys`
+
+K řešení tohoto problému máme vlastní hook, který umožňuje poslouchat klávesové zkratky bez jakéhokoliv konfliktu.
+
+Umístíte ho do komponenty a bude poslouchat klávesové zkratky pouze když je komponenta nasazena A když je aktivní specifikovaný **hotkey scope**.
+
+## Jak v praxi poslouchat klávesové zkratky?
+
+Jsou potřebné dva kroky k nastavení poslouchání klávesových zkratek :
+
+1. Nastavte [hotkey scope](#what-is-a-hotkey-scope-), který bude poslouchat klávesové zkratky
+2. Použijte hook `useScopedHotkeys` k poslouchání klávesových zkratek
+
+Nastavení oblastí klávesových zkratek je potřebné i na jednoduchých stránkách, protože jiné UI prvky jako levé menu nebo příkazové menu mohou také poslouchat klávesové zkratky.
+
+## Použití klávesových zkratek
+
+Obecně budete mít dva případy použití, které vyžadují klávesové zkratky :
+
+1. Na stránce nebo v komponentě nasazené na stránce
+2. V komponentě typu modal, která přebírá fokus kvůli akci uživatele
+
+Druhý případ použití se může stát rekurzivně: například rozbalovací seznam v modalu.
+
+### Poslouchání klávesových zkratek na stránce
+
+Příklad :
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Nastavte rozsah klávesových zkratek v useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Vraťte se k předchozímu rozsahu klávesových zkratek, když se komponenta odpojí
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Použijte hook useScopedHotkeys
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Nějaká logika vykonaná na této stránce, když uživatel stiskne Enter
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return Moje stránka, která poslouchá Enter
;
+};
+```
+
+### Poslouchání klávesových zkratek v komponentě typu modal
+
+V tomto příkladu použijeme komponentu typu modal, která poslouchá klávesu Escape, aby svému nadřazenému komponentu řekla, že se má zavřít.
+
+Zde interakce uživatele mění rozsah.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Nastavte rozsah klávesových zkratek, když uživatel otevře modal
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Vraťte se k předchozímu rozsahu klávesových zkratek, když se modal zavře
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
Moje stránka s modálem
+ Otevřít modal
+ {showModal && }
+ ;
+};
+```
+
+Pak v komponentě modalu :
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Použijte hook useScopedHotkeys k poslouchání Escape.
+ // Všimněte si, že escape je běžná klávesová zkratka, kterou může použít mnoho jiných komponent
+ // Je tedy důležité používat rozsah klávesových zkratek, aby se předešlo konfliktům
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return Moje komponenta modalu
;
+};
+```
+
+Je důležité používat tento vzor, když si nejste jisti, že samotné použití useEffect pro nastavení a odebrání bude dostatečné k zabránění konfliktům.
+
+Tyto konflikty mohou být těžké ladit a mohou se vyskytovat častěji než ne u useEffects.
+
+## Co je to hotkey scope?
+
+Rozsah klávesových zkratek je řetězec, který představuje kontext, ve kterém jsou klávesové zkratky aktivní. Obecně je kódován jako enum.
+
+Když změníte rozsah klávesových zkratek, klávesové zkratky, které poslouchají tento rozsah, budou povolené a klávesové zkratky, které poslouchají jiné rozsahy, budou zakázané.
+
+Můžete nastavit pouze jeden rozsah najednou.
+
+Například rozsahy klávesových zkratek pro každou stránku jsou definovány v `PageHotkeyScope` enumu:
+
+```tsx
+export enum PageHotkeyScope {
+ Nastavení = 'settings',
+ VytvořitPracovníProstor = 'create-workspace',
+ PřihlášeníRegistrace = 'sign-in-up',
+ VytvořitProfil = 'create-profile',
+ PožadovánoPlán = 'plan-required',
+ ZobrazitStránku = 'show-page',
+ OsobníZobrazitStránku = 'person-show-page',
+ FiremníZobrazitStránku = 'company-show-page',
+ FirmyStránka = 'companies-page',
+ LidéStránka = 'people-page',
+ PříležitostiStránka = 'opportunities-page',
+ ProfilStránka = 'profile-page',
+ ČlenPracovníhoProstoruStránka = 'workspace-member-page',
+ ÚkolStránka = 'task-page',
+}
+```
+
+Interně je aktuálně vybraný rozsah uložen v Recoil stavu, který je sdílen napříč aplikací :
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+Ale tento Recoil stav by neměl být nikdy řízen ručně! Ukážeme si, jak jej používat v příští sekci.
+
+## Jak to funguje interně?
+
+Vytvořili jsme tenkou vrstvu nad [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro), která je výkonnější a vyhýbá se zbytečným překreslením.
+
+Také jsme vytvořili Recoil stav, abychom mohli řídit stav rozsahu klávesových zkratek a učinit jej dostupným kdekoli v aplikaci.
diff --git a/packages/twenty-docs/l/cs/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/cs/developers/self-host/capabilities/cloud-providers.mdx
new file mode 100644
index 0000000000..582a401f86
--- /dev/null
+++ b/packages/twenty-docs/l/cs/developers/self-host/capabilities/cloud-providers.mdx
@@ -0,0 +1,45 @@
+---
+title: Další metody
+---
+
+
+ Tento dokument je udržován komunitou. Může obsahovat problémy.
+
+
+## Kubernetes pomocí Terraform a Manifestů
+
+Dokumentace vedená komunitou k nasazení Kubernetes je k dispozici [zde](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+
+### Coolify
+
+Nasazení Twenty na serverech pomocí Coolify. (oficiální obrázek na Coolify bude brzy k dispozici)
+
+[Dokumentace Coolify](https://coolify.io/docs/get-started/introduction)
+
+### EasyPanel
+
+Nasazení Twenty na EasyPanel s komunitně udržovanou šablonou níže.
+
+[Nasadit na EasyPanel](https://easypanel.io/docs/templates/twenty)
+
+### Elest.io
+
+Nasazení Twenty na serverech pomocí Elest.io s odkazem níže.
+
+[Nasadit na Elest.io](https://elest.io/open-source/twenty)
+
+### Twenty na Railway
+
+Nasazení Twenty na Railway s komunitně udržovanou šablonou níže.
+
+[](https://railway.com/deploy/nAL3hA)
+
+### Ostatní
+
+Nasazení Twenty na Sealos s komunitně udržovanou šablonou níže.
+
+[](https://sealos.io/products/app-store/twenty)
+
+## Ostatní
+
+Neváhejte otevřít PR pro přidání dalších možností poskytovatele cloudových služeb.
diff --git a/packages/twenty-docs/l/cs/twenty-ui/input.mdx b/packages/twenty-docs/l/cs/twenty-ui/input.mdx
index 56dcf07865..4ecce430a0 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation.mdx
index bcdc757cb2..0016dc78bf 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx
index 7a5a017758..0b32596f2f 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation/breadcrumb.mdx
@@ -4,41 +4,38 @@ image: /images/user-guide/fields/field.png
---
-
+
Zobrazuje drobečkovou navigační lištu.
-
+
+ ```jsx
+ import { BrowserRouter } from "react-router-dom";
+ import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
-```jsx
-import { BrowserRouter } from "react-router-dom";
-import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
+ export const MyComponent = () => {
+ const breadcrumbLinks = [
+ { children: "Domů", href: "/" },
+ { children: "Kategorie", href: "/category" },
+ { children: "Podkategorie", href: "/category/subcategory" },
+ { children: "Aktuální stránka" },
+ ];
-export const MyComponent = () => {
- const breadcrumbLinks = [
- { children: "Home", href: "/" },
- { children: "Category", href: "/category" },
- { children: "Subcategory", href: "/category/subcategory" },
- { children: "Current Page" },
- ];
+ return (
+
+
+
+ )
+ };
+ ```
+
- return (
-
-
-
- )
-};
-```
-
-
-
-
-| Vlastnosti | Typ | Popis |
-| ---------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| className | textový řetězec | Volitelný název třídy pro dodatečné stylování |
-| odkazy | pole | Pole objektů, z nichž každý představuje odkaz na drobečkovou navigaci. Každý objekt má vlastnost `children` (text obsahu odkazu) a nepovinnou vlastnost `href` (URL, na které se má navigovat po kliknutí na odkaz) |
-
-
+
+ | Vlastnosti | Typ | Popis |
+ | ---------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | řetězec | Volitelný název třídy pro dodatečné stylování |
+ | odkazy | pole | Pole objektů, z nichž každý představuje odkaz na drobečkovou navigaci. Každý objekt má vlastnost `children` (text obsahu odkazu) a nepovinnou vlastnost `href` (URL, na které se má navigovat po kliknutí na odkaz) |
+
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx
index 327db7d1b3..ea3e720205 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation/links.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
## Odkaz na kontakt
@@ -12,44 +12,40 @@ image: /images/user-guide/what-is-twenty/20.png
Stylizovaná komponenta odkazu pro zobrazení kontaktních informací.
-
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
+ import { ContactLink } from 'twenty-ui/navigation';
-import { ContactLink } from 'twenty-ui/navigation';
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('Odkaz na kontakt kliknut!', event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| Vlastnosti | Typ | Popis |
-| ---------- | ----------------- | ----------------------------------------------------- |
-| className | textový řetězec | Volitelný název pro dodatečné stylování |
-| href | textový řetězec | Cílová URL adresa nebo cesta pro odkaz |
-| onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
-| děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
-
-
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
+ ```
+
+
+ | Vlastnosti | Typ | Popis |
+ | ---------- | ----------------- | ----------------------------------------------------- |
+ | className | řetězec | Volitelný název pro další stylování |
+ | href | řetězec | Cílová URL adresa nebo cesta pro odkaz |
+ | onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
+ | děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
+
## Surový odkaz
@@ -57,39 +53,35 @@ export const MyComponent = () => {
Stylizovaná komponenta odkazu pro zobrazení odkazů.
-
+
+ ```jsx
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Odkaz na kontakt kliknut!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Kontaktujte nás
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-
-```
-
-
-
-
-| Vlastnosti | Typ | Popis |
-| ---------- | ----------------- | ----------------------------------------------------- |
-| className | textový řetězec | Volitelný název pro dodatečné stylování |
-| href | textový řetězec | Cílová URL adresa nebo cesta pro odkaz |
-| onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
-| děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
-
-
+
+ | Vlastnosti | Typ | Popis |
+ | ---------- | ----------------- | ----------------------------------------------------- |
+ | className | řetězec | Volitelný název pro dodatečné stylování |
+ | href | řetězec | Cílová URL adresa nebo cesta pro odkaz |
+ | onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
+ | děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
+
## Zaoblený odkaz
@@ -97,38 +89,34 @@ export const MyComponent = () => {
Zaobleně stylizovaný odkaz s komponentou Chip pro odkazy.
-
+
+ ```jsx
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Odkaz na kontakt kliknut!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Kontaktujte nás
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| Vlastnosti | Typ | Popis |
-| ---------- | ----------------- | ----------------------------------------------------- |
-| href | textový řetězec | Cílová URL adresa nebo cesta pro odkaz |
-| děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
-| onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
-
-
+
+ | Vlastnosti | Typ | Popis |
+ | ---------- | ----------------- | ----------------------------------------------------- |
+ | href | řetězec | Cílová URL adresa nebo cesta pro odkaz |
+ | děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
+ | onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
+
## Sociální odkaz
@@ -136,33 +124,30 @@ export const MyComponent = () => {
Stylizované sociální odkazy s podporou různých typů sociálních odkazů, jako jsou URL, LinkedIn a X (nebo Twitter).
-
+
+ ```jsx
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| Vlastnosti | Typ | Popis |
-| ---------- | ----------------- | ------------------------------------------------------------------------------------------------------- |
-| href | textový řetězec | Cílová URL adresa nebo cesta pro odkaz |
-| děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
-| typ | textový řetězec | Typ sociálního odkazu. Možnosti zahrnují: `url`, `LinkedIn` a `Twitter` |
-| onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
-
-
+
+ | Vlastnosti | Typ | Popis |
+ | ---------- | ----------------- | ----------------------------------------------------------------------- |
+ | href | řetězec | Cílová URL adresa nebo cesta pro odkaz |
+ | děti | `React.ReactNode` | Obsah, který se má zobrazovat uvnitř odkazu |
+ | typ | řetězec | Typ sociálního odkazu. Možnosti zahrnují: `url`, `LinkedIn` a `Twitter` |
+ | onClick | funkce | Funkce zpětného volání spuštěná při kliknutí na odkaz |
+
diff --git a/packages/twenty-docs/l/cs/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/cs/twenty-ui/navigation/navigation-bar.mdx
index b79cf1a3c4..b139abe859 100644
--- a/packages/twenty-docs/l/cs/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/cs/twenty-ui/navigation/navigation-bar.mdx
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
Zobrazuje navigační panel, který obsahuje více komponent `NavigationBarItem`.
-
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "Home",
+ Icon: IconHome,
+ onClick: () => console.log("Domů kliknuto"),
+ },
+ {
+ name: "Profile",
+ Icon: IconUser,
+ onClick: () => console.log("Profil kliknuto"),
+ },
+ {
+ name: "Settings",
+ Icon: IconSettings,
+ onClick: () => console.log("Nastavení kliknuto"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| Vlastnosti | Typ | Popis |
-| -------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| activeItemName | textový řetězec | Název aktuálně aktivního navigačního prvku |
-| položky | pole | Pole objektů představujících jednotlivé navigační položky. Každý objekt obsahuje `název` položky, komponent `Ikona` ke zobrazení a funkce `onClick`, která se volá při kliknutí na položku. |
-
-
+
+ | Vlastnosti | Typ | Popis |
+ | -------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | řetězec | Název aktuálně aktivního navigačního prvku |
+ | položky | pole | Pole objektů představujících jednotlivé navigační položky. Každý objekt obsahuje `název` položky, komponent `Ikona` ke zobrazení a funkce `onClick`, která se volá při kliknutí na položku. |
+
diff --git a/packages/twenty-docs/l/cs/user-guide/workflows/how-tos/need-more-help/professional-services.mdx b/packages/twenty-docs/l/cs/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
new file mode 100644
index 0000000000..968d5d9439
--- /dev/null
+++ b/packages/twenty-docs/l/cs/user-guide/workflows/how-tos/need-more-help/professional-services.mdx
@@ -0,0 +1,29 @@
+---
+title: Profesionální služby
+description: Získejte profesionální pomoc s vytvářením složitých pracovních toků a automatizací od týmu Twenty a certifikovaných partnerů.
+---
+
+## Kdy potřebujete profesionální pomoc?
+
+Zvažte profesionální služby pro:
+
+* Složitá více-systémová integrace
+* Pokročilá obchodní logika a pravidla automatizace
+* Velkoplošné pracovní postupy pro zpracování dat
+* Vývoj vlastních API
+* Školení týmu a optimalizace pracovního toku
+* Když nemáte interní zdroje
+
+## Možnosti služeb
+
+### Úvodní balíčky
+
+Získejte pomoc od našeho hlavního týmu s našimi 4hodinovými [Úvodními balíčky](https://twenty.com/onboarding-packages):
+
+* **Vytváření pracovních toků**: Vytvářejte vlastní pracovní toky pro Vaše podnikové procesy
+* **Návrh datového modelu**: Optimalizujte strukturu svých dat pro automatizaci pracovního toku
+* **Migrace dat**: Importujte stávající data s řádnou integrací pracovního toku
+
+### Implementační partneři
+
+Spolupracujte s certifikovanými partnery na pokročilých úpravách. Kontaktujte nás na contact@twenty.com pro spojení s našimi [implementačními partnery](https://twenty.com/partners).
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..701ba604e2
--- /dev/null
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: Beste Praktiken
+---
+
+Dieses Dokument beschreibt die Best Practices, die Sie bei der Arbeit am Backend befolgen sollten.
+
+## Verfolgen Sie einen modularen Ansatz
+
+Das Backend folgt einem modularen Ansatz, was ein grundlegendes Prinzip bei der Arbeit mit NestJS ist. Stellen Sie sicher, dass Sie Ihren Code in wiederverwendbare Module aufteilen, um eine saubere und organisierte Codebasis aufrechtzuerhalten.
+Jedes Modul sollte ein bestimmtes Feature oder eine Funktionalität kapseln und einen klar definierten Umfang haben. Dieser modulare Ansatz ermöglicht eine klare Trennung der Verantwortlichkeiten und beseitigt unnötige Komplexitäten.
+
+## Dienste zur Verwendung in Modulen bereitstellen
+
+Erstellen Sie immer Dienste mit einer klaren Einzelverantwortung, was die Lesbarkeit und Wartbarkeit des Codes verbessert. Benennen Sie die Dienste beschreibend und konsistent.
+
+Sie sollten auch Dienste bereitstellen, die Sie in anderen Modulen verwenden möchten. Das Bereitstellen von Diensten für andere Module ist durch das leistungsstarke Abhängigkeitsinjektionssystem von NestJS möglich und fördert die lose Kopplung zwischen den Komponenten.
+
+## Vermeiden Sie die Verwendung des Typs `any`
+
+Wenn Sie eine Variable als `any` deklarieren, führt der TypeScript-Typenprüfer keine Typprüfung durch, was es möglich macht, der Variablen Werte beliebigen Typs zuzuweisen. TypeScript verwendet Typinferenz, um den Typ einer Variable basierend auf dem Wert zu bestimmen. Durch die Deklaration als `any` kann TypeScript den Typ nicht mehr ableiten. Dies erschwert es, typbezogene Fehler während der Entwicklung zu erkennen, was zu Laufzeitfehlern führt und den Code weniger wartbar, weniger zuverlässig und schwerer verständlich für andere macht.
+
+Deshalb sollte alles einen Typ haben. Wenn Sie also ein neues Objekt mit Vor- und Nachnamen erstellen, sollten Sie eine Schnittstelle oder einen Typ definieren, der Vor- und Nachnamen enthält und die Struktur des Objekts definiert, mit dem Sie arbeiten.
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..9552e9c144
--- /dev/null
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Nachrichtenwarteschlange
+---
+
+Warteschlangen erleichtern die Durchführung asynchroner Vorgänge. Sie können für die Ausführung von Hintergrundaufgaben verwendet werden, wie z.B. das Versenden einer Willkommens-E-Mail bei der Registrierung.
+Jeder Anwendungsfall hat seine eigene Warteschlangenklasse, die von `MessageQueueServiceBase` erweitert wird.
+
+Derzeit unterstützen wir nur `bull-mq`[bull-mq](https://bullmq.io/) als Warteschlangentreiber.
+
+## Schritte zur Erstellung und Nutzung einer neuen Warteschlange
+
+1. Fügen Sie einen Warteschlangennamen für Ihre neue Warteschlange unter dem Enum `MESSAGE_QUEUES` hinzu.
+2. Stellen Sie die Factory-Implementierung der Warteschlange mit dem Warteschlangennamen als Abhängigkeits-Token bereit.
+3. Injizieren Sie die von Ihnen erstellte Warteschlange im erforderlichen Modul/Service mit dem Warteschlangennamen als Abhängigkeits-Token.
+4. Fügen Sie eine Worker-Klasse mit tokenbasierter Injektion hinzu, genau wie der Producer.
+
+### Beispielverwendung
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //business logic
+ await this.queue.add(someData);
+ }
+}
+
+// async-WorKer
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..1501dab325
--- /dev/null
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: Frontend-Befehle
+---
+
+## Nützliche Befehle
+
+### Die App starten
+
+```bash
+npx nx start twenty-front
+```
+
+### GraphQL-Schema basierend auf API-GraphQL-Schema regenerieren
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+ODER
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### Lint
+
+```bash
+npx nx run twenty-front:lint # Füge --fix hinzu, um Lint-Fehler zu beheben
+```
+
+## Übersetzungen
+
+```bash
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
+```
+
+### Test
+
+```bash
+npx nx run twenty-front:test # führe JEST-Tests aus
+npx nx run twenty-front:storybook:serve:dev # führe Storybook aus
+npx nx run twenty-front:storybook:test # führe Tests aus # benötigt yarn storybook:serve:dev als laufenden Prozess
+npx nx run twenty-front:storybook:coverage # benötigt yarn storybook:serve:dev als laufenden Prozess
+```
+
+## Technologie-Stack
+
+Das Projekt hat einen sauberen und einfachen Stack mit minimalem Boilerplate-Code.
+
+**App**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](https://the-guild.dev/graphql/codegen)
+* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
+* [TypeScript](https://www.typescriptlang.org/)
+
+**Tests**
+
+* [Jest](https://jestjs.io/)
+* [Storybook](https://storybook.js.org/)
+
+**Tools**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## Architektur
+
+### Routing
+
+[React Router](https://reactrouter.com/) übernimmt das Routing.
+
+Um unnötige [Re-Renders](/l/de/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) zu vermeiden, befindet sich die gesamte Routing-Logik in einem `useEffect` in `PageChangeEffect`.
+
+### Zustandsverwaltung
+
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) übernimmt die Zustandsverwaltung.
+
+Siehe [Best Practices](/l/de/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) für mehr Informationen zur Zustandsverwaltung.
+
+## Tests
+
+[Jest](https://jestjs.io/) dient als Werkzeug für Unittests, während [Storybook](https://storybook.js.org/) für Komponententests verwendet wird.
+
+Jest ist hauptsächlich für das Testen von Dienstprogrammfunktionen und nicht für die Komponenten selbst gedacht.
+
+Storybook dient zum Testen des Verhaltens isolierter Komponenten sowie zur Darstellung des Designsystems.
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..510174523c
--- /dev/null
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Tastenkombinationen
+---
+
+## Einführung
+
+Wenn Sie eine Tastenkombination abhören müssen, verwenden Sie normalerweise den `onKeyDown` Event-Listener.
+
+In `twenty-front` jedoch könnten Sie Konflikte zwischen gleichen Tastenkombinationen haben, die in verschiedenen Komponenten, die gleichzeitig eingebunden sind, verwendet werden.
+
+Zum Beispiel, wenn Sie eine Seite haben, die auf die Enter-Taste hört, und ein Modal das auf die Enter-Taste hört, und ein Select-Element innerhalb dieses Modals auf die Enter-Taste hört, könnte ein Konflikt entstehen, wenn alle gleichzeitig eingebunden sind.
+
+## Der `useScopedHotkeys` Hook
+
+Um dieses Problem zu lösen, verfügen wir über einen benutzerdefinierten Hook, der es ermöglicht, auf Tastenkombinationen zu hören, ohne Konflikte.
+
+Sie platzieren ihn in einer Komponente, und er wird auf die Tastenkombinationen nur hören, wenn die Komponente eingebunden ist UND wenn der spezifizierte **Tastenkombinationsbereich** aktiv ist.
+
+## Wie hört man in der Praxis auf Tastenkombinationen?
+
+Es gibt zwei Schritte, um das Abhören von Tastenkombinationen einzurichten:
+
+1. Setzen Sie den [Tastenkombinationsbereich](#what-is-a-hotkey-scope-), der auf Tastenkombinationen hören wird
+2. Verwenden Sie den `useScopedHotkeys` Hook, um auf Tastenkombinationen zu hören
+
+Das Einrichten von Tastenkombinationsbereichen ist auch bei einfachen Seiten erforderlich, da andere UI-Elemente wie das linke Menü oder das Befehlsmenü ebenfalls auf Tastenkombinationen hören könnten.
+
+## Anwendungsfälle für Tastenkombinationen
+
+Im Allgemeinen haben Sie zwei Anwendungsfälle, die Tastenkombinationen erfordern:
+
+1. Auf einer Seite oder einer Komponente, die auf einer Seite eingebunden ist
+2. In einer Modal-Komponente, die wegen einer Benutzeraktion den Fokus erhält
+
+Der zweite Anwendungsfall kann rekursiv auftreten: ein Dropdown in einem Modal zum Beispiel.
+
+### Auf Tastenkombinationen in einer Seite hören
+
+Beispiel:
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Setze den Tastenkombinationsbereich in einem useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Zurückkehren zum vorherigen Tastenkombinationsbereich, wenn die Komponente entfernt wird
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Verwenden Sie den useScopedHotkeys Hook
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Eine Logik, die auf dieser Seite ausgeführt wird, wenn der Benutzer Enter drückt
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return Meine Seite, die auf Enter hört
;
+};
+```
+
+### Auf Tastenkombinationen in einer Modal-Komponente hören
+
+Für dieses Beispiel verwenden wir eine Modalkomponente, die auf die Escape-Taste hört, um ihrem übergeordneten Element mitzuteilen, dass sie geschlossen werden soll.
+
+Hier ändert die Benutzerinteraktion den Bereich.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Setze den Tastenkombinationsbereich, wenn der Benutzer das Modal öffnet
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Zurückkehren zum vorherigen Tastenkombinationsbereich, wenn das Modal geschlossen wird
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
Meine Seite mit einem Modal
+ Modal öffnen
+ {showModal && }
+ ;
+};
+```
+
+Dann in der Modalkomponente:
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Verwenden Sie den useScopedHotkeys Hook, um auf Escape zu hören.
+ // Beachten Sie, dass Escape eine gängige Tastenkombination ist, die von vielen anderen Komponenten verwendet werden könnte
+ // Daher ist es wichtig, einen Tastenkombinationsbereich zu verwenden, um Konflikte zu vermeiden
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return Meine Modalkomponente
;
+};
+```
+
+Es ist wichtig, dieses Muster zu verwenden, wenn Sie sich nicht sicher sind, ob das einfache Benutzen eines useEffect bei Ein-/Ausbindung ausreicht, um Konflikte zu vermeiden.
+
+Diese Konflikte können schwer zu debuggen sein und treten möglicherweise häufiger auf, als man denkt, mit useEffects.
+
+## Was ist ein Tastenkombinationsbereich?
+
+Ein Tastenkombinationsbereich ist ein String, der einen Kontext darstellt, in dem die Tastenkombinationen aktiv sind. Er wird im Allgemeinen als Enum kodiert.
+
+Wenn Sie den Tastenkombinationsbereich ändern, werden die Tastenkombinationen aktiviert, die auf diesen Bereich hören, und die Tastenkombinationen, die auf andere Bereiche hören, werden deaktiviert.
+
+Sie können immer nur einen Bereich gleichzeitig setzen.
+
+Als Beispiel sind die Tastenkombinationsbereiche für jede Seite im `PageHotkeyScope` Enum definiert:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+Intern wird der aktuell ausgewählte Bereich in einem Recoil-State gespeichert, der in der gesamten Anwendung geteilt wird:
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+Aber dieser Recoil-State sollte niemals manuell bearbeitet werden! Wir werden im nächsten Abschnitt sehen, wie man es verwendet.
+
+## Wie funktioniert es intern?
+
+Wir haben eine dünne Schicht über [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) erstellt, die es leistungsfähiger macht und unnötige Neu-Renderings vermeidet.
+
+Wir haben auch einen Recoil-State erstellt, um den Tastenkombinationsbereich zu verwalten und in der gesamten Anwendung verfügbar zu machen.
diff --git a/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..a1c4b2a441
--- /dev/null
+++ b/packages/twenty-docs/l/de/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Durchsuchen Sie die UI-Komponentenbibliothek von Twenty
+---
+
+Sehen Sie sich unsere vollständige Komponentenbibliothek und Dokumentation in Storybook an.
+
+[Storybook öffnen →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/de/twenty-ui/input.mdx b/packages/twenty-docs/l/de/twenty-ui/input.mdx
index 12e7c50a65..ef860dbec8 100644
--- a/packages/twenty-docs/l/de/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/de/twenty-ui/navigation.mdx b/packages/twenty-docs/l/de/twenty-ui/navigation.mdx
index e1264f0997..6c71341b17 100644
--- a/packages/twenty-docs/l/de/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/de/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/de/twenty-ui/navigation/navigation-bar.mdx
index 98df96d4d5..74f176bb20 100644
--- a/packages/twenty-docs/l/de/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/navigation/navigation-bar.mdx
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
Rendert eine Navigationsleiste, die mehrere `NavigationBarItem`-Komponenten enthält.
-
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "Home",
+ Icon: IconHome,
+ onClick: () => console.log("Home geklickt"),
+ },
+ {
+ name: "Profil",
+ Icon: IconUser,
+ onClick: () => console.log("Profil geklickt"),
+ },
+ {
+ name: "Einstellungen",
+ Icon: IconSettings,
+ onClick: () => console.log("Einstellungen geklickt"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| Props | Typ | Beschreibung |
-| -------------- | ------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| activeItemName | Zeichenkette | Der Name des aktuell aktiven Navigationselements |
-| items | array | Ein Array von Objekten, die jeweils ein Navigationselement repräsentieren. Jedes Objekt enthält den `name` des Elements, die zugehörige `Icon`-Komponente und eine Funktion `onClick`, die ausgeführt wird, wenn das Element angeklickt wird |
-
-
+
+ | "Eigenschaften" | Typ | Beschreibung |
+ | --------------- | ------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | Zeichenkette | Der Name des aktuell aktiven Navigationselements |
+ | items | array | Ein Array von Objekten, die jeweils ein Navigationselement repräsentieren. Jedes Objekt enthält den `name` des Elements, die zugehörige `Icon`-Komponente und eine Funktion `onClick`, die ausgeführt wird, wenn das Element angeklickt wird |
+
diff --git a/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx
index a12d31032f..c5dd7d17d0 100644
--- a/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/de/twenty-ui/navigation/step-bar.mdx
@@ -4,35 +4,31 @@ image: /images/user-guide/api/api.png
---
-
+
Zeigt den Fortschritt durch eine Folge von nummerierten Schritten, indem der aktive Schritt hervorgehoben wird. Es rendert einen Container mit Schritten, die jeweils durch die `Step`-Komponente dargestellt werden.
-
+
+ ```jsx
+ import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
-```jsx
-import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
+ export const MyComponent = () => {
+ return (
+
+ Schritt 1
+ Schritt 2
+ Schritt 3
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
- Step 1
- Step 2
- Step 3
-
- );
-};
-```
-
-
-
-
-
-| Props | Typ | Beschreibung |
-| -------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------- |
-| aktiverSchritt | nummer | Der Index des derzeit aktiven Schritts. Dies bestimmt, welcher Schritt visuell hervorgehoben werden soll. |
-
-
+
+ | "Eigenschaften" | Typ | Beschreibung |
+ | --------------- | ------ | --------------------------------------------------------------------------------------------------------- |
+ | aktiverSchritt | nummer | Der Index des derzeit aktiven Schritts. Dies bestimmt, welcher Schritt visuell hervorgehoben werden soll. |
+
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..b476a16282
--- /dev/null
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: Mejores prácticas
+---
+
+Este documento describe las mejores prácticas que debe seguir al trabajar en el backend.
+
+## Siga un enfoque modular
+
+El backend sigue un enfoque modular, que es un principio fundamental al trabajar con NestJS. Asegúrese de descomponer su código en módulos reutilizables para mantener una base de código limpia y organizada.
+Cada módulo debe encapsular una característica o funcionalidad particular y tener un alcance bien definido. Este enfoque modular permite una clara separación de responsabilidades y elimina complejidades innecesarias.
+
+## Exponer servicios para usar en módulos
+
+Siempre cree servicios que tengan una responsabilidad clara y única, lo que mejora la legibilidad y mantenibilidad del código. Nombre los servicios de manera descriptiva y consistente.
+
+También debe exponer servicios que desee usar en otros módulos. Exponer servicios a otros módulos es posible a través del poderoso sistema de inyección de dependencias de NestJS, y promueve un acoplamiento débil entre los componentes.
+
+## Evitar usar el tipo `any`
+
+Cuando declara una variable como `any`, el verificador de tipos de TypeScript no realiza ninguna comprobación de tipos, lo que hace posible asignar cualquier tipo de valores a la variable. TypeScript utiliza la inferencia de tipos para determinar el tipo de la variable a partir del valor. Al declararlo como `any`, TypeScript ya no puede inferir el tipo. Esto dificulta la captura de errores relacionados con el tipo durante el desarrollo, lo que lleva a errores en tiempo de ejecución y hace que el código sea menos mantenible, menos fiable y más difícil de entender para otros.
+
+Por eso todo debe tener un tipo. Entonces, si crea un nuevo objeto con un nombre y apellido, debe crear una interfaz o tipo que contenga un nombre y apellido y defina la forma del objeto que está manipulando.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..7ce5c14c0b
--- /dev/null
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Objetos personalizados
+---
+
+Los objetos son estructuras que te permiten almacenar datos (registros, atributos y valores) específicos de una organización. Twenty proporciona tanto objetos estándar como personalizados.
+
+Los objetos estándar son objetos incorporados con un conjunto de atributos disponibles para todos los usuarios. Ejemplos de objetos estándar en Twenty incluyen Empresa y Persona. Los objetos estándar tienen campos estándar que también están disponibles para todos los usuarios de Twenty, como Company.displayName.
+
+Los objetos personalizados son objetos que puedes crear para almacenar información que es única para tu organización. No están incorporados; los miembros de tu espacio de trabajo pueden crear y personalizar objetos personalizados para albergar información para la cual los objetos estándar no son aptos.
+
+## Esquema de alto nivel
+
+
+
+
+
+
+
+## Cómo funciona
+
+Los objetos personalizados provienen de tablas de metadatos que determinan la forma, el nombre y el tipo de los objetos. Toda esta información está presente en la base de datos del esquema de metadatos, que consta de tablas:
+
+* **DataSource**: Detalles de dónde se encuentra la información.
+* **Object**: Describe el objeto y lo vincula a un DataSource.
+* **Field**: Describe los campos de un objeto y lo conecta al objeto.
+
+Para añadir un objeto personalizado, el workspaceMember consultará la API de /metadata. Esto actualiza los metadatos de acuerdo y calcula un esquema GraphQL basado en los metadatos, almacenándolo en un caché de GQL para su uso posterior.
+
+
+
+
+
+
+
+Para obtener datos, el proceso implica hacer consultas a través del endpoint /graphql y pasarlos a través del Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..886d867a5f
--- /dev/null
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Cola de Mensajes
+---
+
+Las colas facilitan la realización de operaciones asíncronas. Se pueden utilizar para realizar tareas en segundo plano, como enviar un correo de bienvenida al registrarse.
+Cada caso de uso tendrá su propia clase de cola extendida de `MessageQueueServiceBase`.
+
+Actualmente, solo soportamos `bull-mq`[bull-mq](https://bullmq.io/) como el controlador de cola.
+
+## Pasos para crear y usar una nueva cola
+
+1. Agregue un nombre de cola para su nueva cola en la enumeración `MESSAGE_QUEUES`.
+2. Proporcione la implementación de fábrica de la cola con el nombre de la cola como el token de dependencia.
+3. Inyecte la cola que creó en el módulo/servicio requerido con el nombre de la cola como el token de dependencia.
+4. Agregue una clase de trabajador con inyección basada en token, al igual que el productor.
+
+### Ejemplo de uso
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //lógica de negocio
+ await this.queue.add(someData);
+ }
+}
+
+//trabajador asíncrono
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //lógica del trabajador
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..4264b4afe0
--- /dev/null
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Atajos de teclado
+---
+
+## Introducción
+
+Cuando necesitas escuchar una tecla de acceso rápido, normalmente usarías el evento `onKeyDown`.
+
+En `twenty-front`, sin embargo, podrías tener conflictos entre los mismos atajos de teclado utilizados en diferentes componentes, montados al mismo tiempo.
+
+Por ejemplo, si tienes una página que escucha la tecla Enter y un modal que escucha la tecla Enter, con un componente Select dentro de ese modal que también escucha la tecla Enter, podrías tener un conflicto cuando todos están montados al mismo tiempo.
+
+## El gancho `useScopedHotkeys`
+
+Para manejar este problema, tenemos un gancho personalizado que hace posible escuchar atajos de teclado sin ningún conflicto.
+
+Lo colocas en un componente, y escuchará los atajos de teclado solo cuando el componente está montado Y cuando el **ámbito del atajo de teclado** especificado está activo.
+
+## ¿Cómo escuchar atajos de teclado en la práctica?
+
+Hay dos pasos involucrados en configurar la escucha de atajos de teclado:
+
+1. Establece el [ámbito del atajo de teclado](#qué-es-un-ambito-de-atajo-de-teclado-) que escuchará los atajos de teclado
+2. Usa el gancho `useScopedHotkeys` para escuchar atajos de teclado
+
+Configurar los ámbitos de atajos de teclado es necesario incluso en páginas simples, porque otros elementos de la interfaz de usuario como el menú lateral o el menú de comandos también podrían escuchar atajos de teclado.
+
+## Casos de uso para atajos de teclado
+
+En general, tendrás dos casos de uso que requieren atajos de teclado:
+
+1. En una página o un componente montado en una página
+2. En un componente tipo modal que toma el enfoque debido a la acción del usuario
+
+El segundo caso de uso puede ocurrir recursivamente: un desplegable en un modal, por ejemplo.
+
+### Escuchando atajos de teclado en una página
+
+Ejemplo:
+
+```tsx
+const EscuchaEnterEnPagina = () => {
+ const {
+ estableceAmbitoDeAtajoYMemorizaAmbitoAnterior,
+ regresaAlAmbitoDeAtajoAnterior,
+ } = usePreviousHotkeyScope();
+
+ // 1. Establece el ámbito de atajo en un useEffect
+ useEffect(() => {
+ estableceAmbitoDeAtajoYMemorizaAmbitoAnterior(
+ EjemploAmbitosDeAtajo.EjemploEnterPagina,
+ );
+
+ // Revertir al ámbito de atajo anterior cuando se desmonte el componente
+ return () => {
+ regresaAlAmbitoDeAtajoAnterior();
+ };
+ }, [regresaAlAmbitoDeAtajoAnterior, estableceAmbitoDeAtajoYMemorizaAmbitoAnterior]);
+
+ // 2. Usa el gancho useScopedHotkeys
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Alguna lógica ejecutada en esta página cuando el usuario presiona Enter
+ // ...
+ },
+ EjemploAmbitosDeAtajo.EjemploEnterPagina,
+ );
+
+ return Mi página que escucha Enter
;
+};
+```
+
+### Escuchando atajos de teclado en un componente tipo modal
+
+Para este ejemplo utilizaremos un componente modal que escucha la tecla Escape para indicar a su padre que lo cierre.
+
+Aquí la interacción del usuario está cambiando el ámbito.
+
+```tsx
+const PaginaEjemploConModal = () => {
+ const [mostrarModal, establecerMostrarModal] = useState(false);
+
+ const {
+ estableceAmbitoDeAtajoYMemorizaAmbitoAnterior,
+ regresaAlAmbitoDeAtajoAnterior,
+ } = usePreviousHotkeyScope();
+
+ const manejarClicAbrirModal = () => {
+ // 1. Establece el ámbito de atajo cuando el usuario abre el modal
+ establecerMostrarModal(true);
+ estableceAmbitoDeAtajoYMemorizaAmbitoAnterior(
+ EjemploAmbitosDeAtajo.EjemploModal,
+ );
+ };
+
+ const manejarCierreModal = () => {
+ // 1. Revertir al ámbito de atajo anterior cuando se cierra el modal
+ establecerMostrarModal(false);
+ regresaAlAmbitoDeAtajoAnterior();
+ };
+
+ return
+
Mi página con un modal
+ Abrir modal
+ {mostrarModal && }
+ ;
+};
+```
+
+Luego, en el componente modal:
+
+```tsx
+const MiComponenteDesplegable = ({ onClose }: { onClose: () => void }) => {
+ // 2. Usa el gancho useScopedHotkeys para escuchar la tecla Escape.
+ // Tenga en cuenta que Escape es una tecla de acceso rápido común que podría usarse en muchos otros componentes
+ // Por lo tanto, es importante usar un ámbito de atajo para evitar conflictos
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ EjemploAmbitosDeAtajo.EjemploModal,
+ );
+
+ return Mi componente modal
;
+};
+```
+
+Es importante usar este patrón cuando no estás seguro de que solo usar un useEffect con mount/unmount será suficiente para evitar conflictos.
+
+Esos conflictos pueden ser difíciles de depurar, y puede suceder más a menudo de lo que crees con useEffects.
+
+## ¿Qué es un ámbito de atajo de teclado?
+
+Un ámbito de atajo de teclado es una cadena que representa un contexto en el que los atajos de teclado están activos. Por lo general, se codifica como un enum.
+
+Cuando cambias el ámbito del atajo de teclado, se habilitarán los atajos que están escuchando este ámbito y se deshabilitarán los atajos que escuchan otros ámbitos.
+
+Solo puedes establecer un ámbito a la vez.
+
+Como ejemplo, los ámbitos de atajos de teclado para cada página se definen en el enum `PageHotkeyScope`:
+
+```tsx
+export enum PageHotkeyScope {
+ Configuración = 'configuración',
+ CrearEspacioTrabajo = 'crear-espacio-trabajo',
+ IniciarSesion = 'iniciar-sesión',
+ CrearPerfil = 'crear-perfil',
+ PlanRequerido = 'plan-requerido',
+ MostrarPagina = 'mostrar-pagina',
+ MostrarPersonaPagina = 'mostrar-persona-pagina',
+ MostrarEmpresaPagina = 'mostrar-empresa-pagina',
+ PaginaEmpresas = 'pagina-empresas',
+ PaginaPersonas = 'pagina-personas',
+ PaginaOportunidades = 'pagina-oportunidades',
+ PaginaPerfil = 'pagina-perfil',
+ PaginaMiembroEspacioTrabajo = 'pagina-miembro-espacio-trabajo',
+ PaginaTareas = 'pagina-tareas',
+}
+```
+
+Internamente, el ámbito seleccionado se almacena en un estado de Recoil que se comparte en toda la aplicación:
+
+```tsx
+export const estadoActualDeAmbitoDeAtajo = createState({
+ key: 'estadoActualDeAmbitoDeAtajo',
+ defaultValue: AMBITO_INICIAL_ATAJOS,
+});
+```
+
+¡Pero este estado de Recoil nunca debe manejarse manualmente! Veremos cómo usarlo en la siguiente sección.
+
+## ¿Cómo funciona internamente?
+
+Hicimos un contenedor delgado sobre [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) que lo hace más eficiente y evita renders innecesarios.
+
+También creamos un estado de Recoil para manejar el estado del ámbito de atajos de teclado y hacerlo disponible en toda la aplicación.
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..f6e770b67b
--- /dev/null
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Navegar por la biblioteca de componentes de interfaz de Twenty
+---
+
+Ver nuestra biblioteca completa de componentes y documentación en Storybook.
+
+[Abrir Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
new file mode 100644
index 0000000000..85382f32b1
--- /dev/null
+++ b/packages/twenty-docs/l/es/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -0,0 +1,59 @@
+---
+title: Trabajar con Figma
+info: Aprende cómo puedes colaborar con Twenty en Figma
+---
+
+Figma es una herramienta de diseño de interfaces colaborativa que ayuda a superar la barrera de comunicación entre diseñadores y desarrolladores.
+Esta guía explica cómo puedes colaborar con Figma.
+
+## Acceso
+
+1. **Accede al enlace compartido:** Puedes acceder al archivo de Figma del proyecto [aquí](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Inicia sesión:** Si aún no has iniciado sesión, Figma te pedirá que lo hagas.
+ Las características clave solo están disponibles para usuarios registrados, como el modo desarrollador y la capacidad de seleccionar un marco dedicado.
+
+
+ No podrás colaborar efectivamente sin una cuenta.
+
+
+## Estructura de Figma
+
+En la barra lateral izquierda, puedes acceder a las diferentes páginas del Figma de Twenty. Así es como están organizadas:
+
+* **Página de componentes:** Esta es la primera página. El diseñador la utiliza para crear y organizar los elementos de diseño reutilizables que se usan en todo el archivo de diseño. Por ejemplo, botones, íconos, símbolos u otros componentes reutilizables. Sirve para mantener la consistencia a lo largo del diseño.
+* **Página principal:** La segunda página es la página principal, que muestra la interfaz de usuario completa del proyecto. Puedes presionar ***Play*** para usar el prototipo completo de la aplicación.
+* **Páginas de características:** Las otras páginas están típicamente dedicadas a características en progreso. Contienen el diseño de características específicas o módulos de la aplicación o sitio web. Normalmente, aún están en desarrollo.
+
+## Consejos útiles
+
+Con acceso de solo lectura, no puedes editar el diseño, pero puedes acceder a todas las características que serán útiles para convertir los diseños en código.
+
+### Usa el modo Dev
+
+El Modo Dev de Figma mejora la productividad de los desarrolladores al proporcionar una navegación fácil por el diseño, una gestión eficaz de assets, herramientas de comunicación eficientes, integraciones de caja de herramientas, fragmentos de código rápidos e información clave de capas, superando la brecha entre diseño y desarrollo. Puedes aprender más sobre el Modo Dev [aquí](https://www.figma.com/dev-mode/).
+
+Cambia al modo "Desarrollador" en la parte derecha de la barra de herramientas para ver las especificaciones de diseño, copiar CSS y acceder a los assets.
+
+### Usar el prototipo
+
+Haz clic en cualquier elemento del lienzo y presiona el botón "Play" en el extremo superior derecho de la interfaz para acceder a la vista del prototipo. El modo de prototipo te permite interactuar con el diseño como si fuera el producto final. Demuestra el flujo entre pantallas y cómo los elementos de la interfaz, como botones, enlaces o menús, se comportan al interactuar con ellos.
+
+1. **Entendiendo las transiciones y animaciones:** En el modo Prototipo, puedes ver cualquier transición o animación añadida por un diseñador entre pantallas o elementos de UI, proporcionando instrucciones visuales claras a los desarrolladores sobre la conducta y el estilo intencionados.
+2. **Aclaración de implementación:** Un prototipo también puede ayudar a reducir las ambigüedades. Los desarrolladores pueden interactuar con él para obtener una mejor comprensión de la funcionalidad o apariencia de elementos particulares.
+
+Para más detalles y orientación sobre el aprendizaje de la plataforma Figma, puedes visitar la [Documentación Oficial de Figma](https://help.figma.com/hc/en-us).
+
+### Medir distancias
+
+Selecciona un elemento, mantén presionada la tecla `Option` (Mac) o `Alt` (Windows), luego pasa el cursor sobre otro elemento para ver la distancia entre ellos.
+
+### Extensión Figma para VSCode (Recomendado)
+
+[Figma para VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+te permite navegar e inspeccionar archivos de diseño, colaborar con diseñadores, rastrear cambios y acelerar la implementación, todo sin salir de tu editor de texto.
+Forma parte de nuestras extensiones recomendadas.
+
+## Colaboración
+
+1. **Uso de Comentarios:** Puedes utilizar la función de comentarios haciendo clic en el ícono de burbuja en la parte izquierda de la barra de herramientas.
+2. **Chat de Cursor:** Una característica agradable de Figma es el Chat de Cursor. Simplemente presiona `;` en Mac y `/` en Windows para enviar un mensaje si ves a alguien más usando Figma al mismo tiempo que tú.
diff --git a/packages/twenty-docs/l/es/twenty-ui/input.mdx b/packages/twenty-docs/l/es/twenty-ui/input.mdx
index e2e309dc53..a2550d107a 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx
index 2f9d84206d..f01ee51116 100644
--- a/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/input/checkbox.mdx
@@ -4,44 +4,41 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
+
Usado cuando un usuario necesita seleccionar múltiples valores entre varias opciones.
-
+
+ ```jsx
+ import { Checkbox } from "twenty-ui/display";
-```jsx
-import { Checkbox } from "twenty-ui/display";
+ export const MyComponent = () => {
+ return (
+ console.log("función onChange ejecutada")}
+ onCheckedChange={() => console.log("función onCheckedChange ejecutada")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
- console.log("onChange function fired")}
- onCheckedChange={() => console.log("onCheckedChange function fired")}
- variant="primary"
- size="small"
- shape="squared"
- />
- );
-};
-```
-
-
-
-
-| "Props" | Tipo | Descripción |
-| --------------- | --------- | -------------------------------------------------------------------------------------------------------------------------------------- |
-| marcado | booleano | Indica si la caja de selección está marcada |
-| indeterminado | booleano | Indica si la caja de selección está en un estado indeterminado (ni marcada ni desmarcada) |
-| "onChange" | función | La función de devolución de llamada que desea activar cuando cambia el estado de la caja de selección |
-| onCheckedChange | "función" | La función de devolución de llamada que desea activar cuando cambia el estado `marcado` |
-| variante | "cadena" | La variante de estilo visual de la caja. Las opciones incluyen: `primario`, `secundario` y `terciario` |
-| tamaño | "cadena" | El tamaño de la caja de selección. Tiene dos opciones: `pequeño` y `grande` |
-| forma | cadena | La forma de la caja de selección. Tiene dos opciones: `cuadrado` y `redondeado` |
-
-
+
+ | Props | Tipo | Descripción |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------ |
+ | marcado | booleano | Indica si la caja de selección está marcada |
+ | indeterminado | booleano | Indica si la caja de selección está en un estado indeterminado (ni marcada ni desmarcada) |
+ | onChange | función | La función de devolución de llamada que desea activar cuando cambia el estado de la caja de selección |
+ | onCheckedChange | función | La función de devolución de llamada que desea activar cuando cambia el estado `marcado` |
+ | variante | cadena | La variante de estilo visual de la caja. Las opciones incluyen: `primario`, `secundario` y `terciario` |
+ | tamaño | cadena | El tamaño de la caja de selección. Tiene dos opciones: `pequeño` y `grande` |
+ | forma | cadena | La forma de la caja de selección. Tiene dos opciones: `cuadrado` y `redondeado` |
+
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation.mdx
index 8d50701bfa..d604ffba0c 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx
index b094bb5692..03e007339a 100644
--- a/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/navigation/links.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
## Enlace de Contacto
@@ -12,44 +12,40 @@ image: /images/user-guide/what-is-twenty/20.png
Un componente de enlace estilizado para mostrar información de contacto.
-
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
+ import { ContactLink } from 'twenty-ui/navigation';
-import { ContactLink } from 'twenty-ui/navigation';
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('¡Enlace de contacto pulsado!', event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| "Props" | Tipo | Descripción |
-| ----------- | ----------------- | ------------------------------------------------------------------------------- |
-| "className" | "cadena" | "Nombre opcional para estilización adicional" |
-| href | "cadena" | La URL o ruta objetivo del enlace |
-| alHacerClic | "función" | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
-| hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
-
-
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
+ ```
+
+
+ | "Props" | Tipo | Descripción |
+ | ----------- | ----------------- | ------------------------------------------------------------------------------- |
+ | "className" | string | "Nombre opcional para estilización adicional" |
+ | href | string | La URL o ruta objetivo del enlace |
+ | onClick | "función" | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
+ | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
+
## Enlace Sin Estilo
@@ -57,39 +53,35 @@ export const MyComponent = () => {
Un componente de enlace estilizado para mostrar enlaces.
-
+
+ ```jsx
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("¡Enlace de contacto pulsado!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contáctanos
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-
-```
-
-
-
-
-| "Props" | Tipo | Descripción |
-| ----------- | ----------------- | ------------------------------------------------------------------------------- |
-| "className" | cadena | "Nombre opcional para estilización adicional" |
-| href | "cadena" | La URL o ruta objetivo del enlace |
-| alHacerClic | función | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
-| hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
-
-
+
+ | "Props" | Tipo | Descripción |
+ | ------------- | ----------------- | ------------------------------------------------------------------------------- |
+ | nombreDeClase | string | Nombre opcional para estilo adicional |
+ | href | string | La URL o ruta objetivo del enlace |
+ | onClick | función | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
+ | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
+
## Enlace Redondeado
@@ -97,38 +89,34 @@ export const MyComponent = () => {
Un enlace de estilo redondeado con un componente Chip para enlaces.
-
+
+ ```jsx
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("¡Enlace de contacto pulsado!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contáctanos
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| "Props" | Tipo | Descripción |
-| ----------- | ----------------- | ------------------------------------------------------------------------------- |
-| href | "cadena" | La URL o ruta objetivo del enlace |
-| hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
-| alHacerClic | "función" | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
-
-
+
+ | "Props" | Tipo | Descripción |
+ | ------- | ----------------- | ------------------------------------------------------------------------------- |
+ | href | cadena | La URL o ruta objetivo del enlace |
+ | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
+ | onClick | "función" | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
+
## Enlace Social
@@ -136,33 +124,30 @@ export const MyComponent = () => {
Enlaces sociales estilizados, con soporte para varios tipos de enlaces sociales, como URLs, LinkedIn y X (o Twitter).
-
+
+ ```jsx
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| "Props" | Tipo | Descripción |
-| ----------- | ----------------- | ------------------------------------------------------------------------------------------------------------------ |
-| href | "cadena" | La URL o ruta objetivo del enlace |
-| hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
-| tipo | "cadena" | El tipo de enlaces sociales. Las opciones incluyen: `url`, `LinkedIn`, y `Twitter` |
-| alHacerClic | "función" | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
-
-
+
+ | Props | Tipo | Descripción |
+ | ------- | ----------------- | ---------------------------------------------------------------------------------- |
+ | href | string | La URL o ruta objetivo del enlace |
+ | hijos | `React.ReactNode` | El contenido que se mostrará dentro del enlace |
+ | tipo | string | El tipo de enlaces sociales. Las opciones incluyen: `url`, `LinkedIn`, y `Twitter` |
+ | onClick | función | Función de devolución de llamada que se activa cuando se hace clic en el enlace |
+
diff --git a/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx
index b6e0a0eecc..87c450d275 100644
--- a/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx
+++ b/packages/twenty-docs/l/es/twenty-ui/progress-bar.mdx
@@ -4,46 +4,41 @@ image: /images/user-guide/emails/emails_header.png
---
-
+
Indica el progreso o la cuenta regresiva y se mueve de derecha a izquierda.
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
-```jsx
-import { ProgressBar } from "twenty-ui/feedback";
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| "Props" | Tipo | Descripción | Predeterminado |
-| ---------------- | -------- | --------------------------------------------------------------------------------------------------------- | -------------- |
-| duración | número | La duración total de la animación de la barra de progreso en milisegundos | 3 |
-| retraso | número | El retraso en el inicio de la animación de la barra de progreso en milisegundos | 0 |
-| aceleración | "cadena" | Función de aceleración para la animación de la barra de progreso | easeInOut |
-| alturaDeBarra | número | La altura de la barra en píxeles | 24 |
-| colorDeBarra | "cadena" | El color de la barra | gray80 |
-| inicioAutomático | booleano | Si es `true`, la animación de la barra de progreso comienza automáticamente cuando el componente se monta | `verdadero` |
-
-
+
+ | Props | Tipo | Descripción | Predeterminado |
+ | ---------------- | -------- | --------------------------------------------------------------------------------------------------------- | -------------- |
+ | duración | número | La duración total de la animación de la barra de progreso en milisegundos | 3 |
+ | retraso | número | El retraso en el inicio de la animación de la barra de progreso en milisegundos | 0 |
+ | aceleración | cadena | Función de aceleración para la animación de la barra de progreso | easeInOut |
+ | alturaDeBarra | número | La altura de la barra en píxeles | 24 |
+ | colorDeBarra | cadena | El color de la barra | gray80 |
+ | inicioAutomático | booleano | Si es `true`, la animación de la barra de progreso comienza automáticamente cuando el componente se monta | `verdadero` |
+
## Barra de Progreso Circular
@@ -51,27 +46,21 @@ export const MyComponent = () => {
Indica el progreso de una tarea, a menudo se usa en pantallas de carga o áreas donde se desea comunicar procesos en curso al usuario.
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-
-```jsx
-import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| "Props" | Tipo | Descripción | Predeterminado |
-| ------------ | ------ | -------------------------------------------- | -------------- |
-| tamaño | número | El tamaño de la barra de progreso circular | 50 |
-| anchoDeBarra | número | El ancho de la línea de la barra de progreso | 5 |
-| colorDeBarra | cadena | El color de la barra de progreso | currentColor |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Props | Tipo | Descripción | Predeterminado |
+ | ------------ | ------ | -------------------------------------------- | -------------- |
+ | tamaño | número | El tamaño de la barra de progreso circular | 50 |
+ | anchoDeBarra | número | El ancho de la línea de la barra de progreso | 5 |
+ | colorDeBarra | cadena | El color de la barra de progreso | currentColor |
+
diff --git a/packages/twenty-docs/l/es/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/es/user-guide/billing/capabilities/pricing-plans.mdx
new file mode 100644
index 0000000000..1de0d238e1
--- /dev/null
+++ b/packages/twenty-docs/l/es/user-guide/billing/capabilities/pricing-plans.mdx
@@ -0,0 +1,79 @@
+---
+title: Planes de precios},{
+description: Obtén información sobre los planes de precios de Twenty y cómo cambiar entre ellos.
+---
+
+## Resumen
+
+Twenty ofrece precios flexibles para adaptarse a equipos de todos los tamaños, tanto si prefieres alojamiento en la nube como autoalojamiento.
+
+## Planes en la nube
+
+### Pro (Nube)
+
+Para equipos listos para escalar:
+
+* Todas las funciones principales de CRM
+* Sincronización de correo electrónico y calendario
+* Flujos de trabajo y automatizaciones
+* Soporte estándar
+
+
+ Las funciones premium (SSO y permisos a nivel de fila) no están incluidas en el plan Pro.
+
+
+### Organización (Nube)
+
+Para equipos más grandes con necesidades avanzadas:
+
+* Todo lo de Pro
+* **Funciones premium**: integración de SSO y permisos a nivel de fila
+* Soporte prioritario
+
+## Planes de autoalojamiento
+
+### Gratis (Autoalojado)
+
+Aloja Twenty en tu propia infraestructura sin costo:
+
+* Incluye todas las funciones de Pro
+* Soporte de la comunidad a través de Discord
+* Control total sobre tus datos
+
+### Organización (Autoalojado)
+
+Para equipos que necesitan funciones premium mientras se autoalojan:
+
+* Todas las funciones de Pro
+* **Funciones premium**: integración de SSO y permisos a nivel de fila
+* Soporte del equipo de Twenty
+* No es obligatorio publicar el código personalizado como código abierto antes de distribuirlo
+
+## Funciones premium
+
+Las funciones premium solo están disponibles en los planes de Organización (Nube o Autoalojado):
+
+* **Integración de SSO**: inicio de sesión único con tu proveedor de identidad
+* **Permisos a nivel de fila**: control de acceso granular a nivel de registro
+
+## Cambiar de plan
+
+### Actualizar a Organización
+
+1. Ir a **Ajustes → Facturación**
+2. Haz clic en **Cambiar a Organización**
+3. Confirma tu actualización
+
+### Reducir a Pro
+
+Contacta al equipo de soporte para reducir tu plan.
+
+### Cambiar a facturación anual
+
+1. Ir a **Ajustes → Facturación**
+2. Haz clic en **Cambiar a anual**
+3. Ahorra con la facturación anual
+
+### Cambiar a facturación mensual
+
+Contacta al equipo de soporte para volver a la facturación mensual.
diff --git a/packages/twenty-docs/l/es/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/es/user-guide/data-migration/overview.mdx
new file mode 100644
index 0000000000..2500fd7da2
--- /dev/null
+++ b/packages/twenty-docs/l/es/user-guide/data-migration/overview.mdx
@@ -0,0 +1,89 @@
+---
+title: Migración de datos
+description: Importe y exporte sus datos de CRM mediante archivos CSV o la API.
+image: /images/user-guide/import-export-data/cloud.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Métodos de importación
+
+Twenty admite dos métodos principales para importar datos:
+
+| Método | Ideal para | Límite de volumen |
+| ---------------------------- | ------------------------------------------------ | ---------------------------- |
+| **Importación CSV** | Migraciones estándar, actualizaciones periódicas | 10.000 registros por archivo |
+| **Importación mediante API** | Migraciones a gran escala, automatización | Ilimitado |
+
+Para conjuntos de datos muy grandes (cientos de miles de registros), use la API. Nuestros [socios de implementación](/l/es/user-guide/getting-started/capabilities/implementation-services) pueden ayudar a ejecutar estos scripts si es necesario.
+
+## Conceptos básicos de la importación CSV
+
+Puede importar datos de cualquier objeto mediante archivos CSV, XLSX o XLS. Cada archivo debe contener **solo un tipo de objeto** (por ejemplo, solo registros de Personas).
+
+**Los campos deben existir antes de la importación.** Cargar un CSV crea registros, pero no crea campos. Si necesita campos personalizados, créelos primero en **Configuración → Modelo de datos**.
+
+### Pasos
+
+1. Vaya al objeto en el que desea importar datos
+2. Haga clic en el icono **⋮** en la esquina superior derecha (este es el Menú de comandos) y haga clic en **Importar registros**
+3. Descargue el archivo de plantilla para asegurarse de que sus datos estén en el formato esperado
+4. Cargue su archivo CSV con el formato correcto
+5. Asigne sus columnas a los campos de Twenty
+6. Revise los errores (resaltados en amarillo) y corríjalos, editando directamente en la interfaz de usuario
+7. Confirme la importación
+
+### Importación de relaciones entre objetos
+
+Puede importar relaciones entre objetos utilizando la función de importación CSV. Debe hacer referencia al objeto relacionado utilizando un campo único de ese objeto: el `id`, el `email` para Personas y Miembros del espacio de trabajo, el `domain` para empresas, cualquier otro campo establecido como único en el modelo de datos para cualquier otro objeto.
+
+**Los registros eliminados cuentan para la unicidad.** Los registros eliminados lógicamente (visibles en Menú de comandos → Ver registros eliminados) se incluyen en las comprobaciones de unicidad. Si importa un registro con el mismo valor único que un registro eliminado, el registro eliminado se restaurará.
+
+
+ **¡Importa el orden de importación!**
+
+ Al importar objetos relacionados, cargue los archivos en este orden:
+
+ 1. **Empresas** primero (el lado "uno" de las relaciones)
+ 2. **Personas** segundo (vinculadas a empresas mediante companyId)
+ 3. **Oportunidades** tercero (vinculadas a empresas/personas)
+ 4. **Objetos personalizados** con relaciones al final
+
+ ¿Por qué? El lado "uno" de una relación de uno a muchos debe existir antes de que pueda hacer referencia a él. Por ejemplo, el registro de Empresa debe existir antes de importar una Persona con el ID de esa empresa.
+
+
+Consulte [este artículo](/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) para ver una guía paso a paso sobre cómo proceder.
+
+## Exportar Datos
+
+Exporte los datos de su espacio de trabajo para copias de seguridad, informes o migración.
+
+### Pasos
+
+1. Vaya al objeto que desea exportar
+2. Configure la vista con las columnas que necesita
+3. Haga clic en **⋮** → **Exportar vista**
+4. Guarde el archivo CSV
+
+**Solo se exportan las columnas visibles.** El archivo CSV contendrá únicamente las columnas que se muestran en su vista actual. Agregue u oculte columnas antes de exportar para controlar qué datos se incluyen.
+
+**Límites de exportación**: hasta 20.000 registros por exportación.
+
+## Permisos
+
+La importación y exportación de datos requieren permisos específicos:
+
+* **Importación**: requiere el permiso "Importar CSV"
+* **Exportación**: requiere el permiso "Exportar CSV"
+
+Póngase en contacto con el administrador de su espacio de trabajo si no tiene estos permisos.
+
+## Próximos Pasos
+
+* [Prepare sus archivos CSV](/l/es/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Importe relaciones entre objetos](/l/es/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Importe mediante API para conjuntos de datos grandes](/l/es/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/es/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/es/user-guide/permissions-access/overview.mdx
new file mode 100644
index 0000000000..07ff71b19f
--- /dev/null
+++ b/packages/twenty-docs/l/es/user-guide/permissions-access/overview.mdx
@@ -0,0 +1,40 @@
+---
+title: Permisos y acceso
+description: Administra roles, permisos y el control de acceso en tu espacio de trabajo.
+---
+
+
+
+
+
+El sistema de permisos de Twenty te permite controlar quién puede acceder y modificar los datos en tu espacio de trabajo. Crea roles, asigna permisos y configura SSO para un acceso seguro.
+
+## Qué incluye esta sección
+
+
+
+ Crea roles y configura permisos de objetos, campos y configuración.
+
+
+
+ Configura el inicio de sesión único (SSO) con tu proveedor de identidad.
+
+
+
+ Preguntas comunes sobre roles, permisos y SSO.
+
+
+
+## Características clave
+
+* **Acceso basado en roles**: Crea roles personalizados con permisos específicos
+* **Permisos de objetos**: Controla quién puede ver, editar o eliminar registros
+* **Permisos de campos**: Restringe el acceso a campos sensibles
+* **Permisos de configuración**: Controla el acceso a la configuración del espacio de trabajo
+* **Integración con SSO**: Configura el inicio de sesión único para seguridad a nivel empresarial (plan Organization)
+
+## Enlaces rápidos
+
+* [Crear un rol](/l/es/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configurar SSO](/l/es/user-guide/permissions-access/capabilities/sso-configuration)
+* [Administrar miembros del equipo](/l/es/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
new file mode 100644
index 0000000000..f2fbaf5201
--- /dev/null
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -0,0 +1,32 @@
+---
+title: Restringir el acceso a tu vista
+description: Controla quién puede ver tus vistas personalizadas.
+---
+
+Cada vista (excepto las vistas predeterminadas "Todas las [Object Name]") tiene su propia configuración de visibilidad.
+
+## Pasos
+
+1. Abre la vista que deseas restringir
+2. Haz clic en **Opciones** en la esquina superior derecha
+3. Haz clic en **Visibilidad**
+4. Selecciona **No listada**
+
+Tu vista ahora es visible solo para ti.
+
+## Opciones de visibilidad
+
+| Configuración | Quién puede ver |
+| ---------------------- | ----------------------------------------- |
+| **Espacio de trabajo** | Todos los miembros del espacio de trabajo |
+| **No listada** | Solo tú |
+
+## Notas
+
+* Las vistas predeterminadas "Todas las [Object Name]" no se pueden establecer como no listadas
+* Las vistas no listadas no aparecen en los menús desplegables de vistas de otros usuarios
+* Puedes cambiar la visibilidad de nuevo a Espacio de trabajo en cualquier momento
+
+## Relacionado
+
+* [Configuración de vistas](/l/es/user-guide/views-pipelines/capabilities/view-settings) — todas las opciones de configuración de vistas
diff --git a/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
new file mode 100644
index 0000000000..9269fb8de1
--- /dev/null
+++ b/packages/twenty-docs/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -0,0 +1,231 @@
+---
+title: Realiza un seguimiento de cuánto tiempo permanecen las oportunidades en cada etapa.
+description: Supervisa la velocidad de las oportunidades registrando cuándo ingresan a cada etapa.
+---
+
+
+ Este es un ejemplo de cómo crear [Campos de fórmula](/l/es/user-guide/workflows/how-tos/crm-automations/formula-fields) usando flujos de trabajo — específicamente cálculos de fechas.
+
+
+Registrar cuándo las oportunidades ingresan a cada etapa te ayuda a identificar cuellos de botella y medir la velocidad de las oportunidades.
+
+Esta guía te muestra cómo configurar campos personalizados y un flujo de trabajo para registrar automáticamente cuándo una oportunidad pasa a cada etapa y calcular cuántos días pasó en la etapa anterior.
+
+## Paso 1: Crear campos personalizados
+
+Necesitas dos tipos de campos para cada etapa:
+
+* **Campos de fecha y hora**: Registran cuándo la oportunidad ingresó a cada etapa
+* **Campos numéricos**: Almacenan cuántos días pasó la oportunidad en cada etapa
+
+### Crea los campos "Última entrada"
+
+1. Ve a **Ajustes → Modelo de datos → Oportunidades**
+2. Para cada etapa, haz clic en **+ Agregar campo** y configura:
+ * **Nombre**: Última entrada en [Nombre de la etapa] (p. ej., "Última entrada en Nuevo", "Última entrada en Calificado")
+ * **Tipo**: Fecha y hora
+ * **Descripción**: Marca de tiempo cuando la oportunidad ingresó a esta etapa
+3. Haga clic en **Guardar**
+
+Crea estos campos:
+
+* Última entrada en Nuevo
+* Última entrada en Calificado
+* Última entrada en Reunión
+* Última entrada en Propuesta
+* Última entrada en Negociación
+* Última entrada en Cerrado ganado
+* Última entrada en Cerrado perdido
+
+### Crea los campos "Días en la etapa"
+
+1. Para cada etapa, haz clic en **+ Agregar campo** y configura:
+ * **Nombre**: Días en [Nombre de la etapa] (p. ej., "Días en Nuevo", "Días en Calificado")
+ * **Tipo**: Número
+ * **Descripción**: Número de días que pasó en esta etapa
+2. Haga clic en **Guardar**
+
+Crea estos campos:
+
+* Días en Nuevo
+* Días en Calificado
+* Días en Reunión
+* Días en Propuesta
+* Días en Negociación
+
+
+ No necesitas campos "Días en" para Cerrado ganado y Cerrado perdido, ya que son etapas finales.
+
+
+### Opcional: Hacer que los campos sean de solo lectura
+
+Si no quieres que los usuarios editen manualmente estos campos calculados:
+
+1. Ve a **Ajustes → Roles**
+2. Selecciona el rol que deseas configurar
+3. Busca el objeto Oportunidades
+4. Configura los campos "Última entrada" y "Días en" como de solo lectura
+
+## Paso 2: Crear el flujo de trabajo
+
+Este único flujo de trabajo gestiona ambas tareas:
+
+* Registra la marca de tiempo al entrar en una nueva etapa
+* Calcula los días que se pasaron en la etapa anterior
+
+### Crea el flujo de trabajo
+
+1. Ve a **Flujos de trabajo**
+2. Haz clic en **+ Nuevo flujo de trabajo**
+3. Ponle el nombre "Seguimiento del tiempo por etapa"
+
+### Configura el disparador
+
+1. Agrega un disparador **Registro actualizado**
+2. Selecciona **Oportunidades** como objeto
+3. Filtrar por: el campo **Etapa** se actualiza
+
+### Agrega ramas para cada etapa
+
+
+ Para crear una nueva rama, haz clic derecho en el lienzo del flujo de trabajo y haz clic en **Nueva acción**. Luego, vincula esta acción al nodo anterior arrastrando la flecha desde el nodo anterior hasta esta nueva acción.
+
+
+---
+
+**Rama 1: Etapa = Nuevo (primera etapa)**
+
+Como esta es la primera etapa, solo registramos la marca de tiempo de entrada; no hay una etapa anterior que calcular.
+
+1. Agrega un nodo **Filtro**: Etapa = Nuevo
+2. Agrega una acción de **Código**:
+
+```javascript
+export const main = async (): Promise => {
+ return { now: new Date().toISOString() };
+};
+```
+
+3. Agrega una acción **Actualizar registro**:
+ * Registro: la Oportunidad que activó el evento
+ * Campo: Última entrada en Nuevo
+ * Valor: `now` del nodo de Código
+
+---
+
+**Rama 2: Etapa = Calificado**
+
+Al pasar a Calificado, registra la hora de entrada Y calcula los días que se pasaron en Nuevo.
+
+1. Agrega un nodo **Filtro**: Etapa = Calificado
+2. Agrega una acción de **Código**:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configura la entrada del nodo de Código: mapea `lastEnteredPreviousStage` al campo **Última entrada en Nuevo**
+4. Agrega una acción **Actualizar registro**:
+ * Registro: la Oportunidad que activó el evento
+ * Campos a actualizar:
+ * Última entrada en Calificado = `now`
+ * Días en Nuevo = `daysInPreviousStage`
+
+---
+
+**Rama 3: Etapa = Reunión**
+
+Al pasar a Reunión, registra la hora de entrada Y calcula los días que se pasaron en Calificado.
+
+1. Agrega un nodo **Filtro**: Etapa = Reunión
+2. Agrega una acción de **Código**:
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configura la entrada del nodo de Código: mapea `lastEnteredPreviousStage` al campo **Última entrada en Calificado**
+4. Agrega una acción **Actualizar registro**:
+ * Registro: la Oportunidad que activó el evento
+ * Campos a actualizar:
+ * Última entrada en Reunión = `now`
+ * Días en Calificado = `daysInPreviousStage`
+
+---
+
+**Continúa con las etapas restantes:**
+
+| Etapa | Registros | Calcula |
+| --------------- | --------------------------------- | ------------------- |
+| Propuesta | Última entrada en Propuesta | Días en Reunión |
+| Negociación | Última entrada en Negociación | Días en Propuesta |
+| Cerrado ganado | Última entrada en Cerrado ganado | Días en Negociación |
+| Cerrado perdido | Última entrada en Cerrado perdido | Días en Negociación |
+
+Las ramas no necesitan volver a unirse; cada una se ejecuta de forma independiente cuando se cumple su condición de etapa.
+
+## Paso 3: Analizar el tiempo en la etapa
+
+Con las marcas de tiempo y los recuentos de días registrados, ahora puedes analizar la velocidad de las oportunidades.
+
+### Crea una vista "Oportunidades lentas"
+
+1. Crea una vista de tabla de Oportunidades
+2. Agrega columnas: Nombre, Etapa, Días en [etapa anterior], Importe
+3. Ordena por el campo "Días en" (descendente)
+4. Filtra por Etapa para centrarte en una etapa a la vez
+
+Las oportunidades en la parte superior pasaron más tiempo en la etapa anterior.
+
+### Usa agregaciones
+
+En tu vista Kanban del pipeline:
+
+1. Haz clic en el número junto al nombre de una Etapa
+2. Selecciona **Promedio**
+3. Elige un campo "Días en"
+
+Esto muestra el tiempo promedio que las oportunidades pasan en cada etapa.
+
+## Resumen
+
+| Componente | Propósito |
+| --------------------------- | ------------------------------------------------------------------------- |
+| **Campos "Última entrada"** | Almacenan cuándo la oportunidad ingresó a cada etapa |
+| **Campos "Días en"** | Almacenan cuántos días se pasaron en cada etapa |
+| **Flujo de trabajo** | Registra la marca de tiempo Y calcula los días en una sola pasada |
+| **Vistas y agregaciones** | Analiza la velocidad de las oportunidades e identifica cuellos de botella |
+
+## Relacionado
+
+* [Flujos de trabajo](/l/es/user-guide/workflows/overview) — conceptos básicos de automatización
+* [Cómo crear campos personalizados](/l/es/user-guide/data-model/how-tos/create-custom-fields) — configuración de campos
+* [Vistas Kanban](/l/es/user-guide/views-pipelines/capabilities/kanban-views) — agregaciones
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..c5d7388c5d
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: Meilleures pratiques
+---
+
+Ce document décrit les meilleures pratiques à suivre lors de travaux sur le backend.
+
+## Suivez une approche modulaire
+
+Le backend suit une approche modulaire, qui est un principe fondamental lors de l'utilisation de NestJS. Assurez-vous de décomposer votre code en modules réutilisables pour maintenir une base de code propre et organisée.
+Chaque module doit encapsuler une fonctionnalité particulière et avoir un périmètre bien défini. Cette approche modulaire permet une séparation claire des préoccupations et supprime les complexités inutiles.
+
+## Exposez des services à utiliser dans les modules
+
+Créez toujours des services avec une responsabilité claire et unique, ce qui améliore la lisibilité et la maintenabilité du code. Nommez les services de manière descriptive et cohérente.
+
+Vous devez également exposer les services que vous souhaitez utiliser dans d'autres modules. Exposer des services à d'autres modules est possible grâce au puissant système d'injection de dépendance de NestJS, et favorise un couplage lâche entre les composants.
+
+## Évitez d'utiliser le type `any`
+
+Lorsque vous déclarez une variable comme `any`, le vérificateur de types de TypeScript ne procède à aucune vérification de type, ce qui permet d'affecter n'importe quel type de valeur à la variable. TypeScript utilise l'inférence de type pour déterminer le type d'une variable en fonction de sa valeur. En le déclarant comme `any`, TypeScript ne peut plus inférer le type. Cela rend difficile la détection des erreurs liées aux types pendant le développement, conduisant à des erreurs d'exécution et rendant le code moins maintenable, moins fiable et plus difficile à comprendre pour d'autres.
+
+C'est pourquoi tout devrait avoir un type. Donc si vous créez un nouvel objet avec un prénom et un nom, vous devriez créer une interface ou un type contenant un prénom et un nom qui définit la forme de l'objet que vous manipulez.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
new file mode 100644
index 0000000000..fd0c45d576
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -0,0 +1,109 @@
+---
+title: Architecture des Dossiers
+info: Un aperçu détaillé de notre architecture de dossiers
+---
+
+Dans ce guide, vous explorerez les détails de la structure du répertoire de projet et comment elle contribue à l'organisation et à la maintenabilité de Twenty.
+
+En suivant cette convention d'architecture de dossiers, il est plus facile de trouver les fichiers liés à des fonctionnalités spécifiques et de s'assurer que l'application est évolutive et maintenable.
+
+```
+front
+└───modules
+│ └───module1
+│ │ └───sous-module1
+│ └───module2
+│ └───ui
+│ │ └───affichage
+│ │ └───entrées
+│ │ │ └───boutons
+│ │ └───...
+└───pages
+└───...
+```
+
+## Pages
+
+Comprend les composants de haut niveau définis par les routes de l'application. Ils importent des composants de plus bas niveau depuis le dossier `modules` (plus de détails ci-dessous).
+
+## Modules
+
+Chaque module représente une fonctionnalité ou un groupe de fonctionnalités, comprenant ses composants spécifiques, ses états, et sa logique opérationnelle.
+Ils doivent tous suivre la structure ci-dessous. Vous pouvez imbriquer des modules dans des modules (appelés sous-modules) et les mêmes règles s'appliqueront.
+
+```
+module1
+ └───composants
+ │ └───composant1
+ │ └───composant2
+ └───constantes
+ └───contextes
+ └───graphql
+ │ └───fragments
+ │ └───requêtes
+ │ └───mutations
+ └───hooks
+ │ └───interne
+ └───états
+ │ └───sélecteurs
+ └───types
+ └───utilitaires
+```
+
+### Contextes
+
+Un contexte est un moyen de transmettre des données à travers l'arborescence de composants sans avoir à transmettre les propriétés manuellement à chaque niveau.
+
+Voir [React Context](https://react.dev/reference/react#context-hooks) pour plus de détails.
+
+### GraphQL
+
+Comprend des fragments, des requêtes et des mutations.
+
+Voir [GraphQL](https://graphql.org/learn/) pour plus de détails.
+
+* Fragments
+
+Un fragment est une partie réutilisable d'une requête, que vous pouvez utiliser dans différents endroits. En utilisant des fragments, il est plus facile d'éviter de dupliquer du code.
+
+Voir [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) pour plus de détails.
+
+* Requêtes
+
+Voir [GraphQL Queries](https://graphql.org/learn/queries/) pour plus de détails.
+
+* Mutations
+
+Voir [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) pour plus de détails.
+
+### Hooks
+
+Voir [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks) pour plus de détails.
+
+### États
+
+Contient la logique de gestion des états. [RecoilJS](https://recoiljs.org) gère cela.
+
+* Sélecteurs : Voir [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) pour plus de détails.
+
+La gestion de l'état intégrée de React gère toujours l'état au sein d'un composant.
+
+### Utilitaires
+
+Devrait juste contenir des fonctions pures réutilisables. Autrement, créez des hooks personnalisés dans le dossier `hooks`.
+
+## UI
+
+Contient tous les composants d'interface utilisateur réutilisables utilisés dans l'application.
+
+Ce dossier peut contenir des sous-dossiers, comme `data`, `display`, `feedback`, et `input` pour des types de composants spécifiques. Chaque composant doit être autonome et réutilisable, de sorte que vous puissiez l'utiliser dans différentes parties de l'application.
+
+En séparant les composants UI des autres composants dans le dossier `modules`, il est plus facile de maintenir un design cohérent et d'effectuer des changements de l'interface utilisateur sans affecter d'autres parties (logique métier) de la base de code.
+
+## Interface et dépendances
+
+Vous pouvez importer le code d'autres modules depuis n'importe quel module, sauf le dossier `ui`. Cela permettra de garder son code facile à tester.
+
+### Interne
+
+Chaque partie (hooks, états, ...) d'un module peut avoir un dossier `internal`, qui contient des parties utilisées uniquement au sein du module.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..9921f33a18
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,86 @@
+---
+title: Commandes Frontend
+---
+
+## Commandes utiles
+
+### Lancement de l'application
+
+```bash
+npx nx start twenty-front
+```
+
+### Régénérer le schéma GraphQL basé sur le schéma API GraphQL
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+OU
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### Analyse
+
+```bash
+npx nx run twenty-front:lint # passez --fix pour corriger les erreurs de lint
+```
+
+## Traductions
+
+```bash
+npx nx run twenty-front:lingui:extract\nnpx nx run twenty-front:lingui:compile
+```
+
+### Test
+
+```bash
+npx nx run twenty-front:test # exécuter les tests jest\nnpx nx run twenty-front:storybook:serve:dev # exécuter storybook\nnpx nx run twenty-front:storybook:test # exécuter les tests # (besoin de yarn storybook:serve:dev pour fonctionner)\nnpx nx run twenty-front:storybook:coverage # (besoin de yarn storybook:serve:dev pour fonctionner)
+```
+
+## Écosystème Tech
+
+Le projet a une stack simple et propre, avec un code boilerplate minimal.
+
+**Application**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](https://the-guild.dev/graphql/codegen)
+* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
+* [TypeScript](https://www.typescriptlang.org/)
+
+**Tests**
+
+* [Jest](https://jestjs.io/)
+* [Storybook](https://storybook.js.org/)
+
+**Outils**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## Architecture
+
+### Routage
+
+[React Router](https://reactrouter.com/) gère le routage.
+
+Pour éviter les [re-renders](/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) inutiles, toute la logique de routage est dans un `useEffect` dans `PageChangeEffect`.
+
+### Gestion de l'État
+
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) gère la gestion de l'état.
+
+Voir [les meilleures pratiques](/l/fr/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) pour plus d'informations sur la gestion de l'état.
+
+## Tests
+
+[Jest](https://jestjs.io/) sert de guide pour les tests unitaires tandis que [Storybook](https://storybook.js.org/) est utilisé pour les tests de composants.
+
+Jest est principalement utilisé pour tester les fonctions utilitaires, et non les composants eux-mêmes.
+
+Storybook est utilisé pour tester le comportement des composants isolés, ainsi que pour afficher le système de design.
diff --git a/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..456c270679
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Parcourir la bibliothèque de composants UI de Twenty
+---
+
+Consultez notre bibliothèque de composants complète et la documentation dans Storybook.
+
+[Ouvrir Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/fr/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/fr/developers/self-host/capabilities/cloud-providers.mdx
new file mode 100644
index 0000000000..cc975ad41e
--- /dev/null
+++ b/packages/twenty-docs/l/fr/developers/self-host/capabilities/cloud-providers.mdx
@@ -0,0 +1,45 @@
+---
+title: Autres méthodes
+---
+
+
+ Ce document est maintenu par la communauté. Il pourrait contenir des problèmes.
+
+
+## Kubernetes via Terraform et Manifests
+
+La documentation communautaire pour le déploiement de Kubernetes est disponible [ici](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+
+### Coolify
+
+Déployer Twenty sur les serveurs avec Coolify. (l'image officielle sur Coolify sera bientôt disponible)
+
+[Documentation Coolify](https://coolify.io/docs/get-started/introduction)
+
+### EasyPanel
+
+Déployez Twenty sur EasyPanel avec le modèle maintenu par la communauté ci-dessous.
+
+[Déployer sur EasyPanel](https://easypanel.io/docs/templates/twenty)
+
+### Elest.io
+
+Déployez Twenty sur les serveurs avec Elest.io en utilisant le lien ci-dessous.
+
+[Déployer sur Elest.io](https://elest.io/open-source/twenty)
+
+### Twenty sur Railway
+
+Déployez Twenty sur Railway avec le modèle maintenu par la communauté ci-dessous.
+
+[](https://railway.com/deploy/nAL3hA)
+
+### Twenty sur Sealos
+
+Déployez Twenty sur Sealos avec le modèle maintenu par la communauté ci-dessous.
+
+[](https://sealos.io/products/app-store/twenty)
+
+## Autres
+
+N'hésitez pas à ouvrir une PR pour ajouter d'autres options de fournisseur cloud.
diff --git a/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx
index ed88adeac3..6b43167a3b 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/display/app-tooltip.mdx
@@ -4,57 +4,52 @@ image: /images/user-guide/tips/light-bulb.png
---
-
+
Un message bref qui affiche des informations supplémentaires lorsqu'un utilisateur interagit avec un élément.
-
+
+ ```jsx
+ import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-```jsx
-import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-
-export const MyComponent = () => {
- return (
- <>
-
- Customer Insights
-
-
- >
- );
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ----------------------- | -------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| nomDeClasse | chaîne | Classe CSS facultative pour le style supplémentaire |
-| sélecteurAncre | Sélecteur CSS | Sélecteur pour l'ancre de l'info-bulle (l'élément qui déclenche l'info-bulle) |
-| contenu | chaîne | Le contenu que vous souhaitez afficher dans l'info-bulle |
-| délaiMasquer | nombre | Le délai avant de masquer l'info-bulle après que le curseur ait quitté l'ancre |
-| décalage | nombre | Le décalage en pixels pour positionner l'info-bulle |
-| pasDeFlèche | booléen | Si `vrai`, masque la flèche sur l'info-bulle |
-| estOuvert | booléen | Si `vrai`, l'info-bulle est ouverte par défaut |
-| emplacement | Chaîne `PlacesType` de `react-tooltip` | Spécifie le placement de l'info-bulle. Les valeurs incluent `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, et `left-end` |
-| stratégiePositionnement | Chaîne `PositionStrategy` de `react-tooltip` | Stratégie de positionnement pour l'info-bulle. A deux valeurs : `absolute` et `fixed` |
-
-
+ export const MyComponent = () => {
+ return (
+ <>
+
+ Aperçus client
+
+
+ >
+ );
+ };
+ ```
+
+
+ | Propriétés | Type | Description |
+ | ----------------------- | -------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | nomDeClasse | chaîne | Classe CSS facultative pour le style supplémentaire |
+ | sélecteurAncre | Sélecteur CSS | Sélecteur pour l'ancre de l'info-bulle (l'élément qui déclenche l'info-bulle) |
+ | contenu | chaîne | Le contenu que vous souhaitez afficher dans l'info-bulle |
+ | délaiMasquer | nombre | Le délai avant de masquer l'info-bulle après que le curseur ait quitté l'ancre |
+ | décalage | nombre | Le décalage en pixels pour positionner l'info-bulle |
+ | pasDeFlèche | booléen | Si `vrai`, masque la flèche sur l'info-bulle |
+ | estOuvert | booléen | Si `vrai`, l'info-bulle est ouverte par défaut |
+ | emplacement | Chaîne `PlacesType` de `react-tooltip` | Spécifie le placement de l'info-bulle. Les valeurs incluent `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, et `left-end` |
+ | stratégiePositionnement | Chaîne `PositionStrategy` de `react-tooltip` | Stratégie de positionnement pour l'info-bulle. A deux valeurs : `absolute` et `fixed` |
+
## Texte débordant avec info-bulle
@@ -62,27 +57,22 @@ export const MyComponent = () => {
Gère le texte débordant et affiche une info-bulle lorsque le texte déborde.
-
+
+ ```jsx
+ import { OverflowingTextWithTooltip } from 'twenty-ui/display';
-```jsx
-import { OverflowingTextWithTooltip } from 'twenty-ui/display';
+ export const MyComponent = () => {
+ const crmTaskDescription =
+ 'Suivre avec le client concernant son enquête récente sur le produit. Discuter des options de prix, répondre à toute préoccupation et fournir des informations additionnelles sur le produit. Enregistrer les détails de la conversation dans le CRM pour référence future.';
-export const MyComponent = () => {
- const crmTaskDescription =
- 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-
- return ;
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ---------- | ------ | ----------------------------------------------------------------------- |
-| texte | chaîne | Le contenu que vous souhaitez afficher dans la zone de texte débordante |
-
-
+ return ;
+ };
+ ```
+
+
+ | Propriétés | Type | Description |
+ | ---------- | ------ | ----------------------------------------------------------------------- |
+ | texte | chaîne | Le contenu que vous souhaitez afficher dans la zone de texte débordante |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input.mdx b/packages/twenty-docs/l/fr/twenty-ui/input.mdx
index 4a19239d96..9c298b3927 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx
index f5f1a3e19c..09b17c3888 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/checkbox.mdx
@@ -4,44 +4,41 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
+
Utilisé lorsqu'un utilisateur doit sélectionner plusieurs valeurs parmi plusieurs options.
-
+
+ ```jsx
+ import { Checkbox } from "twenty-ui/display";
-```jsx
-import { Checkbox } from "twenty-ui/display";
+ export const MyComponent = () => {
+ return (
+ console.log("la fonction onChange est exécutée")}
+ onCheckedChange={() => console.log("la fonction onCheckedChange est exécutée")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
- console.log("onChange function fired")}
- onCheckedChange={() => console.log("onCheckedChange function fired")}
- variant="primary"
- size="small"
- shape="squared"
- />
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
-| coché | booléen | Indique si la case à cocher est cochée |
-| indéterminé | booléen | Indique si la case à cocher est dans un état indéterminé (ni cochée ni décochée) |
-| onChange | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'état de la case à cocher change |
-| onCheckedChange | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'état `coché` change |
-| variante | chaîne | Le style visuel de la variante de la boîte. Les options incluent : `primaire`, `secondaire` et `tertiaire` |
-| taille | chaîne | La taille de la case à cocher. Comporte deux options : `petit` et `grand` |
-| forme | chaîne | La forme de la case à cocher. Comporte deux options : `carrée` et `arrondie` |
-
-
+
+ | Propriétés | Type | Description |
+ | --------------- | -------- | ---------------------------------------------------------------------------------------------------------- |
+ | coché | booléen | Indique si la case à cocher est cochée |
+ | indéterminé | booléen | Indique si la case à cocher est dans un état indéterminé (ni cochée ni décochée) |
+ | onChange | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'état de la case à cocher change |
+ | onCheckedChange | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'état `coché` change |
+ | variante | chaîne | Le style visuel de la variante de la boîte. Les options incluent : `primaire`, `secondaire` et `tertiaire` |
+ | taille | chaîne | La taille de la case à cocher. Comporte deux options : `petit` et `grand` |
+ | forme | chaîne | La forme de la case à cocher. Comporte deux options : `carrée` et `arrondie` |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx
index d583615c42..6e0ada64ed 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/icon-picker.mdx
@@ -4,53 +4,49 @@ image: /images/user-guide/github/github-header.png
---
-
+
Un sélecteur d'icônes basé sur un menu déroulant qui permet aux utilisateurs de sélectionner une icône dans une liste.
+
+ ```jsx
+ import { RecoilRoot } de "recoil";
+ import React, { useState } de "react";
+ import { IconPicker } de "@/ui/input/components/IconPicker";
-
+ export const MonComposant = () => {
-```jsx
-import { RecoilRoot } from "recoil";
-import React, { useState } from "react";
-import { IconPicker } from "@/ui/input/components/IconPicker";
+ const [selectedIcon, setSelectedIcon] = useState("");
+ const handleIconChange = ({ iconKey, Icon }) => {
+ console.log("Icône sélectionnée:", iconKey);
+ setSelectedIcon(iconKey);
+ };
-export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
- const [selectedIcon, setSelectedIcon] = useState("");
- const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Selected Icon:", iconKey);
- setSelectedIcon(iconKey);
- };
-
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| --------------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| désactivé | booléen | Désactive le sélecteur d'icônes si défini sur `true` |
-| onChange | fonction | La fonction de rappel déclenchée lorsque l'utilisateur sélectionne une icône. Elle reçoit un objet avec les propriétés `iconKey` et `Icon` |
-| selectedIconKey | chaîne | La clé de l'icône initialement sélectionnée |
-| onClickOutside | fonction | Fonction de rappel déclenchée lorsque l'utilisateur clique en dehors du menu déroulant |
-| onClose | fonction | Fonction de rappel déclenchée lorsque le menu déroulant est fermé |
-| onOpen | fonction | Fonction de rappel déclenchée lorsque le menu déroulant est ouvert |
-| variante | chaîne | La variante de style visuel de l'icône cliquable. Les options incluent : `primaire`, `secondaire` et `tertiaire` |
-
-
+
+ | Propriétés | Type | Description |
+ | --------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
+ | désactivé | booléen | Désactive le sélecteur d'icônes si défini sur `true` |
+ | onChange | fonction | La fonction de rappel déclenchée lorsque l'utilisateur sélectionne une icône. Elle reçoit un objet avec les propriétés `iconKey` et `Icon` |
+ | selectedIconKey | chaîne | La clé de l'icône initialement sélectionnée |
+ | onClickOutside | fonction | Fonction de rappel déclenchée lorsque l'utilisateur clique en dehors du menu déroulant |
+ | onClose | fonction | Fonction de rappel déclenchée lorsque le menu déroulant est fermé |
+ | onOpen | fonction | Fonction de rappel déclenchée lorsque le menu déroulant est ouvert |
+ | variante | chaîne | La variante de style visuel de l'icône cliquable. Les options incluent : `primaire`, `secondaire` et `tertiaire` |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx
index c2246c6ee7..0ac0aae033 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/image-input.mdx
@@ -4,34 +4,31 @@ image: /images/user-guide/objects/objects.png
---
-
+
Permet aux utilisateurs de télécharger et de supprimer une image.
-
+
+ ```jsx
+ import { ImageInput } from "@/ui/input/components/ImageInput";
-```jsx
-import { ImageInput } from "@/ui/input/components/ImageInput";
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ------------- | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| photo | chaîne | L'URL source de l'image |
-| onUpload | fonction | La fonction appelée lors du téléchargement d'une nouvelle image par un utilisateur. Elle reçoit l'objet `File` comme paramètre. |
-| onRemove | fonction | La fonction appelée lorsque l'utilisateur clique sur le bouton supprimer. |
-| onAbort | fonction | La fonction appelée lorsque l'utilisateur clique sur le bouton annuler pendant le téléchargement de l'image. |
-| isUploading | booléen | Indique si une image est en cours de téléchargement. |
-| messageErreur | chaîne | Un message d'erreur facultatif à afficher sous l'entrée d'image. |
-| désactivé | booléen | Si `true`, l'entrée entière est désactivée et les boutons ne sont pas cliquables. |
-
-
+
+ | Propriétés | Type | Description |
+ | ------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------- |
+ | photo | chaîne | L'URL source de l'image |
+ | onUpload | fonction | La fonction appelée lors du téléchargement d'une nouvelle image par un utilisateur. Elle reçoit l'objet `File` comme paramètre. |
+ | onRemove | fonction | La fonction appelée lorsque l'utilisateur clique sur le bouton supprimer. |
+ | onAbort | fonction | La fonction appelée lorsque l'utilisateur clique sur le bouton annuler pendant le téléchargement de l'image. |
+ | isUploading | booléen | Indique si une image est en cours de téléchargement. |
+ | messageErreur | chaîne | Un message d'erreur facultatif à afficher sous l'entrée d'image. |
+ | désactivé | booléen | Si `true`, l'entrée entière est désactivée et les boutons ne sont pas cliquables. |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx b/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx
index d371a99153..f298f1112e 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/input/text.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/notes/notes_header.png
---
-
+
## Entrée de texte
@@ -12,59 +12,52 @@ image: /images/user-guide/notes/notes_header.png
Permet aux utilisateurs de saisir et de modifier du texte.
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { TextInput } from "@/ui/input/components/TextInput";
-
+ export const MyComponent = () => {
+ const handleChange = (text) => {
+ console.log("Changement d'entrée:", text);
+ };
-```jsx
-import { RecoilRoot } from "recoil";
-import { TextInput } from "@/ui/input/components/TextInput";
+ const handleKeyDown = (event) => {
+ console.log("Touche enfoncée:", event.key);
+ };
-export const MyComponent = () => {
- const handleChange = (text) => {
- console.log("Input changed:", text);
- };
+ return (
+
+
+
+ );
+ };
+ ```
+
- const handleKeyDown = (event) => {
- console.log("Key pressed:", event.key);
- };
-
- return (
-
-
-
- );
-};
-
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ----------------------- | -------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-| étiquette | chaîne | Représente l'étiquette de l'entrée |
-| onChange | fonction | La fonction appelée lorsque la valeur de l'entrée change |
-| largeurTotale | booléen | Indique si l'entrée doit occuper 100% de la largeur |
-| désactiverLesRaccourcis | booléen | Indique si les raccourcis sont activés pour l'entrée |
-| erreur | chaîne | Représente le message d'erreur à afficher. Lorsqu'il est fourni, il ajoute également une icône d'erreur sur le côté droit de l'entrée |
-| surToucheEnfoncée | fonction | Appelée lorsqu'une touche est enfoncée alors que le champ de saisie est focalisé. Reçoit un `React.KeyboardEvent` en tant qu'argument |
-| IcôneDroite | ComposantIcône | Un composant icône facultatif affiché sur le côté droit de l'entrée |
-
-Le composant accepte également d'autres propriétés d'éléments d'entrée HTML.
-
-
+
+ | Propriétés | Type | Description |
+ | ----------------------- | -------------- | ------------------------------------------------------------------------------------------------------------------------------------- |
+ | nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
+ | étiquette | chaîne | Représente l'étiquette de l'entrée |
+ | onChange | fonction | La fonction appelée lorsque la valeur de l'entrée change |
+ | largeurTotale | booléen | Indique si l'entrée doit occuper 100% de la largeur |
+ | désactiverLesRaccourcis | booléen | Indique si les raccourcis sont activés pour l'entrée |
+ | erreur | chaîne | Représente le message d'erreur à afficher. Lorsqu'il est fourni, il ajoute également une icône d'erreur sur le côté droit de l'entrée |
+ | surToucheEnfoncée | fonction | Appelée lorsqu'une touche est enfoncée alors que le champ de saisie est focalisé. Reçoit un `React.KeyboardEvent` en tant qu'argument |
+ | IcôneDroite | ComposantIcône | Un composant icône facultatif affiché sur le côté droit de l'entrée |
+ Le composant accepte également d'autres propriétés d'éléments d'entrée HTML.
+
## Entrée de texte à taille automatique
@@ -72,46 +65,40 @@ Le composant accepte également d'autres propriétés d'éléments d'entrée HTM
Composant d'entrée de texte qui ajuste automatiquement sa hauteur en fonction du contenu.
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
-
-
-```jsx
-import { RecoilRoot } from "recoil";
-import { AutosizeTextInput } from "@/ui/input/components/AutosizeTextInput";
-
-export const MyComponent = () => {
- return (
-
- console.log("onValidate function fired")}
- minRows={1}
- placeholder="Write a comment"
- onFocus={() => console.log("onFocus function fired")}
- variant="icon"
- buttonTitle
- value="Task: "
- />
-
- );
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| -------------- | -------- | -------------------------------------------------------------------------------------------------------------- |
-| surValider | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'utilisateur valide l'entrée |
-| minLignes | nombre | Le nombre minimum de lignes pour la zone de texte |
-| espace réservé | chaîne | Le texte d'espace réservé que vous souhaitez afficher lorsque la zone de texte est vide |
-| surFocus | fonction | La fonction de rappel que vous souhaitez déclencher lorsque la zone de texte prend le focus |
-| variante | chaîne | La variante de l'entrée. Les options incluent : `défaut`, `icône`, et `bouton` |
-| titreBouton | chaîne | Le titre pour le bouton (applicable uniquement à la variante bouton) |
-| valeur | chaîne | La valeur initiale pour la zone de texte |
-
-
+ export const MyComponent = () => {
+ return (
+
+ console.log("Fonction onValidate déclenchée")}
+ minRows={1}
+ placeholder="Écrivez un commentaire"
+ onFocus={() => console.log("Fonction onFocus déclenchée")}
+ variant="icon"
+ buttonTitle
+ value="Tâche: "
+ />
+
+ );
+ };
+ ```
+
+
+ | Propriétés | Type | Description |
+ | -------------- | -------- | ------------------------------------------------------------------------------------------- |
+ | surValider | fonction | La fonction de rappel que vous souhaitez déclencher lorsque l'utilisateur valide l'entrée |
+ | minLignes | nombre | Le nombre minimum de lignes pour la zone de texte |
+ | espace réservé | chaîne | Le texte d'espace réservé que vous souhaitez afficher lorsque la zone de texte est vide |
+ | surFocus | fonction | La fonction de rappel que vous souhaitez déclencher lorsque la zone de texte prend le focus |
+ | variante | chaîne | La variante de l'entrée. Les options incluent : `défaut`, `icône`, et `bouton` |
+ | titreBouton | chaîne | Le titre pour le bouton (applicable uniquement à la variante bouton) |
+ | valeur | chaîne | La valeur initiale pour la zone de texte |
+
## Zone de texte
@@ -119,35 +106,31 @@ export const MyComponent = () => {
Vous permet de créer des entrées de texte multiligne.
-
+
+ ```jsx
+ import { TextArea } from "@/ui/input/components/TextArea";
-```jsx
-import { TextArea } from "@/ui/input/components/TextArea";
+ export const MyComponent = () => {
+ return (
+
-export const MyComponent = () => {
- return (
-
-
-
-
-| Propriétés | Type | Description |
-| -------------- | -------- | --------------------------------------------------------------------------- |
-| désactivé | booléen | Indique si la zone de texte est désactivée |
-| minLignes | nombre | Nombre minimum de lignes visibles pour la zone de texte. |
-| onChange | fonction | Fonction de rappel déclenchée lorsque le contenu de la zone de texte change |
-| espace réservé | chaîne | Texte de l'espace réservé affiché lorsque la zone de texte est vide |
-| valeur | chaîne | La valeur actuelle de la zone de texte |
-
-
+
+ | Propriétés | Type | Description |
+ | -------------- | -------- | --------------------------------------------------------------------------- |
+ | désactivé | booléen | Indique si la zone de texte est désactivée |
+ | minLignes | nombre | Nombre minimum de lignes visibles pour la zone de texte. |
+ | surChangement | fonction | Fonction de rappel déclenchée lorsque le contenu de la zone de texte change |
+ | espace réservé | chaîne | Texte de l'espace réservé affiché lorsque la zone de texte est vide |
+ | valeur | chaîne | La valeur actuelle de la zone de texte |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx
index e1264f0997..f99e2bb5df 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx
index d0e67a1de2..b8acf63d8c 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/breadcrumb.mdx
@@ -4,41 +4,38 @@ image: /images/user-guide/fields/field.png
---
-
+
Affiche une barre de navigation en fil d'Ariane.
-
+
+ ```jsx
+ import { BrowserRouter } from "react-router-dom";
+ import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
-```jsx
-import { BrowserRouter } from "react-router-dom";
-import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
+ export const MyComponent = () => {
+ const breadcrumbLinks = [
+ { children: "Accueil", href: "/" },
+ { children: "Catégorie", href: "/category" },
+ { children: "Sous-catégorie", href: "/category/subcategory" },
+ { children: "Page Actuelle" },
+ ];
-export const MyComponent = () => {
- const breadcrumbLinks = [
- { children: "Home", href: "/" },
- { children: "Category", href: "/category" },
- { children: "Subcategory", href: "/category/subcategory" },
- { children: "Current Page" },
- ];
+ return (
+
+
+
+ )
+ };
+ ```
+
- return (
-
-
-
- )
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
-| nomDeClasse | chaîne | Nom de classe facultatif pour un style supplémentaire |
-| liens | tableau | Un tableau d'objets, chacun représentant un lien de fil d'Ariane. Chaque objet a une propriété `children` (le contenu textuel du lien) et une propriété `href` facultative (l'URL vers laquelle naviguer lorsque le lien est cliqué) |
-
-
+
+ | Propriétés | Type | Description |
+ | ----------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+ | nomDeClasse | chaîne | Nom de classe facultatif pour un style supplémentaire |
+ | liens | tableau | Un tableau d'objets, chacun représentant un lien de fil d'Ariane. Chaque objet a une propriété `children` (le contenu textuel du lien) et une propriété `href` facultative (l'URL vers laquelle naviguer lorsque le lien est cliqué) |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx
index ef6c6b2ae8..af019d075a 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/links.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
## Lien de contact
@@ -12,44 +12,40 @@ image: /images/user-guide/what-is-twenty/20.png
Un composant de lien stylisé pour afficher les informations de contact.
-
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
+ import { ContactLink } from 'twenty-ui/navigation';
-import { ContactLink } from 'twenty-ui/navigation';
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('Lien de contact cliqué!', event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | ----------------- | -------------------------------------------------------- |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-| href | chaîne | L'URL cible ou le chemin du lien |
-| onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
-| enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
-
-
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
+ ```
+
+
+ | Propriétés | Type | Description |
+ | ----------- | ----------------- | -------------------------------------------------------- |
+ | nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
+ | href | chaîne | L'URL cible ou le chemin du lien |
+ | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
+ | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
+
## Lien brut
@@ -57,39 +53,35 @@ export const MyComponent = () => {
Un composant de lien stylisé pour afficher les liens.
-
+
+ ```jsx
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Lien de contact cliqué!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contactez-nous
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | ----------------- | -------------------------------------------------------- |
-| nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
-| href | chaîne | L'URL cible ou le chemin du lien |
-| auClique | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
-| enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
-
-
+
+ | Propriétés | Type | Description |
+ | ----------- | ----------------- | -------------------------------------------------------- |
+ | nomDeClasse | chaîne | Nom facultatif pour un style supplémentaire |
+ | href | chaîne | L'URL cible ou le chemin du lien |
+ | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
+ | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
+
## Lien arrondi
@@ -97,38 +89,34 @@ export const MyComponent = () => {
Un lien de style arrondi avec un composant Chip pour les liens.
-
+
+ ```jsx
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Lien de contact cliqué!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contactez-nous
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ---------- | ----------------- | -------------------------------------------------------- |
-| href | chaîne | L'URL cible ou le chemin du lien |
-| enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
-| auClique | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
-
-
+
+ | Propriétés | Type | Description |
+ | ---------- | ----------------- | -------------------------------------------------------- |
+ | href | chaîne | L'URL cible ou le chemin du lien |
+ | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
+ | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
+
## Lien social
@@ -136,33 +124,30 @@ export const MyComponent = () => {
Liens sociaux stylisés, avec support pour différents types de liens sociaux, tels que les URL, LinkedIn, et X (ou Twitter).
-
+
+ ```jsx
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| Propriétés | Type | Description |
-| ---------- | ----------------- | --------------------------------------------------------------------------------------------------------------- |
-| href | chaîne | L'URL cible ou le chemin du lien |
-| enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
-| type | chaîne | Le type de liens sociaux. Les options incluent: `url`, `LinkedIn`, et `Twitter` |
-| auClique | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
-
-
+
+ | Propriétés | Type | Description |
+ | ---------- | ----------------- | ------------------------------------------------------------------------------- |
+ | href | chaîne | L'URL cible ou le chemin du lien |
+ | enfants | `React.ReactNode` | Le contenu à afficher à l'intérieur du lien |
+ | type | chaîne | Le type de liens sociaux. Les options incluent: `url`, `LinkedIn`, et `Twitter` |
+ | onClick | fonction | Fonction de rappel à déclencher lors du clic sur le lien |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx
index 5dd2e965f5..41bb17dedb 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/navigation/step-bar.mdx
@@ -4,35 +4,31 @@ image: /images/user-guide/api/api.png
---
-
+
Affiche la progression à travers une séquence d'étapes numérotées en surlignant l'étape active. Il affiche un conteneur avec des étapes, chacune représentée par le composant `Step`.
-
+
+ ```jsx
+ import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
-```jsx
-import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
+ export const MyComponent = () => {
+ return (
+
+ Étape 1
+ Étape 2
+ Étape 3
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
- Step 1
- Step 2
- Step 3
-
- );
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description |
-| ----------- | ------ | ------------------------------------------------------------------------------------------------------------------------- |
-| étapeActive | nombre | L'index de l'étape actuellement active. Cela détermine quelle étape doit être visuellement mise en valeur |
-
-
+
+ | Propriétés | Type | Description |
+ | ----------- | ------ | --------------------------------------------------------------------------------------------------------- |
+ | étapeActive | nombre | L'index de l'étape actuellement active. Cela détermine quelle étape doit être visuellement mise en valeur |
+
diff --git a/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx
index f2d043bd63..2f9f866831 100644
--- a/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx
+++ b/packages/twenty-docs/l/fr/twenty-ui/progress-bar.mdx
@@ -4,46 +4,41 @@ image: /images/user-guide/emails/emails_header.png
---
-
+
Indique le progrès ou le compte à rebours et passe de droite à gauche.
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
-```jsx
-import { ProgressBar } from "twenty-ui/feedback";
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description | Par défaut |
-| -------------------- | ------- | --------------------------------------------------------------------------------------------------------- | ---------- |
-| durée | nombre | La durée totale de l'animation de la barre de progression en millisecondes | 3 |
-| délai | nombre | Le délai de démarrage de l'animation de la barre de progression en millisecondes | 0 |
-| adoucissement | chaîne | Fonction d'adoucissement pour l'animation de la barre de progression | easeInOut |
-| hauteurBarre | nombre | La hauteur de la barre en pixels | 24 |
-| couleurBarre | chaîne | La couleur de la barre | gray80 |
-| démarrageAutomatique | booléen | Si `true`, l'animation de la barre de progression commence automatiquement lorsque le composant est monté | `vrai` |
-
-
+
+ | Propriétés | Type | Description | Par défaut |
+ | -------------------- | ------- | --------------------------------------------------------------------------------------------------------- | ---------- |
+ | durée | nombre | La durée totale de l'animation de la barre de progression en millisecondes | 3 |
+ | délai | nombre | Le délai de démarrage de l'animation de la barre de progression en millisecondes | 0 |
+ | adoucissement | chaîne | Fonction d'adoucissement pour l'animation de la barre de progression | easeInOut |
+ | hauteurBarre | nombre | La hauteur de la barre en pixels | 24 |
+ | couleurBarre | chaîne | La couleur de la barre | gray80 |
+ | démarrageAutomatique | booléen | Si `true`, l'animation de la barre de progression commence automatiquement lorsque le composant est monté | `vrai` |
+
## Barre de Progression Circulaire
@@ -51,27 +46,21 @@ export const MyComponent = () => {
Indique le progrès d'une tâche, souvent utilisé sur des écrans de chargement ou dans des zones où vous souhaitez communiquer des processus en cours à l'utilisateur.
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-
-```jsx
-import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| Propriétés | Type | Description | Par défaut |
-| ------------ | ------ | ------------------------------------------------- | --------------- |
-| taille | nombre | La taille de la barre de progression circulaire | 50 |
-| largeurBarre | nombre | La largeur de la ligne de la barre de progression | 5 |
-| couleurBarre | chaîne | La couleur de la barre de progression | couleurCourante |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Propriétés | Type | Description | Par défaut |
+ | ------------ | ------ | ------------------------------------------------- | --------------- |
+ | taille | nombre | La taille de la barre de progression circulaire | 50 |
+ | largeurBarre | nombre | La largeur de la ligne de la barre de progression | 5 |
+ | couleurBarre | chaîne | La couleur de la barre de progression | couleurCourante |
+
diff --git a/packages/twenty-docs/l/fr/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/permissions-access-control.mdx
new file mode 100644
index 0000000000..fc8db7cc80
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -0,0 +1,35 @@
+---
+title: Autorisations et contrôle d’accès
+description: Contrôlez ce à quoi les agents IA peuvent accéder et ce qu’ils peuvent modifier dans votre espace de travail.
+---
+
+## Vue d'ensemble
+
+Les agents IA respectent votre structure d’autorisations existante. C’est particulièrement important pour les équipes qui veulent contrôler précisément à quoi les processus d’IA automatisés peuvent accéder ou ce qu’ils peuvent modifier dans leur espace de travail.
+
+## Attribuer un Rôle à un Agent IA
+
+1. Allez dans **Paramètres → Rôles**
+2. Cliquez sur le rôle que vous souhaitez attribuer
+3. Ouvrez l'onglet **Attribution**
+4. Sous **Agents IA**, cliquez sur **+ Attribuer à un agent IA**
+5. Sélectionnez l’agent IA dans la liste
+6. Confirmez l'attribution
+
+## Pourquoi Attribuer des Rôles aux Agents IA ?
+
+| Avantage | Description |
+| ---------------- | --------------------------------------------------------------------------------------- |
+| **Sécurité** | Limitez les données auxquelles les agents IA peuvent accéder ou qu’ils peuvent modifier |
+| **Conformité** | Garantissez que l’IA ne traite que les données dont elle a besoin |
+| **Contrôle** | Empêchez les actions involontaires des automatisations d’IA |
+| **Auditabilité** | Suivez quelles actions ont été effectuées par chaque agent |
+
+
+ Pour les agents IA s’exécutant au sein de flux de travail, l’attribution d’un rôle garantit que l’agent ne peut pas accéder ni modifier des données en dehors de sa portée prévue—même si le flux de travail dispose d’autorisations plus étendues.
+
+
+## Contenu connexe
+
+* [Autorisations](/l/fr/user-guide/permissions-access/capabilities/permissions) — informations détaillées sur la création et la gestion des rôles
+* [Agents IA](/l/fr/user-guide/ai/capabilities/ai-agents) — fonctionnalités d’IA dans les flux de travail
diff --git a/packages/twenty-docs/l/fr/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/fr/user-guide/billing/capabilities/pricing-plans.mdx
new file mode 100644
index 0000000000..b762a884cf
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/billing/capabilities/pricing-plans.mdx
@@ -0,0 +1,79 @@
+---
+title: Formules tarifaires},{
+description: En savoir plus sur les formules tarifaires de Twenty et comment passer de l’une à l’autre.
+---
+
+## Vue d'ensemble
+
+Twenty propose une tarification flexible adaptée aux équipes de toute taille, que vous préfériez l’hébergement cloud ou l’auto-hébergement.
+
+## Formules Cloud
+
+### Pro (Cloud)
+
+Pour les équipes prêtes à passer à l’échelle :
+
+* Toutes les fonctionnalités CRM essentielles
+* Synchronisation des e-mails et du calendrier
+* Workflows et automatisations
+* Support standard
+
+
+ Les fonctionnalités premium (SSO et autorisations au niveau des lignes) ne sont pas incluses dans la formule Pro.
+
+
+### Organisation (Cloud)
+
+Pour les équipes plus importantes ayant des besoins avancés :
+
+* Tout ce qui est inclus dans Pro
+* **Fonctionnalités premium** : intégration SSO et autorisations au niveau des lignes
+* Support prioritaire
+
+## Formules auto-hébergées
+
+### Gratuit (Auto-hébergé)
+
+Hébergez Twenty sur votre propre infrastructure, sans frais :
+
+* Toutes les fonctionnalités Pro incluses
+* Support communautaire via Discord
+* Contrôle total sur vos données
+
+### Organisation (Auto-hébergé)
+
+Pour les équipes qui ont besoin de fonctionnalités premium tout en s’auto-hébergeant :
+
+* Toutes les fonctionnalités Pro
+* **Fonctionnalités premium** : intégration SSO et autorisations au niveau des lignes
+* Assistance de l’équipe Twenty
+* Aucune obligation de publier le code personnalisé en open source avant de le distribuer
+
+## Fonctionnalités premium
+
+Les fonctionnalités premium ne sont disponibles que sur les formules Organisation (Cloud ou auto-hébergé) :
+
+* **Intégration SSO** : authentification unique avec votre fournisseur d’identité
+* **Autorisations au niveau des lignes** : contrôle d’accès granulaire au niveau de l’enregistrement
+
+## Changer de formule
+
+### Passer à l’Organisation
+
+1. Allez dans **Paramètres → Facturation**
+2. Cliquez sur **Passer à l’Organisation**
+3. Confirmez la mise à niveau
+
+### Rétrograder vers Pro
+
+Contactez l’assistance pour rétrograder votre formule.
+
+### Passer à la facturation annuelle
+
+1. Allez dans **Paramètres → Facturation**
+2. Cliquez sur **Passer à l’annuel**
+3. Économisez avec la facturation annuelle
+
+### Passer à la facturation mensuelle
+
+Contactez l’assistance pour revenir à la facturation mensuelle.
diff --git a/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
new file mode 100644
index 0000000000..e27785337f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -0,0 +1,52 @@
+---
+title: Limiter les e-mails importés.
+description: Contrôlez quels e-mails sont importés dans Twenty.
+---
+
+## Vue d'ensemble
+
+Par défaut, Twenty synchronise tous les e-mails externes depuis votre boîte aux lettres connectée. Vous pouvez limiter ce qui est importé à l’aide de la **sélection de dossiers** et des **paramètres de visibilité**.
+
+## Méthode 1 : Sélection de dossiers (recommandée)
+
+Contrôlez quels dossiers e-mail sont synchronisés avec Twenty :
+
+1. Allez dans **Paramètres → Versions → Lab**
+2. Activez **Dossier de messages**
+3. Retournez à **Paramètres → Comptes**
+4. Sélectionnez votre compte e-mail connecté
+5. Choisissez quels dossiers synchroniser :
+
+| Dossier | Description |
+| -------------------------- | -------------------------------------------- |
+| **Boîte de réception** | E-mails entrants principaux |
+| **Envoyé** | E-mails sortants que vous avez envoyés |
+| **Archive** | Messages archivés |
+| **Dossiers personnalisés** | Tous les dossiers spécifiques de votre choix |
+
+6. Excluez les dossiers que vous ne voulez pas synchroniser (Spam, Corbeille, dossiers personnels)
+
+Cela vous donne un contrôle précis sur les e-mails qui apparaissent dans votre CRM sans tout synchroniser.
+
+## Méthode 2 : Paramètres de création automatique de contacts
+
+Contrôlez à quel moment les contacts sont créés à partir des e-mails :
+
+1. Allez dans **Paramètres → Comptes**
+2. Sélectionnez votre boîte aux lettres connectée
+3. Choisissez une option :
+ * **Désactivé** : Aucun contact n’est créé, mais les e-mails sont tout de même synchronisés avec les contacts existants.
+ * **Envoyés et reçus** : Créer des contacts à partir de tous les e-mails externes
+ * **Envoyés uniquement** : Créer des contacts uniquement à partir des e-mails que vous envoyez
+
+## Ce qui est toujours exclu
+
+Ces e-mails ne sont jamais synchronisés, quels que soient les paramètres :
+
+* **E-mails internes** : Messages entre collègues (même domaine)
+* **E-mails de groupe** : Listes de distribution et messages de groupe
+* **Spam/Corbeille** : Les dossiers système sont généralement exclus
+
+## Note importante
+
+Nous ne fournissons pas d’adresse e-mail en CC pour une synchronisation sélective. Utilisez la fonctionnalité de sélection de dossiers ci-dessus pour obtenir le même niveau de contrôle.
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/file-formats.mdx
new file mode 100644
index 0000000000..d1ab1ee203
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/capabilities/file-formats.mdx
@@ -0,0 +1,48 @@
+---
+title: Formats de fichiers pris en charge
+description: Formats de fichiers pris en charge pour l’importation de données dans Twenty.
+---
+
+## Formats pris en charge
+
+Twenty prend en charge trois formats de fichiers pour l’importation :
+
+| Format | Extension | Notes |
+| ------------------ | --------- | ------------------------------ |
+| **CSV** | .csv | Recommandé, le plus compatible |
+| **Excel** | .xlsx | Format Excel moderne |
+| **Excel (hérité)** | .xls | Ancien format Excel |
+
+## Exigences relatives aux fichiers
+
+| Exigence | Valeur |
+| ---------------------------- | -------------------------------------------------------- |
+| **Encodage** | UTF-8 recommandé |
+| **Limite d’enregistrements** | 10 000 enregistrements par fichier |
+| **Structure** | La première ligne doit contenir les en-têtes de colonnes |
+| **Contenu** | Un seul type d’objet par fichier |
+
+## Meilleures pratiques pour les fichiers CSV
+
+* **Délimiteur** : Utilisez une virgule (`,`) ou un point-virgule (`;`)
+* **Délimiteur de texte** : Utilisez des guillemets doubles (`\"`) pour le texte contenant des virgules
+* **Fins de ligne** : Windows (CRLF) ou Unix (LF) sont tous deux pris en charge
+* **Valeurs vides** : Laissez les cellules vides, n’utilisez pas "NULL" ni "N/A"
+
+## Meilleures pratiques pour Excel
+
+Lors de l’exportation depuis Excel :
+
+* Supprimez les formules (exportez uniquement les valeurs)
+* Supprimez les lignes vides à la fin
+* Assurez-vous qu’aucune cellule n’est fusionnée
+* Utilisez uniquement la première feuille
+
+## Jeux de données volumineux
+
+Pour les jeux de données de plus de 10 000 enregistrements :
+
+* Divisez en plusieurs fichiers
+* Ou utilisez l’[importation via l’API](/l/fr/user-guide/data-migration/how-tos/import-data-via-api) pour un nombre illimité d’enregistrements
+
+Pour des migrations très volumineuses (plus de 100 000 enregistrements), l’API est nettement plus rapide et plus fiable que les importations CSV.
diff --git a/packages/twenty-docs/l/fr/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/fr/user-guide/data-migration/overview.mdx
new file mode 100644
index 0000000000..851f8eb428
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-migration/overview.mdx
@@ -0,0 +1,89 @@
+---
+title: Migration de données},{
+description: Importez et exportez vos données CRM via des fichiers CSV ou l’API.
+image: /images/user-guide/import-export-data/cloud.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Méthodes d’import
+
+Twenty prend en charge deux méthodes principales d’import de données :
+
+| Méthode | Idéal pour | Limite de volume |
+| ----------------------- | -------------------------------------------- | ---------------------------------- |
+| **Importation CSV** | Migrations standard, mises à jour régulières | 10 000 enregistrements par fichier |
+| **Importation via API** | Migrations à grande échelle, automatisation | Illimité |
+
+Pour des ensembles de données très volumineux (des centaines de milliers d’enregistrements), utilisez l’API. Nos [partenaires d’implémentation](/l/fr/user-guide/getting-started/capabilities/implementation-services) peuvent vous aider à exécuter ces scripts si nécessaire.
+
+## Principes de base de l’import CSV
+
+Vous pouvez importer des données pour n’importe quel objet à l’aide de fichiers CSV, XLSX ou XLS. Chaque fichier doit contenir **un seul type d’objet** (par exemple, uniquement des enregistrements Personnes).
+
+**Les champs doivent exister avant l’import.** Le téléversement d’un CSV crée des enregistrements, mais ne crée pas de champs. Si vous avez besoin de champs personnalisés, créez-les d’abord dans **Paramètres → Modèle de données**.
+
+### Étapes
+
+1. Accédez à l’objet dans lequel vous souhaitez importer des données
+2. Cliquez sur l’icône **⋮** en haut à droite (le menu Commande), puis cliquez sur **Importer des enregistrements**
+3. Téléchargez le fichier modèle pour garantir que vos données sont au format attendu
+4. Téléversez votre fichier CSV formaté
+5. Faites correspondre vos colonnes aux champs Twenty
+6. Passez en revue les erreurs (surlignées en jaune) et corrigez-les en les modifiant directement dans l’interface
+7. Confirmez l’importation
+
+### Importer des relations entre objets
+
+Vous pouvez importer des relations entre objets à l’aide de la fonction d’import CSV. Vous devez référencer l’objet lié en utilisant un champ unique de cet objet : l’`id`, l’`email` pour les Personnes et les membres de l’espace de travail, le `domain` pour les entreprises, tout autre champ défini comme unique dans le modèle de données pour tout autre objet.
+
+**Les enregistrements supprimés comptent pour l’unicité.** Les enregistrements supprimés de façon logique (visibles dans le menu Commande → Voir les enregistrements supprimés) sont inclus dans les vérifications d’unicité. Si vous importez un enregistrement ayant la même valeur unique qu’un enregistrement supprimé, l’enregistrement supprimé sera restauré.
+
+
+ **L’ordre d’importation est important !**
+
+ Lors de l’import d’objets liés, téléversez les fichiers dans cet ordre :
+
+ 1. **Entreprises** d’abord (le côté "un" des relations)
+ 2. **Personnes** en second (liées aux entreprises via companyId)
+ 3. **Opportunités** en troisième (liées aux entreprises/personnes)
+ 4. **Objets personnalisés** avec relations en dernier
+
+ Pourquoi ? Le côté "un" d’une relation un-à-plusieurs doit exister avant que vous puissiez y faire référence. Par exemple, l’enregistrement Entreprise doit exister avant d’importer une Personne avec l’ID de cette entreprise.
+
+
+Veuillez consulter [cet article](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) pour un guide étape par étape sur la procédure à suivre.
+
+## Exporter des données
+
+Exportez les données de votre espace de travail pour des sauvegardes, des rapports ou des migrations.
+
+### Étapes
+
+1. Accédez à l’objet que vous souhaitez exporter
+2. Configurez la vue avec les colonnes dont vous avez besoin
+3. Cliquez sur **⋮** → **Exporter la vue**
+4. Enregistrez le fichier CSV
+
+**Seules les colonnes visibles sont exportées.** Le fichier CSV ne contiendra que les colonnes affichées dans votre vue actuelle. Ajoutez ou masquez des colonnes avant l’exportation pour contrôler les données incluses.
+
+**Limites d’exportation** : jusqu’à 20 000 enregistrements par export.
+
+## Autorisations
+
+L’import et l’export de données nécessitent des autorisations spécifiques :
+
+* **Importation** : nécessite l’autorisation "Import CSV"
+* **Exportation** : nécessite l’autorisation "Export CSV"
+
+Contactez l’administrateur de votre espace de travail si vous n’avez pas ces autorisations.
+
+## Prochaines étapes
+
+* [Préparez vos fichiers CSV](/l/fr/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Importer des relations entre objets](/l/fr/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Importer via API pour de grands ensembles de données](/l/fr/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/fields.mdx
new file mode 100644
index 0000000000..e4885faef2
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/capabilities/fields.mdx
@@ -0,0 +1,122 @@
+---
+title: Champs
+description: Comprendre le rôle des champs et comment les gérer.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## À propos des Champs
+
+Les champs sont comme les colonnes d'une feuille de calcul. Ils stockent différents types de données comme du texte, des chiffres ou des dates. Les champs peuvent être standard (intégrés) ou personnalisés (ceux que vous créez).
+
+### Champs Standards
+
+Les champs standard sont intégrés à Twenty pour répondre aux besoins professionnels courants.
+
+Par exemple, `Prénom` et `Nom de famille` sont des champs standards dans l'objet `Personnes`. Ils stockent des données textuelles pour les noms individuels.
+
+Vous ne pouvez pas supprimer les champs standard, mais vous pouvez les désactiver si vous n'en avez pas besoin.
+
+Vous pouvez également personnaliser les options des champs standard de type `SELECT`, par exemple les options pour l’`Étape` des Opportunités.
+
+
+
+### Champs Personnalisés
+
+Les champs personnalisés peuvent être ajoutés à n'importe quel objet. Vous pouvez stocker du texte, des chiffres, des dates, des sélections déroulantes, et plus encore. Utilisez les champs personnalisés pour suivre des informations spécifiques à votre entreprise.
+
+Par exemple, un champ personnalisé pour SpaceX pourrait être `Statut Actif de la Fusée`, indiquant si une fusée est opérationnelle.
+
+
+
+## Types de champs
+
+Twenty prend en charge divers types de champs :
+
+| Type | Description | Exemple |
+| ------------------ | ----------------------------------------------------------- | -------------------------- |
+| Adresse | Adresse structurée avec rue, ville, état, pays, code postal | Adresse du bureau |
+| Tableau | Liste de valeurs textuelles | Étiquettes |
+| Booléen | Case à cocher vrai/faux | Actif |
+| Devise | Valeur monétaire avec code de devise | Montant de l’affaire (USD) |
+| Date | Valeurs de date | Date de clôture |
+| Date et heure | Date avec heure | Heure de réunion |
+| Domaine | Domaine de site web (utilisé pour les Entreprises) | acme.com |
+| E-mail | Adresses e-mail (principale + supplémentaires) | Adresse e-mail du contact |
+| JSON | Données JSON structurées | Métadonnées personnalisées |
+| Liens | URL avec libellés (primaire + secondaire) | Site web, LinkedIn |
+| Texte long | Texte sur plusieurs lignes | Description, Notes |
+| Sélection multiple | Choix multiples à partir d’une liste prédéfinie | Étiquettes, Catégories |
+| Nombre | Valeurs numériques (entières ou décimales) | Quantité, Score |
+| Téléphone | Numéros de téléphone avec indicatif du pays | Téléphone professionnel |
+| Note | Notation par étoiles (1-5) | Priorité, Score |
+| Relation | Liens vers des enregistrements dans d’autres objets | Entreprise → Personnes |
+| Sélection | Choix unique à partir d’une liste prédéfinie | Étape, Statut |
+| Texte | Texte sur une seule ligne | Nom, Titre |
+
+## Créer un Champ Personnalisé
+
+Pour ajouter un champ personnalisé à n'importe quel objet, suivez ces étapes:
+
+1. Allez dans les `Paramètres` dans la barre latérale gauche.
+2. Allez dans le `Modèle de Données`, puis sélectionnez l'objet que vous souhaitez personnaliser.
+3. Continuez en cliquant sur `Ajouter un champ`.
+4. Choisissez un nom de champ et un type qui répondent à vos exigences. Envisagez d'ajouter une description du champ pour une meilleure compréhension.
+
+Votre nouveau champ est maintenant disponible dans les champs de l'application. Pour l'afficher sur une vue spécifique, cliquez sur le menu des options, puis sélectionnez `Champs`.
+
+
+
+**Méthode rapide:** Cliquez sur le bouton **+** en haut à droite de tout tableau d'objet, puis sélectionnez `Personnaliser les champs`. Cela vous amène directement aux paramètres du Modèle de Données.
+
+
+
+## Désactiver un champ
+
+Vous pouvez désactiver un champ pour le masquer dans l'application sans perdre vos données. Considérez cela comme masquer le champ plutôt que de le supprimer.
+
+Voici comment vous pouvez le faire:
+
+1. Trouvez le champ que vous voulez désactiver dans vos paramètres d'objet.
+
+2. Cliquez sur les trois points `⋮` à côté du champ pour ouvrir le menu.
+
+3. Sélectionnez `Désactiver` dans le menu déroulant.
+
+
+
+Que se passe-t-il lorsque vous désactivez un champ?
+
+1. **Dans l'application :** Le champ disparaît et vous ne pouvez plus ajouter de nouvelles valeurs.
+
+2. **Relations existantes :** S'il s'agit d'un champ de relation, les connexions existantes restent mais vous ne pouvez pas en créer de nouvelles.
+
+3. **Accès API :** Vous pouvez toujours accéder au champ et à ses données par l'API.
+
+Vous pouvez réactiver les champs standards et personnalisés ou avoir l'option de les supprimer définitivement.
+
+## Rendre les Champs Uniques
+
+Rendez un champ unique pour garantir que des enregistrements distincts ne peuvent pas avoir la même valeur. Par exemple, les adresses e-mail sont uniques pour chaque personne.
+
+Si vous obtenez une erreur lors de la définition de l'unicité, vérifiez les valeurs en double dans vos données (y compris les enregistrements supprimés).
+
+## Bonnes pratiques de configuration des champs
+
+### Conventions de nommage et limitations
+
+* **Les noms au singulier et au pluriel doivent être distincts** : Notre API GraphQL nécessite des noms distincts pour les mutations
+* **Noms de champs protégés** : certains noms sont réservés à l’usage du système (par exemple, `Type`, `Application`)
+
+### Champs de devise et de téléphone
+
+* **Devise par défaut** : peut être configurée via le modèle de données
+* **Codes de pays par défaut** : peuvent être configurés pour les champs téléphoniques via le modèle de données
+
+### Champs de sélection
+
+* **Une option par défaut peut être sélectionnée** pour chaque champ de sélection
+
+### Champs de texte d'enregistrement
+
+* **Chaque objet a un champ d'affichage principal**: Ce champ apparaît dans la colonne la plus à gauche et représente l'enregistrement lorsqu'il est lié à d'autres objets. Il doit s'agir d'un champ de texte. Par exemple, le champ `Nom` est utilisé pour les Personnes comme champ principal, donc lorsque vous liez une personne à une entreprise, vous verrez son nom dans la vue de l'entreprise.
diff --git a/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/customize-your-data-model.mdx b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/customize-your-data-model.mdx
new file mode 100644
index 0000000000..92cc7769be
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/data-model/how-tos/customize-your-data-model.mdx
@@ -0,0 +1,22 @@
+---
+title: Personnalisez votre modèle de données},{
+description: Vue d’ensemble des options de personnalisation du modèle de données.
+---
+
+Le modèle de données de Twenty est entièrement personnalisable. Créez des objets, des champs et des relations adaptés à votre entreprise.
+
+## Liens rapides
+
+| Je souhaite... | Guide |
+| ----------------------------- | ---------------------------------------------------------------------------------------------- |
+| Créer un nouvel objet | [Comment créer des objets personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-objects) |
+| Ajouter des champs à un objet | [Comment créer des champs personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-fields) |
+| Relier des objets entre eux | [Comment créer des champs de relation](/l/fr/user-guide/data-model/how-tos/create-relation-fields) |
+
+## En savoir plus
+
+* [Comprendre votre modèle de données](/l/fr/user-guide/data-model/overview) — concepts clés et conseils de planification
+* [Objets](/l/fr/user-guide/data-model/capabilities/objects) — objets standard et personnalisés
+* [Champs](/l/fr/user-guide/data-model/capabilities/fields) — tous les types de champs
+* [Champs de relation](/l/fr/user-guide/data-model/capabilities/relation-fields) — relier des objets
+* [FAQ sur le modèle de données](/l/fr/user-guide/data-model/how-tos/data-model-faq) — questions fréquentes
diff --git a/packages/twenty-docs/l/fr/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/fr/user-guide/permissions-access/overview.mdx
new file mode 100644
index 0000000000..313b9de765
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/permissions-access/overview.mdx
@@ -0,0 +1,40 @@
+---
+title: Autorisations et accès
+description: Gérez les rôles, les autorisations et le contrôle d’accès dans votre espace de travail.
+---
+
+
+
+
+
+Le système d’autorisations de Twenty vous permet de contrôler qui peut accéder aux données de votre espace de travail et les modifier. Créez des rôles, attribuez des autorisations et configurez l’authentification unique (SSO) pour un accès sécurisé.
+
+## Contenu de cette section
+
+
+
+ Créez des rôles et configurez les autorisations sur les objets, les champs et les paramètres.
+
+
+
+ Configurez l’authentification unique avec votre fournisseur d’identité.
+
+
+
+ Questions fréquentes sur les rôles, les autorisations et l’authentification unique (SSO).
+
+
+
+## Fonctionnalités clés
+
+* **Accès basé sur les rôles** : Créez des rôles personnalisés avec des autorisations spécifiques
+* **Autorisations sur les objets** : Contrôlez qui peut afficher, modifier ou supprimer des enregistrements
+* **Autorisations sur les champs** : Restreignez l’accès aux champs sensibles
+* **Autorisations sur les paramètres** : Contrôlez l’accès à la configuration de l’espace de travail
+* **Intégration SSO** : Configurez l’authentification unique pour la sécurité d’entreprise (plan Organization)
+
+## Liens rapides
+
+* [Créer un rôle](/l/fr/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configurer le SSO](/l/fr/user-guide/permissions-access/capabilities/sso-configuration)
+* [Gérer les membres de l’équipe](/l/fr/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
new file mode 100644
index 0000000000..f19d50894f
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/restrict-access-to-your-view.mdx
@@ -0,0 +1,32 @@
+---
+title: Restreindre l’accès à votre vue},{
+description: Contrôlez qui peut voir vos vues personnalisées.
+---
+
+Chaque vue (sauf les vues par défaut "All [Object Name]") possède son propre paramètre de visibilité.
+
+## Étapes
+
+1. Ouvrez la vue que vous souhaitez restreindre
+2. Cliquez sur **Options** en haut à droite
+3. Cliquez sur **Visibilité**
+4. Sélectionnez **Non répertorié**
+
+Votre vue est désormais visible uniquement par vous.
+
+## Options de visibilité
+
+| Paramètre | Qui peut voir |
+| --------------------- | --------------------------------------- |
+| **Espace de travail** | Tous les membres de l’espace de travail |
+| **Non répertorié** | Vous uniquement |
+
+## Notes
+
+* Les vues par défaut "All [Object Name]" ne peuvent pas être rendues non répertoriées
+* Les vues non répertoriées n’apparaissent pas dans les menus déroulants de vues des autres utilisateurs
+* Vous pouvez à tout moment rétablir la visibilité sur l’espace de travail
+
+## Articles connexes
+
+* [Paramètres des vues](/l/fr/user-guide/views-pipelines/capabilities/view-settings) — toutes les options de configuration des vues
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
new file mode 100644
index 0000000000..1c956dfc1c
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -0,0 +1,149 @@
+---
+title: Afficher le Montant attendu dans votre pipeline},{
+description: Calculez et affichez les valeurs d'affaire pondérées en fonction de la probabilité de l'étape.
+---
+
+Le Montant attendu est une valeur calculée : **Montant × Probabilité**. Cela vous aide à prévoir les revenus en pondérant les affaires selon leur probabilité de conclusion.
+
+
+ Ceci est un exemple de création de [Champs de formule](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) à l'aide de workflows.
+
+
+Ce guide vous explique comment configurer les champs personnalisés et les workflows nécessaires pour calculer et afficher les montants attendus dans votre pipeline.
+
+## Étape 1 : Créer des champs personnalisés
+
+Vous avez besoin de deux champs personnalisés sur l'objet Opportunités.
+
+### Créer le champ Probabilité
+
+1. Allez dans **Paramètres → Modèle de données → Opportunités**
+2. Cliquez sur **+ Ajouter un champ**
+3. Configurer:
+ * **Nom** : Probabilité
+ * **Type** : Nombre
+ * **Description** : Probabilité selon l'étape (0–100 %)
+4. Cliquez sur **Enregistrer**
+
+### Créer le champ Montant attendu
+
+1. Cliquez sur **+ Ajouter un champ**
+2. Configurer:
+ * **Nom** : Montant attendu
+ * **Type** : Devise
+ * **Description** : Calculé : Montant × Probabilité
+3. Cliquez sur **Enregistrer**
+
+### Facultatif : rendre les champs en lecture seule pour les utilisateurs
+
+Si vous ne souhaitez pas que les utilisateurs modifient manuellement ces champs calculés :
+
+1. Allez dans **Paramètres → Rôles**
+2. Sélectionnez le rôle à configurer
+3. Recherchez l'objet Opportunités
+4. Définissez les champs **Probabilité** et **Montant attendu** en lecture seule
+
+Cela garantit que seuls les workflows peuvent mettre à jour ces valeurs.
+
+## Étape 2 : Créer le workflow n° 1 — Mettre à jour la probabilité lors d'un changement d'étape
+
+Ce workflow définit automatiquement la Probabilité lorsqu'une opportunité passe à une nouvelle étape.
+
+### Créer le workflow
+
+1. Allez dans **Workflows**
+2. Cliquez sur **+ Nouveau workflow**
+3. Nommez-le "Mettre à jour la probabilité lors d'un changement d'étape"
+
+### Configurer le déclencheur
+
+1. Ajoutez un déclencheur **Enregistrement créé ou mis à jour**
+2. Sélectionnez **Opportunités** comme objet
+3. Filtrer sur : le champ **Étape** est mis à jour
+
+### Ajouter des branches pour chaque étape
+
+Créez une branche pour chaque étape avec sa probabilité :
+
+| Étape | Probabilité |
+| ------------- | ----------- |
+| Nouveau | 10 % |
+| Qualifié | 25 % |
+| Réunion | 40 % |
+| Proposition | 60 % |
+| Négociation | 80 % |
+| Fermée gagnée | 100 % |
+| Fermée perdue | 0% |
+
+
+ Pour créer une nouvelle branche, cliquez avec le bouton droit sur la zone de travail du workflow et cliquez sur **Nouvelle action**. Puis, reliez cette action au nœud précédent en faisant glisser la flèche du nœud précédent vers cette nouvelle action.
+
+
+Pour chaque étape :
+
+1. Ajoutez un nœud **Filtre** : Étape = [nom de l'étape]
+2. Ajoutez une action **Mettre à jour l'enregistrement** :
+ * Enregistrement : l'opportunité déclenchante
+ * Champ : Probabilité
+ * Valeur : [probabilité pour cette étape]
+
+### Calculer le montant attendu
+
+Après la jonction des branches :
+
+1. Ajoutez un nœud **Filtre** : le champ Montant n'est pas vide
+2. Ajoutez une action **Mettre à jour l'enregistrement** :
+ * Enregistrement : l'opportunité déclenchante
+ * Champ : Montant attendu
+ * Valeur : Montant × Probabilité
+
+## Étape 3 : Créer le workflow n° 2 — Recalculer lors d'une modification du montant
+
+Ce workflow met à jour le Montant attendu lorsque le Montant de l'affaire change.
+
+### Créer le workflow
+
+1. Allez dans **Workflows**
+2. Cliquez sur **+ Nouveau workflow**
+3. Nommez-le "Recalculer le Montant attendu lors d'une modification du Montant"
+
+### Configurer le déclencheur
+
+1. Ajoutez un déclencheur **Enregistrement créé ou mis à jour**
+2. Sélectionnez **Opportunités** comme objet
+3. Filtrer sur : le champ **Montant** est mis à jour
+
+### Ajouter la logique
+
+1. Ajoutez un nœud **Filtre** : le champ Montant n'est pas vide
+2. Ajoutez une action **Mettre à jour l'enregistrement** :
+ * Enregistrement : l'opportunité déclenchante
+ * Champ : Montant attendu
+ * Valeur : Montant × Probabilité
+
+## Étape 4 : Afficher dans votre pipeline
+
+Affichez maintenant les totaux de Montant attendu dans votre vue Kanban :
+
+1. Ouvrez votre vue Kanban **Pipeline des ventes**
+2. Cliquez sur le **nombre** à côté de n'importe quel nom d'étape en haut d'une colonne
+3. Sélectionnez **Somme**
+4. Choisissez **Montant attendu**
+
+Chaque colonne affiche maintenant la valeur totale pondérée du pipeline pour cette étape.
+
+## Résumé
+
+| Composant | Objectif |
+| ------------------------- | ----------------------------------------------------------------------------------- |
+| **Champ Probabilité** | Stocke la probabilité de gain selon l'étape |
+| **Champ Montant attendu** | Stocke Montant × Probabilité |
+| **Workflow n° 1** | Met à jour la Probabilité lorsque l'Étape change, puis recalcule le Montant attendu |
+| **Workflow n° 2** | Recalcule le Montant attendu lorsque le Montant change |
+| **Agrégation** | Affiche la somme du Montant attendu par étape |
+
+## Connexes
+
+* [Champs de formule](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) — créer des champs calculés à l'aide de workflows
+* [Vues Kanban](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — agrégations de colonnes
+* [Comment créer des champs personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-fields) — configuration des champs
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
new file mode 100644
index 0000000000..160da26ffb
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/how-tos/track-time-in-stage.mdx
@@ -0,0 +1,231 @@
+---
+title: Suivre la durée pendant laquelle les opportunités restent à chaque étape
+description: Surveillez la vélocité des affaires en suivant le moment où les opportunités entrent dans chaque étape.
+---
+
+
+ Voici un exemple de création de [champs de formule](/l/fr/user-guide/workflows/how-tos/crm-automations/formula-fields) à l'aide de Workflows — plus précisément des calculs de dates.
+
+
+Suivre le moment où les opportunités entrent dans chaque étape vous aide à identifier les goulots d'étranglement et à mesurer la vélocité des affaires.
+
+Ce guide vous explique comment configurer des champs personnalisés et un workflow pour enregistrer automatiquement le moment où une opportunité passe à chaque étape, et calculer le nombre de jours passés dans l'étape précédente.
+
+## Étape 1 : Créez des champs personnalisés
+
+Vous avez besoin de deux types de champs pour chaque étape :
+
+* **Champs Date et heure** : Enregistrer le moment où l'opportunité est entrée dans chaque étape
+* **Champs numériques** : Stocker le nombre de jours que l'opportunité a passés dans chaque étape
+
+### Créez les champs "Dernière entrée"
+
+1. Allez dans **Paramètres → Modèle de données → Opportunités**
+2. Pour chaque étape, cliquez sur **+ Ajouter un champ** et configurez :
+ * **Nom** : Dernière entrée [Nom de l'étape] (par exemple, "Dernière entrée Nouveau", "Dernière entrée Qualifiée")
+ * **Type** : Date et heure
+ * **Description** : Horodatage du moment où l'opportunité est entrée dans cette étape
+3. Cliquez sur **Enregistrer**
+
+Créez ces champs :
+
+* Dernière entrée Nouveau
+* Dernière entrée Qualifiée
+* Dernière entrée Réunion
+* Dernière entrée Proposition
+* Dernière entrée Négociation
+* Dernière entrée Clôturée gagnée
+* Dernière entrée Clôturée perdue
+
+### Créez les champs "Jours dans l'étape"
+
+1. Pour chaque étape, cliquez sur **+ Ajouter un champ** et configurez :
+ * **Nom** : Jours dans [Nom de l'étape] (par exemple, "Jours dans Nouveau", "Jours dans Qualifiée")
+ * **Type** : Numérique
+ * **Description** : Nombre de jours passés dans cette étape
+2. Cliquez sur **Enregistrer**
+
+Créez ces champs :
+
+* Jours dans Nouveau
+* Jours dans Qualifiée
+* Jours dans Réunion
+* Jours dans Proposition
+* Jours dans Négociation
+
+
+ Vous n'avez pas besoin de champs "Jours dans" pour Clôturée gagnée et Clôturée perdue, car ce sont des étapes finales.
+
+
+### Facultatif : rendre les champs en lecture seule
+
+Si vous ne souhaitez pas que les utilisateurs modifient manuellement ces champs calculés :
+
+1. Allez dans **Paramètres → Rôles**
+2. Sélectionnez le rôle à configurer
+3. Trouvez l'objet Opportunités
+4. Définissez les champs "Dernière entrée" et "Jours dans" en lecture seule
+
+## Étape 2 : Créez le workflow
+
+Ce seul workflow gère les deux tâches :
+
+* Enregistre l'horodatage lors de l'entrée dans une nouvelle étape
+* Calcule le nombre de jours passés dans l'étape précédente
+
+### Créez le workflow
+
+1. Allez dans **Workflows**
+2. Cliquez sur **+ Nouveau workflow**
+3. Nommez-le "Suivre le temps par étape"
+
+### Configurez le déclencheur
+
+1. Ajoutez un déclencheur **Enregistrement mis à jour**
+2. Sélectionnez **Opportunités** comme objet
+3. Filtrer sur : le champ **Étape** est mis à jour
+
+### Ajoutez des branches pour chaque étape
+
+
+ Pour créer une nouvelle branche, faites un clic droit sur le canevas du workflow et cliquez sur **Nouvelle action**. Ensuite, reliez cette action au nœud précédent en faisant glisser la flèche du nœud précédent vers cette nouvelle action.
+
+
+---
+
+**Branche 1 : Étape = Nouveau (première étape)**
+
+Comme il s'agit de la première étape, nous enregistrons uniquement l'horodatage d'entrée — aucune étape précédente à calculer.
+
+1. Ajoutez un nœud **Filtre** : Étape = Nouveau
+2. Ajoutez une action **Code** :
+
+```javascript
+export const main = async (): Promise => {
+ return { now: new Date().toISOString() };
+};
+```
+
+3. Ajoutez une action **Mettre à jour l'enregistrement** :
+ * Enregistrement : l'opportunité déclenchante
+ * Champ : Dernière entrée Nouveau
+ * Valeur : `now` depuis le nœud Code
+
+---
+
+**Branche 2 : Étape = Qualifiée**
+
+Lors du passage à Qualifiée, enregistrez l'heure d'entrée ET calculez les jours passés dans Nouveau.
+
+1. Ajoutez un nœud **Filtre** : Étape = Qualifiée
+2. Ajoutez une action **Code** :
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configurez l'entrée du nœud Code : associez `lastEnteredPreviousStage` au champ **Dernière entrée Nouveau**
+4. Ajoutez une action **Mettre à jour l'enregistrement** :
+ * Enregistrement : l'opportunité déclenchante
+ * Champs à mettre à jour:
+ * Dernière entrée Qualifiée = `now`
+ * Jours dans Nouveau = `daysInPreviousStage`
+
+---
+
+**Branche 3 : Étape = Réunion**
+
+Lors du passage à Réunion, enregistrez l'heure d'entrée ET calculez les jours passés dans Qualifiée.
+
+1. Ajoutez un nœud **Filtre** : Étape = Réunion
+2. Ajoutez une action **Code** :
+
+```javascript
+export const main = async (params: {
+ lastEnteredPreviousStage: Date;
+}): Promise => {
+ const { lastEnteredPreviousStage } = params;
+
+ const now = new Date();
+ const entryDate = new Date(lastEnteredPreviousStage);
+ const diffTime = Math.abs(now.getTime() - entryDate.getTime());
+ const daysInPreviousStage = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
+
+ return {
+ now: now.toISOString(),
+ daysInPreviousStage: daysInPreviousStage
+ };
+};
+```
+
+3. Configurez l'entrée du nœud Code : associez `lastEnteredPreviousStage` au champ **Dernière entrée Qualifiée**
+4. Ajoutez une action **Mettre à jour l'enregistrement** :
+ * Enregistrement : l'opportunité déclenchante
+ * Champs à mettre à jour:
+ * Dernière entrée Réunion = `now`
+ * Jours dans Qualifiée = `daysInPreviousStage`
+
+---
+
+**Continuez pour les étapes restantes :**
+
+| Étape | Enregistrements | Calcule |
+| --------------- | ------------------------------- | ---------------------- |
+| Proposition | Dernière entrée Proposition | Jours dans Réunion |
+| Négociation | Dernière entrée Négociation | Jours dans Proposition |
+| Clôturée gagnée | Dernière entrée Clôturée gagnée | Jours dans Négociation |
+| Clôturée perdue | Dernière entrée Clôturée perdue | Jours dans Négociation |
+
+Les branches n'ont pas besoin de se rejoindre — chacune s'exécute indépendamment lorsque sa condition d'étape est remplie.
+
+## Étape 3 : Analyser le temps par étape
+
+Avec les horodatages et les comptages de jours enregistrés, vous pouvez désormais analyser la vélocité des affaires.
+
+### Créez une vue "Affaires lentes"
+
+1. Créez une vue Tableau des Opportunités
+2. Ajoutez des colonnes : Nom, Étape, Jours dans [étape précédente], Montant
+3. Triez par le champ "Jours dans" (décroissant)
+4. Filtrez par Étape pour vous concentrer sur une étape à la fois
+
+Les affaires en haut ont passé le plus de temps dans l'étape précédente.
+
+### Utilisez les agrégations
+
+Dans votre vue Kanban du pipeline :
+
+1. Cliquez sur le nombre à côté du nom d'une étape
+2. Sélectionnez **Moyenne**
+3. Choisissez un champ "Jours dans"
+
+Cela affiche le temps moyen que les affaires passent à chaque étape.
+
+## Résumé
+
+| Composant | Objectif |
+| ------------------------------ | -------------------------------------------------------------------------- |
+| **Champs « Dernière entrée »** | Stockent le moment où l'opportunité est entrée dans chaque étape |
+| **Champs « Jours dans »** | Stockent le nombre de jours passés dans chaque étape |
+| **Workflow** | Enregistre l'horodatage ET calcule les jours en un seul passage |
+| **Vues et agrégations** | Analysez la vélocité des affaires et identifiez les goulots d'étranglement |
+
+## Connexes
+
+* [Workflows](/l/fr/user-guide/workflows/overview) — principes de l'automatisation
+* [Comment créer des champs personnalisés](/l/fr/user-guide/data-model/how-tos/create-custom-fields) — configuration des champs
+* [Vues Kanban](/l/fr/user-guide/views-pipelines/capabilities/kanban-views) — agrégations
diff --git a/packages/twenty-docs/l/fr/user-guide/views-pipelines/overview.mdx b/packages/twenty-docs/l/fr/user-guide/views-pipelines/overview.mdx
new file mode 100644
index 0000000000..b837935b23
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/views-pipelines/overview.mdx
@@ -0,0 +1,137 @@
+---
+title: Vues et Pipelines
+description: Découvrez comment créer et gérer des vues dans Twenty.
+image: /images/user-guide/table-views/table.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Comprendre les vues
+
+Les vues sont des configurations enregistrées qui déterminent la façon dont vos données sont affichées. Chaque vue peut avoir ses propres :
+
+* **Disposition** : Tableau, Kanban ou Calendrier
+* **Filtres** : Quels enregistrements afficher
+* **Tri** : Comment les enregistrements sont classés
+* **Champs** : Quelles colonnes sont visibles
+
+## Types de vue
+
+### Vue Tableau
+
+La vue par défaut de type tableur affichant les enregistrements en lignes avec des colonnes personnalisables.
+
+### Vue Kanban
+
+Une vue tableau visuelle où les enregistrements apparaissent sous forme de cartes organisées par étapes. Idéal pour :
+
+* Pipelines de vente
+* Suivi de projets
+* Tout flux de travail avec des étapes définies
+
+### Vue Calendrier
+
+Affiche les enregistrements possédant des champs de date sur un calendrier. Parfait pour :
+
+* Réunions et événements
+* Échéances et dates limites
+* Planification basée sur le temps
+
+## Création d'une Vue
+
+Il y a deux manières de créer une nouvelle vue.
+
+### Utilisez le menu déroulant de la vue
+
+1. Accédez à n'importe quel objet (Personnes, Entreprises, etc.)
+2. Cliquez sur le nom de la vue en haut à gauche (affiche la vue actuelle avec une flèche déroulante)
+3. Cliquez sur **+ Ajouter une vue**
+4. Nommez votre vue et cliquez sur **Créer**
+5. Choisissez une disposition (Tableau, Kanban ou Calendrier) sous **Options**
+6. Ajoutez des filtres et un tri selon vos besoins
+7. Sélectionnez les champs à afficher et réorganisez-les
+8. Cliquez sur **Enregistrer**
+
+
+
+### Commencez par modifier une vue existante
+
+1. Accédez à n'importe quel objet (Personnes, Entreprises, etc.)
+2. Choisissez une disposition (Tableau, Kanban ou Calendrier) sous **Options** ou ajoutez des filtres et un tri selon vos besoins
+3. Cliquez sur **Enregistrer comme nouvelle vue**
+4. Nommez votre vue et cliquez sur **Créer**
+5. Continuez à modifier votre nouvelle vue
+6. Cliquez sur **Mettre à jour la vue** pour enregistrer vos configurations supplémentaires
+
+
+
+## Gérer les vues
+
+### Modifier une vue
+
+1. Sélectionnez la vue dans le menu déroulant
+2. Apportez vos modifications (filtres, tri, colonnes)
+3. Cliquez sur **Enregistrer** pour mettre à jour la vue
+
+### Renommer une vue ou changer son icône
+
+1. Ouvrez le menu déroulant de la vue
+2. Cliquez sur le menu **⋮** à côté du nom de la vue
+3. Sélectionnez **Modifier**
+4. Modifiez le nom ou l'icône
+5. Cliquez sur **Enregistrer**
+
+### Réorganiser les vues
+
+1. Ouvrez le menu déroulant de la vue
+2. Cliquez et faites glisser une vue par sa poignée
+3. Déposez-la à l'emplacement souhaité
+4. Le nouvel ordre est enregistré automatiquement
+
+### Ajouter aux favoris
+
+Épinglez les vues fréquemment utilisées pour un accès rapide :
+
+1. Ouvrez le menu déroulant de la vue
+2. Cliquez sur le menu **⋮** à côté d'une vue
+3. Sélectionnez **Ajouter aux favoris**
+4. La vue apparaît dans votre section Favoris
+
+### Supprimer une vue
+
+1. Sélectionnez la vue à supprimer
+2. Cliquez sur le menu déroulant de la vue
+3. Cliquez sur le menu **⋮** à côté de la vue
+4. Sélectionnez **Supprimer**
+5. Confirmez la suppression
+
+
+ Les vues supprimées ne peuvent pas être récupérées. Assurez-vous de vouloir la supprimer avant de confirmer.
+
+
+## Visibilité de la vue
+
+Chaque vue (sauf les vues par défaut "Tous les [Nom de l'objet]") possède son propre paramètre de visibilité.
+
+Pour modifier la visibilité :
+
+1. Ouvrez la vue
+2. Cliquez sur **Options → Visibilité**
+3. Choisissez :
+ * **Espace de travail** : Visible par tous les membres de l'espace de travail
+ * **Non répertoriée** : Visible uniquement par vous
+
+
+ La visibilité des vues par défaut "Tous les [Nom de l'objet]" ne peut pas être modifiée.
+
+
+## Prochaines étapes
+
+* [Vues de Tableau](/l/fr/user-guide/views-pipelines/capabilities/table-views)
+* [Vues Kanban](/l/fr/user-guide/views-pipelines/capabilities/kanban-views)
+* [Filtres et tri](/l/fr/user-guide/views-pipelines/capabilities/filters-and-sorting)
+* [Paramètres de la vue](/l/fr/user-guide/views-pipelines/capabilities/view-settings)
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-branches.mdx
new file mode 100644
index 0000000000..ead12adad6
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -0,0 +1,66 @@
+---
+title: Branches de flux de travail},{
+description: Créez des chemins parallèles et une logique conditionnelle dans vos flux de travail.
+---
+
+Les branches vous permettent de scinder votre flux de travail en plusieurs chemins pouvant s’exécuter simultanément ou de façon conditionnelle selon vos données.
+
+
+
+## Fonctionnement des branches
+
+Lorsque vous créez plusieurs connexions à partir d’un seul nœud, chaque chemin devient une branche. Par défaut, **toutes les branches s’exécutent en parallèle** — elles ne s’attendent pas les unes les autres.
+
+## Création de branches
+
+### Ajouter une nouvelle branche
+
+1. **Cliquez avec le bouton droit sur la zone de travail principale** du flux de travail (et non sur un nœud existant)
+2. Cliquez sur **Ajouter un nœud**
+3. Choisissez le type de nœud pour votre nouvelle branche
+4. Faites glisser une flèche depuis le bas de l’étape précédente vers le haut de cette nouvelle action
+5. Répétez pour ajouter d’autres branches à partir du même nœud
+
+
+ Chaque branche est indépendante. L’ajout d’une branche n’affecte pas les autres chemins existants à partir de ce nœud.
+
+
+### Disposition visuelle
+
+Les branches apparaissent comme des chemins parallèles dans l’éditeur de flux de travail. Vous pouvez faire glisser les nœuds pour réorganiser la disposition visuelle sans affecter l’exécution.
+
+## Branches conditionnelles
+
+Puisque toutes les branches s’exécutent par défaut, utilisez des nœuds **Filtre** pour contrôler quels chemins s’exécutent réellement :
+
+| Branche | Condition de filtre | Action |
+| ------- | --------------------- | ---------------------------------- |
+| A | Étape = "Gagnée" | Envoyer un e-mail de félicitations |
+| B | Étape = "Perdue" | Créer une tâche de suivi |
+| C | Étape = "Négociation" | Notifier le responsable |
+
+1. Créez des branches à partir de votre déclencheur ou action
+2. Ajoutez un nœud **Filtre** comme première étape de chaque branche
+3. Configurez chaque filtre avec des conditions mutuellement exclusives
+4. Ajoutez vos actions après chaque filtre
+
+Seules les branches pour lesquelles la condition du filtre est remplie poursuivront l’exécution.
+
+## Fusion de branches
+
+**Les branches ne fusionnent pas automatiquement.** Chaque branche s’exécute indépendamment jusqu’à sa fin. Vous avez toute latitude quant à la manière de gérer cela :
+
+* **Option 1 : Garder les branches séparées**
+ Chaque branche gère ses propres actions de suivi de manière indépendante. C’est l’approche la plus simple lorsque les branches n’ont pas besoin de converger.
+
+* **Option 2 : Fusionner les branches manuellement**
+ Lors de la création de votre flux de travail, vous pouvez connecter manuellement plusieurs branches à la même action en aval. Il suffit de faire glisser des flèches depuis la fin de chaque branche vers un nœud commun.
+
+
+ Bien que vous puissiez utiliser un nœud [Delay](/l/fr/user-guide/workflows/capabilities/workflow-actions#delay) pour mettre l’exécution en pause, il n’est pas actuellement configurable pour attendre "jusqu’à ce qu’une autre branche se termine".
+
+
+## Contenus associés
+
+* [Comment utiliser les branches dans les flux de travail](/l/fr/user-guide/workflows/capabilities/use-branches-in-workflows) - Guide étape par étape
+* [Actions de flux de travail](/l/fr/user-guide/workflows/capabilities/workflow-actions) - Actions disponibles, y compris Filtre
diff --git a/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-versions.mdx
new file mode 100644
index 0000000000..3868531027
--- /dev/null
+++ b/packages/twenty-docs/l/fr/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -0,0 +1,85 @@
+---
+title: Versions de Workflow
+description: Gérer les versions et les brouillons de workflows.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## À propos des versions
+
+Chaque fois que vous activez un workflow, une nouvelle version est créée. Cela vous permet de suivre les modifications dans le temps et de revenir aux configurations précédentes si nécessaire.
+
+## Statuts des versions
+
+| Statut | Description |
+| ------------- | ------------------------------------------------- |
+| **Brouillon** | En cours d'édition, pas encore publié |
+| **Actif** | Version active répondant aux déclencheurs |
+| **Désactivé** | Auparavant actif, mais arrêté manuellement |
+| **Archivé** | Versions antérieures conservées pour l'historique |
+
+## Travailler avec des brouillons
+
+Lorsque vous modifiez un workflow actif, vos modifications sont enregistrées en tant que **brouillon**. La version active continue de s'exécuter pendant que vous travaillez sur des mises à jour.
+
+Une fois vos modifications terminées, vous pouvez :
+
+* **Activer** : Publier le brouillon comme nouvelle version active (la version précédente est archivée)
+* **Abandonner** : Supprimer le brouillon et conserver la version active actuelle
+
+## Historique des versions
+
+### Afficher les versions précédentes
+
+1. Ouvrez le workflow
+2. Cliquez sur l'onglet **Versions**
+3. Affichez toutes les versions précédentes avec leurs horodatages
+
+### Restaurer une version
+
+1. Trouvez la version que vous souhaitez restaurer
+2. Cliquez sur **Utiliser comme brouillon**
+3. La version est copiée dans un nouveau brouillon
+4. Effectuez les mises à jour nécessaires
+5. Activez lorsque vous êtes prêt
+
+## Meilleures pratiques
+
+### Gestion des versions
+
+* N'activez que lorsque vous êtes prêt pour la mise en production
+* Conservez des modifications significatives d'une version à l'autre.
+* Documentez les modifications majeures dans les noms ou les descriptions de workflows
+* Testez en mode brouillon avant d'activer
+
+### Annulation des modifications
+
+* Si une nouvelle version pose des problèmes, restaurez la version précédente
+* Utilisez l'historique des versions pour suivre ce qui a changé
+* Testez toujours les versions restaurées avant de les activer
+
+## Workflows courants
+
+### Modification rapide
+
+1. Apportez des modifications mineures à un workflow actif
+2. Testez en mode brouillon
+3. Activez la nouvelle version
+
+### Révision majeure
+
+1. Utilisez la version précédente comme point de départ
+2. Apportez des modifications importantes dans un brouillon
+3. Testez minutieusement tous les scénarios
+4. Activez lorsque vous êtes confiant
+
+### Retour en arrière
+
+1. Identifiez le problème avec la version actuelle
+2. Trouvez la dernière version fonctionnelle dans l'historique
+3. Cliquez sur **Utiliser comme brouillon**
+4. Activez pour rétablir l'ancien comportement
+
+## Articles connexes
+
+* [Prise en main des workflows](/l/fr/user-guide/workflows/overview)
+* [Exécutions de workflows](/l/fr/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/it/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/it/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..f010476e3b
--- /dev/null
+++ b/packages/twenty-docs/l/it/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: Migliori Pratiche
+---
+
+Questo documento descrive le migliori pratiche da seguire quando si lavora sul backend.
+
+## Segui un approccio modulare
+
+Il backend segue un approccio modulare, che è un principio fondamentale quando si lavora con NestJS. Assicurati di suddividere il tuo codice in moduli riutilizzabili per mantenere una codebase pulita e organizzata.
+Ogni modulo dovrebbe incapsulare una particolare caratteristica o funzionalità e avere un ambito ben definito. Questo approccio modulare consente una chiara separazione delle responsabilità e rimuove complessità non necessarie.
+
+## Esporre servizi da usare nei moduli
+
+Crea sempre servizi che abbiano una responsabilità chiara e singola, migliorando la leggibilità e la manutenzione del codice. Dai ai servizi nomi descrittivi e coerenti.
+
+Dovresti anche esporre i servizi che vuoi utilizzare in altri moduli. Esporre servizi ad altri moduli è possibile tramite il potente sistema di iniezione delle dipendenze di NestJS e promuove un basso accoppiamento tra i componenti.
+
+## Evitare di usare il tipo `any`
+
+Quando dichiari una variabile come `any`, il sistema di controllo dei tipi di TypeScript non esegue alcun controllo dei tipi, rendendo possibile assegnare alla variabile valori di qualsiasi tipo. TypeScript utilizza l'inferenza dei tipi per determinare il tipo della variabile in base al valore. Dichiarandola come `any`, TypeScript non può più dedurre il tipo. Questo rende difficile individuare errori legati ai tipi durante lo sviluppo, portando a errori in fase di esecuzione e rendendo il codice meno manutenibile, meno affidabile e più difficile da comprendere per gli altri.
+
+È per questo che tutto dovrebbe avere un tipo. Quindi, se crei un nuovo oggetto con un nome e un cognome, dovresti creare un'interfaccia o un tipo che contenga un nome e un cognome e che definisca la struttura dell'oggetto che stai manipolando.
diff --git a/packages/twenty-docs/l/it/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/it/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..96a8bd356d
--- /dev/null
+++ b/packages/twenty-docs/l/it/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Coda di messaggi
+---
+
+Le code facilitano l'esecuzione di operazioni asincrone. Possono essere usate per eseguire attività in background come l'invio di un'email di benvenuto alla registrazione.
+Ogni caso d'uso avrà la propria classe di coda estesa da `MessageQueueServiceBase`.
+
+Al momento supportiamo solo `bull-mq`[bull-mq](https://bullmq.io/) come driver della coda.
+
+## Passaggi per creare e utilizzare una nuova coda
+
+1. Aggiungi un nome di coda per la tua nuova coda sotto l'enum `MESSAGE_QUEUES`.
+2. Fornire l'implementazione della fabbrica della coda con il nome della coda come token di dipendenza.
+3. Inserisci la coda che hai creato nel modulo/servizio richiesto con il nome della coda come token di dipendenza.
+4. Aggiungi una classe worker con iniezione basata su token, proprio come il produttore.
+
+### Esempio di utilizzo
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //business logic
+ await this.queue.add(someData);
+ }
+}
+
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..e40f5f7f9b
--- /dev/null
+++ b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: Comandi frontend
+---
+
+## Comandi utili
+
+### Avviare l'app
+
+```bash
+npx nx start twenty-front
+```
+
+### Rigenerare lo schema graphql sulla base dello schema API graphql
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+OPPURE
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### Lint
+
+```bash
+npx nx run twenty-front:lint # aggiungere --fix per correggere gli errori di lint
+```
+
+## Traduzioni
+
+```bash
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
+```
+
+### Test
+
+```bash
+npx nx run twenty-front:test # eseguire i test jest
+npx nx run twenty-front:storybook:serve:dev # eseguire storybook
+npx nx run twenty-front:storybook:test # eseguire i test # (è necessario che yarn storybook:serve:dev sia in esecuzione)
+npx nx run twenty-front:storybook:coverage # (è necessario che yarn storybook:serve:dev sia in esecuzione)
+```
+
+## Tech Stack
+
+Il progetto ha una struttura chiara e semplice, con un codice boilerplate minimo.
+
+**App**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](https://the-guild.dev/graphql/codegen)
+* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
+* [TypeScript](https://www.typescriptlang.org/)
+
+**Testing**
+
+* [Jest](https://jestjs.io/)
+* [Storybook](https://storybook.js.org/)
+
+**Strumenti**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## Architettura
+
+### Routing
+
+[React Router](https://reactrouter.com/) gestisce il routing.
+
+Per evitare [re-render](/l/it/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) inutili, tutta la logica del routing è in un `useEffect` in `PageChangeEffect`.
+
+### Gestione dello stato
+
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) gestisce lo stato.
+
+Vedi [best practices](/l/it/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) per ulteriori informazioni sulla gestione dello stato.
+
+## Testing
+
+[Jest](https://jestjs.io/) serve come strumento per i test unitari mentre [Storybook](https://storybook.js.org/) è per i test dei componenti.
+
+Jest è principalmente per testare le funzioni utility, e non i componenti stessi.
+
+Storybook è per testare il comportamento di componenti isolati, oltre che per mostrare il sistema di design.
diff --git a/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..46e0c334ac
--- /dev/null
+++ b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Tasti di scelta rapida
+---
+
+## Introduzione
+
+Quando hai bisogno di ascoltare un tasto di scelta rapida, normalmente useresti l'evento `onKeyDown`.
+
+In `twenty-front`, tuttavia, potresti avere conflitti tra gli stessi tasti di scelta rapida che sono utilizzati in componenti diversi, montati nello stesso momento.
+
+Ad esempio, se hai una pagina che ascolta il tasto Invio, e una modale che ascolta lo stesso tasto, con un componente Select all'interno della modale che ascolta il tasto Invio, potresti avere un conflitto quando tutti sono montati contemporaneamente.
+
+## L'hook `useScopedHotkeys`
+
+Per gestire questo problema, abbiamo un hook personalizzato che rende possibile ascoltare i tasti di scelta rapida senza alcun conflitto.
+
+Lo posizioni in un componente, e ascolterà i tasti solo quando il componente è montato E quando l'**ambito del tasto di scelta rapida** specificato è attivo.
+
+## Come ascoltare i tasti di scelta rapida nella pratica?
+
+Sono coinvolti due passaggi nell'impostazione dell'ascolto dei tasti di scelta rapida:
+
+1. Imposta l'[ambito del tasto di scelta rapida](#what-is-a-hotkey-scope-) che ascolterà i tasti di scelta rapida
+2. Usa l'hook `useScopedHotkeys` per ascoltare i tasti di scelta rapida
+
+Configurare gli ambiti dei tasti di scelta rapida è necessario anche in pagine semplici, perché altri elementi dell'interfaccia utente come il menu a sinistra o il menu dei comandi potrebbero anch'essi ascoltare i tasti di scelta rapida.
+
+## Casi d'uso per i tasti di scelta rapida
+
+In generale, avrai due casi d'uso che richiedono tasti di scelta rapida:
+
+1. In una pagina o un componente montato in una pagina
+2. In un componente di tipo modale che prende il focus a causa di un'azione dell'utente
+
+Il secondo caso d'uso può verificarsi in modo ricorsivo: ad esempio, un menu a tendina in una modale.
+
+### Ascoltare i tasti di scelta rapida in una pagina
+
+Esempio:
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Imposta l'ambito del tasto di scelta rapida in un useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Torna all'ambito del tasto di scelta rapida precedente quando il componente viene smontato
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Usa l'hook useScopedHotkeys
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Alcuna logica eseguita in questa pagina quando l'utente preme Invio
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return La mia pagina che ascolta per Invio
;
+};
+```
+
+### Ascoltare i tasti di scelta rapida in un componente di tipo modale
+
+Per questo esempio utilizzeremo un componente modale che ascolta il tasto Esc per segnalare al suo genitore di chiuderlo.
+
+Qui l'interazione dell'utente sta cambiando l'ambito.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Imposta l'ambito del tasto di scelta rapida quando l'utente apre la modale
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Torna all'ambito del tasto di scelta rapida precedente quando la modale viene chiusa
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
La mia pagina con una modale
+ Apri modale
+ {showModal && }
+ ;
+};
+```
+
+Poi nel componente modale:
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Usa l'hook useScopedHotkeys per ascoltare per Esc.
+ // Nota che esc è un tasto di scelta rapida comune che potrebbe essere utilizzato da molti altri componenti
+ // Quindi è importante utilizzare un ambito di tasto di scelta rapida per evitare conflitti
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return Il mio componente modale
;
+};
+```
+
+È importante utilizzare questo schema quando non sei sicuro che l'utilizzo di useEffect con mount/unmount sarà sufficiente per evitare conflitti.
+
+Quei conflitti possono essere difficili da debug, e potrebbe accadere più spesso che no con useEffects.
+
+## Che cos'è un ambito del tasto di scelta rapida?
+
+Un ambito del tasto di scelta rapida è una stringa che rappresenta un contesto in cui i tasti di scelta rapida sono attivi. È generalmente codificato come un enum.
+
+Quando cambi l'ambito del tasto di scelta rapida, i tasti di scelta rapida che ascoltano questo ambito saranno abilitati e i tasti che ascoltano altri ambiti saranno disabilitati.
+
+Puoi impostare solo un ambito alla volta.
+
+Ad esempio, gli ambiti dei tasti di scelta rapida per ogni pagina sono definiti nell'enum `PageHotkeyScope`:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+Internamente, l'ambito selezionato attualmente viene memorizzato in uno stato Recoil condiviso in tutta l'applicazione:
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+Ma questo stato Recoil non dovrebbe mai essere gestito manualmente! Vedremo come usarlo nella sezione successiva.
+
+## Come funziona internamente?
+
+Abbiamo creato un sottile wrapper su [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) che lo rende più performante ed evita rendering non necessari.
+
+Abbiamo anche creato uno stato Recoil per gestire lo stato dell'ambito del tasto di scelta rapida e renderlo disponibile ovunque nell'applicazione.
diff --git a/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..65b2ed889b
--- /dev/null
+++ b/packages/twenty-docs/l/it/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Sfoglia la libreria dei componenti UI di Twenty
+---
+
+Visualizza la nostra libreria completa di componenti e documentazione in Storybook.
+
+[Apri Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/it/twenty-ui/input.mdx b/packages/twenty-docs/l/it/twenty-ui/input.mdx
index 548d44a7e4..1082908085 100644
--- a/packages/twenty-docs/l/it/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/it/twenty-ui/navigation.mdx b/packages/twenty-docs/l/it/twenty-ui/navigation.mdx
index 79afc8251b..4dbaebaa42 100644
--- a/packages/twenty-docs/l/it/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/it/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/it/twenty-ui/navigation/navigation-bar.mdx
index c6ef8d962f..5b33310235 100644
--- a/packages/twenty-docs/l/it/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/navigation/navigation-bar.mdx
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
Rende una barra di navigazione che contiene più componenti `NavigationBarItem`.
-
+
+ ```jsx
+ importa { IconHome, IconUser, IconSettings } da '@tabler/icons-react';
+ importa { NavigationBar } da "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "Home",
+ Icon: IconHome,
+ onClick: () => console.log("Home cliccato"),
+ },
+ {
+ name: "Profilo",
+ Icon: IconUser,
+ onClick: () => console.log("Profilo cliccato"),
+ },
+ {
+ name: "Impostazioni",
+ Icon: IconSettings,
+ onClick: () => console.log("Impostazioni cliccate"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| Props | Tipo | Descrizione |
-| -------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| activeItemName | string | Il nome dell'elemento di navigazione attualmente attivo |
-| elementi | array | Un array di oggetti che rappresentano ciascun elemento di navigazione. Ogni oggetto contiene il `name`, il componente `Icon` da visualizzare e una funzione `onClick` da chiamare quando l'elemento viene cliccato |
-
-
+
+ | Props | Tipo | Descrizione |
+ | -------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
+ | activeItemName | string | Il nome dell'elemento di navigazione attualmente attivo |
+ | elementi | array | Un array di oggetti che rappresentano ciascun elemento di navigazione. Ogni oggetto contiene il `name`, il componente `Icon` da visualizzare e una funzione `onClick` da chiamare quando l'elemento viene cliccato |
+
diff --git a/packages/twenty-docs/l/it/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/it/twenty-ui/progress-bar.mdx
index 01bfd6ae05..1ffe5c7042 100644
--- a/packages/twenty-docs/l/it/twenty-ui/progress-bar.mdx
+++ b/packages/twenty-docs/l/it/twenty-ui/progress-bar.mdx
@@ -4,46 +4,41 @@ image: /images/user-guide/emails/emails_header.png
---
-
+
Indica progresso o conto alla rovescia e si muove da destra a sinistra.
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
-```jsx
-import { ProgressBar } from "twenty-ui/feedback";
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| Props | Tipo | Descrizione | Predefinito |
-| --------------- | -------- | ---------------------------------------------------------------------------------------------------------- | ----------- |
-| durata | numero | La durata totale dell'animazione della barra di progresso in millisecondi | 3 |
-| ritardo | numero | Il ritardo nell'avvio dell'animazione della barra di progresso in millisecondi | 0 |
-| smorzamento | string | Funzione di smorzamento per l'animazione della barra di progresso | easeInOut |
-| altezzaBarra | numero | L'altezza della barra in pixel | 24 |
-| coloreBarra | string | Il colore della barra | gray80 |
-| avvioAutomatico | booleano | Se `true`, l'animazione della barra di progresso inizia automaticamente quando il componente viene montato | `vero` |
-
-
+
+ | Props | Tipo | Descrizione | Predefinito |
+ | --------------- | -------- | ---------------------------------------------------------------------------------------------------------- | ----------- |
+ | durata | numero | La durata totale dell'animazione della barra di progresso in millisecondi | 3 |
+ | ritardo | numero | Il ritardo nell'avvio dell'animazione della barra di progresso in millisecondi | 0 |
+ | smorzamento | stringa | Funzione di smorzamento per l'animazione della barra di progresso | easeInOut |
+ | altezzaBarra | numero | L'altezza della barra in pixel | 24 |
+ | coloreBarra | stringa | Il colore della barra | gray80 |
+ | avvioAutomatico | booleano | Se `true`, l'animazione della barra di progresso inizia automaticamente quando il componente viene montato | `vero` |
+
## Barra di progresso circolare
@@ -51,27 +46,21 @@ export const MyComponent = () => {
Indica il progresso di un'attività, spesso utilizzata in schermate di caricamento o aree in cui si desidera comunicare processi in corso all'utente.
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-
-```jsx
-import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| Props | Tipo | Descrizione | Predefinito |
-| -------------- | ------ | ------------------------------------------------- | ------------ |
-| dimensione | numero | La dimensione della barra di progresso circolare | 50 |
-| larghezzaBarra | numero | La larghezza della linea della barra di progresso | 5 |
-| coloreBarra | string | Il colore della barra di progresso | currentColor |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Proprietà | Tipo | Descrizione | Predefinito |
+ | -------------- | ------- | ------------------------------------------------- | ------------ |
+ | dimensione | numero | La dimensione della barra di progresso circolare | 50 |
+ | larghezzaBarra | numero | La larghezza della linea della barra di progresso | 5 |
+ | coloreBarra | stringa | Il colore della barra di progresso | currentColor |
+
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/feature-flags.mdx
new file mode 100644
index 0000000000..9cf53d125f
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -0,0 +1,46 @@
+---
+title: 機能フラグ
+---
+
+機能フラグは試験的な機能を隠すために使用されます。 機能フラグは試験的な機能を隠すために使用されます。 Twentyでは、それらはワークスペースレベルで設定されており、ユーザーレベルではありません。 機能フラグは試験的な機能を隠すために使用されます。 Twentyでは、それらはワークスペースレベルで設定されており、ユーザーレベルではありません。
+
+## 新しい機能フラグの追加
+
+`FeatureFlagKey.ts`に機能フラグを追加します:
+
+```ts
+type FeatureFlagKey =
+ | 'IS_FEATURENAME_ENABLED'
+ | ...;
+```
+
+また、`feature-flag.entity.ts`の列挙型にも追加します:
+
+```ts
+enum FeatureFlagKeys {
+ IsFeatureNameEnabled = 'IS_FEATURENAME_ENABLED',
+ ...
+}
+```
+
+**バックエンド**機能に機能フラグを適用するには、次を使用します:
+
+```ts
+@Gate({
+ featureFlag: 'IS_FEATURENAME_ENABLED',
+})
+```
+
+**フロントエンド**機能に機能フラグを適用するには、次を使用します:
+
+```ts
+const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
+```
+
+## デプロイメント用の機能フラグを設定する
+
+Table `core.featureFlag` 内の対応するレコードを変更します:
+
+| id | キー | workspaceId | 値 |
+| ---- | ------------------------ | ----------- | --- |
+| ランダム | `IS_FEATURENAME_ENABLED` | WorkspaceID | `真` |
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/server-commands.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/server-commands.mdx
new file mode 100644
index 0000000000..aef509c753
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/backend-development/server-commands.mdx
@@ -0,0 +1,106 @@
+---
+title: バックエンドコマンド
+---
+
+## 便利なコマンド
+
+これらのコマンドは packages/twenty-server フォルダから実行してください。
+これらのコマンドは packages/twenty-server フォルダから実行してください。
+これらのコマンドは packages/twenty-server フォルダから実行してください。
+これらのコマンドは packages/twenty-server フォルダから実行してください。
+これらのコマンドは 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}`).
+
+### 初期設定
+
+```
+npx nx database:reset twenty-server # 開発用のシードでデータベースを設定する
+```
+
+### サーバーの起動
+
+```
+npx nx run twenty-server:start
+```
+
+### Lint
+
+```
+npx nx run twenty-server:lint # --fix を付けることでリントエラーを修正可能
+```
+
+### テスト
+
+```
+npx nx run twenty-server:test:unit # 単体テストを実行
+npx nx run twenty-server:test:integration # 統合テストを実行
+```
+
+注: 統合テストを実行する前にデータベースをリセットする必要がある場合、 `npx nx run twenty-server:test:integration:with-db-reset` を実行できます。
+
+### データベースのリセット
+
+データベースをリセットおよびシードしたい場合は、次のコマンドを実行してください:
+
+```bash
+npx nx run twenty-server:database:reset
+```
+
+### マイグレーション
+
+#### Core/Metadata スキーマ (TypeORM) のオブジェクトに対して
+
+```bash
+npx nx run twenty-server:typeorm migration:generate src/database/typeorm/core/migrations/nameOfYourMigration -d src/database/typeorm/core/core.datasource.ts
+```
+
+#### ワークスペースオブジェクトに対して
+
+マイグレーションファイルはなく、それぞれのワークスペースに対して自動的に生成され、
+データベースに保存され、このコマンドで適用されます。
+
+```bash
+npx nx run twenty-server:command workspace:sync-metadata -f
+```
+
+
+ これによりデータベースが削除され、マイグレーションとシードが再実行されます。
+
+ このコマンドを実行する前に、保持したいデータをバックアップしてください。
+
+
+## 技術スタック
+
+Twenty は主にバックエンドに NestJS を使用しています。
+
+最初に使用した 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. 最初に使用した 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 を使用しています。
+
+現在の技術スタックは次のようになっています。
+
+**コア**
+
+* [NestJS](https://nestjs.com/)
+* [TypeORM](https://typeorm.io/)
+* [GraphQL Yoga](https://the-guild.dev/graphql/yoga-server)
+
+**データベース**
+
+* [Postgres](https://www.postgresql.org/)
+
+**サードパーティ統合**
+
+* [Sentry](https://sentry.io/welcome/) バグトラッキング用
+
+**テスト**
+
+* [Jest](https://jestjs.io/)
+
+**ツール**
+
+* [Yarn](https://yarnpkg.com/)
+* [ESLint](https://eslint.org/)
+
+**開発**
+
+* [AWS EKS](https://aws.amazon.com/eks/)
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..e08909064c
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: フロントエンドコマンド
+---
+
+## 便利なコマンド
+
+### アプリの開始
+
+```bash
+npx nx start twenty-front
+```
+
+### APIのGraphQLスキーマに基づいてGraphQLスキーマを再生成する
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+または
+
+```bash
+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
+npx nx run twenty-front:storybook:serve:dev # run storybook
+npx nx run twenty-front:storybook:test # run tests # (needs yarn storybook:serve:dev to be running)
+npx nx run twenty-front:storybook:coverage # (needs yarn storybook:serve:dev to be running)
+```
+
+## 技術スタック
+
+プロジェクトは、最小限のボイラープレートコードを持つシンプルでクリーンなスタックを持っています。
+
+**アプリ**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](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/)
+
+**ツール**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## アーキテクチャ
+
+### ルーティング
+
+[React Router](https://reactrouter.com/)はルーティングを処理します。
+
+不要な[再レンダリング](/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders)を避けるために、すべてのルーティングロジックは`PageChangeEffect`内の`useEffect`にあります。
+
+### 状態管理
+
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts)は状態管理を処理します。
+
+状態管理に関する詳細な情報は[ベストプラクティス](/l/ja/developers/contribute/capabilities/frontend-development/best-practices-front#state-management)を参照してください。
+
+## テスト
+
+[Jest](https://jestjs.io/)はユニットテストのツールであり、[Storybook](https://storybook.js.org/)はコンポーネントテスト用です。
+
+Jestは主にユーティリティ関数のテスト用で、コンポーネントのテスト自体ではありません。
+
+Storybookは、独立したコンポーネントの挙動をテストし、デザインシステムを表示するためのものです。
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..b1ebf3a762
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: ホットキー
+---
+
+## イントロダクション
+
+ホットキーをリッスンする必要がある場合、通常は `onKeyDown` イベントリスナーを使用します。
+
+しかし、`twenty-front` では、同時にマウントされている異なるコンポーネントで使用される同じホットキーの間で競合が生じることがあります。
+
+例えば、Enterキーをリッスンするページと、Enterキーをリッスンするモーダル、さらにそのモーダル内のSelectコンポーネントもEnterキーをリッスンしている場合、全てが同時にマウントされると競合が生じる可能性があります。
+
+## `useScopedHotkeys` フック
+
+この問題を解決するために、どのような競合もなくホットキーをリッスンすることを可能にするカスタムフックがあります。
+
+コンポーネント内に配置すると、コンポーネントがマウントされ、指定された**ホットキースコープ**がアクティブなときだけホットキーをリッスンします。
+
+## 実際にホットキーをリッスンする方法は?
+
+ホットキーをリッスンするための設定には2つのステップがあります:
+
+1. ホットキーをリッスンする[ホットキースコープ](#what-is-a-hotkey-scope-)を設定します
+2. ホットキーをリッスンするために `useScopedHotkeys` フックを使用します
+
+他のUI要素(例:左側のメニューやコマンドメニュー)もホットキーをリッスンする可能性があるため、ホットキースコープの設定は単純なページでも必要です。
+
+## ホットキーのユースケース
+
+一般的に、ホットキーが必要となる動作は2つあります:
+
+1. ページにマウントされたコンポーネントで
+2. ユーザーのアクションでフォーカスをとるモーダルタイプのコンポーネントで
+
+2番目のユースケースは再帰的に発生します:例えばモーダル内のドロップダウン。
+
+### ページ内でホットキーをリッスン
+
+例:
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. setHotkeyScopeAndMemorizePreviousScopeをuseEffect内で設定
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // コンポーネントがアンマウントされたときに前のホットキースコープに戻ります
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. useScopedHotkeysフックを使用
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // ユーザーがEnterを押したときにこのページで実行されるロジック
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return Enterをリッスンする私のページ
;
+};
+```
+
+### モーダルタイプのコンポーネントでホットキーをリッスン
+
+この例では、親にモーダルを閉じるように指示するためにEscapeキーをリッスンするモーダルコンポーネントを使用します。
+
+ここで、ユーザーの操作がスコープを変更します。
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. ユーザーがモーダルを開くときにホットキースコープを設定
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. モーダルが閉じられるときに前のホットキースコープに戻る
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
私のモーダル付きページ
+ モーダルを開く
+ {showModal && }
+ ;
+};
+```
+
+その後、モーダルコンポーネント内で:
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. EscapeをリッスンするためにuseScopedHotkeysフックを使用
+ // Escapeは多くの他のコンポーネントでも使用される可能性がある一般的なホットキーです
+ // スコープを使って競合を防ぐことが重要です
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return 私のモーダルコンポーネント
;
+};
+```
+
+モント/アンマウントでのuseEffectだけで競合を避けるには不十分なことがある場合にこのパターンを使用することが重要です。
+
+これらの競合はデバッグが困難で、useEffectsでよく発生することがあります。
+
+## ホットキースコープとは?
+
+ホットキースコープは、ホットキーがアクティブなコンテキストを表す文字列です。 通常、enumとしてエンコードされます。 通常、enumとしてエンコードされます。 通常、enumとしてエンコードされます。
+
+ホットキースコープを変更すると、このスコープをリッスンしているホットキーが有効になり、他のスコープをリッスンしているホットキーが無効になります。
+
+一度に1つのスコープしか設定できません。
+
+例として、各ページのホットキースコープは`PageHotkeyScope` enumで定義されています:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = '設定',
+ CreateWorkspace = '作業スペースの作成',
+ SignInUp = 'サインイン-アップ',
+ CreateProfile = 'プロファイルの作成',
+ PlanRequired = 'プランが必要',
+ ShowPage = 'ページ表示',
+ PersonShowPage = '人物表示ページ',
+ CompanyShowPage = '会社表示ページ',
+ CompaniesPage = '会社ページ',
+ PeoplePage = '人物ページ',
+ OpportunitiesPage = '機会ページ',
+ ProfilePage = 'プロファイルページ',
+ WorkspaceMemberPage = 'ワークスペースメンバーページ',
+ TaskPage = 'タスクページ',
+}
+```
+
+内部的には、現在選択されているスコープはアプリケーション全体で共有されるRecoilステートに格納されています:
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: '現在のホットキースコープステート',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+しかし、このRecoilステートは手動で処理しないでください! 次のセクションでその使用方法を見ていきます。 次のセクションでその使用方法を見ていきます。 次のセクションでその使用方法を見ていきます。
+
+## 内部的にはどう機能しているのか?
+
+[react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro)の上に薄いラッパーを作成し、より効率的にし、不必要な再レンダリングを避けます。
+
+また、ホットキースコープの状態を処理し、アプリケーション全体で利用できるRecoilステートを作成しました。
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..baff4a6c9a
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: ストーリーブック
+description: TwentyのUIコンポーネントライブラリを閲覧
+---
+
+ストーリーブックで私たちの完全なコンポーネントライブラリおよびドキュメントを参照してください。
+
+[ストーリーブックを開く →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
new file mode 100644
index 0000000000..a91dc197c4
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -0,0 +1,136 @@
+---
+title: Figma で作業する
+info: Twenty の Figma を使用した共同作業方法を学ぶ
+---
+
+Figma は、デザイナーと開発者の間のコミュニケーションの壁を埋めるのを助ける協働インターフェース設計ツールです。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+このガイドは、Figma を使って共同作業する方法を説明します。
+
+## アクセス
+
+1. **共有リンクにアクセスする:** プロジェクトの Figma ファイルは [ここ](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty) からアクセスできます。
+2. **サインイン:** まだサインインしていない場合、Figma はサインインを促します。
+ 開発者モードや専用のフレーム選択など、キー機能はサインインしたユーザーのみが利用できます。
+
+
+ アカウントがないと効果的に協力することはできません。
+
+
+## Figma 構造
+
+左側のサイドバーで、Twenty の Figma の異なるページにアクセスできます。 それらは次のように整理されています: それらは次のように整理されています: それらは次のように整理されています: それらは次のように整理されています: それらは次のように整理されています:
+
+* **コンポーネントページ:** これは最初のページです。 デザイナーはこれを使用して、デザインファイル全体で使用される再利用可能なデザイン要素を作成および整理します。 例えば、ボタン、アイコン、シンボル、またはその他の再利用可能なコンポーネントとして使用されます。 これにより、デザイン全体で一貫性を保つことができます。
+* **メインページ:** 2 番目のページはメインページで、プロジェクトの完全なユーザーインターフェースを示しています。 ***再生*** を押すことで、アプリプロトタイプを完全に使用できます。 **メインページ:** 2 番目のページはメインページで、プロジェクトの完全なユーザーインターフェースを示しています。 ***再生*** を押すことで、アプリプロトタイプを完全に使用できます。 ***再生*** を押すことで、アプリプロトタイプを完全に使用できます。
+* **特徴ページ:** その他のページは、通常、進行中の機能に専念しています。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。 それらはアプリケーションまたはウェブサイトの特定の機能またはモジュールのデザインを含みます。 通常、まだ進行中です。
+
+## 役立つヒント
+
+閲覧専用アクセスでは、デザインの編集はできませんが、デザインをコードに変換する際に役立つすべての機能にアクセスできます。
+
+### 開発者モードを使用する
+
+Figma の Dev モードは、デザインナビゲーションの容易化、効果的なアセット管理、効率的な通信ツール、ツールボックス統合、迅速なコードスニペット、主要レイヤー情報の提供により、開発者の生産性を向上させ、デザインと開発の間のギャップを埋めます。 Dev Mode についての詳細は [こちら](https://www.figma.com/dev-mode/) で確認できます。
+
+ツールバーの右部分で「開発者」モードに切り替えることで、デザインスペックの確認、CSS のコピー、アセットへのアクセスが可能です。
+
+### プロトタイプを使用する
+
+キャンバス上の任意の要素をクリックし、インターフェースの右上隅にある「再生」ボタンを押してプロトタイプビューにアクセスします。 プロトタイプモードでは、あたかも最終製品であるかのようにデザインに触れることができます。 画面間のフローや、ボタン、リンク、メニューなどのインターフェース要素が操作時にどのように動作するかを示します。
+
+1. **トランジションとアニメーションの理解:** プロトタイプモードでは、デザイナーによって画面や UI 要素間に追加されたトランジションやアニメーションを表示でき、開発者に意図された動作やスタイルを視覚的に明確に指示します。
+2. **実装の明確化:** プロトタイプは曖昧さを減らすのにも役立ちます。 開発者はそれを操作することで、特定の要素の機能や外観をより良く理解することができます。
+
+Figma プラットフォームの学習に関するより包括的な詳細とガイダンスについては、公式の [Figma ドキュメント](https://help.figma.com/hc/en-us) を訪れることができます。
+
+### 距離を測定する
+
+要素を選択し、`Option` キー(Mac)または `Alt` キー(Windows)を押したまま、別の要素の上にカーソルを合わせると、それらの間の距離が表示されます。
+
+### VSCode 用 Figma 拡張機能(推奨)
+
+[Figma for VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension) を使用すると、デザインファイルのナビゲート、検査、デザイナーとのコラボレーション、変更の追跡、実装の促進ができます - すべてをテキストエディターから離れることなく行えます。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+これは推奨拡張機能の一部です。
+
+## コラボレーション
+
+1. **コメントの使用:** ツールバーの左側にあるバブルアイコンをクリックしてコメント機能を使用できます。
+2. **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 **カーソルチャット:** Figma の魅力的な機能のひとつにカーソルチャットがあります。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。 他の Figma を同時に使用している誰かを見た場合、`/` キー(Windows)または `;` キー(Mac)を押してメッセージを送信します。
diff --git a/packages/twenty-docs/l/ja/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/ja/developers/self-host/capabilities/cloud-providers.mdx
new file mode 100644
index 0000000000..d5e2db0b91
--- /dev/null
+++ b/packages/twenty-docs/l/ja/developers/self-host/capabilities/cloud-providers.mdx
@@ -0,0 +1,46 @@
+---
+title: その他の方法
+---
+
+
+ このドキュメントはコミュニティによって管理されています。 問題を含む可能性があります。
+ 問題を含む可能性があります。
+
+
+## Terraformとマニフェストを通したKubernetes
+
+Kubernetesデプロイメントに関するコミュニティ主導のドキュメントは[こちら](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)です。
+
+### Coolify
+
+Coolifyを使用してサーバーにTwentyをデプロイします。 (Coolify上の公式イメージは近日公開予定です) (Coolify上の公式イメージは近日公開予定です)
+
+[Coolifyのドキュメント](https://coolify.io/docs/get-started/introduction)
+
+### EasyPanel
+
+以下のコミュニティ維持テンプレートを使用して、EasyPanelにTwentyをデプロイします。
+
+以下のコミュニティ維持テンプレートを使用して、EasyPanelにTwentyをデプロイします。
+
+### Elest.io
+
+以下のリンクを使用して、Elest.ioにTwentyをサーバー上にデプロイします。
+
+[Elest.ioにデプロイする](https://elest.io/open-source/twenty)
+
+### Railway上のTwenty
+
+以下のコミュニティ維持テンプレートを使用して、RailwayにTwentyをデプロイします。
+
+[](https://railway.com/deploy/nAL3hA)
+
+### Sealos上のTwenty
+
+以下のコミュニティがメンテナンスしているテンプレートを使用して、SealosにTwentyをデプロイします。
+
+[](https://sealos.io/products/app-store/twenty)
+
+## その他
+
+もっと多くのクラウドプロバイダーオプションを追加するために、PRを自由に作成してください。
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 5f170e5cc2..f0226bc91d 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
@@ -4,57 +4,52 @@ image: /images/user-guide/tips/light-bulb.png
---
-
+
ユーザーが要素とやり取りするときに追加情報を表示する短いメッセージ。
-
+
+ ```jsx
+ import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-```jsx
-import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-
-export const MyComponent = () => {
- return (
- <>
-
- Customer Insights
-
-
- >
- );
-};
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| ---------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| className | string | 追加のスタイリング用のオプションのCSSクラス |
-| anchorSelect | CSSセレクタ | ツールチップのアンカー(ツールチップをトリガーする要素)のセレクタ |
-| content | string | ツールチップ内に表示したいコンテンツ |
-| 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`文字列 | ツールチップの位置戦略。 ツールチップの位置戦略。 2つの値があります: `absolute` と `fixed` |
-
-
+ export const MyComponent = () => {
+ return (
+ <>
+
+ カスタマーインサイト
+
+
+ >
+ );
+ };
+ ```
+
+
+ | プロパティ | タイプ | 説明 |
+ | ---------------- | --------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | string | 追加のスタイリング用のオプションのCSSクラス |
+ | anchorSelect | CSSセレクタ | ツールチップのアンカー(ツールチップをトリガーする要素)のセレクタ |
+ | content | string | ツールチップ内に表示したいコンテンツ |
+ | 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`文字列 | ツールチップの位置戦略。 2つの値があります: `absolute` と `fixed` |
+
## ツールチップを伴うオーバーフローテキスト
@@ -62,27 +57,22 @@ export const MyComponent = () => {
オーバーフローテキストを処理し、テキストがオーバーフローしたときにツールチップを表示します。
-
+
+ ```jsx
+ import { OverflowingTextWithTooltip } from 'twenty-ui/display';
-```jsx
-import { OverflowingTextWithTooltip } from 'twenty-ui/display';
+ export const MyComponent = () => {
+ const crmTaskDescription =
+ '最近の製品照会に関してクライアントをフォローアップします。 価格オプションについて議論し、懸念事項に対応し、追加の製品情報を提供します。 将来の参照のために、会話の詳細をCRMに記録します。';
-export const MyComponent = () => {
- const crmTaskDescription =
- 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-
- return ;
-};
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| ----- | ------ | -------------------------- |
-| テキスト | string | オーバーフローテキストエリア内に表示したいコンテンツ |
-
-
+ return ;
+ };
+ ```
+
+
+ | プロパティ | タイプ | 説明 |
+ | ----- | ------ | -------------------------- |
+ | テキスト | string | オーバーフローテキストエリア内に表示したいコンテンツ |
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/input.mdx b/packages/twenty-docs/l/ja/twenty-ui/input.mdx
index 00a51fbd15..2283178d8b 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
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 0def7dafb4..5f10a5caff 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
@@ -4,53 +4,49 @@ image: /images/user-guide/github/github-header.png
---
-
+
ドロップダウンベースのアイコンピッカーで、ユーザーがリストからアイコンを選択できます。
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import React, { useState } from "react";
+ import { IconPicker } from "@/ui/input/components/IconPicker";
-
+ export const MyComponent = () => {
-```jsx
-import { RecoilRoot } from "recoil";
-import React, { useState } from "react";
-import { IconPicker } from "@/ui/input/components/IconPicker";
+ const [selectedIcon, setSelectedIcon] = useState("");
+ const handleIconChange = ({ iconKey, Icon }) => {
+ console.log("選択されたアイコン:", iconKey);
+ setSelectedIcon(iconKey);
+ };
-export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
- const [selectedIcon, setSelectedIcon] = useState("");
- const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Selected Icon:", iconKey);
- setSelectedIcon(iconKey);
- };
-
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| --------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| disabled | ブール型 | `true` に設定されるとアイコンピッカーは無効になります |
-| onChange | 機能 | ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります |
-| selectedIconKey | string | 最初に選択されたアイコンのキー |
-| onClickOutside | 機能 | ユーザーがドロップダウン外をクリックしたときにトリガーされるコールバック関数 |
-| onClose | 機能 | ドロップダウンが閉じられたときにトリガーされるコールバック関数 |
-| onOpen | 機能 | ドロップダウンが開かれたときにトリガーされるコールバック関数 |
-| バリアント | string | クリック可能なアイコンのビジュアルスタイルバリアント。 オプションには `primary`、 `secondary`、 `tertiary` が含まれます |
-
-
+
+ | プロパティ | タイプ | 説明 |
+ | --------------- | ------ | ------------------------------------------------------------------------------ |
+ | 無効 | ブール型 | `true` に設定されるとアイコンピッカーは無効になります |
+ | onChange | 関数 | ユーザーがアイコンを選択したときにトリガーされるコールバック関数。 それは `iconKey` と `Icon` プロパティを持つオブジェクトを受け取ります |
+ | selectedIconKey | string | 最初に選択されたアイコンのキー |
+ | onClickOutside | 関数 | ユーザーがドロップダウン外をクリックしたときにトリガーされるコールバック関数 |
+ | onClose | 関数 | ドロップダウンが閉じられたときにトリガーされるコールバック関数 |
+ | onOpen | 関数 | ドロップダウンが開かれたときにトリガーされるコールバック関数 |
+ | バリアント | string | クリック可能なアイコンのビジュアルスタイルバリアント。 オプションには `primary`、 `secondary`、 `tertiary` が含まれます |
+
diff --git a/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx b/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx
index 54b9d1059d..b51d35678b 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: '""'
---
-
-
\ No newline at end of file
+
+
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 6dc3976138..470155fd39 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/breadcrumb.mdx
@@ -4,41 +4,38 @@ image: /images/user-guide/fields/field.png
---
-
+
ブレッドクラムナビゲーションバーをレンダリングします。
-
+
+ ```jsx
+ import { BrowserRouter } from "react-router-dom";
+ import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
-```jsx
-import { BrowserRouter } from "react-router-dom";
-import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
+ export const MyComponent = () => {
+ const breadcrumbLinks = [
+ { children: "ホーム", href: "/" },
+ { children: "カテゴリ", href: "/category" },
+ { children: "サブカテゴリ", href: "/category/subcategory" },
+ { children: "現在のページ" },
+ ];
-export const MyComponent = () => {
- const breadcrumbLinks = [
- { children: "Home", href: "/" },
- { children: "Category", href: "/category" },
- { children: "Subcategory", href: "/category/subcategory" },
- { children: "Current Page" },
- ];
+ return (
+
+
+
+ )
+ };
+ ```
+
- return (
-
-
-
- )
-};
-```
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| --------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| className | string | 追加のスタイリングのためのオプションクラス名 |
-| リンク | array | 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトには `children` プロパティ(リンクのテキストコンテンツ)とオプションの `href` プロパティ(リンクをクリックしたときに移動するURL)が含まれています。 |
-
-
+
+ | プロパティ | タイプ | 説明 |
+ | --------- | ------ | --------------------------------------------------------------------------------------------------------------------- |
+ | className | string | 追加のスタイリングのためのオプションクラス名 |
+ | リンク | 配列 | 各オブジェクトはブレッドクラムリンクを表します。 各オブジェクトには `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 58812ea080..0a2f28664d 100644
--- a/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/ja/twenty-ui/navigation/links.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
## 連絡先リンク
@@ -12,44 +12,40 @@ image: /images/user-guide/what-is-twenty/20.png
連絡先情報を表示するためのスタイライズされたリンクコンポーネントです。
-
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
+ import { ContactLink } from 'twenty-ui/navigation';
-import { ContactLink } from 'twenty-ui/navigation';
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('連絡先リンクがクリックされました!', event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| --------- | ----------------- | --------------------------- |
-| className | string | 追加スタイル用のオプション名 |
-| href | string | リンクのターゲットURLまたはパス |
-| onClick | 機能 | リンクがクリックされるとトリガーされるコールバック関数 |
-| children | `React.ReactNode` | リンク内に表示されるコンテンツ |
-
-
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
+ ```
+
+
+ | プロパティ | タイプ | 説明 |
+ | --------- | ----------------- | ---------------------------- |
+ | className | string | 追加のスタイリングのためのオプション名 |
+ | href | string | リンクのターゲットURLまたはパス |
+ | onClick | function | リンクがクリックされた際にトリガーされるコールバック関数 |
+ | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
+
## 生リンク
@@ -57,39 +53,35 @@ export const MyComponent = () => {
リンクを表示するためのスタイライズされたリンクコンポーネントです。
-
+
+ ```jsx
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("連絡先リンクがクリックされました!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ お問い合わせ
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-
-```
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| --------- | ----------------- | --------------------------- |
-| className | string | 追加のスタイリングのためのオプション名 |
-| href | string | リンクのターゲットURLまたはパス |
-| onClick | 機能 | リンクがクリックされるとトリガーされるコールバック関数 |
-| children | `React.ReactNode` | リンク内に表示されるコンテンツ |
-
-
+
+ | プロパティ | タイプ | 説明 |
+ | --------- | ----------------- | ---------------------------- |
+ | className | string | 追加のスタイリングのためのオプション名 |
+ | href | string | リンクのターゲットURLまたはパス |
+ | onClick | 機能 | リンクがクリックされた際にトリガーされるコールバック関数 |
+ | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
+
## 丸リンク
@@ -97,38 +89,34 @@ export const MyComponent = () => {
リンクのためのチップコンポーネントを備えた丸いスタイルのリンクです。
-
+
+ ```jsx
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("連絡先リンクがクリックされました!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ お問い合わせ
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| -------- | ----------------- | --------------------------- |
-| href | string | リンクのターゲットURLまたはパス |
-| children | `React.ReactNode` | リンク内に表示されるコンテンツ |
-| onClick | 機能 | リンクがクリックされるとトリガーされるコールバック関数 |
-
-
+
+ | プロパティ | タイプ | 説明 |
+ | -------- | ----------------- | ---------------------------- |
+ | href | string | リンクのターゲットURLまたはパス |
+ | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
+ | onClick | 機能 | リンクがクリックされた際にトリガーされるコールバック関数 |
+
## ソーシャルリンク
@@ -136,33 +124,30 @@ export const MyComponent = () => {
URL、LinkedIn、X(またはTwitter)など、さまざまなソーシャルリンクタイプに対応したスタイライズされたソーシャルリンクです。
-
+
+ ```jsx
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| -------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------------ |
-| href | string | リンクのターゲットURLまたはパス |
-| children | `React.ReactNode` | リンク内に表示されるコンテンツ |
-| タイプ | string | ソーシャルリンクの種類です。 ソーシャルリンクの種類です。 オプションには、`url`、`LinkedIn`、`Twitter`があります。 ソーシャルリンクの種類です。 オプションには、`url`、`LinkedIn`、`Twitter`があります。 |
-| onClick | 機能 | リンクがクリックされるとトリガーされるコールバック関数 |
-
-
+
+ | プロパティ | タイプ | 説明 |
+ | -------- | ----------------- | ------------------------------------------------------- |
+ | href | string | リンクのターゲットURLまたはパス |
+ | children | `React.ReactNode` | リンク内に表示されるコンテンツ |
+ | タイプ | string | ソーシャルリンクの種類です。 オプションには、`url`、`LinkedIn`、`Twitter`があります。 |
+ | onClick | function | リンクがクリックされた際にトリガーされるコールバック関数 |
+
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 15631e5092..6224e67904 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
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
複数の`NavigationBarItem`コンポーネントを含むナビゲーションバーをレンダリングします。
-
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "ホーム",
+ Icon: IconHome,
+ onClick: () => console.log("ホームがクリックされました"),
+ },
+ {
+ name: "プロフィール",
+ Icon: IconUser,
+ onClick: () => console.log("プロフィールがクリックされました"),
+ },
+ {
+ name: "設定",
+ Icon: IconSettings,
+ onClick: () => console.log("設定がクリックされました"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| -------------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| activeItemName | string | 現在アクティブなナビゲーション項目の名前 |
-| アイテム | array | 各ナビゲーションアイテムを表すオブジェクトの配列。 各ナビゲーションアイテムを表すオブジェクトの配列。 各ナビゲーションアイテムを表すオブジェクトの配列。 各ナビゲーションアイテムを表すオブジェクトの配列。 各ナビゲーションアイテムを表すオブジェクトの配列。 各オブジェクトには、アイテムの `name`、表示する `Icon` コンポーネント、およびアイテムがクリックされたときに呼び出される `onClick` 関数が含まれています。 |
-
-
+
+ | プロパティ | タイプ | 説明 |
+ | -------------- | ------ | ------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | string | 現在アクティブなナビゲーション項目の名前 |
+ | アイテム | 配列 | 各ナビゲーションアイテムを表すオブジェクトの配列。 各オブジェクトには、アイテムの `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 bfa215485e..335fa2fab1 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
@@ -4,35 +4,31 @@ image: /images/user-guide/api/api.png
---
-
+
アクティブなステップをハイライトして、一連の番号付きステップの進行状況を表示します。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 アクティブなステップをハイライトして、一連の番号付きステップの進行状況を表示します。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。 各 `Step` コンポーネントによって表されるステップを含むコンテナをレンダリングします。
-
+
+ ```jsx
+ import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
-```jsx
-import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
+ export const MyComponent = () => {
+ return (
+
+ Step 1
+ Step 2
+ Step 3
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
- Step 1
- Step 2
- Step 3
-
- );
-};
-```
-
-
-
-
-
-| プロパティ | タイプ | 説明 |
-| --------- | --- | -------------------------------------------------------------------------------------- |
-| アクティブステップ | 数 | 現在アクティブなステップのインデックス。 これにより、どのステップを視覚的にハイライトするかが決まります。 これにより、どのステップを視覚的にハイライトするかが決まります。 |
-
-
+
+ | プロパティ | タイプ | 説明 |
+ | --------- | --- | ----------------------------------------------------- |
+ | アクティブステップ | 数 | 現在アクティブなステップのインデックス。 これにより、どのステップを視覚的にハイライトするかが決まります。 |
+
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..6338a8e808
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: 모범 사례
+---
+
+이 문서는 백엔드 작업 시 따를 모범 사례를 설명합니다.
+
+## 모듈형 접근법 따르기
+
+백엔드는 NestJS로 작업할 때 기본 원칙 중 하나인 모듈형 접근법을 따릅니다. 코드베이스를 깔끔하고 체계적으로 유지하려면 코드를 재사용 가능한 모듈로 분리하십시오.
+각 모듈은 특정 기능을 캡슐화하고 명확하게 정의된 범위를 가져야 합니다. 이 모듈형 접근법은 관심사의 명확한 분리를 가능하게 하고 불필요한 복잡성을 제거합니다.
+
+## 모듈에서 사용할 서비스를 노출시키십시오.
+
+항상 명확하고 단일한 책임을 가진 서비스를 생성하여 코드 가독성과 유지보수성을 향상시킵니다. 서비스의 이름을 일관되게 설명적으로 지정하십시오.
+
+다른 모듈에서 사용하고자 하는 서비스를 노출해야 합니다. 다른 모듈에 서비스를 노출하는 것은 NestJS의 강력한 의존성 주입 시스템을 통해 가능하며, 구성 요소 간의 느슨한 결합을 촉진합니다.
+
+## `any` 타입 사용 피하기
+
+변수를 `any`로 선언하면 TypeScript의 타입 검사자가 타입 검사를 수행하지 않으므로 변수에 모든 유형의 값을 할당할 수 있게 됩니다. TypeScript는 값에 따라 변수의 타입을 추론하기 위해 타입 추론을 사용합니다. 이를 `any`로 선언하면 TypeScript는 더 이상 타입을 추론할 수 없습니다. 이는 개발 중 타입 관련 오류를 잡기 어렵게 만들어 런타임 오류로 이어지고, 코드의 유지보수성과 신뢰성이 떨어지며, 다른 사람이 이해하기도 어려워집니다.
+
+이것이 모든 것이 타입을 가져야 하는 이유입니다. 따라서 이름(first name)과 성(last name)을 가진 새 개체를 만든다면, 다루는 개체의 구조를 정의하는 이름과 성을 포함한 인터페이스나 타입을 만들어야 합니다.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
new file mode 100644
index 0000000000..fe85b7b819
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -0,0 +1,109 @@
+---
+title: 폴더 아키텍처
+info: 우리의 폴더 아키텍처를 자세히 살펴보기
+---
+
+이 가이드에서는 프로젝트 디렉토리 구조의 세부 사항과 그것이 Twenty의 구조화와 유지관리성에 어떻게 기여하는지 살펴봅니다.
+
+이 폴더 아키텍처 관례를 따르면 특정 기능과 관련된 파일을 더 쉽게 찾을 수 있고, 애플리케이션의 확장성과 유지관리성을 보장하기가 쉬워집니다.
+
+```
+front
+└───modules
+│ └───module1
+│ │ └───submodule1
+│ └───module2
+│ └───ui
+│ │ └───display
+│ │ └───inputs
+│ │ │ └───buttons
+│ │ └───...
+└───pages
+└───...
+```
+
+## 페이지
+
+애플리케이션 라우트로 정의된 최상위 컴포넌트를 포함합니다. 모듈 폴더에서 더 하위 수준의 컴포넌트를 가져옵니다(자세한 내용은 아래를 참조하세요).
+
+## 모듈
+
+각 모듈은 특정 컴포넌트, 상태 및 운영 로직을 포함하는 기능 또는 기능 그룹을 나타냅니다.
+모두 아래 구조를 따라야 합니다. 모듈 안에 모듈을 중첩할 수 있으며(이를 서브모듈이라고 하며), 동일한 규칙이 적용됩니다.
+
+```
+module1
+ └───components
+ │ └───component1
+ │ └───component2
+ └───constants
+ └───contexts
+ └───graphql
+ │ └───fragments
+ │ └───queries
+ │ └───mutations
+ └───hooks
+ │ └───internal
+ └───states
+ │ └───selectors
+ └───types
+ └───utils
+```
+
+### 컨텍스트
+
+컨텍스트는 각 레벨에서 수동으로 props를 전달하지 않고, 컴포넌트 트리를 통해 데이터를 전달할 수 있는 방법입니다.
+
+자세한 내용은 [React Context](https://react.dev/reference/react#context-hooks)를 참조하세요.
+
+### GraphQL
+
+프래그먼트, 쿼리 및 뮤테이션이 포함됩니다.
+
+자세한 내용은 [GraphQL](https://graphql.org/learn/)을 참조하세요.
+
+* 프래그먼트
+
+프래그먼트는 쿼리의 재사용 가능한 조각으로, 여러 장소에서 사용할 수 있습니다. 프래그먼트를 사용하면 코드 중복을 피하기가 더 쉬워집니다.
+
+자세한 내용은 [GraphQL 프래그먼트](https://graphql.org/learn/queries/#fragments)를 참조하세요.
+
+* 쿼리
+
+자세한 내용은 [GraphQL 쿼리](https://graphql.org/learn/queries/)를 참조하세요.
+
+* 뮤테이션
+
+자세한 내용은 [GraphQL 뮤테이션](https://graphql.org/learn/queries/#mutations)을 참조하세요.
+
+### 훅
+
+자세한 내용은 [훅](https://react.dev/learn/reusing-logic-with-custom-hooks)을 참조하세요.
+
+### 상태
+
+상태 관리 로직이 포함되어 있습니다. [RecoilJS](https://recoiljs.org)가 이것을 처리합니다.
+
+* 셀렉터: 자세한 내용은 [RecoilJS 셀렉터](https://recoiljs.org/docs/basic-tutorial/selectors)를 참조하세요.
+
+React의 내장 상태 관리는 구성 요소 내에서의 상태를 여전히 처리합니다.
+
+### 유틸
+
+재사용 가능한 순수 함수를 포함해야 합니다. 그렇지 않으면 `hooks` 폴더에 커스텀 훅을 만들어야 합니다.
+
+## UI
+
+애플리케이션에서 사용되는 모든 재사용 가능한 UI 컴포넌트를 포함합니다.
+
+이 폴더는 `data`, `display`, `feedback`, `input`과 같은 특정 유형의 컴포넌트에 대한 하위 폴더를 포함할 수 있습니다. 각 컴포넌트는 자기 완결적이고 재사용 가능해야 하며, 애플리케이션의 다른 부분에서 사용할 수 있어야 합니다.
+
+`modules` 폴더의 다른 컴포넌트에서 UI 컴포넌트를 분리함으로써 일관된 디자인을 유지하고, 코드베이스의 다른 부분(비즈니스 로직)에 영향을 주지 않고 UI를 변경하기가 더 쉬워집니다.
+
+## 인터페이스 및 종속성
+
+`ui` 폴더를 제외한 모든 모듈에서 다른 모듈 코드를 가져올 수 있습니다. 이렇게 하면 코드를 쉽게 테스트할 수 있습니다.
+
+### 내부
+
+각 부분(훅, 상태, ...) 모듈의 각 부분은 모듈 내에서만 사용하는 `internal` 폴더를 가질 수 있습니다.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..ed68230820
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: 프론트엔드 명령어
+---
+
+## 유용한 명령어
+
+### 앱 시작하기
+
+```bash
+npx nx start twenty-front
+```
+
+### API GraphQL 스키마를 기반으로 GraphQL 스키마 재생성
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+또는
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### 린트
+
+```bash
+npx nx run twenty-front:lint # lint 오류를 수정하려면 --fix 전달
+```
+
+## 번역
+
+```bash
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
+```
+
+### 테스트
+
+```bash
+npx nx run twenty-front:test # jest 테스트 실행
+npx nx run twenty-front:storybook:serve:dev # storybook 실행
+npx nx run twenty-front:storybook:test # 테스트 실행 # (yarn storybook:serve:dev 실행 필요)
+npx nx run twenty-front:storybook:coverage # (yarn storybook:serve:dev 실행 필요)
+```
+
+## 기술 스택
+
+프로젝트는 최소한의 보일러플레이트 코드로 깔끔하고 단순한 스택을 가지고 있습니다.
+
+**앱**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](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/)
+
+**도구**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## 아키텍처
+
+### 라우팅
+
+[React Router](https://reactrouter.com/)가 라우팅을 처리합니다.
+
+불필요한 [재렌더링](/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders)을 피하기 위해 모든 라우팅 로직은 `PageChangeEffect`의 `useEffect`에 있습니다.
+
+### 상태 관리
+
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts)이 상태 관리를 처리합니다.
+
+상태 관리에 대한 자세한 정보는 [최고의 관례](/l/ko/developers/contribute/capabilities/frontend-development/best-practices-front#state-management)를 참조하십시오.
+
+## 테스트
+
+[Jest](https://jestjs.io/)는 유닛 테스트 도구로 사용되고 [Storybook](https://storybook.js.org/)은 컴포넌트 테스트에 사용됩니다.
+
+Jest는 주로 유틸리티 함수 테스트에 사용되며, 직접 컴포넌트를 테스트하지는 않습니다.
+
+Storybook은 개별 컴포넌트의 동작을 테스트하고 디자인 시스템을 표시하는 데 사용됩니다.
diff --git a/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
new file mode 100644
index 0000000000..7273c3f74c
--- /dev/null
+++ b/packages/twenty-docs/l/ko/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -0,0 +1,58 @@
+---
+title: Figma와 함께 작업하기
+info: Twenty의 Figma와 협업하는 방법을 배우기
+---
+
+Figma는 디자이너와 개발자 간의 소통 장벽을 허무는 협업 인터페이스 디자인 도구입니다.
+이 가이드는 Figma와 협업하는 방법을 설명합니다.
+
+## 접근하기
+
+1. **공유 링크에 접근:** 프로젝트의 Figma 파일에 [여기서](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty) 접근할 수 있습니다.
+2. **로그인:** 이미 로그인하지 않은 경우, Figma에서 로그인 하라는 요청을 받을 것입니다.
+ 전문 모드 및 전용 프레임 선택 기능과 같이 로그인한 사용자에게만 제공되는 주요 기능이 있습니다.
+
+
+ 계정 없이는 효과적으로 협업할 수 없습니다.
+
+
+## Figma 구조
+
+왼쪽 사이드바에서 Twenty의 Figma의 다양한 페이지에 접근할 수 있습니다. 이들은 이렇게 구성되어 있습니다:
+
+* **구성 요소 페이지:** 첫 번째 페이지입니다. 디자이너는 디자인 파일 전반에 걸쳐 재사용 가능한 디자인 요소를 생성하고 조직하는 데 사용합니다. 예를 들어, 버튼, 아이콘, 심벌 또는 기타 재사용 가능한 구성 요소가 있습니다. 디자인 전체에서 일관성을 유지하는 역할을 합니다.
+* **메인 페이지:** 두 번째 페이지는 프로젝트의 완전한 사용자 인터페이스를 보여주는 메인 페이지입니다. 전체 앱 프로토타입을 사용하려면 ***재생*** 버튼을 누르세요.
+* **기능 페이지:** 다른 페이지는 일반적으로 진행중인 기능에 전용되어 있습니다. 이 페이지들은 애플리케이션이나 웹사이트의 특정 기능 또는 모듈의 디자인을 포함하고 있습니다. 일반적으로 아직 진행 중인 상태입니다.
+
+## 유용한 팁
+
+읽기 전용 접근 권한으로는 디자인을 편집할 수 없지만, 디자인을 코드로 변환하는 데 유용한 모든 기능에 접근할 수 있습니다.
+
+### 개발 모드 사용
+
+Figma의 Dev Mode는 쉬운 디자인 탐색, 효과적인 자산 관리, 효율적인 통신 도구, 도구 상자 통합, 빠른 코드 스니펫, 주요 레이어 정보를 제공하여 디자이너와 개발자 간의 격차를 줄입니다. Dev Mode에 대해 더 알고 싶으시면 [여기](https://www.figma.com/dev-mode/)를 방문하세요.
+
+툴바의 오른쪽에서 "개발자" 모드로 전환하여 디자인 사양을 보고 CSS를 복사하고 자산에 접근하세요.
+
+### 프로토타입 사용
+
+캔버스의 아무 요소나 클릭하고 인터페이스의 오른쪽 상단 모서리에 있는 "재생" 버튼을 눌러 프로토타입 보기에 접근하세요. 프로토타입 모드는 디자인을 최종 제품처럼 상호작용할 수 있게 합니다. 이를 통해 화면 간의 흐름과 버튼, 링크, 메뉴 등과 같은 인터페이스 요소가 상호작용할 때 어떻게 작동하는지 보여줍니다.
+
+1. **전환 및 애니메이션 이해하기:** 프로토타입 모드에서는 디자이너가 화면 또는 UI 요소 간에 추가한 전환이나 애니메이션을 볼 수 있어 개발자에게 의도된 동작 및 스타일에 대한 명확한 시각적 지침을 제공합니다.
+2. **실행 명확화:** 프로토타입은 모호성을 줄이는 데 도움을 줄 수 있습니다. 개발자는 특정 요소의 기능이나 모양을 보다 잘 이해하기 위해 이를 상호작용할 수 있습니다.
+
+Figma 플랫폼 학습에 대한 포괄적인 세부 정보와 지침을 얻으시려면 [공식 Figma 문서](https://help.figma.com/hc/en-us)를 방문하세요.
+
+### 거리 측정
+
+요소를 선택하고 `Option` 키(Mac) 또는 `Alt` 키(Windows)를 누른 상태에서 다른 요소 위에 마우스를 올리면 요소 간 거리를 확인할 수 있습니다.
+
+### VSCode용 Figma 확장 프로그램 (추천)
+
+[VS Code용 Figma](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension) 확장 프로그램은 텍스트 편집기에서 벗어나지 않고 디자인 파일 탐색 및 점검, 디자이너와의 협업, 변경 사항 추적, 구현 속도 향상을 가능하게 합니다.
+추천하는 확장 프로그램의 일부입니다.
+
+## 협업
+
+1. **댓글 사용하기:** 툴바 왼쪽의 말풍선 아이콘을 클릭하여 댓글 기능을 사용할 수 있습니다.
+2. **커서 채팅:** Figma의 멋진 기능 중 하나는 커서 채팅입니다. Figma를 다른 누군가와 동시에 사용하는 것을 보면 `;` (Mac)이나 `/` (Windows) 키를 눌러 메시지를 보낼 수 있습니다.
diff --git a/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx
index 0d9c355e33..c36674c726 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/display/app-tooltip.mdx
@@ -4,57 +4,31 @@ image: /images/user-guide/tips/light-bulb.png
---
-
+
요소와 상호작용할 때 추가 정보를 표시하는 간단한 메시지입니다.
-
-
-```jsx
-import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-
-export const MyComponent = () => {
- return (
- <>
-
- Customer Insights
-
-
- >
- );
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| ------ | --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| 클래스 네임 | 문자열 | 추가 스타일링을 위한 선택적 CSS 클래스 |
-| 앵커 선택 | CSS 선택자 | 툴팁 앵커(툴팁을 트리거하는 요소)의 선택자 |
-| 내용 | 문자열 | 툴팁 내에 표시할 내용을 입력하세요 |
-| 지연 숨기기 | 숫자 | 커서가 앵커를 떠난 후 툴팁이 숨겨지기까지의 지연 시간(초) |
-| 오프셋 | 숫자 | 툴팁 위치 조건을 위한 픽셀 단위의 오프셋 |
-| 화살표 없음 | 부울 | `true`이면 툴팁의 화살표가 숨겨집니다 |
-| 열림 여부 | 부울 | `true`이면 툴팁이 기본적으로 열려 있습니다 |
-| 위치 | `react-tooltip`의 `PlacesType` 문자열 | 툴팁의 배치를 지정합니다. 값으로는 `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, `left-end` 등이 있습니다. |
-| 위치 전략 | `react-tooltip`의 `PositionStrategy` 문자열 | 툴팁에 대한 위치 전략입니다. 두 가지 값: `absolute` 및 `fixed` |
-
-
+
+ ```jsx
+ import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";\n\nexport const MyComponent = () => {\n return (\n <>\n \n 고객 인사이트\n
\n \n >\n );\n};
+ ```
+
+
+ | 프로퍼티 | 유형 | 설명 |
+ | ------ | --------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | 클래스 네임 | 문자열 | 추가 스타일링을 위한 선택적 CSS 클래스 |
+ | 앵커 선택 | CSS 선택자 | 툴팁 앵커(툴팁을 트리거하는 요소)의 선택자 |
+ | 내용 | 문자열 | 툴팁 내에 표시할 내용을 입력하세요 |
+ | 지연 숨기기 | 숫자 | 커서가 앵커를 떠난 후 툴팁이 숨겨지기까지의 지연 시간(초) |
+ | 오프셋 | 숫자 | 툴팁 위치 조건을 위한 픽셀 단위의 오프셋 |
+ | 화살표 없음 | 부울 | `true`이면 툴팁의 화살표가 숨겨집니다 |
+ | 열림 여부 | 부울 | `true`이면 툴팁이 기본적으로 열려 있습니다 |
+ | 위치 | `react-tooltip`의 `PlacesType` 문자열 | 툴팁의 배치를 지정합니다. 값으로는 `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, `left-end` 등이 있습니다. |
+ | 위치 전략 | `react-tooltip`의 `PositionStrategy` 문자열 | 툴팁에 대한 위치 전략입니다. 두 가지 값: `absolute` 및 `fixed` |
+
## 툴팁이 포함된 오버플로 텍스트
@@ -62,27 +36,15 @@ export const MyComponent = () => {
텍스트가 넘칠 경우 처리하고 툴팁을 표시합니다.
-
-
-```jsx
-import { OverflowingTextWithTooltip } from 'twenty-ui/display';
-
-export const MyComponent = () => {
- const crmTaskDescription =
- 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-
- return ;
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| ---- | --- | -------------------------- |
-| 텍스트 | 문자열 | 오버플로 텍스트 영역에 표시할 내용을 입력하세요 |
-
-
+
+ ```jsx
+ import { OverflowingTextWithTooltip } from 'twenty-ui/display';\n\nexport const MyComponent = () => {\n const crmTaskDescription =\n '최근 제품 문의에 대한 클라이언트의 후속 조치 사항을 따릅니다. 가격 옵션을 논의하고, 우려 사항을 해결하며, 추가 제품 정보를 제공합니다. 대화 내용을 미래 참조를 위해 CRM에 기록하세요.';\n\n return ;\n};
+ ```
+
+
+ | 프로퍼티 | 유형 | 설명 |
+ | ---- | --- | -------------------------- |
+ | 텍스트 | 문자열 | 오버플로 텍스트 영역에 표시할 내용을 입력하세요 |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input.mdx b/packages/twenty-docs/l/ko/twenty-ui/input.mdx
index 61ed0ea41e..74f860155d 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx
index c09281d778..027ef5da9c 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/checkbox.mdx
@@ -4,44 +4,41 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
+
사용자가 여러 옵션 중 여러 값을 선택해야 할 때 사용됩니다.
-
+
+ ```jsx
+ import { Checkbox } from "twenty-ui/display";
-```jsx
-import { Checkbox } from "twenty-ui/display";
+ export const MyComponent = () => {
+ return (
+ console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
- console.log("onChange function fired")}
- onCheckedChange={() => console.log("onCheckedChange function fired")}
- variant="primary"
- size="small"
- shape="squared"
- />
- );
-};
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| --------------- | -------- | -------------------------------------------------------------------------------------------------- |
-| 체크됨 | 부울 | 체크박스가 체크된 상태인지 나타냅니다 |
-| 불확정 | 부울 | 체크박스가 불확정 상태(체크되지 않음과 체크됨의 중간)에 있는지 나타냅니다 |
-| onChange | function | 체크박스 상태가 변경될 때 호출할 콜백 함수입니다. |
-| onCheckedChange | function | `checked` 상태가 변경될 때 호출할 콜백 함수입니다. |
-| 변형 | 문자열 | 박스의 시각적 스타일 변형입니다. 옵션에는 `primary`, `secondary`, `tertiary`가 포함됩니다. |
-| 크기 | 문자열 | 체크박스의 크기입니다. 두 가지 옵션이 있습니다: `small`과 `large` |
-| 모양 | 문자열 | 체크박스의 모양입니다. 두 가지 옵션이 있습니다: `squared`와 `rounded` |
-
-
+
+ | 프로퍼티 | 유형 | 설명 |
+ | --------------- | --- | ----------------------------------------------------------------- |
+ | 체크됨 | 부울 | 체크박스가 체크된 상태인지 나타냅니다 |
+ | 불확정 | 부울 | 체크박스가 불확정 상태(체크되지 않음과 체크됨의 중간)에 있는지 나타냅니다 |
+ | onChange | 함수 | 체크박스 상태가 변경될 때 호출할 콜백 함수입니다. |
+ | onCheckedChange | 함수 | `checked` 상태가 변경될 때 호출할 콜백 함수입니다. |
+ | 변형 | 문자열 | 박스의 시각적 스타일 변형입니다. 옵션에는 `primary`, `secondary`, `tertiary`가 포함됩니다 |
+ | 크기 | 문자열 | 체크박스의 크기입니다. 두 가지 옵션이 있습니다: `small`과 `large` |
+ | 모양 | 문자열 | 체크박스의 모양입니다. 두 가지 옵션이 있습니다: `squared`와 `rounded` |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx b/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx
index 7fb33d882f..9f27f5d1c5 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/input/image-input.mdx
@@ -4,34 +4,31 @@ image: /images/user-guide/objects/objects.png
---
-
+
사용자가 이미지를 업로드하고 제거할 수 있도록 합니다.
-
+
+ ```jsx
+ import { ImageInput } from "@/ui/input/components/ImageInput";
-```jsx
-import { ImageInput } from "@/ui/input/components/ImageInput";
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| ------------ | -------- | ------------------------------------------------------------------------------------- |
-| 사진 | 문자열 | 이미지 소스 URL |
-| onUpload | function | 사용자가 새 이미지를 업로드할 때 호출되는 함수입니다. `File` 객체를 매개변수로 받습니다. |
-| onRemove | function | 사용자가 제거 버튼을 클릭할 때 호출되는 함수입니다. |
-| onAbort | function | 사용자가 이미지 업로드 중 중단 버튼을 클릭할 때 호출되는 함수입니다. |
-| isUploading | 부울 | 이미지가 현재 업로드 중인지 여부를 나타냅니다. |
-| errorMessage | 문자열 | 이미지 입력 아래에 표시할 선택적 오류 메시지입니다. |
-| disabled | 부울 | `true`인 경우 전체 입력이 비활성화되고 버튼을 클릭할 수 없습니다. |
-
-
+
+ | 프로퍼티 | 유형 | 설명 |
+ | ------------ | --- | ----------------------------------------------------- |
+ | 사진 | 문자열 | 이미지 소스 URL |
+ | onUpload | 함수 | 사용자가 새 이미지를 업로드할 때 호출되는 함수입니다. `File` 객체를 매개변수로 받습니다. |
+ | onRemove | 함수 | 사용자가 제거 버튼을 클릭할 때 호출되는 함수입니다. |
+ | onAbort | 함수 | 사용자가 이미지 업로드 중 중단 버튼을 클릭할 때 호출되는 함수입니다. |
+ | isUploading | 부울 | 이미지가 현재 업로드 중인지 여부를 나타냅니다. |
+ | errorMessage | 문자열 | 이미지 입력 아래에 표시할 선택적 오류 메시지입니다. |
+ | disabled | 부울 | `true`인 경우 전체 입력이 비활성화되고 버튼을 클릭할 수 없습니다. |
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx
index ddf8d6f1bf..e9a819550b 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx
index fef13fa1be..fc99944018 100644
--- a/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/ko/twenty-ui/navigation/step-bar.mdx
@@ -4,35 +4,31 @@ image: /images/user-guide/api/api.png
---
-
+
활성 단계가 강조 표시되어 있는 다단계 진행 상황을 표시합니다. 각각의 `Step` 구성 요소로 표현되는 단계를 포함하는 컨테이너를 렌더링합니다.
-
+
+ ```jsx
+ import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
-```jsx
-import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
+ export const MyComponent = () => {
+ return (
+
+ 1단계
+ 2단계
+ 3단계
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
- Step 1
- Step 2
- Step 3
-
- );
-};
-```
-
-
-
-
-
-| 프로퍼티 | 유형 | 설명 |
-| ---------- | -- | ----------------------------------------------------------------------------------- |
-| activeStep | 숫자 | 현재 활성 단계의 인덱스입니다. 어느 단계가 시각적으로 강조 표시되어야 하는지를 결정합니다. |
-
-
+
+ | 프로퍼티 | 유형 | 설명 |
+ | ---------- | -- | --------------------------------------------------- |
+ | activeStep | 숫자 | 현재 활성 단계의 인덱스입니다. 어느 단계가 시각적으로 강조 표시되어야 하는지를 결정합니다. |
+
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/best-practices-server.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/best-practices-server.mdx
new file mode 100644
index 0000000000..4d7666f9ff
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/best-practices-server.mdx
@@ -0,0 +1,22 @@
+---
+title: Melhores Práticas
+---
+
+Este documento descreve as melhores práticas que você deve seguir ao trabalhar no backend.
+
+## Siga uma abordagem modular
+
+O backend segue uma abordagem modular, que é um princípio fundamental ao trabalhar com NestJS. Certifique-se de dividir seu código em módulos reutilizáveis para manter uma base de código limpa e organizada.
+Cada módulo deve encapsular um recurso ou funcionalidade específico e ter um escopo bem definido. Esta abordagem modular permite uma clara separação de preocupações e remove complexidades desnecessárias.
+
+## Expor serviços para uso em módulos
+
+Sempre crie serviços que tenham uma responsabilidade clara e única, o que melhora a legibilidade e a manutenção do código. Nomeie os serviços de forma descritiva e consistente.
+
+Você também deve expor serviços que deseja usar em outros módulos. Expor serviços para outros módulos é possível através do poderoso sistema de injeção de dependências do NestJS e promove o acoplamento frouxo entre os componentes.
+
+## Evite usar o tipo `any`
+
+Quando você declara uma variável como `any`, o verificador de tipos do TypeScript não realiza nenhuma verificação de tipo, tornando possível atribuir qualquer tipo de valores à variável. O TypeScript usa inferência de tipos para determinar o tipo da variável com base no valor. Ao declará-lo como `any`, o TypeScript não pode mais inferir o tipo. Isso torna difícil capturar erros relacionados a tipos durante o desenvolvimento, levando a erros em tempo de execução e tornando o código menos mantenível, menos confiável e mais difícil de entender para os outros.
+
+Por isso, tudo deve ter um tipo. Assim, se você criar um novo objeto com um primeiro nome e um sobrenome, deve criar uma interface ou tipo que contenha um primeiro nome e um sobrenome que defina a forma do objeto que você está manipulando.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..08b6a416d3
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Fila de Mensagens
+---
+
+Filas facilitam operações assíncronas a serem realizadas. Elas podem ser usadas para realizar tarefas em segundo plano, como enviar um email de boas-vindas ao se registrar.
+Cada caso de uso terá sua própria classe de fila estendida de `MessageQueueServiceBase`.
+
+Atualmente, só damos suporte ao `bull-mq`[bull-mq](https://bullmq.io/) como o driver de fila.
+
+## Passos para criar e usar uma nova fila
+
+1. Adicione um nome de fila para sua nova fila no enum `MESSAGE_QUEUES`.
+2. Forneça a implementação da fábrica da fila com o nome da fila como o token de dependência.
+3. Injete a fila que você criou no módulo/serviço necessário com o nome da fila como o token de dependência.
+4. Adicione uma classe de trabalhador com injeção baseada em token, assim como o produtor.
+
+### Exemplo de uso
+
+```ts
+classe Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //lógica de negócio
+ await this.queue.add(someData);
+ }
+}
+
+//trabalhador assíncrono
+classe CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //lógica do trabalhador
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..b88eae11ea
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,83 @@
+---
+title: Aplicativo Zapier
+---
+
+Sincronize o Twenty com mais de 3000 aplicativos usando [Zapier](https://zapier.com/) sem esforço. Automatize tarefas, aumente a produtividade e potencialize seus relacionamentos com clientes!
+
+## Sobre o Zapier
+
+O Zapier é uma ferramenta que permite automações de fluxos de trabalho conectando os aplicativos que sua equipe usa todos os dias. O conceito fundamental do Zapier são automações de fluxos de trabalho, chamadas Zaps, que incluem disparadores e ações.
+
+Você pode aprender mais sobre como o Zapier funciona [aqui](https://zapier.com/how-it-works).
+
+## Configuração
+
+### Etapa 1: Instalar pacotes do Zapier
+
+```bash
+cd packages/twenty-zapier
+
+yarn
+```
+
+### Etapa 2: Faça login com o CLI
+
+Use suas credenciais do Zapier para fazer login usando o CLI:
+
+```bash
+zapier login
+```
+
+### Etapa 3: Defina as variáveis de ambiente
+
+Na pasta `packages/twenty-zapier`, execute:
+
+```bash
+cp .env.example .env
+```
+
+Execute o aplicativo localmente, vá para [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks) e gere uma chave API.
+
+Substitua o valor **YOUR_API_KEY** no arquivo `.env` pela chave API que você acabou de gerar.
+
+## Desenvolvimento
+
+
+ Certifique-se de executar `yarn build` antes de qualquer comando `zapier`.
+
+
+### Teste
+
+```bash
+yarn test
+```
+
+### Lint
+
+```bash
+yarn format
+```
+
+### Assista e compile enquanto edita o código
+
+```bash
+yarn watch
+```
+
+### Valide seu aplicativo Zapier
+
+```bash
+yarn validate
+```
+
+### Implante seu aplicativo Zapier
+
+```bash
+yarn deploy
+```
+
+### Liste todos os comandos CLI do Zapier
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
new file mode 100644
index 0000000000..5f292abe03
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -0,0 +1,109 @@
+---
+title: Arquitetura de Pastas
+info: Um olhar detalhado sobre nossa arquitetura de pastas
+---
+
+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.
+
+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 manutenível.
+
+```
+front
+└───modules
+│ └───module1
+│ │ └───submodule1
+│ └───module2
+│ └───ui
+│ │ └───display
+│ │ └───inputs
+│ │ │ └───buttons
+│ │ └───...
+└───pages
+└───...
+```
+
+## Páginas
+
+Inclui os componentes de nível superior definidos pelas rotas da aplicação. Elas importam componentes de nível mais baixo da pasta `modules` (mais detalhes abaixo).
+
+## Módulos
+
+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
+ └───components
+ │ └───component1
+ │ └───component2
+ └───constants
+ └───contexts
+ └───graphql
+ │ └───fragments
+ │ └───queries
+ │ └───mutations
+ └───hooks
+ │ └───internal
+ └───states
+ │ └───selectors
+ └───types
+ └───utils
+```
+
+### Contextos
+
+Um contexto é uma maneira de passar dados através da árvore de componentes sem ter que passar propriedades manualmente em cada nível.
+
+Veja [React Context](https://react.dev/reference/react#context-hooks) para mais detalhes.
+
+### GraphQL
+
+Inclui fragmentos, consultas e mutações.
+
+Veja [GraphQL](https://graphql.org/learn/) para mais detalhes.
+
+* Fragmentos
+
+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.
+
+Veja [GraphQL Fragments](https://graphql.org/learn/queries/#fragments) para mais detalhes.
+
+* Consultas
+
+Veja [GraphQL Queries](https://graphql.org/learn/queries/) para mais detalhes.
+
+* Mutações
+
+Veja [GraphQL Mutations](https://graphql.org/learn/queries/#mutations) para mais detalhes.
+
+### Hooks
+
+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) lida com isso.
+
+* Seletores: Veja [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors) para mais detalhes.
+
+O gerenciamento de estado embutido do React ainda lida com o estado dentro de um componente.
+
+### Utilitários
+
+Deve conter apenas funções puras reutilizáveis. Caso contrário, crie hooks personalizados na pasta `hooks`.
+
+## UI
+
+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 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`, é 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, exceto da pasta `ui`. Isso manterá seu código fácil de testar.
+
+### Interno
+
+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/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..502b747104
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: Comandos do Frontend
+---
+
+## Comandos Úteis
+
+### Iniciando o aplicativo
+
+```bash
+npx nx start twenty-front
+```
+
+### Regenerar esquema GraphQL baseado no esquema de API GraphQL
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+OU
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### Lint
+
+```bash
+npx nx run twenty-front:lint # passe --fix para corrigir erros de lint
+```
+
+## Traduções
+
+```bash
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
+```
+
+### Teste
+
+```bash
+npx nx run twenty-front:test # execute testes com jest
+npx nx run twenty-front:storybook:serve:dev # execute storybook
+npx nx run twenty-front:storybook:test # execute testes # (precisa de yarn storybook:serve:dev em execução)
+npx nx run twenty-front:storybook:coverage # (precisa de yarn storybook:serve:dev em execução)
+```
+
+## Pilha de Tecnologias
+
+O projeto possui uma pilha limpa e simples, com pouco código boilerplate.
+
+**Aplicativo**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](https://the-guild.dev/graphql/codegen)
+* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
+* [TypeScript](https://www.typescriptlang.org/)
+
+**Testes**
+
+* [Jest](https://jestjs.io/)
+* [Storybook](https://storybook.js.org/)
+
+**Ferramentas**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## Arquitetura
+
+### Roteamento
+
+[React Router](https://reactrouter.com/) gerencia o roteamento.
+
+Para evitar [re-renderizações](/l/pt/developers/contribute/capabilities/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) gerencia o estado.
+
+Veja [melhores práticas](/l/pt/developers/contribute/capabilities/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 teste de componentes.
+
+Jest é principalmente para testar funções utilitárias, e não os componentes em si.
+
+Storybook é para testar o comportamento de componentes isolados, bem como exibir o sistema de design.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..ee753b30db
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Teclas de atalho
+---
+
+## Introdução
+
+Quando você precisa ouvir uma tecla de atalho, normalmente usaria o listener de evento `onKeyDown`.
+
+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ê 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.
+
+## O hook `useScopedHotkeys`
+
+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 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á dois passos envolvidos na configuração da escuta de teclas de atalho :
+
+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 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
+
+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 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.
+
+### Ouvindo teclas de atalho em uma página
+
+Exemplo :
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Defina o escopo da tecla de atalho em um useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Volte para o escopo de atalho anterior quando o componente for desmontado
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Use o hook useScopedHotkeys
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Alguma lógica executada nesta página quando o usuário pressiona Enter
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return Minha página que escuta Enter
+};
+```
+
+### Ouvindo teclas de atalho em um componente do tipo modal
+
+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.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Defina o escopo da tecla de atalho quando o usuário abrir o modal
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Volte para o escopo de atalho anterior quando o modal for fechado
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
Minha página com um modal
+ Abrir modal
+ {showModal && }
+ ;
+};
+```
+
+Então no componente modal :
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Use o hook useScopedHotkeys para ouvir o Escape.
+ // Note que Escape é uma tecla de atalho comum que pode ser usada por muitos outros componentes
+ // Portanto, é importante usar um escopo de tecla para evitar conflitos
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return Meu componente modal
;
+};
+```
+
+É 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 tecla de atalho?
+
+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ê 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 tecla de atalho para cada página são definidos no enum `PageHotkeyScope`:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+Internamente, o escopo atualmente selecionado é armazenado em um estado Recoil que é compartilhado por toda a aplicação :
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+Mas esse estado Recoil nunca deve ser manipulado manualmente! Veremos como usá-lo na próxima seção.
+
+## Como funciona internamente?
+
+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 Recoil para gerenciar o estado do escopo da tecla de atalho e torná-lo disponível em toda a aplicação.
diff --git a/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..62e7a9ebf2
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Navegue pela biblioteca de componentes UI do Twenty
+---
+
+Veja toda a nossa biblioteca de componentes e documentação no Storybook.
+
+[Abra o Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/pt/developers/self-host/capabilities/cloud-providers.mdx b/packages/twenty-docs/l/pt/developers/self-host/capabilities/cloud-providers.mdx
new file mode 100644
index 0000000000..8476254c26
--- /dev/null
+++ b/packages/twenty-docs/l/pt/developers/self-host/capabilities/cloud-providers.mdx
@@ -0,0 +1,45 @@
+---
+title: Outros métodos
+---
+
+
+ Este documento é mantido pela comunidade. Pode conter problemas.
+
+
+## Kubernetes via Terraform e Manifests
+
+A documentação liderada pela comunidade para a implantação do Kubernetes está disponível [aqui](https://github.com/twentyhq/twenty/tree/main/packages/twenty-docker/k8s)
+
+### Coolify
+
+Implante o Twenty em servidores usando o Coolify. (imagem oficial no Coolify estará disponível em breve)
+
+[Documentação Coolify](https://coolify.io/docs/get-started/introduction)
+
+### EasyPanel
+
+Implante o Twenty no EasyPanel com o modelo mantido pela comunidade abaixo.
+
+[Implante no EasyPanel](https://easypanel.io/docs/templates/twenty)
+
+### Elest.io
+
+Implante o Twenty em servidores com Elest.io usando o link abaixo.
+
+[Implante no Elest.io](https://elest.io/open-source/twenty)
+
+### Twenty no Railway
+
+Implante o Twenty no Railway com o modelo mantido pela comunidade abaixo.
+
+[](https://railway.com/deploy/nAL3hA)
+
+### Twenty no Sealos
+
+Implante o Twenty no Sealos com o modelo mantido pela comunidade abaixo.
+
+[](https://sealos.io/products/app-store/twenty)
+
+## Outros
+
+Sinta-se à vontade para abrir um PR para adicionar mais opções de Provedor de Nuvem.
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 ccabb2baad..257426ad45 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
@@ -4,57 +4,52 @@ image: /images/user-guide/tips/light-bulb.png
---
-
+
Uma mensagem breve que exibe informações adicionais quando um usuário interage com um elemento.
-
+
+ ```jsx
+ import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-```jsx
-import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-
-export const MyComponent = () => {
- return (
- <>
-
- Customer Insights
-
-
- >
- );
-};
-```
-
-
-
-
-
-| 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`. |
-
-
+ export const MyComponent = () => {
+ return (
+ <>
+
+ Customer Insights
+
+
+ >
+ );
+ };
+ ```
+
+
+ | 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 Overflow com Dica
@@ -62,27 +57,22 @@ export const MyComponent = () => {
Lida com texto em excesso e exibe uma dica quando o texto transborda.
-
+
+ ```jsx
+ import { OverflowingTextWithTooltip } from 'twenty-ui/display';
-```jsx
-import { OverflowingTextWithTooltip } from 'twenty-ui/display';
+ export const MyComponent = () => {
+ const crmTaskDescription =
+ 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-export const MyComponent = () => {
- const crmTaskDescription =
- 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-
- return ;
-};
-```
-
-
-
-
-
-| Propriedades | Tipo | Descrição |
-| ------------ | ------ | ----------------------------------------------------------------------------- |
-| texto | string | O conteúdo que você deseja exibir na área de texto excessivo. |
-
-
+ return ;
+ };
+ ```
+
+
+ | 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/twenty-ui/input.mdx b/packages/twenty-docs/l/pt/twenty-ui/input.mdx
index e2e309dc53..70eff960cc 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx
index c1204bd49d..5c3636d8cc 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx
index c391e5d583..8384668f35 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation/links.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
## Link de Contato
@@ -12,44 +12,40 @@ image: /images/user-guide/what-is-twenty/20.png
Um componente de link estilizado para exibir informações de contato.
-
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
+ import { ContactLink } from 'twenty-ui/navigation';
-import { ContactLink } from 'twenty-ui/navigation';
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('Link de contato clicado!', event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| Propriedades | Tipo | Descrição |
-| ------------ | ----------------- | ----------------------------------------------------------------------- |
-| className | string | Nome opcional para estilização adicional. |
-| href | string | A URL ou caminho de destino para o link |
-| onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
-| filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
-
-
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
+ ```
+
+
+ | Propriedades | Tipo | Descrição |
+ | ------------ | ----------------- | ----------------------------------------------------------------------- |
+ | className | string | Nome opcional para estilização adicional |
+ | href | string | A URL ou caminho de destino para o link |
+ | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
+ | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
+
## Link Puro
@@ -57,39 +53,36 @@ export const MyComponent = () => {
Um componente de link estilizado para exibir links.
-
+
+ ```jsx
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Link de contato clicado!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Fale Conosco
+
+
+ );
+ };
- return (
-
-
- Contact Us
-
-
- );
-};
+ ```
+
-```
-
-
-
-
-| Propriedades | Tipo | Descrição |
-| ------------ | ----------------- | ----------------------------------------------------------------------- |
-| className | string | Nome opcional para estilização adicional. |
-| href | string | A URL ou caminho de destino para o link |
-| aoClicar | função | Função de retorno de chamada para ser disparada quando o link é clicado |
-| filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
-
-
+
+ | Propriedades | Tipo | Descrição |
+ | ------------ | ----------------- | ----------------------------------------------------------------------- |
+ | className | string | Nome opcional para estilização adicional. |
+ | href | string | A URL ou caminho de destino para o link |
+ | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
+ | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
+
## Link Arredondado
@@ -97,38 +90,34 @@ export const MyComponent = () => {
Um link estilizado de forma arredondada com um componente Chip para links.
-
+
+ ```jsx
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Link de contato clicado!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Fale Conosco
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| Propriedades | Tipo | Descrição |
-| ------------ | ----------------- | ----------------------------------------------------------------------- |
-| href | string | A URL ou caminho de destino para o link |
-| filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
-| aoClicar | função | Função de retorno de chamada para ser disparada quando o link é clicado |
-
-
+
+ | Propriedades | Tipo | Descrição |
+ | ------------ | ----------------- | ----------------------------------------------------------------------- |
+ | href | string | A URL ou caminho de destino para o link |
+ | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
+ | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
+
## Link Social
@@ -136,33 +125,30 @@ export const MyComponent = () => {
Links sociais estilizados, com suporte para vários tipos de links sociais, como URLs, LinkedIn e X (ou Twitter).
-
+
+ ```jsx
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| Propriedades | Tipo | Descrição |
-| ------------ | ----------------- | ------------------------------------------------------------------------------------------------------ |
-| href | string | A URL ou caminho de destino para o link |
-| filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
-| tipo | string | O tipo de links sociais. Opções incluem: `url`, `LinkedIn` e `Twitter` |
-| onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
-
-
+
+ | Propriedades | Tipo | Descrição |
+ | ------------ | ----------------- | ----------------------------------------------------------------------- |
+ | href | string | A URL ou caminho de destino para o link |
+ | filhos | `React.ReactNode` | O conteúdo a ser exibido dentro do link |
+ | tipo | string | O tipo de links sociais. Opções incluem: `url`, `LinkedIn` e `Twitter` |
+ | onClick | função | Função de retorno de chamada para ser disparada quando o link é clicado |
+
diff --git a/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx
index f28e91ef86..dd1bf266bd 100644
--- a/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/pt/twenty-ui/navigation/step-bar.mdx
@@ -4,35 +4,31 @@ image: /images/user-guide/api/api.png
---
-
+
Exibe o progresso por meio de uma sequência de passos numerados destacando o passo ativo. Ele renderiza um contêiner com passos, cada um representado pelo componente `Step`.
-
+
+ ```jsx
+ import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
-```jsx
-import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
+ export const MyComponent = () => {
+ return (
+
+ Passo 1
+ Passo 2
+ Passo 3
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
- Step 1
- Step 2
- Step 3
-
- );
-};
-```
-
-
-
-
-
-| Propriedades | Tipo | Descrição |
-| ------------ | ------ | ------------------------------------------------------------------------------------------------------------ |
-| passoAtivo | número | O índice do passo atualmente ativo. Isso determina qual passo deve ser visualmente destacado |
-
-
+
+ | Propriedades | Tipo | Descrição |
+ | ------------ | ------ | -------------------------------------------------------------------------------------------- |
+ | passoAtivo | número | O índice do passo atualmente ativo. Isso determina qual passo deve ser visualmente destacado |
+
diff --git a/packages/twenty-docs/l/ro/developers/contribute/capabilities/backend-development/custom-objects.mdx b/packages/twenty-docs/l/ro/developers/contribute/capabilities/backend-development/custom-objects.mdx
new file mode 100644
index 0000000000..1f06feceff
--- /dev/null
+++ b/packages/twenty-docs/l/ro/developers/contribute/capabilities/backend-development/custom-objects.mdx
@@ -0,0 +1,39 @@
+---
+title: Obiecte personalizate
+---
+
+Obiectele sunt structuri care îți permit să stochezi date (înregistrări, atribute și valori) specifice organizației tale. Twenty oferă atât obiecte standard, cât și personalizate.
+
+Obiectele standard sunt obiecte încorporate cu un set de atribute disponibile pentru toți utilizatorii. Exemple de obiecte standard în Twenty includ Companie și Persoană. Obiectele standard au câmpuri standard care sunt disponibile pentru toți utilizatorii Twenty, cum ar fi Company.displayName.
+
+Obiectele personalizate sunt acelea pe care le poți crea pentru a stoca informații unice pentru organizația ta. Nu sunt încorporate; membrii workspace-ului tău pot crea și personaliza obiecte personalizate pentru a deține informații pentru care obiectele standard nu sunt adecvate.
+
+## Schema la nivel înalt
+
+
+
+
+
+
+
+## Cum funcționează
+
+Obiectele personalizate provin din tabele de metadate care determină forma, numele și tipul obiectelor. Toate aceste informații sunt prezente în baza de date de schema de metadate, constând din tabele:
+
+* **DataSource**: Detalii privind locul unde sunt prezente datele.
+* **Object**: Descrie obiectul și îl leagă de un DataSource.
+* **Field**: Prezintă câmpurile unui Obiect și le conectează la Obiect.
+
+Pentru a adăuga un obiect personalizat, membrul workspace-ului va interoga API-ul /metadata. Aceasta actualizează metadatele în consecință și calculează o schemă GraphQL pe baza metadatelor, stocând-o în cache-ul GQL pentru utilizare ulterioară.
+
+
+
+
+
+
+
+Pentru a prelua datele, procesul implică realizarea de interogări prin endpoint-ul /graphql și transmiterea lor prin Query Resolver.
+
+
+
+
diff --git a/packages/twenty-docs/l/ro/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/ro/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..abb813f295
--- /dev/null
+++ b/packages/twenty-docs/l/ro/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Răsfoiește biblioteca de componente UI Twenty
+---
+
+Vizualizați biblioteca noastră completă de componente și documentația în Storybook.
+
+[Deschideți Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/ro/twenty-ui/input.mdx b/packages/twenty-docs/l/ro/twenty-ui/input.mdx
index d415a68a00..498d999013 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx b/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx
index fccbcfa8ba..ca11cd3310 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/input/checkbox.mdx
@@ -4,44 +4,41 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
+
Utilizat atunci când un utilizator trebuie să selecteze mai multe valori din mai multe opțiuni.
-
+
+ ```jsx
+ import { Checkbox } din "twenty-ui/display";
-```jsx
-import { Checkbox } from "twenty-ui/display";
+ export const MyComponent = () => {
+ return (
+ console.log("onChange function fired")}
+ onCheckedChange={() => console.log("onCheckedChange function fired")}
+ variant="primary"
+ size="small"
+ shape="squared"
+ />
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
- console.log("onChange function fired")}
- onCheckedChange={() => console.log("onCheckedChange function fired")}
- variant="primary"
- size="small"
- shape="squared"
- />
- );
-};
-```
-
-
-
-
-| Proprietăți | Tip | Descriere |
-| ----------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- |
-| bifat | boolean | Indică dacă bifa este selectată |
-| indeterminat | boolean | Indică dacă bifa este într-o stare indeterminată (nici bifată, nici nebifată) |
-| onChange | funcție | Funcția de callback pe care doriți să o declanșați când starea bifei se schimbă |
-| laSchimbareBifată | funcție | Funcția de callback pe care doriți să o declanșați când starea `bifat` se schimbă |
-| variantă | șir | Variantele vizuale ale stilului cutiei. Opțiunile includ: `primar`, `secundar` și `terțiar` |
-| dimensiune | șir | Dimensiunea bifei. Are două opțiuni: `mic` și `mare` |
-| formă | șir | Forma bifei. Are două opțiuni: `pătrată` și `rotunjită` |
-
-
+
+ | Proprietăți | Tip | Descriere |
+ | ----------------- | ------- | ---------------------------------------------------------------------------------------------- |
+ | bifat | boolean | Indică dacă bifa este selectată |
+ | indeterminat | boolean | Indică dacă bifa este într-o stare indeterminată (nici bifată, nici nebifată) |
+ | laSchimbare | funcție | Funcția de callback pe care doriți să o declanșați când starea bifei se schimbă |
+ | laSchimbareBifată | funcție | Funcția de callback pe care doriți să o declanșați când starea `bifat` se schimbă |
+ | variantă | şir | Variantele vizuale ale stilului cutiei. Opțiunile includ: `principal`, `secundar` și `terțiar` |
+ | dimensiune | şir | Dimensiunea bifei. Are două opțiuni: `mic` și `mare` |
+ | formă | șir | Forma bifei. Are două opțiuni: `pătrată` și `rotunjită` |
+
diff --git a/packages/twenty-docs/l/ro/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/ro/twenty-ui/input/icon-picker.mdx
index 89c3ea0d95..b0743eda35 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/input/icon-picker.mdx
@@ -4,53 +4,49 @@ image: /images/user-guide/github/github-header.png
---
-
+
Un selector de iconițe bazat pe listă derulantă care permite utilizatorilor să selecteze o iconiță dintr-o listă.
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import React, { useState } from "react";
+ import { IconPicker } from "@/ui/input/components/IconPicker";
-
+ export const MyComponent = () => {
-```jsx
-import { RecoilRoot } from "recoil";
-import React, { useState } from "react";
-import { IconPicker } from "@/ui/input/components/IconPicker";
+ const [selectedIcon, setSelectedIcon] = useState("");
+ const handleIconChange = ({ iconKey, Icon }) => {
+ console.log("Selected Icon:", iconKey);
+ setSelectedIcon(iconKey);
+ };
-export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
- const [selectedIcon, setSelectedIcon] = useState("");
- const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Selected Icon:", iconKey);
- setSelectedIcon(iconKey);
- };
-
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| Proprietăți | Tip | Descriere |
-| --------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------- |
-| dezactivat | boolean | Dezactivează selectorul de iconițe dacă este setat pe `true` |
-| onChange | funcție | Funcția callback declanșată când utilizatorul selectează o iconiță. Primește un obiect cu proprietățile `iconKey` și `Icon` |
-| cheieIconițăSelectată | șir | Cheia iconiței selectate inițial |
-| laClickExterior | funcție | Funcția callback declanșată când utilizatorul face clic în afara listei derulante |
-| laÎnchidere | funcție | Funcția callback declanșată când lista derulantă este închisă |
-| laDeschidere | funcție | Funcția callback declanșată când lista derulantă este deschisă |
-| variantă | șir | Varianta stilului vizual al iconiței clicabile. Opțiunile includ: `primar`, `secundar` și `terțiar` |
-
-
+
+ | Proprietăți | Tip | Descriere |
+ | --------------------- | ------- | --------------------------------------------------------------------------------------------------------------------------- |
+ | dezactivat | boolean | Dezactivează selectorul de iconițe dacă este setat pe `true` |
+ | laSchimbare | funcție | Funcția callback declanșată când utilizatorul selectează o iconiță. Primește un obiect cu proprietățile `iconKey` și `Icon` |
+ | cheieIconițăSelectată | șir | Cheia iconiței selectate inițial |
+ | laClickExterior | funcție | Funcția callback declanșată când utilizatorul face clic în afara listei derulante |
+ | laÎnchidere | funcție | Funcția callback declanșată când lista derulantă este închisă |
+ | laDeschidere | funcție | Funcția callback declanșată când lista derulantă este deschisă |
+ | variantă | șir | Varianta stilului vizual al iconiței clicabile. Opțiunile includ: `primar`, `secundar` și `terțiar` |
+
diff --git a/packages/twenty-docs/l/ro/twenty-ui/navigation.mdx b/packages/twenty-docs/l/ro/twenty-ui/navigation.mdx
index ac547ff8b9..c9d30e0f29 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx b/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx
index ff1454fbaf..a8ee466db6 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/navigation/links.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
## Link de Contact
@@ -12,44 +12,40 @@ image: /images/user-guide/what-is-twenty/20.png
Un component de link stilizat pentru afișarea informațiilor de contact.
-
+
+ ```jsx
+ import { BrowserRouter as Router } from 'react-router-dom';
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
+ import { ContactLink } from 'twenty-ui/navigation';
-import { ContactLink } from 'twenty-ui/navigation';
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log('Contact link clicked!', event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| Proprietăți | Tip | Descriere |
-| ----------- | ----------------- | ------------------------------------------------------- |
-| numeClasa | șir | Nume opțional pentru stilizare suplimentară |
-| href | șir | URL-ul sau calea țintă pentru link |
-| laClick | funcție | Funcția de callback care se declanșează la clic pe link |
-| copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
-
-
+ return (
+
+
+ example@example.com
+
+
+ );
+ };
+ ```
+
+
+ | Proprietăți | Tip | Descriere |
+ | ----------- | ----------------- | ------------------------------------------------------- |
+ | numeClasa | șir | Nume opțional pentru stilizare suplimentară |
+ | href | string | URL-ul sau calea țintă pentru link |
+ | laClick | funcție | Funcția de callback care se declanșează la clic pe link |
+ | copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
+
## Link Brut
@@ -57,39 +53,35 @@ export const MyComponent = () => {
Un component de link stilizat pentru afișarea linkurilor.
-
+
+ ```jsx
+ import { RawLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contactați-ne
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-
-```
-
-
-
-
-| Proprietăți | Tip | Descriere |
-| ----------- | ----------------- | ------------------------------------------------------- |
-| numeClasa | șir | Nume opțional pentru stilizare suplimentară |
-| href | șir | URL-ul sau calea țintă pentru link |
-| laClick | funcție | Funcția de callback care se declanșează la clic pe link |
-| copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
-
-
+
+ | Proprietăți | Tip | Descriere |
+ | ----------- | ----------------- | ------------------------------------------------------- |
+ | numeClasă | string | Nume opțional pentru stilizare suplimentară |
+ | href | string | URL-ul sau calea țintă pentru link |
+ | laClick | funcție | Funcția de callback care se declanșează la clic pe link |
+ | copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
+
## Link Rotunjit
@@ -97,38 +89,34 @@ export const MyComponent = () => {
Un link stilizat cu margini rotunjite cu un component Chip pentru linkuri.
-
+
+ ```jsx
+ import { RoundedLink } from "/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ const handleLinkClick = (event) => {
+ console.log("Contact link clicked!", event);
+ };
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
+ return (
+
+
+ Contactați-ne
+
+
+ );
+ };
+ ```
+
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| Proprietăți | Tip | Descriere |
-| ----------- | ----------------- | ------------------------------------------------------- |
-| href | șir | URL-ul sau calea țintă pentru link |
-| copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
-| laClick | funcție | Funcția de callback care se declanșează la clic pe link |
-
-
+
+ | Proprietăți | Tip | Descriere |
+ | ----------- | ----------------- | ------------------------------------------------------- |
+ | href | șir | URL-ul sau calea țintă pentru link |
+ | copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
+ | laClick | funcție | Funcția de callback care se declanșează la clic pe link |
+
## Link Social
@@ -136,33 +124,30 @@ export const MyComponent = () => {
Linkuri sociale stilizate, cu suport pentru diverse tipuri de linkuri sociale, cum ar fi URL-uri, LinkedIn și X (sau Twitter).
-
+
+ ```jsx
+ import { SocialLink } from "twenty-ui/navigation";
+ import { BrowserRouter as Router } from "react-router-dom";
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
+ export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| Proprietăți | Tip | Descriere |
-| ----------- | ----------------- | ---------------------------------------------------------------------------------------------------------- |
-| href | șir | URL-ul sau calea țintă pentru link |
-| copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
-| tip | șir | Tipul linkurilor sociale. Opțiunile includ: `url`, `LinkedIn` și `Twitter` |
-| laClick | funcție | Funcția de callback care se declanșează la clic pe link |
-
-
+
+ | Proprietăți | Tip | Descriere |
+ | ----------- | ----------------- | -------------------------------------------------------------------------- |
+ | href | string | URL-ul sau calea țintă pentru link |
+ | copii | `React.ReactNode` | Conținutul de afișat în interiorul linkului |
+ | tip | string | Tipul linkurilor sociale. Opțiunile includ: `url`, `LinkedIn` și `Twitter` |
+ | laClick | funcție | Funcția de callback care se declanșează la clic pe link |
+
diff --git a/packages/twenty-docs/l/ro/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/ro/twenty-ui/navigation/navigation-bar.mdx
index 362116e9ff..c3762dc1ef 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/navigation/navigation-bar.mdx
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
Redă o bară de navigare care conține mai multe componente `NavigationBarItem`.
-
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "Acasă",
+ Icon: IconHome,
+ onClick: () => console.log("Acasă clicat"),
+ },
+ {
+ name: "Profil",
+ Icon: IconUser,
+ onClick: () => console.log("Profil clicat"),
+ },
+ {
+ name: "Setări",
+ Icon: IconSettings,
+ onClick: () => console.log("Setări clicat"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| Proprietăți | Tip | Descriere |
-| -------------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| activeItemName | șir | Numele elementului de navigare care este activ în prezent |
-| elemente | array | O matrice de obiecte care reprezintă fiecare element de navigare. Fiecare obiect conține `numele` elementului, componenta `Icon` pentru afișare și o funcție `onClick` care să fie invocată atunci când elementul este apăsat |
-
-
+
+ | Proprietăți | Tip | Descriere |
+ | -------------- | ----- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | activeItemName | șir | Numele elementului de navigare care este activ în prezent |
+ | elemente | array | O matrice de obiecte care reprezintă fiecare element de navigare. Fiecare obiect conține `numele` elementului, componenta `Icon` pentru afișare și o funcție `onClick` care să fie invocată atunci când elementul este apăsat |
+
diff --git a/packages/twenty-docs/l/ro/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/ro/twenty-ui/progress-bar.mdx
index d56f5afc7c..ccb5fc38b1 100644
--- a/packages/twenty-docs/l/ro/twenty-ui/progress-bar.mdx
+++ b/packages/twenty-docs/l/ro/twenty-ui/progress-bar.mdx
@@ -4,46 +4,41 @@ image: /images/user-guide/emails/emails_header.png
---
-
+
Indică progresul sau numărătoarea inversă și se mișcă de la dreapta la stânga.
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
-```jsx
-import { ProgressBar } from "twenty-ui/feedback";
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| Proprietăți | Tip | Descriere | Implicit |
-| --------------- | ------- | ----------------------------------------------------------------------------------- | ---------- |
-| durată | număr | Durata totală a animației barei de progres în milisecunde | 3 |
-| întârziere | număr | Întârzierea în pornirea animației barei de progres în milisecunde | 0 |
-| easing | șir | Funcția de accelerare (easing) pentru animația barei de progres | easeInOut |
-| înălțimeBară | număr | Înălțimea barei în pixeli | 24 |
-| culoareBară | șir | Culoarea barei | gray80 |
-| pornireAutomată | boolean | Dacă `true`, animația barei de progres pornește automat când componenta se montează | `adevărat` |
-
-
+
+ | Proprietăți | Tip | Descriere | Implicit |
+ | --------------- | ------- | ----------------------------------------------------------------------------------- | ---------- |
+ | durată | număr | Durata totală a animației barei de progres în milisecunde | 3 |
+ | întârziere | număr | Întârzierea în pornirea animației barei de progres în milisecunde | 0 |
+ | easing | șir | Funcția de accelerare (easing) pentru animația barei de progres | easeInOut |
+ | înălțimeBară | număr | Înălțimea barei în pixeli | 24 |
+ | culoareBară | şir | Culoarea barei | gray80 |
+ | pornireAutomată | boolean | Dacă `true`, animația barei de progres pornește automat când componenta se montează | `adevărat` |
+
## Bara de Progres Circulară
@@ -51,27 +46,21 @@ export const MyComponent = () => {
Indică progresul unei sarcini, utilizată adesea pe ecranele de încărcare sau în zonele unde doriți să comunicați procesele continue utilizatorului.
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-
-```jsx
-import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| Proprietăți | Tip | Descriere | Implicit |
-| ----------- | ----- | -------------------------------------- | ------------ |
-| dimensiune | număr | Dimensiunea barei de progres circulare | 50 |
-| lățimeBară | număr | Lățimea liniei barei de progres | 5 |
-| culoareBară | șir | Culoarea barei de progres | currentColor |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Proprietăți | Tip | Descriere | Implicit |
+ | ----------- | ----- | -------------------------------------- | ------------ |
+ | dimensiune | număr | Dimensiunea barei de progres circulare | 50 |
+ | lățimeBară | număr | Lățimea liniei barei de progres | 5 |
+ | culoareBară | șir | Culoarea barei de progres | currentColor |
+
diff --git a/packages/twenty-docs/l/ro/user-guide/ai/capabilities/permissions-access-control.mdx b/packages/twenty-docs/l/ro/user-guide/ai/capabilities/permissions-access-control.mdx
new file mode 100644
index 0000000000..476a6e2b66
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/ai/capabilities/permissions-access-control.mdx
@@ -0,0 +1,35 @@
+---
+title: Permisiuni și controlul accesului
+description: Controlați la ce pot avea acces și ce pot modifica agenții AI în spațiul dvs. de lucru.
+---
+
+## Prezentare generală
+
+Agenții AI respectă structura de permisiuni existentă. Acest lucru este deosebit de important pentru echipele care doresc să controleze exact la ce pot avea acces sau ce pot modifica procesele AI automatizate în spațiul lor de lucru.
+
+## Atribuiți un Rol unui Agent AI
+
+1. Accesați **Setări → Roluri**
+2. Faceți clic pe rolul pe care doriți să-l atribuiți
+3. Deschideți fila **Atribuire**
+4. În **Agenți AI**, faceți clic pe **+ Atribuiți agentului AI**
+5. Selectați agentul AI din listă
+6. Confirmați atribuirea
+
+## De ce să Atribuiți Roluri Agenților AI?
+
+| Beneficiu | Descriere |
+| ------------------ | ------------------------------------------------------------- |
+| **Securitate** | Limitați ce date pot accesa sau modifica agenții AI |
+| **Conformitate** | Asigurați-vă că AI prelucrează doar datele de care are nevoie |
+| **Control** | Preveniți acțiunile neintenționate ale automatizărilor AI |
+| **Auditabilitate** | Urmăriți ce acțiuni au fost efectuate de fiecare agent |
+
+
+ Pentru agenții AI care rulează în cadrul fluxurilor de lucru, atribuirea unui Rol asigură că agentul nu poate accesa sau modifica date în afara scopului său — chiar dacă fluxul de lucru are permisiuni mai extinse.
+
+
+## Articole conexe
+
+* [Permisiuni](/l/ro/user-guide/permissions-access/capabilities/permissions) — informații detaliate despre crearea și gestionarea rolurilor
+* [Agenți AI](/l/ro/user-guide/ai/capabilities/ai-agents) — capabilități AI în fluxuri de lucru
diff --git a/packages/twenty-docs/l/ro/user-guide/billing/capabilities/pricing-plans.mdx b/packages/twenty-docs/l/ro/user-guide/billing/capabilities/pricing-plans.mdx
new file mode 100644
index 0000000000..2f9335d1c4
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/billing/capabilities/pricing-plans.mdx
@@ -0,0 +1,79 @@
+---
+title: Planuri tarifare
+description: Aflați despre planurile tarifare ale Twenty și cum să comutați între ele.
+---
+
+## Prezentare generală
+
+Twenty oferă prețuri flexibile care se potrivesc echipelor de orice dimensiune, fie că preferați găzduirea în cloud sau autogăzduirea.
+
+## Planuri Cloud
+
+### Pro (Cloud)
+
+Pentru echipe pregătite să se extindă:
+
+* Toate funcționalitățile CRM de bază
+* Sincronizare email și calendar
+* Fluxuri de lucru și automatizări
+* Asistență standard
+
+
+ Funcționalitățile premium (SSO și permisiuni la nivel de rând) nu sunt incluse în planul Pro.
+
+
+### Organization (Cloud)
+
+Pentru echipe mai mari cu nevoi avansate:
+
+* Tot ce include Pro
+* **Funcționalități premium**: integrare SSO și permisiuni la nivel de rând
+* Suport prioritar
+
+## Planuri autogăzduite
+
+### Gratuit (Autogăzduit)
+
+Găzduiți Twenty pe propria infrastructură, fără costuri:
+
+* Toate funcționalitățile Pro incluse
+* Asistență din partea comunității prin Discord
+* Control deplin asupra datelor dumneavoastră
+
+### Organization (Autogăzduit)
+
+Pentru echipe care au nevoie de funcționalități premium în timp ce se autogăzduiesc:
+
+* Toate funcționalitățile Pro
+* **Funcționalități premium**: integrare SSO și permisiuni la nivel de rând
+* Asistență din partea echipei Twenty
+* Fără obligația de a publica codul personalizat ca open-source înainte de distribuire
+
+## Funcționalități premium
+
+Funcționalitățile premium sunt disponibile doar în planurile Organization (Cloud sau Autogăzduit):
+
+* **Integrare SSO**: autentificare unică (Single Sign-On) cu furnizorul dumneavoastră de identitate
+* **Permisiuni la nivel de rând**: control de acces granular la nivel de înregistrare
+
+## Schimbarea planurilor
+
+### Faceți upgrade la Organization
+
+1. Accesați **Setări → Facturare**
+2. Faceți clic pe **Schimbă la Organization**
+3. Confirmați upgrade-ul
+
+### Faceți downgrade la Pro
+
+Contactați asistența pentru a face downgrade al planului.
+
+### Treceți la facturarea anuală
+
+1. Accesați **Setări → Facturare**
+2. Faceți clic pe **Schimbă la anual**
+3. Economisiți cu facturarea anuală
+
+### Treceți la facturarea lunară
+
+Contactați asistența pentru a reveni la facturarea lunară.
diff --git a/packages/twenty-docs/l/ro/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx b/packages/twenty-docs/l/ro/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
new file mode 100644
index 0000000000..2d37e95572
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/calendar-emails/how-tos/limit-emails-imported.mdx
@@ -0,0 +1,52 @@
+---
+title: Limitați e-mailurile importate
+description: Controlați ce e-mailuri sunt importate în Twenty.
+---
+
+## Prezentare generală
+
+În mod implicit, Twenty sincronizează toate e-mailurile externe din căsuța poștală conectată. Puteți limita ce se importă folosind **selecția de dosare** și **setările de vizibilitate**.
+
+## Metoda 1: Selecția dosarelor (recomandată)
+
+Controlați care foldere de e-mail se sincronizează cu Twenty:
+
+1. Accesați **Setări → Lansări → Laborator**
+2. Activați **Dosarul de mesaje**
+3. Întoarceți-vă la **Setări → Conturi**
+4. Selectați contul de e-mail conectat
+5. Alegeți ce dosare să sincronizați:
+
+| Folder | Descriere |
+| ------------------------ | ---------------------------------------- |
+| **Inbox** | E-mailuri primare primite |
+| **Trimise** | E-mailurile trimise de dvs. |
+| **Arhivă** | Mesaje arhivate |
+| **Dosare personalizate** | Orice dosare specifice pe care le doriți |
+
+6. Excludeți dosarele pe care nu doriți să le sincronizați (Spam, Coș de gunoi, dosare personale)
+
+Acest lucru vă oferă un control precis asupra e-mailurilor care apar în CRM-ul dvs., fără a sincroniza totul.
+
+## Metoda 2: Setări pentru crearea automată a contactelor
+
+Controlați când sunt create contactele din e-mailuri:
+
+1. Mergeți la **Setări → Conturi**
+2. Selectați căsuța poștală conectată
+3. Alegeți o opțiune:
+ * **Dezactivat**: Nu se creează contacte, dar e-mailurile se sincronizează în continuare cu contactele existente
+ * **Trimise și primite**: Creați contacte din toate e-mailurile externe
+ * **Doar trimise**: Creați contacte numai din e-mailurile pe care le trimiteți
+
+## Ce este întotdeauna exclus
+
+Aceste e-mailuri nu sunt niciodată sincronizate, indiferent de setări:
+
+* **E-mailuri interne**: Mesaje între colegi (același domeniu)
+* **E-mailuri de grup**: Liste de distribuție și mesaje de grup
+* **Spam/Coș de gunoi**: Dosarele de sistem sunt de obicei excluse
+
+## Notă importantă
+
+Nu oferim o adresă de e-mail CC pentru sincronizare selectivă. Utilizați funcția de selecție a dosarelor de mai sus pentru a obține același nivel de control.
diff --git a/packages/twenty-docs/l/ro/user-guide/data-migration/capabilities/file-formats.mdx b/packages/twenty-docs/l/ro/user-guide/data-migration/capabilities/file-formats.mdx
new file mode 100644
index 0000000000..81fc33eeac
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/data-migration/capabilities/file-formats.mdx
@@ -0,0 +1,48 @@
+---
+title: Formate de fișiere acceptate!
+description: Formate de fișier acceptate pentru importul de date în Twenty.
+---
+
+## Formate acceptate
+
+Twenty acceptă trei formate de fișier pentru import:
+
+| Format | Extensie | Notițe |
+| ----------------- | -------- | ------------------------------ |
+| **CSV** | .csv | Recomandat, cel mai compatibil |
+| **Excel** | .xlsx | Format Excel modern |
+| **Excel (vechi)** | .xls | Format Excel mai vechi |
+
+## Cerințe pentru fișiere
+
+| Cerință | Valoare |
+| -------------------------- | -------------------------------------------------- |
+| **Codare** | Se recomandă UTF-8 |
+| **Limită de înregistrări** | 10.000 de înregistrări pe fișier |
+| **Structură** | Primul rând trebuie să conțină antetele coloanelor |
+| **Conținut** | Un singur tip de obiect pe fișier |
+
+## Cele mai bune practici pentru CSV
+
+* **Delimitator**: utilizați virgula (`,`) sau punct și virgulă (`;`)
+* **Calificator de text**: utilizați ghilimele duble (`\"`) pentru text care conține virgule
+* **Sfârșituri de linie**: Windows (CRLF) sau Unix (LF), ambele sunt acceptate
+* **Valori goale**: Lăsați celulele necompletate, nu folosiți "NULL" sau "N/A"
+
+## Cele mai bune practici pentru Excel
+
+Când exportați din Excel:
+
+* Eliminați formulele (exportați doar valorile)
+* Ștergeți rândurile goale de la final
+* Asigurați-vă că nu există celule îmbinate
+* Folosiți doar prima foaie
+
+## Seturi de date mari
+
+Pentru seturi de date mai mari de 10.000 de înregistrări:
+
+* Împărțiți în mai multe fișiere
+* Sau folosiți [importul prin API](/l/ro/user-guide/data-migration/how-tos/import-data-via-api) pentru un număr nelimitat de înregistrări
+
+Pentru migrarea unor volume foarte mari (peste 100.000 de înregistrări), API-ul este semnificativ mai rapid și mai fiabil decât importurile CSV.
diff --git a/packages/twenty-docs/l/ro/user-guide/data-migration/overview.mdx b/packages/twenty-docs/l/ro/user-guide/data-migration/overview.mdx
new file mode 100644
index 0000000000..99a318863b
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/data-migration/overview.mdx
@@ -0,0 +1,89 @@
+---
+title: Migrarea datelor
+description: Importați și exportați datele CRM prin fișiere CSV sau API.
+image: /images/user-guide/import-export-data/cloud.png
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+
+
+
+
+## Metode de import
+
+Twenty acceptă două metode principale de importare a datelor:
+
+| Metodă | Recomandat pentru | Limită de volum |
+| ------------------- | --------------------------------------- | -------------------------------- |
+| **Import CSV** | Migrații standard, actualizări regulate | 10.000 de înregistrări pe fișier |
+| **Import prin API** | Migrații la scară mare, automatizare | Nelimitat |
+
+Pentru seturi de date foarte mari (sute de mii de înregistrări), utilizați API-ul. Partenerii noștri de [implementare](/l/ro/user-guide/getting-started/capabilities/implementation-services) vă pot ajuta să rulați aceste scripturi, dacă este nevoie.
+
+## Noțiuni de bază despre importul CSV
+
+Puteți importa date pentru orice obiect folosind fișiere CSV, XLSX sau XLS. Fiecare fișier ar trebui să conțină **doar un singur tip de obiect** (de exemplu, doar înregistrări ale Persoanelor).
+
+**Câmpurile trebuie să existe înainte de import.** Încărcarea unui fișier CSV creează înregistrări, dar nu creează câmpuri. Dacă aveți nevoie de câmpuri personalizate, creați-le mai întâi în **Settings → Data Model**.
+
+### Pași
+
+1. Navigați la obiectul în care doriți să importați date
+2. Faceți clic pe pictograma **⋮** din dreapta sus (acesta este Command Menu) și faceți clic pe **Import records**
+3. Descărcați fișierul-șablon pentru a vă asigura că datele sunt în formatul așteptat
+4. Încărcați fișierul CSV formatat
+5. Mapați coloanele la câmpurile din Twenty
+6. Revizuiți erorile (evidențiate cu galben) și corectați-le, editând direct în interfața utilizator
+7. Confirmați importul
+
+### Importarea relațiilor dintre obiecte
+
+Puteți importa relații între obiecte folosind funcția de import CSV. Trebuie să faceți referire la obiectul înrudit folosind un câmp unic al acestuia: `id`, `email` pentru Persoane și membri ai spațiului de lucru, `domain` pentru companii, orice alt câmp setat ca unic în modelul de date pentru orice alt obiect.
+
+**Înregistrările șterse contează pentru unicitate.** Înregistrările șterse soft (vizibile în Command Menu → See deleted records) sunt incluse în verificările de unicitate. Dacă importați o înregistrare cu aceeași valoare unică ca o înregistrare ștearsă, înregistrarea ștearsă va fi restaurată.
+
+
+ **Ordinea importului contează!**
+
+ Când importați obiecte înrudite, încărcați fișierele în această ordine:
+
+ 1. **Companiile** mai întâi (partea "one" a relațiilor)
+ 2. **Persoanele** în al doilea rând (legate de companii prin companyId)
+ 3. **Oportunitățile** în al treilea rând (legate de companii/persoane)
+ 4. **Obiectele personalizate** cu relații, la final
+
+ De ce? Partea "one" a unei relații unul-la-mulți trebuie să existe înainte de a o putea referi. De exemplu, înregistrarea Companiei trebuie să existe înainte de a importa o Persoană cu ID-ul acelei companii.
+
+
+Consultați [acest articol](/l/ro/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv) pentru un ghid pas cu pas despre cum să procedați.
+
+## Exportați Date
+
+Exportați datele spațiului de lucru pentru copii de siguranță, raportare sau migrare.
+
+### Pași
+
+1. Navigați la obiectul pe care doriți să-l exportați
+2. Configurați vizualizarea cu coloanele de care aveți nevoie
+3. Faceți clic pe **⋮** → **Export view**
+4. Salvați fișierul CSV
+
+**Se exportă doar coloanele vizibile.** Fișierul CSV va conține doar coloanele afișate în vizualizarea curentă. Adăugați sau ascundeți coloane înainte de export pentru a controla ce date sunt incluse.
+
+**Limite de export**: Până la 20.000 de înregistrări pe export.
+
+## Permisiuni
+
+Importul și exportul de date necesită permisiuni specifice:
+
+* **Import**: Necesită permisiunea "Import CSV"
+* **Export**: Necesită permisiunea "Export CSV"
+
+Contactați administratorul spațiului de lucru dacă nu aveți aceste permisiuni.
+
+## Pașii următori
+
+* [Pregătiți fișierele CSV](/l/ro/user-guide/data-migration/how-tos/prepare-your-csv-files)
+* [Importați relații între obiecte](/l/ro/user-guide/data-migration/how-tos/import-relations-between-objects-via-csv)
+* [Importați prin API pentru seturi mari de date](/l/ro/user-guide/data-migration/how-tos/import-data-via-api)
diff --git a/packages/twenty-docs/l/ro/user-guide/data-model/capabilities/fields.mdx b/packages/twenty-docs/l/ro/user-guide/data-model/capabilities/fields.mdx
new file mode 100644
index 0000000000..a6302d06d1
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/data-model/capabilities/fields.mdx
@@ -0,0 +1,122 @@
+---
+title: Câmpuri
+description: Înțelegeți rolul câmpurilor și cum să le gestionați.
+---
+
+import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
+
+## Despre câmpuri
+
+Câmpurile sunt ca coloanele dintr-o foaie de calcul. Ele stochează diferite tipuri de date, cum ar fi text, numere sau date calendaristice. Câmpurile pot fi standard (încorporate) sau personalizate (cele pe care le creați).
+
+### Câmpuri standard
+
+Câmpurile standard vin încorporate în Twenty pentru a acoperi nevoile de afaceri uzuale.
+
+De exemplu, `Prenume` și `Nume de familie` sunt câmpuri standard în obiectul `Persoane`. Ele stochează date text pentru numele individuale.
+
+Nu puteți șterge câmpurile standard, dar le puteți dezactiva dacă nu aveți nevoie de ele.
+
+De asemenea, puteți personaliza opțiunile câmpurilor standard de tip `SELECT`, de exemplu opțiunile pentru `Etapa` la Oportunități.
+
+
+
+### Câmpuri personalizate
+
+Câmpurile personalizate pot fi adăugate la orice obiect. Puteți stoca text, numere, date, selecții din liste derulante și altele. Folosind câmpuri personalizate puteți urmări informații specifice afacerii dumneavoastră.
+
+De exemplu, un câmp personalizat pentru SpaceX ar putea fi `Starea de funcționare a rachetei`, indicând dacă o rachetă este operațională.
+
+
+
+## Tipuri de câmp
+
+Twenty acceptă diverse tipuri de câmp:
+
+| Tip | Descriere | Exemplu |
+| ----------------- | ---------------------------------------------------------- | -------------------------- |
+| Adresă | Adresă structurată cu stradă, oraș, stat, țară, cod poștal | Adresă de birou |
+| Array | Listă de valori text | Etichete |
+| Boolean | Casetă de bifare adevărat/fals | Este activ |
+| Monedă | Valoare monetară cu codul monedei | Valoarea tranzacției (USD) |
+| Dată | Valori de tip dată | Data închiderii |
+| Dată și oră | Dată cu oră | Ora întâlnirii |
+| Domeniu | Domeniu de site web (utilizat pentru Companii) | acme.com |
+| Email | Adrese de e-mail (cu principală + suplimentare) | E-mailul contactului |
+| JSON | Date JSON structurate | Metadate personalizate |
+| Linkuri | URL-uri cu etichete (primară + secundară) | Site web, LinkedIn |
+| Text lung | Text pe mai multe rânduri | Descriere, Note |
+| Selecție multiplă | Alegeri multiple dintr-o listă predefinită | Etichete, Categorii |
+| Număr | Valori numerice (întregi sau zecimale) | Cantitate, Scor |
+| Telefon | Numere de telefon cu codul țării | Telefon de serviciu |
+| Evaluare | Evaluare cu stele (1-5) | Prioritate, Scor |
+| Relație | Legături către înregistrări din alte obiecte | Companie → Persoane |
+| Select | O singură alegere dintr-o listă predefinită | Etapă, Stare |
+| Text | O singură linie de text | Nume, Titlu |
+
+## Creați un câmp personalizat
+
+Pentru a adăuga un câmp personalizat la orice obiect, urmați acești pași:
+
+1. Accesați `Setări` din bara laterală stângă.
+2. Accesați `Model de date`, apoi selectați obiectul pe care doriți să îl personalizați.
+3. Continuați prin a face clic pe `Adaugă câmp`.
+4. Alegeți un nume și un tip de câmp care se potrivesc cerințelor dumneavoastră. Luați în considerare adăugarea unei descrieri a câmpului pentru o înțelegere mai bună.
+
+Noul câmp creat de dumneavoastră este acum disponibil în cadrul câmpurilor aplicației. Pentru a-l afișa într-o vizualizare specifică, faceți clic pe meniul de opțiuni, apoi selectați `Câmpuri`.
+
+
+
+**Cale rapidă:** Faceți clic pe butonul **+** în colțul dreapta sus al oricărui tabel de obiecte, apoi selectați `Personalizați câmpurile`. Aceasta vă duce direct la setările Modelului de Date.
+
+
+
+## Dezactivați un câmp
+
+Puteți dezactiva un câmp pentru a-l ascunde din aplicație fără a pierde datele. Gândiți-vă la aceasta ca la ascunderea câmpului, nu la ștergerea lui.
+
+Iată cum puteți face acest lucru:
+
+1. Găsiți câmpul pe care doriți să-l dezactivați în setările obiectului dumneavoastră.
+
+2. Faceți clic pe cele trei puncte `⋮` de lângă câmp pentru a deschide meniul.
+
+3. Selectați `Dezactivează` din lista derulantă.
+
+
+
+Ce se întâmplă când dezactivați un câmp?
+
+1. **În aplicație:** Câmpul dispare și nu se pot adăuga valori noi la acesta.
+
+2. **Relații existente:** Dacă este un câmp de relație, conexiunile existente rămân, dar nu se pot crea noi.
+
+3. **Acces API:** Încă puteți accesa câmpul și datele sale prin API.
+
+Puteți reactiva câmpuri standard și personalizate sau aveți opțiunea de a le șterge permanent.
+
+## Faceți câmpurile unice
+
+Faceți un câmp unic pentru a vă asigura că înregistrările distincte nu pot avea aceeași valoare. De exemplu, adresele de e-mail sunt unice pentru fiecare persoană.
+
+Dacă primiți o eroare când setați unicitatea, verificați prezența valorilor duplicate în datele dumneavoastră (inclusiv în cele șterse).
+
+## Cele mai bune practici pentru configurarea câmpurilor
+
+### Convenții de denumire și limitări
+
+* **Numele la singular și plural trebuie să fie distincte**: API-ul nostru GraphQL necesită nume distincte pentru mutații
+* **Nume de câmpuri protejate**: unele nume sunt rezervate pentru uzul sistemului (de ex., `Tip`, `Aplicație`)
+
+### Câmpuri valută și telefon
+
+* **Valută implicită**: poate fi configurată prin modelul de date
+* **Coduri de țară implicite**: pot fi configurate pentru câmpurile de telefon prin modelul de date
+
+### Câmpuri de selectare
+
+* **Se poate selecta o opțiune implicită** pentru fiecare câmp de tip Select
+
+### Câmpuri de text pentru înregistrări
+
+* **Fiecare obiect are un câmp principal de afișare**: Acest câmp apare în coloana din stânga și reprezintă înregistrarea atunci când este legată de alte obiecte. Trebuie să fie un câmp text. De exemplu, Persoane utilizează `Nume` ca câmp principal, astfel încât atunci când legați o persoană de o companie, veți vedea numele ei în vizualizarea companiei.
diff --git a/packages/twenty-docs/l/ro/user-guide/permissions-access/overview.mdx b/packages/twenty-docs/l/ro/user-guide/permissions-access/overview.mdx
new file mode 100644
index 0000000000..63ac110bfd
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/permissions-access/overview.mdx
@@ -0,0 +1,40 @@
+---
+title: Permisiuni și acces
+description: Gestionați rolurile, permisiunile și controlul accesului în spațiul dvs. de lucru.
+---
+
+
+
+
+
+Sistemul de permisiuni Twenty vă permite să controlați cine poate accesa și modifica datele din spațiul dvs. de lucru. Creați roluri, atribuiți permisiuni și configurați SSO pentru acces securizat.
+
+## Ce conține această secțiune
+
+
+
+ Creați roluri și configurați permisiunile pentru obiecte, câmpuri și setări.
+
+
+
+ Configurați autentificarea unică (SSO) cu furnizorul dvs. de identitate.
+
+
+
+ Întrebări frecvente despre roluri, permisiuni și SSO.
+
+
+
+## Caracteristici cheie
+
+* **Acces bazat pe roluri**: Creați roluri personalizate cu permisiuni specifice
+* **Permisiuni pentru obiecte**: Controlați cine poate vizualiza, edita sau șterge înregistrări
+* **Permisiuni pentru câmpuri**: Restricționați accesul la câmpuri sensibile
+* **Permisiuni pentru setări**: Controlați accesul la configurarea spațiului de lucru
+* **Integrare SSO**: Configurați autentificarea unică pentru securitate la nivel de întreprindere (plan Organization)
+
+## Linkuri rapide
+
+* [Creați un rol](/l/ro/user-guide/permissions-access/capabilities/permissions#create-a-role)
+* [Configurați SSO](/l/ro/user-guide/permissions-access/capabilities/sso-configuration)
+* [Gestionați membrii echipei](/l/ro/user-guide/settings/capabilities/member-management)
diff --git a/packages/twenty-docs/l/ro/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx b/packages/twenty-docs/l/ro/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
new file mode 100644
index 0000000000..704294c974
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline.mdx
@@ -0,0 +1,149 @@
+---
+title: Afișați suma estimată în pipeline-ul dvs.
+description: Calculați și afișați valorile ponderate ale oportunităților pe baza probabilității etapei.
+---
+
+Suma estimată este o valoare calculată: **Sumă × Probabilitate**. Acest lucru vă ajută să prognozați veniturile prin ponderarea oportunităților în funcție de cât de probabil este să se închidă.
+
+
+ Acesta este un exemplu de creare a [Câmpurilor de formulă](/l/ro/user-guide/workflows/how-tos/crm-automations/formula-fields) folosind fluxuri de lucru.
+
+
+Acest ghid vă conduce prin configurarea câmpurilor personalizate și a fluxurilor de lucru necesare pentru a calcula și afișa sumele estimate în pipeline-ul dvs.
+
+## Pasul 1: Creați câmpuri personalizate
+
+Aveți nevoie de două câmpuri personalizate pe obiectul Oportunități.
+
+### Creați câmpul Probabilitate
+
+1. Accesați **Setări → Model de date → Oportunități**
+2. Faceți clic pe **+ Adaugă câmp**
+3. Configurați:
+ * **Nume**: Probabilitate
+ * **Tip**: Număr
+ * **Descriere**: Probabilitate bazată pe etapă (0–100%)
+4. Faceți clic pe **Salvare**
+
+### Creați câmpul Sumă estimată
+
+1. Faceți clic pe **+ Adaugă câmp**
+2. Configurați:
+ * **Nume**: Sumă estimată
+ * **Tip**: Monedă
+ * **Descriere**: Calculat: Sumă × Probabilitate
+3. Faceți clic pe **Salvare**
+
+### Opțional: Setați câmpurile ca numai în citire pentru utilizatori
+
+Dacă nu doriți ca utilizatorii să editeze manual aceste câmpuri calculate:
+
+1. Accesați **Setări → Roluri**
+2. Selectați rolul pe care doriți să-l configurați
+3. Găsiți obiectul Oportunități
+4. Setați câmpurile **Probabilitate** și **Sumă estimată** ca numai în citire
+
+Acest lucru asigură că doar fluxurile de lucru pot actualiza aceste valori.
+
+## Pasul 2: Creați Fluxul de lucru nr. 1 — Actualizați probabilitatea la schimbarea etapei
+
+Acest flux de lucru setează automat probabilitatea când o oportunitate trece la o nouă etapă.
+
+### Creați fluxul de lucru
+
+1. Accesați **Fluxuri de lucru**
+2. Faceți clic pe **+ Flux de lucru nou**
+3. Denumiți-l "Actualizați probabilitatea la schimbarea etapei"
+
+### Configurați declanșatorul
+
+1. Adăugați un declanșator **Înregistrare creată sau actualizată**
+2. Selectați **Oportunități** ca obiect
+3. Filtrați după: câmpul **Etapă** este actualizat
+
+### Adăugați ramuri pentru fiecare etapă
+
+Creați o ramură pentru fiecare etapă cu probabilitatea sa:
+
+| Etapa | Probabilitate |
+| --------------- | ------------- |
+| Nou | 10% |
+| Calificat | 25% |
+| Întâlnire | 40% |
+| Propunere | 60% |
+| Negociere | 80% |
+| Închis câștigat | 100% |
+| Închis pierdut | 0% |
+
+
+ Pentru a crea o ramură nouă, faceți clic dreapta pe planșa fluxului de lucru și faceți clic pe **Acțiune nouă**. Apoi, legați această acțiune de nodul anterior trăgând săgeata de la nodul anterior la această acțiune nouă.
+
+
+Pentru fiecare etapă:
+
+1. Adăugați un nod **Filtru**: Etapă = [numele etapei]
+2. Adăugați o acțiune **Actualizare înregistrare**:
+ * Înregistrare: Oportunitatea declanșatoare
+ * Câmp: Probabilitate
+ * Valoare: [probabilitatea pentru acea etapă]
+
+### Calculați suma estimată
+
+După ce ramurile se reunesc:
+
+1. Adăugați un nod **Filtru**: câmpul Sumă nu este gol
+2. Adăugați o acțiune **Actualizare înregistrare**:
+ * Înregistrare: Oportunitatea declanșatoare
+ * Câmp: Sumă estimată
+ * Valoare: Sumă × Probabilitate
+
+## Pasul 3: Creați Fluxul de lucru nr. 2 — Recalculați la modificarea sumei
+
+Acest flux de lucru actualizează Suma estimată atunci când suma oportunității se modifică.
+
+### Creați fluxul de lucru
+
+1. Accesați **Fluxuri de lucru**
+2. Faceți clic pe **+ Flux de lucru nou**
+3. Denumiți-l "Recalculați suma estimată la modificarea sumei"
+
+### Configurați declanșatorul
+
+1. Adăugați un declanșator **Înregistrare creată sau actualizată**
+2. Selectați **Oportunități** ca obiect
+3. Filtrați după: câmpul **Sumă** este actualizat
+
+### Adăugați logica
+
+1. Adăugați un nod **Filtru**: câmpul Sumă nu este gol
+2. Adăugați o acțiune **Actualizare înregistrare**:
+ * Înregistrare: Oportunitatea declanșatoare
+ * Câmp: Sumă estimată
+ * Valoare: Sumă × Probabilitate
+
+## Pasul 4: Afișați în pipeline-ul dvs.
+
+Acum afișați totalurile Sumei estimate în vizualizarea dvs. Kanban:
+
+1. Deschideți vizualizarea Kanban **Pipeline de vânzări**
+2. Faceți clic pe **numărul** de lângă orice nume de Etapă din partea de sus a unei coloane
+3. Selectați **Sumă**
+4. Alegeți **Sumă estimată**
+
+Fiecare coloană afișează acum valoarea totală ponderată a pipeline-ului pentru acea etapă.
+
+## Rezumat
+
+| Componentă | Scop |
+| ------------------------ | ---------------------------------------------------------------------------------- |
+| **Câmpul Probabilitate** | Stochează probabilitatea de câștig bazată pe etapă |
+| **Câmpul Sumă estimată** | Stochează Sumă × Probabilitate |
+| **Flux de lucru nr. 1** | Actualizează probabilitatea când se schimbă etapa, apoi recalculează Suma estimată |
+| **Flux de lucru nr. 2** | Recalculează Suma estimată când se modifică suma |
+| **Agregare** | Afișează suma valorilor estimate pentru fiecare etapă |
+
+## Asemănătoare
+
+* [Câmpuri de formulă](/l/ro/user-guide/workflows/how-tos/crm-automations/formula-fields) — creați câmpuri calculate folosind fluxuri de lucru
+* [Vizualizări Kanban](/l/ro/user-guide/views-pipelines/capabilities/kanban-views) — agregări pe coloană
+* [Cum să creați câmpuri personalizate](/l/ro/user-guide/data-model/how-tos/create-custom-fields) — configurarea câmpurilor
diff --git a/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-branches.mdx b/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-branches.mdx
new file mode 100644
index 0000000000..1591ddf8ce
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-branches.mdx
@@ -0,0 +1,66 @@
+---
+title: Ramificații ale fluxului de lucru},{
+description: Creați căi paralele și logică condițională în fluxurile dvs. de lucru.
+---
+
+Ramificațiile vă permit să împărțiți fluxul de lucru în mai multe căi care pot rula simultan sau condițional, în funcție de datele dvs.
+
+
+
+## Cum funcționează ramificațiile
+
+Când creați mai multe conexiuni dintr-un singur nod, fiecare cale devine o ramificație. În mod implicit, **toate ramificațiile se execută în paralel**—nu se așteaptă una pe alta.
+
+## Crearea ramificațiilor
+
+### Adăugați o ramificație nouă
+
+1. **Faceți clic dreapta pe pânza principală** a fluxului de lucru (nu pe un nod existent)
+2. Faceți clic pe **Adăugați nod**
+3. Alegeți tipul de nod pentru ramificația nouă
+4. Trageți o săgeată din partea de jos a pasului anterior la partea de sus a acestei noi acțiuni
+5. Repetați pentru a adăuga mai multe ramificații din același nod
+
+
+ Fiecare ramificație este independentă. Adăugarea unei ramificații nu afectează celelalte căi existente din acel nod.
+
+
+### Machetă vizuală
+
+Ramificațiile apar ca căi paralele în editorul de fluxuri de lucru. Puteți glisa noduri pentru a rearanja macheta vizuală fără a afecta execuția.
+
+## Ramificații condiționale
+
+Deoarece toate ramificațiile rulează în mod implicit, utilizați noduri **Filtru** pentru a controla care căi se execută de fapt:
+
+| Ramificație | Condiție de filtrare | Acțiune |
+| ----------- | -------------------- | --------------------------------- |
+| A | Etapă = "Câștigat" | Trimiteți un e-mail de felicitări |
+| B | Etapă = "Pierdut" | Creați o sarcină de urmărire |
+| C | Etapă = "Negociere" | Notificați managerul |
+
+1. Creați ramificații din declanșatorul sau acțiunea dvs.
+2. Adăugați un nod **Filtru** ca prim pas al fiecărei ramificații
+3. Configurați fiecare filtru cu condiții care se exclud reciproc
+4. Adăugați acțiunile după fiecare filtru
+
+Doar ramificațiile în care condiția filtrului este îndeplinită vor continua să se execute.
+
+## Îmbinarea ramificațiilor
+
+**Ramificațiile nu se îmbină automat.** Fiecare ramificație rulează independent până când se încheie. Aveți flexibilitate completă în modul în care gestionați acest lucru:
+
+* **Opțiunea 1: Păstrați ramificațiile separate**
+ Fiecare ramificație gestionează independent propriile acțiuni de urmărire. Aceasta este cea mai simplă abordare atunci când ramificațiile nu trebuie să convergă.
+
+* **Opțiunea 2: Îmbinați ramificațiile manual**
+ La crearea fluxului de lucru, puteți conecta manual mai multe ramificații la aceeași acțiune ulterioară. Pur și simplu trageți săgeți de la capătul fiecărei ramificații către un nod comun.
+
+
+ Deși puteți utiliza un nod [Întârziere](/l/ro/user-guide/workflows/capabilities/workflow-actions#delay) pentru a întrerupe execuția, în prezent nu poate fi configurat să aștepte "până când se termină o altă ramificație".
+
+
+## Conexe
+
+* [Cum să utilizați ramificațiile în fluxuri de lucru](/l/ro/user-guide/workflows/capabilities/use-branches-in-workflows) - Ghid pas cu pas
+* [Acțiuni ale fluxului de lucru](/l/ro/user-guide/workflows/capabilities/workflow-actions) - Acțiuni disponibile, inclusiv Filtru
diff --git a/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-versions.mdx b/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-versions.mdx
new file mode 100644
index 0000000000..672c215043
--- /dev/null
+++ b/packages/twenty-docs/l/ro/user-guide/workflows/capabilities/workflow-versions.mdx
@@ -0,0 +1,85 @@
+---
+title: Versiunile fluxului de lucru
+description: Gestionați versiunile și schițele fluxului de lucru.
+image: /images/user-guide/workflows/workflow.png
+---
+
+## Despre versiuni
+
+De fiecare dată când activați un flux de lucru, se creează o versiune nouă. Acest lucru vă permite să urmăriți modificările în timp și să reveniți la configurațiile anterioare, dacă este necesar.
+
+## Stările versiunilor
+
+| Status | Descriere |
+| -------------- | -------------------------------------------- |
+| **Schiță** | În curs de editare, încă nepublicată |
+| **Activ** | Versiunea live care răspunde la declanșatori |
+| **Dezactivat** | Anterior activă, oprită manual |
+| **Arhivat** | Versiuni anterioare păstrate pentru istoric |
+
+## Lucrul cu schițele
+
+Când editați un flux de lucru activ, modificările sunt salvate ca **schiță**. Versiunea activă continuă să ruleze în timp ce lucrați la actualizări.
+
+După ce ați terminat editarea, puteți:
+
+* **Activați**: Publicați schița ca noua versiune activă (versiunea anterioară este arhivată)
+* **Renunțați**: Ștergeți schița și păstrați versiunea activă curentă
+
+## Istoria versiunilor
+
+### Vizualizarea versiunilor anterioare
+
+1. Deschideți fluxul de lucru
+2. Faceți clic pe fila **Versiuni**
+3. Vedeți toate versiunile anterioare cu marcaje de timp
+
+### Restaurarea unei versiuni
+
+1. Găsiți versiunea pe care doriți să o restaurați
+2. Faceți clic pe **Utilizează ca schiță**
+3. Versiunea este copiată într-o nouă schiță
+4. Efectuați actualizările necesare
+5. Activați când sunteți gata
+
+## Cele mai bune practici
+
+### Gestionarea versiunilor
+
+* Activați numai când este gata pentru producție
+* Păstrați modificările semnificative între versiuni
+* Documentați modificările majore în numele sau descrierile fluxurilor de lucru
+* Testați în modul schiță înainte de a activa
+
+### Anularea modificărilor
+
+* Dacă o versiune nouă provoacă probleme, restaurați versiunea anterioară
+* Utilizați istoricul versiunilor pentru a urmări ce s-a schimbat
+* Testați întotdeauna versiunile restaurate înainte de activare
+
+## Fluxuri de lucru comune
+
+### Editare rapidă
+
+1. Faceți modificări minore la un flux de lucru activ
+2. Testați în modul schiță
+3. Activați noua versiune
+
+### Revizie majoră
+
+1. Folosiți versiunea anterioară ca punct de pornire
+2. Efectuați modificări semnificative în schiță
+3. Testați temeinic toate scenariile
+4. Activați când sunteți încrezători
+
+### Revenire
+
+1. Identificați problema versiunii curente
+2. Găsiți în istoric ultima versiune funcțională
+3. Faceți clic pe **Utilizează ca schiță**
+4. Activați pentru a restabili comportamentul vechi
+
+## Conexe
+
+* [Noțiuni de bază despre fluxuri de lucru](/l/ro/user-guide/workflows/overview)
+* [Execuții ale fluxurilor de lucru](/l/ro/user-guide/workflows/capabilities/workflow-runs)
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..cdcb3406a2
--- /dev/null
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: Команды фронтенда
+---
+
+## Полезные команды
+
+### Запуск приложения
+
+```bash
+npx nx start twenty-front
+```
+
+### Перегенерировать схему graphql на основе схемы API graphql
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+ИЛИ
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### Линт
+
+```bash
+npx nx run twenty-front:lint # используйте --fix для исправления ошибок линтинга
+```
+
+## Переводы
+
+```bash
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
+```
+
+### Тест
+
+```bash
+npx nx run twenty-front:test # запуск тестов jest
+npx nx run twenty-front:storybook:serve:dev # запуск storybook
+npx nx run twenty-front:storybook:test # запуск тестов # (требуется yarn storybook:serve:dev для работы)
+npx nx run twenty-front:storybook:coverage # (требуется yarn storybook:serve:dev для работы)
+```
+
+## Технологический стек
+
+Проект имеет чистый и простой стек с минимальным кодом.
+
+**Приложение**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](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/)
+
+**Инструменты**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## Архитектура
+
+### Маршрутизация
+
+[React Router](https://reactrouter.com/) обрабатывает маршрутизацию.
+
+Чтобы избежать ненужных [перерисовок](/l/ru/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders), вся логика маршрутизации находится в `useEffect` в `PageChangeEffect`.
+
+### Управление состоянием
+
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) обрабатывает управление состоянием.
+
+[лучшие практики](/l/ru/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) для получения дополнительной информации об управлении состоянием.
+
+## Тестирование
+
+[Jest](https://jestjs.io/) служит инструментом для модульного тестирования, а [Storybook](https://storybook.js.org/) — для тестирования компонентов.
+
+Jest в основном используется для тестирования утилит, а не самих компонентов.
+
+Storybook предназначен для тестирования поведения изолированных компонентов, а также для отображения системы дизайна.
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..61406938ec
--- /dev/null
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Горячие клавиши
+---
+
+## Введение
+
+Когда вам нужно прослушивать горячую клавишу, вы обычно используете обработчик событий `onKeyDown`.
+
+Однако в `twenty-front` могут возникнуть конфликты между одинаковыми горячими клавишами, которые используются в разных компонентах, смонтированных одновременно.
+
+Например, если у вас есть страница, которая реагирует на клавишу Enter, и модальное окно, реагирующее на ту же клавишу Enter, с компонентом Select внутри этого окна, то может возникнуть конфликт, когда все они смонтированы одновременно.
+
+## Хук `useScopedHotkeys`
+
+Для решения этой проблемы у нас есть индивидуальный хук, который позволяет мониторить горячие клавиши без конфликтов.
+
+Вы размещаете его в компоненте, и он будет реагировать на горячие клавиши только тогда, когда компонент смонтирован И заданные **области горячих клавиш** активны.
+
+## Как прослушивать горячие клавиши на практике?
+
+Настройка мониторинга горячих клавиш включает в себя два шага :
+
+1. Установить [область горячих клавиш](#what-is-a-hotkey-scope-), которая будет реагировать на горячие клавиши
+2. Использовать хук `useScopedHotkeys` для мониторинга горячих клавиш
+
+Настройка областей горячих клавиш необходима даже на простых страницах, так как другие элементы пользовательского интерфейса, такие как меню слева или меню команд, также могут реагировать на горячие клавиши.
+
+## Кейсы использования горячих клавиш
+
+В общем, у вас будет два случая использования, требующих горячих клавиш :
+
+1. На странице или в компоненте, смонтированном на странице
+2. В компоненте типа модального окна, который фокусируется из-за действия пользователя
+
+Второй случай использования может происходить рекурсивно : например, раскрывающееся меню в модальном окне.
+
+### Прослушивание горячих клавиш на странице
+
+Пример :
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Установить область горячих клавиш в useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Вернуться к предыдущей области горячих клавиш, когда компонент размонтирован
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Используйте хук useScopedHotkeys
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Логика, выполняемая на этой странице при нажатии пользователем клавиши Enter
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return Моя страница, прослушивающая Enter
;
+};
+```
+
+### Прослушивание горячих клавиш в компоненте типа модального окна
+
+Для этого примера мы используем модальный компонент, который прослушивает ключ Escape, чтобы сообщить своему родителю закрыть его.
+
+В этом случае взаимодействие пользователя меняет область операций.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Установите область горячих клавиш, когда пользователь открывает модальное окно
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Вернуться к предыдущей области горячих клавиш при закрытии модального окна
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
Моя страница с модальным окном
+ Открыть модальное окно
+ {showModal && }
+ ;
+};
+```
+
+Затем в компоненте модального окна :
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Используйте хук useScopedHotkeys для прослушивания Escape.
+ // Учтите, что Escape — это общая горячая клавиша, которая может использоваться многими другими компонентами
+ // Поэтому крайне важно использовать области горячих клавиш, чтобы избежать конфликтов
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return Мой компонент модального окна
;
+};
+```
+
+Важно использовать этот шаблон, когда вы не уверены, что просто использование useEffect при монтировании/размонтировании будет достаточным для избегания конфликтов.
+
+Эти конфликты могут быть сложными для отладки, и они могут возникать чаще, чем ожидалось, с использованием useEffects.
+
+## Что такое область горячих клавиш?
+
+Область горячих клавиш — это строка, представляющая собой контекст, в котором активны горячие клавиши. Она обычно кодируется в виде перечисления (enum).
+
+При изменении области горячих клавиш, горячие клавиши, слушающие эту область, будут включены, а слушающие другие области — отключены.
+
+Вы можете установить только одну область за раз.
+
+Например, области горячих клавиш для каждой страницы определены в enum `PageHotkeyScope`:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+Внутренне текущая выбранная область хранится в состоянии Recoil, которое используется по всему приложению:
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+Но это состояние Recoil никогда не следует обрабатывать вручную! Мы увидим, как использовать это в следующем разделе.
+
+## Как это работает внутренне?
+
+Мы сделали тонкую обертку поверх [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro), которая делает его более производительным и избегает ненужных повторных рендеров.
+
+Мы также создаем состояние Recoil, чтобы управлять состоянием горячей клавиши и сделать его доступным везде в приложении.
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..f02d533365
--- /dev/null
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Сторибук
+description: Просмотр библиотеки компонентов UI Twenty
+---
+
+Посмотрите нашу полную библиотеку компонентов и документацию в Сторибуке.
+
+[Открыть Сторибук →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/work-with-figma.mdx b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
new file mode 100644
index 0000000000..b31633ab4d
--- /dev/null
+++ b/packages/twenty-docs/l/ru/developers/contribute/capabilities/frontend-development/work-with-figma.mdx
@@ -0,0 +1,59 @@
+---
+title: Работа с Figma
+info: Узнайте, как можно сотрудничать с Figma компании Twenty
+---
+
+Figma - это совместный инструмент для проектирования пользовательских интерфейсов, который помогает преодолеть барьер в коммуникации между дизайнерами и разработчиками.
+Это руководство объясняет, как вы можете работать с Figma.
+
+## Доступ
+
+1. **Получите доступ к общей ссылке:** Вы можете открыть файл проекта Figma [здесь](https://www.figma.com/file/xt8O9mFeLl46C5InWwoMrN/Twenty).
+2. **Войдите в систему:** Если вы ещё не вошли, Figma предложит вам это сделать.
+ Ключевые функции доступны только для авторизованных пользователей, такие как режим разработчика и возможность выбора конкретного фрейма.
+
+
+ Вы не сможете эффективно сотрудничать без учетной записи.
+
+
+## Структура Figma
+
+На левой боковой панели вы можете получить доступ к разным страницам Figma компании Twenty. Вот как они организованы:
+
+* **Страница компонентов:** Это первая страница. Дизайнер использует её для создания и организации элементов дизайна, которые могут быть переиспользованы в течение всего файла дизайна. Например, кнопки, иконки, символы или любые другие переиспользуемые компоненты. Она служит для поддержания консистентности дизайна.
+* **Главная страница:** Вторая страница — это главная страница, которая показывает полный пользовательский интерфейс проекта. Вы можете нажать ***Play***, чтобы использовать полный прототип приложения.
+* **Страницы с функциями:** Другие страницы обычно посвящены функциям в процессе разработки. Они содержат дизайн определённых функций или модулей приложения или веб-сайта. Они, как правило, все еще в процессе разработки.
+
+## Полезные советы
+
+С доступом только для чтения, вы не можете редактировать дизайн, но вы можете получить доступ ко всем функциям, которые будут полезны для преобразования дизайнов в код.
+
+### Используйте режим разработчика
+
+Dev Mode Figma повышает производительность разработчиков, обеспечивая легкую навигацию по дизайну, эффективное управление ресурсами, инструменты связи, интеграции с инструментами для разработки, быстрые фрагменты кода и информацию о ключевых слоях, устраняя разрыв между дизайном и разработкой. Подробнее о режиме Dev можно узнать [здесь](https://www.figma.com/dev-mode/).
+
+Переключитесь в режим "Разработчик" в правой части панели инструментов, чтобы посмотреть спецификации дизайна, скопировать CSS и получить доступ к ресурсам.
+
+### Использование прототипа
+
+Кликните на любой элемент на холсте и нажмите кнопку “Play” в верхней правой части интерфейса, чтобы открыть просмотр прототипа. Режим прототипа позволяет взаимодействовать с дизайном, как если бы это был финальный продукт. Он демонстрирует переходы между экранами и то, как элементы интерфейса, такие как кнопки, ссылки или меню, ведут себя при взаимодействии.
+
+1. **Понимание переходов и анимаций:** В режиме Прототипа вы можете увидеть любые переходы или анимации, добавленные дизайнером между экранами или элементами интерфейса, предоставляя четкие визуальные инструкции разработчикам о предположительном поведении и стиле.
+2. **Уточнение реализации:** Прототип также может помочь уменьшить неясности. Разработчики могут взаимодействовать с ним, чтобы лучше понять функциональность или внешний вид определенных элементов.
+
+Для получения более подробной информации и руководств о платформе Figma, вы можете посетить официальную [Документацию Figma](https://help.figma.com/hc/en-us).
+
+### Измерение расстояний
+
+Выберите элемент, удерживая клавишу `Option` (Mac) или `Alt` (Windows), затем наведите курсор на другой элемент, чтобы увидеть расстояние между ними.
+
+### Расширение Figma для VSCode (Рекомендуется)
+
+[Figma для VS Code](https://marketplace.visualstudio.com/items?itemName=figma.figma-vscode-extension)
+позволяет вам просматривать и инспектировать файлы дизайна, сотрудничать с дизайнерами, отслеживать изменения и ускорять внедрение - все это, не покидая текстового редактора.
+Это часть наших рекомендуемых расширений.
+
+## Сотрудничество
+
+1. **Использование комментариев:** Вы можете воспользоваться функцией комментариев, кликнув по значку пузыря в левой части панели инструментов.
+2. **Чат курсора:** Приятная особенность Figma - это чат курсора. Просто нажмите `;` на Mac и `/` на Windows, чтобы отправить сообщение, если вы видите, что кто-то еще использует Figma одновременно с вами.
diff --git a/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx b/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx
index 3e9c4f7fe6..33fccc5651 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/display/app-tooltip.mdx
@@ -4,57 +4,52 @@ image: /images/user-guide/tips/light-bulb.png
---
-
+
Краткое сообщение, которое отображает дополнительную информацию, когда пользователь взаимодействует с элементом.
-
+
+ ```jsx
+ import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-```jsx
-import { AppTooltip } from "@/ui/display/tooltip/AppTooltip";
-
-export const MyComponent = () => {
- return (
- <>
-
- Customer Insights
-
-
- >
- );
-};
-```
-
-
-
-
-
-| Свойства | Тип | Описание |
-| ---------------- | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| className | строка | Необязательный CSS-класс для дополнительного стилирования |
-| anchorSelect | CSS-селектор | Селектор для анкера подсказки (элемент, который активирует подсказку) |
-| content | строка | Содержимое, которое вы хотите отобразить в подсказке |
-| delayHide | число | Задержка в секундах перед скрытием подсказки после того, как курсор покинет анкер |
-| offset | число | Смещение в пикселях для позиционирования подсказки |
-| noArrow | boolean | Если `true`, стрелка на подсказке скрыта |
-| isOpen | boolean | Если `true`, подсказка открыта по умолчанию |
-| place | Строка `PlacesType` из `react-tooltip` | Определяет расположение подсказки. Значения включают: `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, `left-end` |
-| positionStrategy | Строка `PositionStrategy` из `react-tooltip` | Стратегия позиционирования для подсказки. Имеет два значения: `absolute` и `fixed` |
-
-
+ export const MyComponent = () => {
+ return (
+ <>
+
+ Информация о клиенте
+
+
+ >
+ );
+ };
+ ```
+
+
+ | Свойства | Тип | Описание |
+ | ---------------- | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | строка | Необязательный CSS-класс для дополнительного стилирования |
+ | anchorSelect | CSS-селектор | Селектор для анкера подсказки (элемент, который активирует подсказку) |
+ | content | строка | Содержимое, которое вы хотите отобразить в подсказке |
+ | delayHide | число | Задержка в секундах перед скрытием подсказки после того, как курсор покинет анкер |
+ | offset | число | Смещение в пикселях для позиционирования подсказки |
+ | noArrow | булево | Если `true`, стрелка на подсказке скрыта |
+ | isOpen | булево | Если `true`, подсказка открыта по умолчанию |
+ | place | Строка `PlacesType` из `react-tooltip` | Определяет расположение подсказки. Значения включают: `bottom`, `left`, `right`, `top`, `top-start`, `top-end`, `right-start`, `right-end`, `bottom-start`, `bottom-end`, `left-start`, `left-end` |
+ | positionStrategy | Строка `PositionStrategy` из `react-tooltip` | Стратегия позиционирования для подсказки. Имеет два значения: `absolute` и `fixed` |
+
## Переполненный текст с подсказкой
@@ -62,27 +57,22 @@ export const MyComponent = () => {
Обрабатывает переполненный текст и отображает подсказку, когда текст переполняется.
-
+
+ ```jsx
+ import { OverflowingTextWithTooltip } from 'twenty-ui/display';
-```jsx
-import { OverflowingTextWithTooltip } from 'twenty-ui/display';
+ export const MyComponent = () => {
+ const crmTaskDescription =
+ 'Свяжитесь с клиентом по поводу его недавнего запроса по продукту. Обсудите варианты цен, ответьте на любые вопросы и предоставьте дополнительную информацию о продукте. Запишите детали разговора в CRM для дальнейшего использования.';
-export const MyComponent = () => {
- const crmTaskDescription =
- 'Follow up with client regarding their recent product inquiry. Discuss pricing options, address any concerns, and provide additional product information. Record the details of the conversation in the CRM for future reference.';
-
- return ;
-};
-```
-
-
-
-
-
-| Свойства | Тип | Описание |
-| -------- | ------ | ------------------------------------------------------------------------ |
-| текст | строка | Содержимое, которое вы хотите отобразить в области переполненного текста |
-
-
+ return ;
+ };
+ ```
+
+
+ | Свойства | Тип | Описание |
+ | -------- | ------ | ------------------------------------------------------------------------ |
+ | текст | строка | Содержимое, которое вы хотите отобразить в области переполненного текста |
+
diff --git a/packages/twenty-docs/l/ru/twenty-ui/input.mdx b/packages/twenty-docs/l/ru/twenty-ui/input.mdx
index 466af67cb7..b68cf37afb 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx b/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx
index 85f45654bc..c248e1f57b 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/input/icon-picker.mdx
@@ -4,53 +4,49 @@ image: /images/user-guide/github/github-header.png
---
-
+
Выпадающий список выбора иконки, который позволяет пользователям выбрать иконку из списка.
+
+ ```jsx
+ import { RecoilRoot } from "recoil";
+ import React, { useState } from "react";
+ import { IconPicker } from "@/ui/input/components/IconPicker";
-
+ export const MyComponent = () => {
-```jsx
-import { RecoilRoot } from "recoil";
-import React, { useState } from "react";
-import { IconPicker } from "@/ui/input/components/IconPicker";
+ const [selectedIcon, setSelectedIcon] = useState("");
+ const handleIconChange = ({ iconKey, Icon }) => {
+ console.log("Выбранная иконка:", iconKey);
+ setSelectedIcon(iconKey);
+ };
-export const MyComponent = () => {
+ return (
+
+
+
+ );
+ };
+ ```
+
- const [selectedIcon, setSelectedIcon] = useState("");
- const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Selected Icon:", iconKey);
- setSelectedIcon(iconKey);
- };
-
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| Свойства | Тип | Описание |
-| --------------- | ------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
-| отключено | boolean | Отключает выбор иконки, если установлено значение `true` |
-| onChange | функция | Функция обратного вызова, вызываемая, когда пользователь выбирает иконку. Она получает объект с свойствами `iconKey` и `Icon` |
-| selectedIconKey | строка | Ключ изначально выбранной иконки |
-| onClickOutside | функция | Функция обратного вызова, вызываемая при клике пользователя за пределами выпадающего списка |
-| onClose | функция | Функция обратного вызова, вызываемая при закрытии выпадающего списка |
-| onOpen | функция | Функция обратного вызова, вызываемая при открытии выпадающего списка |
-| вариант | строка | Визуальный стиль варианта кликабельной иконки. Варианты включают: `primary`, `secondary`, и `tertiary` |
-
-
+
+ | Свойства | Тип | Описание |
+ | --------------- | ------- | ----------------------------------------------------------------------------------------------------------------------------- |
+ | отключено | булево | Отключает выбор иконки, если установлено значение `true` |
+ | onChange | функция | Функция обратного вызова, вызываемая, когда пользователь выбирает иконку. Она получает объект с свойствами `iconKey` и `Icon` |
+ | selectedIconKey | строка | Ключ изначально выбранной иконки |
+ | onClickOutside | функция | Функция обратного вызова, вызываемая при клике пользователя за пределами выпадающего списка |
+ | onClose | функция | Функция обратного вызова, вызываемая при закрытии выпадающего списка |
+ | onOpen | функция | Функция обратного вызова, вызываемая при открытии выпадающего списка |
+ | вариант | строка | Визуальный стиль варианта кликабельной иконки. Варианты включают: `primary`, `secondary`, и `tertiary` |
+
diff --git a/packages/twenty-docs/l/ru/twenty-ui/navigation.mdx b/packages/twenty-docs/l/ru/twenty-ui/navigation.mdx
index 63552b6ba1..5d707e554c 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx b/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx
index 6a950cbb4e..633f369b07 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/navigation/breadcrumb.mdx
@@ -4,41 +4,38 @@ image: /images/user-guide/fields/field.png
---
-
+
Отображает панель навигации с хлебными крошками.
-
+
+ ```jsx
+ import { BrowserRouter } from "react-router-dom";
+ import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
-```jsx
-import { BrowserRouter } from "react-router-dom";
-import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
+ export const MyComponent = () => {
+ const breadcrumbLinks = [
+ { children: "Домой", href: "/" },
+ { children: "Категория", href: "/category" },
+ { children: "Подкатегория", href: "/category/subcategory" },
+ { children: "Текущая страница" },
+ ];
-export const MyComponent = () => {
- const breadcrumbLinks = [
- { children: "Home", href: "/" },
- { children: "Category", href: "/category" },
- { children: "Subcategory", href: "/category/subcategory" },
- { children: "Current Page" },
- ];
+ return (
+
+
+
+ )
+ };
+ ```
+
- return (
-
-
-
- )
-};
-```
-
-
-
-
-| Свойства | Тип | Описание |
-| --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| className | строка | Дополнительное имя класса для дополнительной стилизации |
-| ссылки | массив | Массив объектов, каждый из которых представляет собой ссылку-хлебную крошку. Каждый объект имеет свойство `children` (текстовое содержимое ссылки) и необязательное свойство `href` (URL-адрес для перехода по ссылке при щелчке) |
-
-
+
+ | Свойства | Тип | Описание |
+ | --------- | ------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | className | строка | Дополнительное имя класса для дополнительной стилизации |
+ | ссылки | массив | Массив объектов, каждый из которых представляет собой ссылку-хлебную крошку. Каждый объект имеет свойство `children` (текстовое содержимое ссылки) и необязательное свойство `href` (URL-адрес для перехода по ссылке при щелчке) |
+
diff --git a/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx
index 67bf608f53..498ff5b2af 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/navigation/step-bar.mdx
@@ -4,35 +4,31 @@ image: /images/user-guide/api/api.png
---
-
+
Отображает прогресс через последовательность пронумерованных шагов, выделяя активный шаг. Он отображает контейнер с шагами, каждый из которых представлен компонентом `Step`.
-
+
+ ```jsx
+ import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
-```jsx
-import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
+ export const MyComponent = () => {
+ return (
+
+ Шаг 1
+ Шаг 2
+ Шаг 3
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
- Step 1
- Step 2
- Step 3
-
- );
-};
-```
-
-
-
-
-
-| Свойства | Тип | Описание |
-| ----------- | ----- | --------------------------------------------------------------------------------------------------------------------- |
-| активныйШаг | число | Индекс текущего активного шага. Это определяет, какой шаг следует визуально выделить. |
-
-
+
+ | Свойства | Тип | Описание |
+ | ----------- | ----- | ------------------------------------------------------------------------------------- |
+ | активныйШаг | число | Индекс текущего активного шага. Это определяет, какой шаг следует визуально выделить. |
+
diff --git a/packages/twenty-docs/l/ru/twenty-ui/progress-bar.mdx b/packages/twenty-docs/l/ru/twenty-ui/progress-bar.mdx
index 7761b99e6d..876fe87cc9 100644
--- a/packages/twenty-docs/l/ru/twenty-ui/progress-bar.mdx
+++ b/packages/twenty-docs/l/ru/twenty-ui/progress-bar.mdx
@@ -4,46 +4,41 @@ image: /images/user-guide/emails/emails_header.png
---
-
+
Указывает на прогресс или обратный отсчет и перемещается справа налево.
+
+ ```jsx
+ import { ProgressBar } from "twenty-ui/feedback";
-
+ export const MyComponent = () => {
+ return (
+
+ );
+ };
+ ```
+
-```jsx
-import { ProgressBar } from "twenty-ui/feedback";
-
-export const MyComponent = () => {
- return (
-
- );
-};
-```
-
-
-
-
-
-| Свойства | Тип | Описание | По умолчанию |
-| ----------------- | ------- | ------------------------------------------------------------------------------------------- | ------------ |
-| Продолжительность | число | Общая продолжительность анимации индикатора прогресса в миллисекундах | 3 |
-| Задержка | число | Задержка начала анимации индикатора прогресса в миллисекундах | 0 |
-| Сглаживание | строка | Сглаживающая функция для анимации индикатора прогресса | easeInOut |
-| Высота индикатора | число | Высота полосы в пикселях | 24 |
-| Цвет полосы | строка | Цвет полосы | gray80 |
-| Автозапуск | boolean | Если `true`, анимация индикатора прогресса начинается автоматически при загрузке компонента | `истина` |
-
-
+
+ | Свойства | Тип | Описание | По умолчанию |
+ | ----------------- | ------ | ------------------------------------------------------------------------------------------- | ------------ |
+ | Продолжительность | число | Общая продолжительность анимации индикатора прогресса в миллисекундах | 3 |
+ | Задержка | число | Задержка начала анимации индикатора прогресса в миллисекундах | 0 |
+ | Сглаживание | строка | Сглаживающая функция для анимации индикатора прогресса | easeInOut |
+ | Высота индикатора | число | Высота полосы в пикселях | 24 |
+ | Цвет полосы | строка | Цвет полосы | gray80 |
+ | Автозапуск | булево | Если `true`, анимация индикатора прогресса начинается автоматически при загрузке компонента | `истина` |
+
## Круговой индикатор прогресса
@@ -51,27 +46,21 @@ export const MyComponent = () => {
Указывает на прогресс задачи, часто используется на экранах загрузки или в областях, где необходимо сообщить пользователю о текущих процессах.
+
+ ```jsx
+ import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-
-```jsx
-import { CircularProgressBar } from "@/ui/feedback/progress-bar/components/CircularProgressBar";
-
-export const MyComponent = () => {
- return ;
-};
-```
-
-
-
-
-
-| Свойства | Тип | Описание | По умолчанию |
-| ------------- | ------ | ------------------------------------- | ------------ |
-| размер | число | Размер кругового индикатора прогресса | 50 |
-| Ширина полосы | число | Ширина линии индикатора прогресса | 5 |
-| Цвет полосы | строка | Цвет индикатора прогресса | currentColor |
-
-
+ export const MyComponent = () => {
+ return ;
+ };
+ ```
+
+
+ | Свойства | Тип | Описание | По умолчанию |
+ | ------------- | ------ | ------------------------------------- | ------------ |
+ | Размер | число | Размер кругового индикатора прогресса | 50 |
+ | Ширина полосы | число | Ширина линии индикатора прогресса | 5 |
+ | Цвет полосы | строка | Цвет индикатора прогресса | currentColor |
+
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/feature-flags.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/feature-flags.mdx
new file mode 100644
index 0000000000..7d8b8e2bb4
--- /dev/null
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/feature-flags.mdx
@@ -0,0 +1,46 @@
+---
+title: Özellik Bayrakları
+---
+
+Özellik bayrakları deneysel özellikleri gizlemek için kullanılır. Twenty için, çalışma alanı seviyesinde ayarlanırlar, kullanıcı seviyesinde değil.
+
+## Yeni bir özellik bayrağı ekleme
+
+`FeatureFlagKey.ts` dosyasında özellik bayrağını ekleyin:
+
+```ts
+type FeatureFlagKey =
+ | 'IS_FEATURENAME_ENABLED'
+ | ...;
+```
+
+Ayrıca `feature-flag.entity.ts` enumuna ekleyin:
+
+```ts
+enum FeatureFlagKeys {
+ IsFeatureNameEnabled = 'IS_FEATURENAME_ENABLED',
+ ...
+}
+```
+
+Bir **backend** özelliği üzerinde bir özellik bayrağı uygulamak için kullanın:
+
+```ts
+@Gate({
+ featureFlag: 'IS_FEATURENAME_ENABLED',
+})
+```
+
+Bir **frontend** özelliği üzerinde bir özellik bayrağı uygulamak için kullanın:
+
+```ts
+const isFeatureNameEnabled = useIsFeatureEnabled('IS_FEATURENAME_ENABLED');
+```
+
+## Dağıtım için özellik bayraklarını yapılandırın
+
+`core.featureFlag` Tablosundaki ilgili kaydı değiştirin:
+
+| kimlik | anahtar | çalışma alanı kimliği | değer |
+| -------- | ------------------------ | --------------------- | ------- |
+| Rastgele | `IS_FEATURENAME_ENABLED` | Çalışma Alanı kimliği | `doğru` |
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..fe39619338
--- /dev/null
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,41 @@
+---
+title: Mesaj Kuyruğu
+---
+
+Kuyruklar, asenkron işlemlerin gerçekleştirilmesine imkan tanır. Kayıt esnasında hoş geldin e-postası göndermek gibi arka plan görevleri gerçekleştirmek için kullanılabilirler.
+Her kullanım durumu, `MessageQueueServiceBase`'den genişletilmiş kendi kuyruk sınıfına sahip olacaktır.
+
+Şu anda yalnızca kuyruk sürücüsü olarak `bull-mq`[bull-mq](https://bullmq.io/) destekliyoruz.
+
+## Yeni bir kuyruk oluşturma ve kullanma adımları
+
+1. Yeni kuyruğunuz için enum `MESSAGE_QUEUES` altında bir kuyruk adı ekleyin.
+2. Kuyruğun değişken adını bağımlılık belirteci olarak kullanarak kuyruk fabrikası uygulamasını sağlayın.
+3. Oluşturduğunuz kuyruğu, gerekli modüle/hizmete kuyruk adıyla birlikte bağımlılık belirteci kullanarak enjekte edin.
+4. Üretici gibi token tabanlı enjeksiyon ile çalışan sınıfını ekleyin.
+
+### Örnek kullanım
+
+```ts
+class Resolver {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {}
+
+ async onSomeAction() {
+ //iş mantığı
+ await this.queue.add(someData);
+ }
+}
+
+//async worker
+class CustomWorker {
+ constructor(@Inject(MESSAGE_QUEUES.custom) private queue: MessageQueueService) {
+ this.initWorker();
+ }
+
+ async initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //worker logic
+ });
+ }
+}
+```
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/zapier.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/zapier.mdx
new file mode 100644
index 0000000000..77f3955564
--- /dev/null
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/backend-development/zapier.mdx
@@ -0,0 +1,83 @@
+---
+title: Zapier Uygulaması
+---
+
+Zapier'i kullanarak Twenty'yi 3000+ uygulama ile zahmetsizce senkronize edin. Görevleri otomatikleştirin, verimliliği artırın ve müşteri ilişkilerinizi güçlendirin!
+
+## Zapier Hakkında
+
+Zapier, ekibinizin her gün kullandığı uygulamaları bağlayarak iş akışlarını otomatikleştirmenize olanak tanıyan bir araçtır. Zapier'in temel konsepti, Zaps olarak adlandırılan otomasyon iş akışlarıdır ve tetikleyiciler ile işlemleri içerir.
+
+Zapier'in nasıl çalıştığı hakkında daha fazla bilgi edinebilirsiniz [burada](https://zapier.com/how-it-works).
+
+## Kurulum
+
+### Adım 1: Zapier paketlerini yükleyin
+
+```bash
+cd packages/twenty-zapier
+
+yarn
+```
+
+### Adım 2: CLI ile giriş yapın
+
+Zapier kimlik bilgilerinizi kullanarak CLI ile oturum açın:
+
+```bash
+zapier login
+```
+
+### Adım 3: Çevre değişkenlerini ayarlayın
+
+`packages/twenty-zapier` klasöründen şunu çalıştırın:
+
+```bash
+cp .env.example .env
+```
+
+Uygulamayı yerel ortamda çalıştırın, [http://localhost:3000/settings/api-webhooks](http://localhost:3000/settings/api-webhooks) adresine gidin ve bir API anahtarı oluşturun.
+
+Yeni oluşturduğunuz API anahtarı ile `.env` dosyasındaki **YOUR_API_KEY** değerini değiştirin.
+
+## Geliştirme
+
+
+ Herhangi bir `zapier` komutundan önce `yarn build` çalıştırdığınızdan emin olun.
+
+
+### Test
+
+```bash
+yarn test
+```
+
+### Lint
+
+```bash
+yarn format
+```
+
+### Kod düzenlerken izle ve derle
+
+```bash
+yarn watch
+```
+
+### Zapier uygulamanızı doğrulayın
+
+```bash
+yarn validate
+```
+
+### Zapier uygulamanızı dağıtın
+
+```bash
+yarn deploy
+```
+
+### Tüm Zapier CLI komutlarını listeleyin
+
+```bash
+zapier
+```
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..322f9ef680
--- /dev/null
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: Ön Yüz Komutları
+---
+
+## Faydalı Komutlar
+
+### Uygulamayı Başlatma
+
+```bash
+npx nx start twenty-front
+```
+
+### API graphql şemasına dayalı graphql şemasını yeniden oluştur
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+VEYA
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### Kod Temizleme
+
+```bash
+npx nx run twenty-front:lint # lint hatalarını düzeltmek için --fix'i geç
+```
+
+## Çeviriler
+
+```bash
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
+```
+
+### Test
+
+```bash
+npx nx run twenty-front:test # jest testlerini çalıştır
+npx nx run twenty-front:storybook:serve:dev # storybook'u çalıştır
+npx nx run twenty-front:storybook:test # testleri çalıştır # (yarn storybook:serve:dev'nin çalışıyor olması gerekir)
+npx nx run twenty-front:storybook:coverage # (yarn storybook:serve:dev'nin çalışıyor olması gerekir)
+```
+
+## Teknoloji Yığını
+
+Proje temiz ve basit bir yığına sahip, minimum şablon koduyla.
+
+**Uygulama**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [GraphQL Codegen](https://the-guild.dev/graphql/codegen)
+* [Recoil](https://recoiljs.org/docs/introduction/core-concepts)
+* [TypeScript](https://www.typescriptlang.org/)
+
+**Test**
+
+* [Jest](https://jestjs.io/)
+* [Storybook](https://storybook.js.org/)
+
+**Araçlar**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## Mimari
+
+### Rotalama
+
+[React Router](https://reactrouter.com/) rotalamayı halleder.
+
+Gereksiz [yeniden renderların](/l/tr/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders) önlenmesi için tüm rotalama mantığı `PageChangeEffect` içindeki bir `useEffect`'te yer alır.
+
+### Durum Yönetimi
+
+Durum yönetimini [Recoil](https://recoiljs.org/docs/introduction/core-concepts) halleder.
+
+Durum yönetimi hakkında daha fazla bilgi için [en iyi uygulamalar](/l/tr/developers/contribute/capabilities/frontend-development/best-practices-front#state-management) bölümüne bakın.
+
+## Test
+
+[Jest](https://jestjs.io/) birim testi aracı olarak kullanılırken [Storybook](https://storybook.js.org/) bileşen testleri için kullanılır.
+
+Jest, esas olarak yardımcı programların test edilmesi için kullanılır ve bileşenlerin kendisi için değil.
+
+Storybook, izole bileşenlerin davranışlarının test edilmesi ve tasarım sisteminin gösterilmesi için kullanılır.
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..1597cdcc08
--- /dev/null
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: Kısayollar
+---
+
+## Giriş
+
+Bir kısayolu dinlemeniz gerektiğinde, normalde `onKeyDown` olay dinleyicisini kullanırsınız.
+
+Ancak `twenty-front` uygulamasında, aynı anda monte edilmiş farklı bileşenlerde kullanılan aynı kısayollar arasında çakışmalar olabilir.
+
+Örneğin, Enter tuşunu dinleyen bir sayfanız ve Enter tuşunu dinleyen bir modalınız varsa, ve modalın içinde Enter tuşunu dinleyen bir Seçim bileşeni varsa, hepsi aynı anda monte edildiğinde bir çakışma yaşayabilirsiniz.
+
+## `useScopedHotkeys` hook'u
+
+Bu sorunu ele almak için, kısayolları çakışma olmadan dinlemeyi mümkün kılan özel bir kanca geliştirdik.
+
+Bir bileşene yerleştirirsiniz ve sadece bileşen monte edildiğinde VE belirtilen **kısayol kapsamı** aktif olduğunda kısayolları dinleyecektir.
+
+## Pratikte kısayolları nasıl dinleyebilirsiniz?
+
+Kısayol dinleme kurulumu iki adımdan oluşur:
+
+1. Kısayolları dinleyecek [kısayol kapsamını](#what-is-a-hotkey-scope-) ayarlayın
+2. Kısayolları dinlemek için `useScopedHotkeys` hook'unu kullanın
+
+Kısayol kapsamlarının kurulumu, sol menü veya komut menüsü gibi diğer kullanıcı arayüzü öğelerinin de kısayolları dinleyebileceği için, basit sayfalarda bile gereklidir.
+
+## Kısayollar için kullanım durumları
+
+Genel olarak, kısayollara ihtiyaç duyan iki kullanım durumunuz olacaktır:
+
+1. Bir sayfada veya bir sayfada monte edilmiş bir bileşende
+2. Bir kullanıcı eylemi nedeniyle dikkati çeken modal-tipi bir bileşende
+
+İkinci kullanım durumu, örneğin bir modal içinde bir açılır menü gibi, yineleyici olabilir.
+
+### Bir sayfada kısayolları dinlemek
+
+Örnek:
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. Set the hotkey scope in a useEffect
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // Revert to the previous hotkey scope when the component is unmounted
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. Use the useScopedHotkeys hook
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // Some logic executed on this page when the user presses Enter
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return Enter Dinleyen Sayfam
;
+};
+```
+
+### Modal-tipi bir bileşende kısayolları dinlemek
+
+Bu örnekte, ebeveynine kapanmasını söylemek için Escape tuşunu dinleyen bir modal bileşeni kullanacağız.
+
+Burada kullanıcı etkileşimi, kapsamı değiştirmektir.
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. Set the hotkey scope when user opens the modal
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. Revert to the previous hotkey scope when the modal is closed
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
Modal İçeren Sayfam
+ Modali Aç
+ {showModal && }
+ ;
+};
+```
+
+Sonra modal bileşeninde:
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. Use the useScopedHotkeys hook to listen for Escape.
+ // Note that escape is a common hotkey that could be used by many other components
+ // So it's important to use a hotkey scope to avoid conflicts
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return Modal bileşenim
;
+};
+```
+
+Bu modeli, mount/unmount ile yalnızca bir useEffect'e güvenmenin çakışmayı önlemek için yeterli olmayabileceği durumlarda kullanmak önemlidir.
+
+Bu çakışmaların hata ayıklaması zor olabilir ve genellikle useEffect'lerle daha sık meydana gelebilir.
+
+## Kısayol kapsamı nedir?
+
+Kısayol kapsamı, kısayolların aktif olduğu bir bağlamı temsil eden bir dizedir. Genellikle bir enum olarak kodlanmıştır.
+
+Kısayol kapsamını değiştirdiğinizde, bu kapsamı dinleyen kısayollar etkinleştirilecek ve diğer kapsamları dinleyen kısayollar devre dışı bırakılacaktır.
+
+Aynı anda yalnızca bir kapsam ayarlayabilirsiniz.
+
+Örneğin, her sayfa için kısayol kapsamları `PageHotkeyScope` enum'unda tanımlanmıştır:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+Dahili olarak, şu anda seçili olan kapsam, uygulama genelinde paylaşılan bir Recoil durumunda saklanır:
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+Ancak bu Recoil durumu asla el ile yönetilmemelidir! Bunu bir sonraki bölümde nasıl kullanacağımızı göreceğiz.
+
+## İçsel olarak nasıl çalışıyor?
+
+Gereksiz yeniden render etme işlemlerinden kaçınarak daha performanslı hale getiren [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) üzerine ince bir sarmalayıcı yaptık.
+
+Ayrıca, kısayol kapsamı durumunu yönetmek ve uygulamanın her yerinde kullanılabilir hale getirmek için bir Recoil durumu oluşturuyoruz.
diff --git a/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..1f8034ae9a
--- /dev/null
+++ b/packages/twenty-docs/l/tr/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: Twenty'nin UI bileşen kütüphanesine göz atın
+---
+
+Storybook'ta eksiksiz bileşen kütüphanemizi ve dokümantasyonumuzu görüntüleyin.
+
+[Storybook'u Aç →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/tr/twenty-ui/input.mdx b/packages/twenty-docs/l/tr/twenty-ui/input.mdx
index 75a7225ad4..8a6b1d8aab 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/tr/twenty-ui/navigation.mdx b/packages/twenty-docs/l/tr/twenty-ui/navigation.mdx
index df9401f3e8..b046632b2f 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
diff --git a/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx
index 7a50004c42..6ef18d7d18 100644
--- a/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/tr/twenty-ui/navigation/navigation-bar.mdx
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
Birden fazla `NavigationBarItem` bileşeni içeren bir gezinti çubuğu oluşturur.
-
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "Ana Sayfa",
+ Icon: IconHome,
+ onClick: () => console.log("Ana Sayfa tıklandı"),
+ },
+ {
+ name: "Profil",
+ Icon: IconUser,
+ onClick: () => console.log("Profil tıklandı"),
+ },
+ {
+ name: "Ayarlar",
+ Icon: IconSettings,
+ onClick: () => console.log("Ayarlar tıklandı"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| Özellikler | Tür | Açıklama |
-| ----------- | ----- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
-| aktifÖğeAdı | metin | Şu anda aktif olan gezinti öğesinin adı |
-| öğeler | dizi | Her gezinti öğesini temsil eden nesnelerin dizisi. Her nesne, öğenin adını, gösterilecek `Icon` bileşenini ve öğeye tıklandığında çağrılacak bir `onClick` fonksiyonunu içerir. |
-
-
+
+ | Özellikler | Tür | Açıklama |
+ | ----------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+ | aktifÖğeAdı | dize | Şu anda aktif olan gezinti öğesinin adı |
+ | öğeler | dizi | Her gezinti öğesini temsil eden nesnelerin dizisi. Her nesne, öğenin adını, gösterilecek `Icon` bileşenini ve öğeye tıklandığında çağrılacak bir `onClick` fonksiyonunu içerir. |
+
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/queue.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/queue.mdx
new file mode 100644
index 0000000000..28af3137da
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/backend-development/queue.mdx
@@ -0,0 +1,42 @@
+---
+title: 消息队列
+---
+
+队列支持异步操作的执行。 它们可用于执行后台任务,例如在注册时发送欢迎邮件。
+每个用例都将拥有一个继承自 `MessageQueueServiceBase` 的队列类。
+
+当前,我们仅支持使用 `bull-mq`[bull-mq](https://bullmq.io/) 作为队列驱动。
+
+## 创建和使用新队列的步骤
+
+1. 在枚举 `MESSAGE_QUEUES` 下为您的新队列添加队列名称。
+2. 提供以队列名称为依赖令牌的队列工厂实现。
+3. 在所需模块/服务中以队列名称作为依赖令牌注入您创建的队列。
+4. 添加与生产者相同令牌注入的工作类。
+
+### 示例用法
+
+```ts
+类 Resolver {
+ 构造函数(@Inject(MESSAGE_QUEUES.custom) 私有队列: MessageQueueService) {}
+
+ 异步某行为事件() {
+ //业务逻辑
+ await this.queue.add(someData);
+ }
+}
+
+//异步工作者
+类 CustomWorker {
+ 构造函数(@Inject(MESSAGE_QUEUES.custom) 私有队列: MessageQueueService) {
+ this.initWorker();
+ }
+
+ 异步 initWorker() {
+ await this.queue.work(async ({ id, data }) => {
+ //工作者逻辑
+ });
+ }
+}
+
+```
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
new file mode 100644
index 0000000000..a8e85c59e1
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/folder-architecture-front.mdx
@@ -0,0 +1,109 @@
+---
+title: 文件夹架构
+info: 深入了解我们的文件夹架构
+---
+
+在本指南中,您将探索项目目录结构的详细信息,以及它如何促进 Twenty 的组织和可维护性。
+
+遵循此文件夹架构约定,可以更轻松地找到与特定功能相关的文件,并确保应用程序的可扩展性和可维护性。
+
+```
+front
+└───modules
+│ └───module1
+│ │ └───submodule1
+│ └───module2
+│ └───ui
+│ │ └───display
+│ │ └───inputs
+│ │ │ └───buttons
+│ │ └───...
+└───pages
+└───...
+```
+
+## 页面
+
+包含由应用程序路由定义的顶级组件。 它们从模块文件夹中导入更多低级组件(详细信息见下文)。
+
+## 模块
+
+每个模块代表一个功能或一组功能,包括其特定组件、状态和操作逻辑。
+它们都应遵循以下结构。 您可以在模块中嵌套模块(称为子模块),同样的规则将适用。
+
+```
+module1
+ └───components
+ │ └───component1
+ │ └───component2
+ └───constants
+ └───contexts
+ └───graphql
+ │ └───fragments
+ │ └───queries
+ │ └───mutations
+ └───hooks
+ │ └───internal
+ └───states
+ │ └───selectors
+ └───types
+ └───utils
+```
+
+### 上下文
+
+上下文是一种通过组件树传递数据的方法,不必在每个级别手动传 props。
+
+详情请参阅 [React Context](https://react.dev/reference/react#context-hooks)。
+
+### GraphQL
+
+包含片段、查询和变更。
+
+详情请参阅 [GraphQL](https://graphql.org/learn/)。
+
+* 片段
+
+片段是查询的可重用部分,可以在不同地方使用。 使用片段可以更容易地避免代码重复。
+
+详情请参阅 [GraphQL Fragments](https://graphql.org/learn/queries/#fragments)。
+
+* 查询
+
+详情请参阅 [GraphQL Queries](https://graphql.org/learn/queries/)。
+
+* 变更
+
+详情请参阅 [GraphQL Mutations](https://graphql.org/learn/queries/#mutations)。
+
+### 钩子
+
+详情请参阅 [Hooks](https://react.dev/learn/reusing-logic-with-custom-hooks)。
+
+### 状态
+
+包含状态管理逻辑。 [RecoilJS](https://recoiljs.org) 处理这部分。
+
+* 选择器:详情请参阅 [RecoilJS Selectors](https://recoiljs.org/docs/basic-tutorial/selectors)。
+
+React 内置状态管理仍然在组件内处理状态。
+
+### 工具
+
+应仅包含可重用的纯函数。 否则,请在 `hooks` 文件夹中创建自定义钩子。
+
+## UI
+
+包含应用程序中使用的所有可重用的 UI 组件。
+
+这个文件夹可以包含子文件夹,像 `data`、`display`、`feedback` 和 `input`,用于特定类型的组件。 每个组件都应是自包含和可重用的,以便您可以在应用程序的不同部分使用它。
+
+通过将 UI 组件与 `modules` 文件夹中的其他组件分开,可以更轻松地保持一致的设计,并在更改 UI 时不影响其他部分(业务逻辑)的代码库。
+
+## 接口和依赖关系
+
+您可以从任何模块中导入其他模块代码,但 `ui` 文件夹除外。 这将使代码易于测试。
+
+### 内部
+
+模块的每个部分(钩子、状态等) 都可以有一个 `internal` 文件夹,其中包含仅在模块内使用的部分。
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/frontend-commands.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
new file mode 100644
index 0000000000..088e938f0d
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/frontend-commands.mdx
@@ -0,0 +1,90 @@
+---
+title: 前端命令
+---
+
+## 实用命令
+
+### 启动应用
+
+```bash
+npx nx start twenty-front
+```
+
+### 根据API graphql schema重新生成graphql schema
+
+```bash
+npx nx run twenty-front:graphql:generate --configuration=metadata
+```
+
+或
+
+```bash
+npx nx run twenty-front:graphql:generate
+```
+
+### Lint
+
+```bash
+npx nx run twenty-front:lint # 传递 --fix 以修复 lint 错误
+```
+
+## 翻译
+
+```bash
+npx nx run twenty-front:lingui:extract
+npx nx run twenty-front:lingui:compile
+```
+
+### 测试
+
+```bash
+npx nx run twenty-front:test # 运行 jest 测试
+npx nx run twenty-front:storybook:serve:dev # 运行 storybook
+npx nx run twenty-front:storybook:test # 运行测试 # (需要正在运行 yarn storybook:serve:dev)
+npx nx run twenty-front:storybook:coverage # (需要正在运行 yarn storybook:serve:dev)
+```
+
+## 技术栈
+
+项目有一个干净且简单的技术栈,使用最少的样板代码。
+
+**应用**
+
+* [React](https://react.dev/)
+* [Apollo](https://www.apollographql.com/docs/)
+* [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/)
+
+**工具**
+
+* [Yarn](https://yarnpkg.com/)
+* [Craco](https://craco.js.org/docs/)
+* [ESLint](https://eslint.org/)
+
+## 架构
+
+### 路由
+
+[React Router](https://reactrouter.com/) 负责处理路由。
+
+为了避免不必要的[重新渲染](/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front#managing-re-renders),所有路由逻辑都在 `PageChangeEffect` 的 `useEffect` 中。
+
+### 状态管理
+
+[Recoil](https://recoiljs.org/docs/introduction/core-concepts) 处理状态管理。
+
+查看[最佳实践](/l/zh/developers/contribute/capabilities/frontend-development/best-practices-front#state-management)以获取有关状态管理的更多信息。
+
+## 测试
+
+[Jest](https://jestjs.io/) 用于单元测试,而 [Storybook](https://storybook.js.org/) 用于组件测试。
+
+Jest 主要用于测试工具函数,而不是组件本身。
+
+Storybook 用于测试隔离组件的行为,以及展示设计系统。
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/hotkeys.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/hotkeys.mdx
new file mode 100644
index 0000000000..9b6656078d
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/hotkeys.mdx
@@ -0,0 +1,178 @@
+---
+title: 快捷键
+---
+
+## 介绍
+
+当你需要监听一个快捷键时,通常会使用 `onKeyDown` 事件监听器。
+
+然而,在 `twenty-front` 中,你可能会遇到用于不同组件的相同快捷键之间的冲突,这些组件同时挂载。
+
+例如,如果你有一个页面监听回车键,而一个包含选择组件的模态框也监听回车键,在所有这些组件同时挂载时可能会发生冲突。
+
+## `useScopedHotkeys` hook
+
+为了解决这个问题,我们有一个自定义的 hook,可以在不产生冲突的情况下监听快捷键。
+
+您可以将它放在组件中,它只会在组件挂载并且指定的 **快捷键范围** 激活时监听快捷键。
+
+## 在实践中如何监听快捷键?
+
+设置快捷键监听涉及两个步骤:
+
+1. 设置将会监听快捷键的[快捷键范围](#what-is-a-hotkey-scope-)
+2. 使用 `useScopedHotkeys` hook 来监听快捷键
+
+即使在简单的页面中,也需要设置快捷键范围,因为其他界面元素如左侧菜单或命令菜单也可能监听快捷键。
+
+## 快捷键的使用案例
+
+通常情况下,会有两种需要快捷键的使用案例:
+
+1. 在页面或页面中挂载的组件中
+2. 在由于用户操作而获得焦点的模态组件中
+
+第二种使用情况可以递归发生:例如,在模态框中的下拉框。
+
+### 在页面中监听快捷键
+
+示例:
+
+```tsx
+const PageListeningEnter = () => {
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ // 1. 设置快捷键范围在 useEffect 中
+ useEffect(() => {
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ // 在组件卸载时恢复到先前的快捷键范围
+ return () => {
+ goBackToPreviousHotkeyScope();
+ };
+ }, [goBackToPreviousHotkeyScope, setHotkeyScopeAndMemorizePreviousScope]);
+
+ // 2. 使用 useScopedHotkeys hook
+ useScopedHotkeys(
+ Key.Enter,
+ () => {
+ // 当用户按下回车键时,此页面上执行的一些逻辑
+ // ...
+ },
+ ExampleHotkeyScopes.ExampleEnterPage,
+ );
+
+ return 我的页面监听回车键
;
+};
+```
+
+### 在模态类型组件中监听快捷键
+
+在这个示例中,我们将使用一个模态组件,该组件监听 Esc 键来告诉其父组件关闭自己。
+
+这里用户交互正在改变范围。
+
+```tsx
+const ExamplePageWithModal = () => {
+ const [showModal, setShowModal] = useState(false);
+
+ const {
+ setHotkeyScopeAndMemorizePreviousScope,
+ goBackToPreviousHotkeyScope,
+ } = usePreviousHotkeyScope();
+
+ const handleOpenModalClick = () => {
+ // 1. 当用户打开模态框时设置快捷键范围
+ setShowModal(true);
+ setHotkeyScopeAndMemorizePreviousScope(
+ ExampleHotkeyScopes.ExampleModal,
+ );
+ };
+
+ const handleModalClose = () => {
+ // 1. 当模态框关闭时恢复到先前的快捷键范围
+ setShowModal(false);
+ goBackToPreviousHotkeyScope();
+ };
+
+ return
+
我的页面有模态框
+ 打开模态框
+ {showModal && }
+ ;
+};
+```
+
+然后在模态组件中:
+
+```tsx
+const MyDropdownComponent = ({ onClose }: { onClose: () => void }) => {
+ // 2. 使用 useScopedHotkeys hook 来监听 Esc 键。
+ // 注意,esc 是许多其他组件可能使用的常见快捷键
+ // 因此,请务必使用快捷键范围以避免冲突
+ useScopedHotkeys(
+ Key.Escape,
+ () => {
+ onClose()
+ },
+ ExampleHotkeyScopes.ExampleModal,
+ );
+
+ return 我的模态组件
;
+};
+```
+
+当你不确定只使用 useEffect 并且挂载/卸载操作是否足以避免冲突时,使用此模式很重要。
+
+这些冲突可能很难调试,而且可能会在使用useEffects时更频繁地发生。
+
+## 什么是快捷键范围?
+
+快捷键范围是表示快捷键激活上下文的字符串。 通常编码为枚举。
+
+当你更改快捷键范围时,监听此范围的快捷键将启用,监听其他范围的快捷键将被禁用。
+
+一次只能设置一个范围。
+
+例如,每个页面的快捷键范围在 `PageHotkeyScope` 枚举中定义:
+
+```tsx
+export enum PageHotkeyScope {
+ Settings = 'settings',
+ CreateWorkspace = 'create-workspace',
+ SignInUp = 'sign-in-up',
+ CreateProfile = 'create-profile',
+ PlanRequired = 'plan-required',
+ ShowPage = 'show-page',
+ PersonShowPage = 'person-show-page',
+ CompanyShowPage = 'company-show-page',
+ CompaniesPage = 'companies-page',
+ PeoplePage = 'people-page',
+ OpportunitiesPage = 'opportunities-page',
+ ProfilePage = 'profile-page',
+ WorkspaceMemberPage = 'workspace-member-page',
+ TaskPage = 'task-page',
+}
+```
+
+在内部,当前选择的范围存储在整个应用程序共享的 Recoil 状态中:
+
+```tsx
+export const currentHotkeyScopeState = createState({
+ key: 'currentHotkeyScopeState',
+ defaultValue: INITIAL_HOTKEYS_SCOPE,
+});
+```
+
+但这个 Recoil 状态不应该手动处理! 我们将在下一节中学习如何使用它。
+
+## 内部是如何运作的?
+
+我们在 [react-hotkeys-hook](https://react-hotkeys-hook.vercel.app/docs/intro) 之上制作了一个薄包装,使其性能更高并避免不必要的重新渲染。
+
+我们还创建了一个 Recoil 状态来处理快捷键范围状态,并使其在整个应用程序中可用。
diff --git a/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/storybook.mdx b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/storybook.mdx
new file mode 100644
index 0000000000..1a6e63662a
--- /dev/null
+++ b/packages/twenty-docs/l/zh/developers/contribute/capabilities/frontend-development/storybook.mdx
@@ -0,0 +1,8 @@
+---
+title: Storybook
+description: 浏览 Twenty 的 UI 组件库
+---
+
+在 Storybook 中查看我们完整的组件库和文档。
+
+[打开 Storybook →](https://storybook.twenty.com)
diff --git a/packages/twenty-docs/l/zh/twenty-ui/input.mdx b/packages/twenty-docs/l/zh/twenty-ui/input.mdx
index 59b7855d48..da99958ad8 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/input.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/input.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tips/light-bulb.png
---
-
-
\ No newline at end of file
+
+
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 b33a54f43b..182cbced4f 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
@@ -4,53 +4,27 @@ image: /images/user-guide/github/github-header.png
---
-
+
一个基于下拉菜单的图标选择器,允许用户从列表中选择图标。
+
+ ```jsx
+ import { RecoilRoot } from \"recoil\";\nimport React, { useState } from \"react\";\nimport { IconPicker } from \"@/ui/input/components/IconPicker\";\n\nexport const MyComponent = () => {\n\n const [selectedIcon, setSelectedIcon] = useState(\"\");\n const handleIconChange = ({ iconKey, Icon }) => {\n console.log(\"Selected Icon:\", iconKey);\n setSelectedIcon(iconKey);\n };\n\n return (\n \n \n \n );\n};
+ ```
+
-
-
-```jsx
-import { RecoilRoot } from "recoil";
-import React, { useState } from "react";
-import { IconPicker } from "@/ui/input/components/IconPicker";
-
-export const MyComponent = () => {
-
- const [selectedIcon, setSelectedIcon] = useState("");
- const handleIconChange = ({ iconKey, Icon }) => {
- console.log("Selected Icon:", iconKey);
- setSelectedIcon(iconKey);
- };
-
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| --------------- | -------- | ------------------------------------------------------ |
-| disabled | 布尔值 | 如果设置为 `true`,则禁用图标选择器 |
-| onChange | 函数 | 当用户选择图标时触发的回调函数。 它接收一个具有 `iconKey` 和 `Icon` 属性的对象 |
-| selectedIconKey | 字符串 | 初始选中的图标键 |
-| onClickOutside | 函数 | 当用户点击下拉菜单外部时触发的回调函数 |
-| onClose | 函数 | 当下拉菜单关闭时触发的回调函数 |
-| onOpen | function | 当下拉菜单打开时触发的回调函数 |
-| 变体 | 字符串 | 可点击图标的视觉风格变体。 可选项包括:`primary`、`secondary` 和 `tertiary` |
-
-
+
+ | 属性 | 类型 | 描述 |
+ | --------------- | --- | ------------------------------------------------------ |
+ | 禁用 | 布尔值 | 如果设置为 `true`,则禁用图标选择器 |
+ | onChange | 函数 | 当用户选择图标时触发的回调函数。 它接收一个具有 `iconKey` 和 `Icon` 属性的对象 |
+ | selectedIconKey | 字符串 | 初始选中的图标键 |
+ | onClickOutside | 函数 | 当用户点击下拉菜单外部时触发的回调函数 |
+ | onClose | 函数 | 当下拉菜单关闭时触发的回调函数 |
+ | onOpen | 函数 | 当下拉菜单打开时触发的回调函数 |
+ | variant | 字符串 | 可点击图标的视觉风格变体。 可选项包括:`primary`、`secondary` 和 `tertiary` |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx
index 3c8c43969e..f0d2d5809f 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation.mdx
@@ -4,5 +4,5 @@ image: /images/user-guide/tasks/tasks_header.png
---
-
-
\ No newline at end of file
+
+
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 cdbb0d8524..4cee8a950b 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/breadcrumb.mdx
@@ -4,41 +4,38 @@ image: /images/user-guide/fields/field.png
---
-
+
呈现一个面包屑导航栏。
-
+
+ ```jsx
+ import { BrowserRouter } from "react-router-dom";
+ import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
-```jsx
-import { BrowserRouter } from "react-router-dom";
-import { Breadcrumb } from "@/ui/navigation/bread-crumb/components/Breadcrumb";
+ export const MyComponent = () => {
+ const breadcrumbLinks = [
+ { children: "首页", href: "/" },
+ { children: "类别", href: "/category" },
+ { children: "子类别", href: "/category/subcategory" },
+ { children: "当前页面" },
+ ];
-export const MyComponent = () => {
- const breadcrumbLinks = [
- { children: "Home", href: "/" },
- { children: "Category", href: "/category" },
- { children: "Subcategory", href: "/category/subcategory" },
- { children: "Current Page" },
- ];
+ return (
+
+
+
+ )
+ };
+ ```
+
- return (
-
-
-
- )
-};
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| -- | --- | -------------------------------------------------------------------------------- |
-| 类名 | 字符串 | 用于额外样式的可选类名 |
-| 链接 | 数组 | 对象数组,每个代表一个面包屑链接。 每个对象都有一个 `children` 属性(链接的文本内容)和一个可选的 `href` 属性(点击链接时导航到的URL)。 |
-
-
+
+ | 属性 | 类型 | 描述 |
+ | --------- | --- | -------------------------------------------------------------------------------- |
+ | className | 字符串 | 用于额外样式的可选类名 |
+ | 链接 | 数组 | 对象数组,每个代表一个面包屑链接。 每个对象都有一个 `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 546d8aea31..5c0189a85e 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/links.mdx
@@ -4,7 +4,7 @@ image: /images/user-guide/what-is-twenty/20.png
---
-
+
## 联系链接
@@ -12,44 +12,20 @@ image: /images/user-guide/what-is-twenty/20.png
用于显示联系信息的样式化链接组件。
-
-
-```jsx
-import { BrowserRouter as Router } from 'react-router-dom';
-
-import { ContactLink } from 'twenty-ui/navigation';
-
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log('Contact link clicked!', event);
- };
-
- return (
-
-
- example@example.com
-
-
- );
-};
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ------- | ----------------- | ------------- |
-| 类名 | 字符串 | 用于附加样式的可选名称 |
-| href | 字符串 | 链接的目标网址或路径 |
-| onClick | 函数 | 链接被点击时触发的回调函数 |
-| 子元素 | `React.ReactNode` | 在链接中显示的内容 |
-
-
+
+ ```jsx
+ 导入 { BrowserRouter as Router } from 'react-router-dom';\n\n导入 { ContactLink } from 'twenty-ui/navigation';\n\n导出 const MyComponent = () => {\n const handleLinkClick = (event) => {\n console.log('联系链接已点击!', event);\n };\n\n 返回 (\n \n \n example@example.com\n \n \n );\n};
+ ```
+
+
+ | 属性 | 类型 | 描述 |
+ | --------- | ----------------- | ------------- |
+ | className | 字符串 | 用于附加样式的可选名称 |
+ | href | 字符串 | 链接的目标网址或路径 |
+ | onClick | function | 链接被点击时触发的回调函数 |
+ | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
+
## 原始链接
@@ -57,39 +33,20 @@ export const MyComponent = () => {
用于显示链接的风格化链接组件。
-
+
+ ```jsx
+ 导入 { RawLink } from "/navigation";\n导入 { BrowserRouter as Router } from "react-router-dom";\n\n导出 const MyComponent = () => {\n const handleLinkClick = (event) => {\n console.log("联系链接已点击!", event);\n };\n\n 返回 (\n \n \n 联系我们\n \n \n );\n};\n
+ ```
+
-```jsx
-import { RawLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
-
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
-
- return (
-
-
- Contact Us
-
-
- );
-};
-
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ------- | ----------------- | ------------- |
-| 类名 | 字符串 | 用于附加样式的可选名称 |
-| href | 字符串 | 链接的目标网址或路径 |
-| onClick | function | 链接被点击时触发的回调函数 |
-| 子元素 | `React.ReactNode` | 在链接中显示的内容 |
-
-
+
+ | 属性 | 类型 | 描述 |
+ | ------- | ----------------- | ------------- |
+ | 类名 | 字符串 | 用于附加样式的可选名称 |
+ | href | 字符串 | 链接的目标网址或路径 |
+ | onClick | 函数 | 链接被点击时触发的回调函数 |
+ | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
+
## 圆形链接
@@ -97,38 +54,19 @@ export const MyComponent = () => {
以 Chip 组件风格显示的圆形链接。
-
+
+ ```jsx
+ 导入 { RoundedLink } from "/navigation";\n导入 { BrowserRouter as Router } from "react-router-dom";\n\n导出 const MyComponent = () => {\n const handleLinkClick = (event) => {\n console.log("联系链接已点击!", event);\n };\n\n 返回 (\n \n \n 联系我们\n \n \n );\n};
+ ```
+
-```jsx
-import { RoundedLink } from "/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
-
-export const MyComponent = () => {
- const handleLinkClick = (event) => {
- console.log("Contact link clicked!", event);
- };
-
- return (
-
-
- Contact Us
-
-
- );
-};
-```
-
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ------- | ----------------- | ------------- |
-| href | 字符串 | 链接的目标网址或路径 |
-| 子元素 | `React.ReactNode` | 在链接中显示的内容 |
-| onClick | 函数 | 链接被点击时触发的回调函数 |
-
-
+
+ | 属性 | 类型 | 描述 |
+ | ------- | ----------------- | ------------- |
+ | href | 字符串 | 链接的目标网址或路径 |
+ | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
+ | onClick | 函数 | 链接被点击时触发的回调函数 |
+
## 社交链接
@@ -136,33 +74,18 @@ export const MyComponent = () => {
风格化的社交链接,支持各种社交链接类型,如网址、LinkedIn 和 X(或 Twitter)。
-
+
+ ```jsx
+ 导入 { SocialLink } from "twenty-ui/navigation";\n导入 { BrowserRouter as Router } from "react-router-dom";\n\n导出 const MyComponent = () => {\n 返回 (\n \n \n \n );\n};
+ ```
+
-```jsx
-import { SocialLink } from "twenty-ui/navigation";
-import { BrowserRouter as Router } from "react-router-dom";
-
-export const MyComponent = () => {
- return (
-
-
-
- );
-};
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ------- | ----------------- | ------------------------------------------ |
-| href | 字符串 | 链接的目标网址或路径 |
-| 子元素 | `React.ReactNode` | 在链接中显示的内容 |
-| 类型 | 字符串 | 社交链接的类型。 选项包括:`url`、`LinkedIn` 和 `Twitter` |
-| onClick | 函数 | 链接被点击时触发的回调函数 |
-
-
+
+ | 属性 | 类型 | 描述 |
+ | ------- | ----------------- | ------------------------------------------ |
+ | href | 字符串 | 链接的目标网址或路径 |
+ | 子元素 | `React.ReactNode` | 在链接中显示的内容 |
+ | 类型 | 字符串 | 社交链接的类型。 选项包括:`url`、`LinkedIn` 和 `Twitter` |
+ | onClick | 函数 | 链接被点击时触发的回调函数 |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx
index 48eaafede1..8b12452e55 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/navigation-bar.mdx
@@ -4,49 +4,46 @@ image: /images/user-guide/table-views/table.png
---
-
+
渲染一个包含多个`NavigationBarItem`组件的导航栏。
-
+
+ ```jsx
+ import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
+ import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
-```jsx
-import { IconHome, IconUser, IconSettings } from '@tabler/icons-react';
-import { NavigationBar } from "@/ui/navigation/navigation-bar/components/NavigationBar";
+ export const MyComponent = () => {
-export const MyComponent = () => {
+ const navigationItems = [
+ {
+ name: "主页",
+ Icon: IconHome,
+ onClick: () => console.log("主页被点击"),
+ },
+ {
+ name: "个人资料",
+ Icon: IconUser,
+ onClick: () => console.log("个人资料被点击"),
+ },
+ {
+ name: "设置",
+ Icon: IconSettings,
+ onClick: () => console.log("设置被点击"),
+ },
+ ];
- const navigationItems = [
- {
- name: "Home",
- Icon: IconHome,
- onClick: () => console.log("Home clicked"),
- },
- {
- name: "Profile",
- Icon: IconUser,
- onClick: () => console.log("Profile clicked"),
- },
- {
- name: "Settings",
- Icon: IconSettings,
- onClick: () => console.log("Settings clicked"),
- },
- ];
+ return ;
+ };
+ ```
+
- return ;
-};
-```
-
-
-
-
-| 属性 | 类型 | 描述 |
-| -------------- | --- | ------------------------------------------------------------ |
-| activeItemName | 字符串 | 当前活跃导航项的名称 |
-| 项目 | 数组 | 表示每个导航项目的对象数组。 每个对象包含项目的`名称`、显示的`图标`组件以及项目被点击时调用的`onClick`函数 |
-
-
+
+ | 属性 | 类型 | 描述 |
+ | -------------- | --- | ------------------------------------------------------------ |
+ | activeItemName | 字符串 | 当前活跃导航项的名称 |
+ | 项目 | 数组 | 表示每个导航项目的对象数组。 每个对象包含项目的`名称`、显示的`图标`组件以及项目被点击时调用的`onClick`函数 |
+
diff --git a/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx b/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx
index 3a359b1ea8..0027ff044f 100644
--- a/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx
+++ b/packages/twenty-docs/l/zh/twenty-ui/navigation/step-bar.mdx
@@ -4,35 +4,31 @@ image: /images/user-guide/api/api.png
---
-
+
通过突出显示活动步骤来显示一系列编号步骤的进度。 它呈现一个包含步骤的容器,每个步骤由 `Step` 组件表示。
-
+
+ ```jsx
+ import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
-```jsx
-import { StepBar } from "@/ui/navigation/step-bar/components/StepBar";
+ export const MyComponent = () => {
+ return (
+
+ 步骤 1
+ 步骤 2
+ 步骤 3
+
+ );
+ };
+ ```
+
-export const MyComponent = () => {
- return (
-
- Step 1
- Step 2
- Step 3
-
- );
-};
-```
-
-
-
-
-
-| 属性 | 类型 | 描述 |
-| ---------- | -- | ------------------------- |
-| activeStep | 数字 | 当前活动步骤的索引。 这决定了应突出显示哪个步骤。 |
-
-
+
+ | 属性 | 类型 | 描述 |
+ | ---------- | -- | ------------------------- |
+ | activeStep | 数字 | 当前活动步骤的索引。 这决定了应突出显示哪个步骤。 |
+