@intlayer/design-system 5.3.4 → 5.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/dist/.vite/manifest.json +20 -20
  2. package/dist/components/DictionaryEditor/DictionaryEditor.cjs +1 -1
  3. package/dist/components/DictionaryEditor/DictionaryEditor.mjs +1 -1
  4. package/dist/components/DictionaryEditor/NodeWrapper/ArrayWrapper.cjs +1 -1
  5. package/dist/components/DictionaryEditor/NodeWrapper/ArrayWrapper.mjs +1 -1
  6. package/dist/components/DictionaryEditor/NodeWrapper/ConditionWrapper.cjs +1 -1
  7. package/dist/components/DictionaryEditor/NodeWrapper/ConditionWrapper.mjs +1 -1
  8. package/dist/components/DictionaryEditor/NodeWrapper/EnumerationWrapper.cjs +1 -1
  9. package/dist/components/DictionaryEditor/NodeWrapper/EnumerationWrapper.mjs +1 -1
  10. package/dist/components/DictionaryEditor/NodeWrapper/InsertionWrapper.cjs +4 -18
  11. package/dist/components/DictionaryEditor/NodeWrapper/InsertionWrapper.cjs.map +1 -1
  12. package/dist/components/DictionaryEditor/NodeWrapper/InsertionWrapper.mjs +4 -18
  13. package/dist/components/DictionaryEditor/NodeWrapper/InsertionWrapper.mjs.map +1 -1
  14. package/dist/components/DictionaryEditor/NodeWrapper/MarkdownWrapper.cjs +1 -1
  15. package/dist/components/DictionaryEditor/NodeWrapper/MarkdownWrapper.mjs +1 -1
  16. package/dist/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.cjs +1 -1
  17. package/dist/components/DictionaryEditor/NodeWrapper/NestedObjectWrapper.mjs +1 -1
  18. package/dist/components/DictionaryEditor/NodeWrapper/TranslationWrapper.cjs +1 -1
  19. package/dist/components/DictionaryEditor/NodeWrapper/TranslationWrapper.mjs +1 -1
  20. package/dist/components/DictionaryEditor/NodeWrapper/index.cjs +1 -1
  21. package/dist/components/DictionaryEditor/NodeWrapper/index.d.ts.map +1 -1
  22. package/dist/components/DictionaryEditor/NodeWrapper/index.mjs +1 -1
  23. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs +116 -77
  24. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.cjs.map +1 -1
  25. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.d.ts.map +1 -1
  26. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs +119 -80
  27. package/dist/components/DictionaryFieldEditor/SaveForm/SaveForm.mjs.map +1 -1
  28. package/dist/components/DictionaryFieldEditor/SaveForm/saveForm.content.cjs +108 -0
  29. package/dist/components/DictionaryFieldEditor/SaveForm/saveForm.content.cjs.map +1 -1
  30. package/dist/components/DictionaryFieldEditor/SaveForm/saveForm.content.d.ts +231 -0
  31. package/dist/components/DictionaryFieldEditor/SaveForm/saveForm.content.d.ts.map +1 -1
  32. package/dist/components/DictionaryFieldEditor/SaveForm/saveForm.content.mjs +108 -0
  33. package/dist/components/DictionaryFieldEditor/SaveForm/saveForm.content.mjs.map +1 -1
  34. package/dist/index-BCuMWKyy.js.map +1 -1
  35. package/dist/index-BYzBot7l.cjs.map +1 -1
  36. package/dist/{index-Au2tP3vA.js → index-CEoL1j7H.js} +23 -2
  37. package/dist/index-CEoL1j7H.js.map +1 -0
  38. package/dist/{index-DbyCRREy.cjs → index-s_Ar0FDw.cjs} +23 -2
  39. package/dist/index-s_Ar0FDw.cjs.map +1 -0
  40. package/dist/zod-BV4nCGJE.js.map +1 -1
  41. package/dist/zod-DSrtTSD_.cjs.map +1 -1
  42. package/package.json +15 -15
  43. package/dist/index-Au2tP3vA.js.map +0 -1
  44. package/dist/index-DbyCRREy.cjs.map +0 -1
@@ -1,8 +1,8 @@
1
1
  "use client";
2
- import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
3
3
  import { useDictionariesRecordActions, useEditedContent } from "@intlayer/editor-react";
4
- import { RotateCcw, Download, ArrowUpFromLine, Save } from "lucide-react";
5
- import { useMemo } from "react";
4
+ import { Save, RotateCcw, Download, ArrowUpFromLine } from "lucide-react";
5
+ import { useState } from "react";
6
6
  import { useDictionary } from "react-intlayer";
7
7
  import "../../../hooks/useScrollBlockage/useScrollBlockageStore.mjs";
8
8
  import "../../../hooks/useAsync/useAsyncStateStore.mjs";
@@ -26,7 +26,7 @@ import "../../Auth/ChangePasswordForm/changePasswordForm.content.mjs";
26
26
  import "../../Auth/ChangePasswordForm/useChangePasswordSchema.content.mjs";
27
27
  import "../../Auth/ResetPasswordForm/resetPasswordContent.content.mjs";
28
28
  import "../../Auth/ResetPasswordForm/useResetPasswordSchema.content.mjs";
29
- import "../../Modal/Modal.mjs";
29
+ import { Modal } from "../../Modal/Modal.mjs";
30
30
  import "@intlayer/config/built";
31
31
  import "../../Auth/VerifyEmailForm/index.content.mjs";
32
32
  import "../../Auth/DefineNewPasswordForm/defineNewPasswordForm.content.mjs";
@@ -38,26 +38,25 @@ const SaveForm = ({
38
38
  className,
39
39
  ...props
40
40
  }) => {
41
+ const [isFormatAlertModalOpen, setIsFormatAlertModalOpen] = useState(false);
41
42
  const { setLocaleDictionary } = useDictionariesRecordActions();
42
43
  const { writeDictionary, isLoading: isWriting } = useWriteDictionary();
43
44
  const { pushDictionaries, isLoading: isPushing } = usePushDictionaries();
44
45
  const isLoading = isWriting || isPushing;
46
+ const isJsonFormat = mode.includes("local") && dictionary.filePath?.endsWith(".json");
45
47
  const { editedContent, restoreEditedContent } = useEditedContent();
46
- const { resetButton, saveButton, publishButton, downloadButton } = useDictionary(saveDictionaryContent);
48
+ const {
49
+ resetButton,
50
+ saveButton,
51
+ publishButton,
52
+ downloadButton,
53
+ confirmation
54
+ } = useDictionary(saveDictionaryContent);
47
55
  const { isAuthenticated } = useAuth();
48
- const editedDictionary = useMemo(
49
- () => editedContent?.[dictionary.key],
50
- [editedContent, dictionary.key]
51
- );
52
- const isEdited = useMemo(
53
- () => editedDictionary && JSON.stringify(editedDictionary) !== JSON.stringify(dictionary),
54
- [editedDictionary, dictionary, mode]
55
- );
56
- const isLocalDictionary = useMemo(
57
- () => typeof dictionary?._id === "undefined",
58
- [dictionary]
59
- );
60
- const handleSaveDictionary = async () => {
56
+ const editedDictionary = editedContent?.[dictionary.key];
57
+ const isEdited = editedDictionary && JSON.stringify(editedDictionary) !== JSON.stringify(dictionary);
58
+ const isLocalDictionary = typeof dictionary?._id === "undefined";
59
+ const handleSaveDictionaryConfirmation = async () => {
61
60
  if (!editedContent?.[dictionary.key]) return;
62
61
  const updatedDictionary = {
63
62
  ...dictionary,
@@ -81,68 +80,108 @@ const SaveForm = ({
81
80
  }
82
81
  });
83
82
  };
84
- return /* @__PURE__ */ jsxs(
85
- "form",
86
- {
87
- className: cn("flex justify-end gap-2 max-md:flex-col", className),
88
- ...props,
89
- children: [
90
- isEdited && /* @__PURE__ */ jsx(
91
- Form.Button,
92
- {
93
- label: resetButton.label.value,
94
- disabled: !isEdited,
95
- Icon: RotateCcw,
96
- variant: "outline",
97
- color: "text",
98
- className: "max-md:w-full",
99
- onClick: () => restoreEditedContent(dictionary.key),
100
- children: resetButton.text
101
- }
102
- ),
103
- mode.includes("local") && /* @__PURE__ */ jsx(
104
- Form.Button,
105
- {
106
- label: downloadButton.label.value,
107
- disabled: !isEdited || isLoading,
108
- Icon: Download,
109
- color: "text",
110
- variant: isAuthenticated ? "outline" : "default",
111
- className: "max-md:w-full",
112
- isLoading: isWriting,
113
- onClick: handleSaveDictionary,
114
- children: downloadButton.text
115
- }
116
- ),
117
- mode.includes("remote") && isAuthenticated && isLocalDictionary && /* @__PURE__ */ jsx(
118
- Form.Button,
119
- {
120
- label: publishButton.label.value,
121
- disabled: isLoading,
122
- Icon: ArrowUpFromLine,
123
- color: "text",
124
- className: "max-md:w-full",
125
- isLoading: isPushing,
126
- onClick: handlePushDictionary,
127
- children: publishButton.text
128
- }
129
- ),
130
- mode.includes("remote") && isAuthenticated && !isLocalDictionary && isEdited && /* @__PURE__ */ jsx(
131
- Form.Button,
132
- {
133
- label: saveButton.label.value,
134
- disabled: !isEdited || isLoading,
135
- Icon: Save,
136
- color: "text",
137
- className: "max-md:w-full",
138
- isLoading: isPushing,
139
- onClick: handlePushDictionary,
140
- children: saveButton.text
141
- }
142
- )
143
- ]
144
- }
145
- );
83
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
84
+ /* @__PURE__ */ jsx(
85
+ Modal,
86
+ {
87
+ isOpen: isFormatAlertModalOpen,
88
+ title: confirmation.title.value,
89
+ size: "md",
90
+ children: /* @__PURE__ */ jsxs("form", { className: "size-full px-3", children: [
91
+ isJsonFormat ? /* @__PURE__ */ jsx("p", { className: "text-neutral py-4 text-sm", children: confirmation.message }) : /* @__PURE__ */ jsx("p", { className: "text-neutral py-4 text-sm", children: confirmation.differentFormatMessage }),
92
+ /* @__PURE__ */ jsxs("div", { className: "mt-12 flex justify-end gap-2 max-md:flex-col", children: [
93
+ /* @__PURE__ */ jsx(
94
+ Form.Button,
95
+ {
96
+ label: confirmation.cancelButton.label.value,
97
+ disabled: !isEdited || isLoading,
98
+ color: "text",
99
+ className: "max-md:w-full",
100
+ variant: "outline",
101
+ onClick: () => setIsFormatAlertModalOpen(false),
102
+ children: confirmation.cancelButton.text
103
+ }
104
+ ),
105
+ /* @__PURE__ */ jsx(
106
+ Form.Button,
107
+ {
108
+ label: confirmation.confirmButton.label.value,
109
+ disabled: !isEdited || isLoading,
110
+ Icon: Save,
111
+ color: "text",
112
+ className: "max-md:w-full",
113
+ isLoading: isPushing,
114
+ onClick: handleSaveDictionaryConfirmation,
115
+ children: confirmation.confirmButton.text
116
+ }
117
+ )
118
+ ] })
119
+ ] })
120
+ }
121
+ ),
122
+ /* @__PURE__ */ jsxs(
123
+ "form",
124
+ {
125
+ className: cn("flex justify-end gap-2 max-md:flex-col", className),
126
+ ...props,
127
+ children: [
128
+ isEdited && /* @__PURE__ */ jsx(
129
+ Form.Button,
130
+ {
131
+ label: resetButton.label.value,
132
+ disabled: !isEdited,
133
+ Icon: RotateCcw,
134
+ variant: "outline",
135
+ color: "text",
136
+ className: "max-md:w-full",
137
+ onClick: () => restoreEditedContent(dictionary.key),
138
+ children: resetButton.text
139
+ }
140
+ ),
141
+ mode.includes("local") && /* @__PURE__ */ jsx(
142
+ Form.Button,
143
+ {
144
+ label: downloadButton.label.value,
145
+ disabled: !isEdited || isLoading,
146
+ Icon: Download,
147
+ color: "text",
148
+ variant: isAuthenticated ? "outline" : "default",
149
+ className: "max-md:w-full",
150
+ isLoading: isWriting,
151
+ onClick: () => setIsFormatAlertModalOpen(true),
152
+ children: downloadButton.text
153
+ }
154
+ ),
155
+ mode.includes("remote") && isAuthenticated && isLocalDictionary && /* @__PURE__ */ jsx(
156
+ Form.Button,
157
+ {
158
+ label: publishButton.label.value,
159
+ disabled: isLoading,
160
+ Icon: ArrowUpFromLine,
161
+ color: "text",
162
+ className: "max-md:w-full",
163
+ isLoading: isPushing,
164
+ onClick: handlePushDictionary,
165
+ children: publishButton.text
166
+ }
167
+ ),
168
+ mode.includes("remote") && isAuthenticated && !isLocalDictionary && isEdited && /* @__PURE__ */ jsx(
169
+ Form.Button,
170
+ {
171
+ label: saveButton.label.value,
172
+ disabled: !isEdited || isLoading,
173
+ Icon: Save,
174
+ color: "text",
175
+ className: "max-md:w-full",
176
+ isLoading: isPushing,
177
+ onClick: handlePushDictionary,
178
+ children: saveButton.text
179
+ }
180
+ )
181
+ ]
182
+ }
183
+ )
184
+ ] });
146
185
  };
147
186
  export {
148
187
  SaveForm
@@ -1 +1 @@
1
- {"version":3,"file":"SaveForm.mjs","sources":["../../../../src/components/DictionaryFieldEditor/SaveForm/SaveForm.tsx"],"sourcesContent":["'use client';\n\nimport type { Dictionary as DistantDictionary } from '@intlayer/backend';\nimport type { Dictionary } from '@intlayer/core';\nimport {\n useDictionariesRecordActions,\n useEditedContent,\n} from '@intlayer/editor-react';\nimport { ArrowUpFromLine, Download, RotateCcw, Save } from 'lucide-react';\nimport {\n type DetailedHTMLProps,\n type FormHTMLAttributes,\n useMemo,\n type FC,\n} from 'react';\nimport { useDictionary } from 'react-intlayer';\nimport { usePushDictionaries, useWriteDictionary } from '../../../hooks';\nimport { cn } from '../../../utils/cn';\nimport { useAuth } from '../../Auth';\nimport { Form } from '../../Form';\nimport { saveDictionaryContent } from './saveForm.content';\n\ntype DictionaryDetailsProps = {\n dictionary: Dictionary;\n mode: ('local' | 'remote')[];\n} & DetailedHTMLProps<FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>;\n\nexport const SaveForm: FC<DictionaryDetailsProps> = ({\n dictionary,\n mode,\n className,\n ...props\n}) => {\n const { setLocaleDictionary } = useDictionariesRecordActions();\n const { writeDictionary, isLoading: isWriting } = useWriteDictionary();\n const { pushDictionaries, isLoading: isPushing } = usePushDictionaries();\n const isLoading = isWriting || isPushing;\n\n const { editedContent, restoreEditedContent } = useEditedContent();\n const { resetButton, saveButton, publishButton, downloadButton } =\n useDictionary(saveDictionaryContent);\n const { isAuthenticated } = useAuth();\n\n const editedDictionary = useMemo(\n () => editedContent?.[dictionary.key],\n [editedContent, dictionary.key]\n );\n\n const isEdited = useMemo(\n () =>\n editedDictionary &&\n JSON.stringify(editedDictionary) !== JSON.stringify(dictionary),\n [editedDictionary, dictionary, mode]\n );\n\n const isLocalDictionary = useMemo(\n () => typeof (dictionary as DistantDictionary)?._id === 'undefined',\n [dictionary]\n );\n\n const handleSaveDictionary = async () => {\n if (!editedContent?.[dictionary.key]) return;\n\n const updatedDictionary = {\n ...dictionary,\n ...editedContent?.[dictionary.key],\n };\n\n await writeDictionary(updatedDictionary).then(() => {\n setLocaleDictionary(editedContent?.[dictionary.key]);\n restoreEditedContent(dictionary.key);\n });\n };\n\n const handlePushDictionary = async () => {\n if (!editedContent?.[dictionary.key]) return;\n\n const updatedDictionary = {\n ...dictionary,\n ...editedContent?.[dictionary.key],\n };\n\n await pushDictionaries([updatedDictionary]).then((res) => {\n if (res) {\n setLocaleDictionary(editedContent?.[dictionary.key]);\n restoreEditedContent(dictionary.key);\n }\n });\n };\n\n return (\n <form\n className={cn('flex justify-end gap-2 max-md:flex-col', className)}\n {...props}\n >\n {isEdited && (\n <Form.Button\n label={resetButton.label.value}\n disabled={!isEdited}\n Icon={RotateCcw}\n variant=\"outline\"\n color=\"text\"\n className=\"max-md:w-full\"\n onClick={() => restoreEditedContent(dictionary.key)}\n >\n {resetButton.text}\n </Form.Button>\n )}\n {mode.includes('local') && (\n <Form.Button\n label={downloadButton.label.value}\n disabled={!isEdited || isLoading}\n Icon={Download}\n color=\"text\"\n variant={isAuthenticated ? 'outline' : 'default'}\n className=\"max-md:w-full\"\n isLoading={isWriting}\n onClick={handleSaveDictionary}\n >\n {downloadButton.text}\n </Form.Button>\n )}\n {mode.includes('remote') && isAuthenticated && isLocalDictionary && (\n <Form.Button\n label={publishButton.label.value}\n disabled={isLoading}\n Icon={ArrowUpFromLine}\n color=\"text\"\n className=\"max-md:w-full\"\n isLoading={isPushing}\n onClick={handlePushDictionary}\n >\n {publishButton.text}\n </Form.Button>\n )}\n {mode.includes('remote') &&\n isAuthenticated &&\n !isLocalDictionary &&\n isEdited && (\n <Form.Button\n label={saveButton.label.value}\n disabled={!isEdited || isLoading}\n Icon={Save}\n color=\"text\"\n className=\"max-md:w-full\"\n isLoading={isPushing}\n onClick={handlePushDictionary}\n >\n {saveButton.text}\n </Form.Button>\n )}\n </form>\n );\n};\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SaveForm.mjs","sources":["../../../../src/components/DictionaryFieldEditor/SaveForm/SaveForm.tsx"],"sourcesContent":["'use client';\n\nimport type { Dictionary as DistantDictionary } from '@intlayer/backend';\nimport type { Dictionary } from '@intlayer/core';\nimport {\n useDictionariesRecordActions,\n useEditedContent,\n} from '@intlayer/editor-react';\nimport { ArrowUpFromLine, Download, RotateCcw, Save } from 'lucide-react';\nimport {\n type DetailedHTMLProps,\n type FormHTMLAttributes,\n type FC,\n useState,\n} from 'react';\nimport { useDictionary } from 'react-intlayer';\nimport { usePushDictionaries, useWriteDictionary } from '../../../hooks';\nimport { cn } from '../../../utils/cn';\nimport { useAuth } from '../../Auth';\nimport { Form } from '../../Form';\nimport { saveDictionaryContent } from './saveForm.content';\nimport { Modal } from '../../../components/Modal';\n\ntype DictionaryDetailsProps = {\n dictionary: Dictionary;\n mode: ('local' | 'remote')[];\n} & DetailedHTMLProps<FormHTMLAttributes<HTMLFormElement>, HTMLFormElement>;\n\nexport const SaveForm: FC<DictionaryDetailsProps> = ({\n dictionary,\n mode,\n className,\n ...props\n}) => {\n const [isFormatAlertModalOpen, setIsFormatAlertModalOpen] = useState(false);\n const { setLocaleDictionary } = useDictionariesRecordActions();\n const { writeDictionary, isLoading: isWriting } = useWriteDictionary();\n const { pushDictionaries, isLoading: isPushing } = usePushDictionaries();\n const isLoading = isWriting || isPushing;\n const isJsonFormat =\n mode.includes('local') && dictionary.filePath?.endsWith('.json');\n\n const { editedContent, restoreEditedContent } = useEditedContent();\n const {\n resetButton,\n saveButton,\n publishButton,\n downloadButton,\n confirmation,\n } = useDictionary(saveDictionaryContent);\n const { isAuthenticated } = useAuth();\n\n const editedDictionary = editedContent?.[dictionary.key];\n\n const isEdited =\n editedDictionary &&\n JSON.stringify(editedDictionary) !== JSON.stringify(dictionary);\n\n const isLocalDictionary =\n typeof (dictionary as DistantDictionary)?._id === 'undefined';\n\n const handleSaveDictionaryConfirmation = async () => {\n if (!editedContent?.[dictionary.key]) return;\n\n const updatedDictionary = {\n ...dictionary,\n ...editedContent?.[dictionary.key],\n };\n\n await writeDictionary(updatedDictionary).then(() => {\n setLocaleDictionary(editedContent?.[dictionary.key]);\n restoreEditedContent(dictionary.key);\n });\n };\n\n const handlePushDictionary = async () => {\n if (!editedContent?.[dictionary.key]) return;\n\n const updatedDictionary = {\n ...dictionary,\n ...editedContent?.[dictionary.key],\n };\n\n await pushDictionaries([updatedDictionary]).then((res) => {\n if (res) {\n setLocaleDictionary(editedContent?.[dictionary.key]);\n restoreEditedContent(dictionary.key);\n }\n });\n };\n\n return (\n <>\n <Modal\n isOpen={isFormatAlertModalOpen}\n title={confirmation.title.value}\n size=\"md\"\n >\n <form className=\"size-full px-3\">\n {isJsonFormat ? (\n <p className=\"text-neutral py-4 text-sm\">{confirmation.message}</p>\n ) : (\n <p className=\"text-neutral py-4 text-sm\">\n {confirmation.differentFormatMessage}\n </p>\n )}\n <div className=\"mt-12 flex justify-end gap-2 max-md:flex-col\">\n <Form.Button\n label={confirmation.cancelButton.label.value}\n disabled={!isEdited || isLoading}\n color=\"text\"\n className=\"max-md:w-full\"\n variant=\"outline\"\n onClick={() => setIsFormatAlertModalOpen(false)}\n >\n {confirmation.cancelButton.text}\n </Form.Button>\n <Form.Button\n label={confirmation.confirmButton.label.value}\n disabled={!isEdited || isLoading}\n Icon={Save}\n color=\"text\"\n className=\"max-md:w-full\"\n isLoading={isPushing}\n onClick={handleSaveDictionaryConfirmation}\n >\n {confirmation.confirmButton.text}\n </Form.Button>\n </div>\n </form>\n </Modal>\n <form\n className={cn('flex justify-end gap-2 max-md:flex-col', className)}\n {...props}\n >\n {isEdited && (\n <Form.Button\n label={resetButton.label.value}\n disabled={!isEdited}\n Icon={RotateCcw}\n variant=\"outline\"\n color=\"text\"\n className=\"max-md:w-full\"\n onClick={() => restoreEditedContent(dictionary.key)}\n >\n {resetButton.text}\n </Form.Button>\n )}\n {mode.includes('local') && (\n <Form.Button\n label={downloadButton.label.value}\n disabled={!isEdited || isLoading}\n Icon={Download}\n color=\"text\"\n variant={isAuthenticated ? 'outline' : 'default'}\n className=\"max-md:w-full\"\n isLoading={isWriting}\n onClick={() => setIsFormatAlertModalOpen(true)}\n >\n {downloadButton.text}\n </Form.Button>\n )}\n {mode.includes('remote') && isAuthenticated && isLocalDictionary && (\n <Form.Button\n label={publishButton.label.value}\n disabled={isLoading}\n Icon={ArrowUpFromLine}\n color=\"text\"\n className=\"max-md:w-full\"\n isLoading={isPushing}\n onClick={handlePushDictionary}\n >\n {publishButton.text}\n </Form.Button>\n )}\n {mode.includes('remote') &&\n isAuthenticated &&\n !isLocalDictionary &&\n isEdited && (\n <Form.Button\n label={saveButton.label.value}\n disabled={!isEdited || isLoading}\n Icon={Save}\n color=\"text\"\n className=\"max-md:w-full\"\n isLoading={isPushing}\n onClick={handlePushDictionary}\n >\n {saveButton.text}\n </Form.Button>\n )}\n </form>\n </>\n );\n};\n"],"names":[],"mappings":"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"}
@@ -131,6 +131,114 @@ const saveDictionaryContent = {
131
131
  ar: "انقر لتنزيل",
132
132
  ru: "Нажмите, чтобы скачать"
133
133
  })
134
+ },
135
+ confirmation: {
136
+ title: intlayer.t({
137
+ en: "Confirmation",
138
+ "en-GB": "Confirmation",
139
+ fr: "Confirmation",
140
+ es: "Confirmation",
141
+ de: "Confirmation",
142
+ ja: "確認",
143
+ ko: "확인",
144
+ zh: "确认",
145
+ it: "Conferma",
146
+ pt: "Confirmação",
147
+ hi: "पुष्टि करें",
148
+ ar: "تأكيد",
149
+ ru: "Подтверждение"
150
+ }),
151
+ message: intlayer.t({
152
+ en: "This will overwrite the existing dictionary. Are you sure you want to continue?",
153
+ "en-GB": "This will overwrite the existing dictionary. Are you sure you want to continue?",
154
+ fr: "Cela remplacera le dictionnaire existant. Êtes-vous sûr de vouloir continuer?",
155
+ es: "Esto sobrescribirá el diccionario existente. ¿Estás seguro de que quieres continuar?",
156
+ de: "Dies wird das existierende Wörterbuch überschreiben. Sind Sie sicher, dass Sie fortfahren möchten?",
157
+ ja: "既存の辞書を上書きします。続行しますか?",
158
+ ko: "이는 기존 사전을 덮어 쓸 것입니다. 계속하시겠습니까?",
159
+ zh: "这将覆盖现有的字典。你确定要继续吗?",
160
+ it: "Questo sovrascriverà il dizionario esistente. Sei sicuro di voler continuare?",
161
+ pt: "Isso sobrescreverá o dicionário existente. Você tem certeza de que deseja continuar?",
162
+ hi: "यह मौजूदा शब्दकोश को ओवरराइट करने जारी है। आप क्या आप जारी रखना चाहते हैं?",
163
+ ar: "سيتم الكتابة على القاموس الحالي. هل أنت متأكد من أنك تريد المتابعة؟",
164
+ ru: "Это перезапишет существующий словарь. Вы уверены, что хотите продолжить?"
165
+ }),
166
+ differentFormatMessage: intlayer.t({
167
+ en: "The dictionary is in a different format, it will be transformed into a JSON file. Are you sure you want to continue? This will overwrite the existing dictionary.",
168
+ "en-GB": "The dictionary is in a different format, it will be transformed into a JSON file. Are you sure you want to continue? This will overwrite the existing dictionary.",
169
+ fr: "Le dictionnaire est dans un format différent, il sera transformé en un fichier JSON. Êtes-vous sûr de vouloir continuer ? Cela remplacera le dictionnaire existant.",
170
+ es: "El diccionario está en un formato diferente, se transformará en un archivo JSON. ¿Estás seguro de que quieres continuar? Esto sobrescribirá el diccionario existente.",
171
+ de: "Das Wörterbuch ist in einem anderen Format, es wird in eine JSON-Datei umgewandelt. Sind Sie sicher, dass Sie fortfahren möchten? Dies wird das existierende Wörterbuch überschreiben.",
172
+ ja: "辞書は異なる形式です。JSONファイルに変換されます。続行しますか?既存の辞書を上書きします。",
173
+ ko: "사전은 다른 형식입니다. JSON 파일로 변환됩니다. 계속하시겠습니까? 이는 기존 사전을 덮어 쓸 것입니다.",
174
+ zh: "字典是在不同格式中,它将转换为JSON文件。你确定要继续吗?这将覆盖现有的字典。",
175
+ it: "Il dizionario è in un formato diverso, verrà trasformato in un file JSON. Sei sicuro di voler continuare? Questo sovrascriverà il dizionario esistente.",
176
+ pt: "O dicionário está em um formato diferente, ele será transformado em um arquivo JSON. Você tem certeza de que deseja continuar? Isso sobrescreverá o dicionário existente."
177
+ }),
178
+ confirmButton: {
179
+ text: intlayer.t({
180
+ en: "Confirm",
181
+ "en-GB": "Confirm",
182
+ fr: "Confirmer",
183
+ es: "Confirmar",
184
+ de: "Bestätigen",
185
+ ja: "確認",
186
+ ko: "확인",
187
+ zh: "确认",
188
+ it: "Conferma",
189
+ pt: "Confirmar",
190
+ hi: "पुष्टि करें",
191
+ ar: "تأكيد",
192
+ ru: "Подтвердить"
193
+ }),
194
+ label: intlayer.t({
195
+ en: "Click to confirm",
196
+ "en-GB": "Click to confirm",
197
+ fr: "Cliquez pour confirmer",
198
+ es: "Haga clic para confirmar",
199
+ de: "Klicken Sie, um zu bestätigen",
200
+ ja: "確認するにはクリックしてください",
201
+ ko: "확인을 클릭하세요",
202
+ zh: "单击确认",
203
+ it: "Fai clic per confermare",
204
+ pt: "Clique para confirmar",
205
+ hi: "पुष्टि करने के लिए क्लिक करें",
206
+ ar: "انقر لتأكيد",
207
+ ru: "Нажмите, чтобы подтвердить"
208
+ })
209
+ },
210
+ cancelButton: {
211
+ text: intlayer.t({
212
+ en: "Cancel",
213
+ "en-GB": "Cancel",
214
+ fr: "Annuler",
215
+ es: "Cancelar",
216
+ de: "Abbrechen",
217
+ ja: "キャンセル",
218
+ ko: "취소",
219
+ zh: "取消",
220
+ it: "Annulla",
221
+ pt: "Cancelar",
222
+ hi: "रद्द करें",
223
+ ar: "إلغاء",
224
+ ru: "Отмена"
225
+ }),
226
+ label: intlayer.t({
227
+ en: "Click to cancel",
228
+ "en-GB": "Click to cancel",
229
+ fr: "Cliquez pour annuler",
230
+ es: "Haga clic para cancelar",
231
+ de: "Klicken Sie, um abzubrechen",
232
+ ja: "キャンセルするにはクリックしてください",
233
+ ko: "취소를 클릭하세요",
234
+ zh: "单击取消",
235
+ it: "Fai clic per annullare",
236
+ pt: "Clique para cancelar",
237
+ hi: "रद्द करने के लिए क्लिक करें",
238
+ ar: "انقر لإلغاء",
239
+ ru: "Нажмите, чтобы отменить"
240
+ })
241
+ }
134
242
  }
135
243
  }
136
244
  };
@@ -1 +1 @@
1
- {"version":3,"file":"saveForm.content.cjs","sources":["../../../../src/components/DictionaryFieldEditor/SaveForm/saveForm.content.tsx"],"sourcesContent":["import { t, type Dictionary } from 'intlayer';\n\nexport const saveDictionaryContent = {\n key: 'save-dictionary-details',\n content: {\n resetButton: {\n text: t({\n en: 'Reset all changes',\n 'en-GB': 'Reset all changes',\n fr: 'Réinitialiser toutes les modifications',\n es: 'Restablecer todas las modificaciones',\n de: 'Alle Änderungen zurücksetzen',\n ja: 'すべての変更をリセット',\n ko: '모든 변경 사항 초기화',\n zh: '重置所有更改',\n it: 'Reimposta tutte le modifiche',\n pt: 'Redefinir todas as alterações',\n hi: 'सभी परिवर्तनों को रीसेट करें',\n ar: 'إعادة تعيين جميع التغييرات',\n ru: 'Сбросить все изменения',\n }),\n label: t({\n en: 'Click to reset all the changes',\n 'en-GB': 'Click to reset all the changes',\n fr: 'Cliquez pour réinitialiser toutes les modifications',\n es: 'Haga clic para restablecer todas las modificaciones',\n de: 'Klicken Sie, um alle Änderungen zurückzusetzen',\n ja: 'すべての変更をリセットするにはクリックしてください',\n ko: '모든 변경 사항을 초기화하려면 클릭하세요',\n zh: '单击以重置所有更改',\n it: 'Fai clic per ripristinare tutte le modifiche',\n pt: 'Clique para redefinir todas as alterações',\n hi: 'सभी परिवर्तनों को रीसेट करने के लिए क्लिक करें',\n ar: 'انقر لإعادة تعيين جميع التغييرات',\n ru: 'Нажмите, чтобы сбросить все изменения',\n }),\n },\n saveButton: {\n text: t({\n en: 'Save changes',\n 'en-GB': 'Save changes',\n fr: 'Enregistrer les modifications',\n es: 'Guardar cambios',\n de: 'Änderungen speichern',\n ja: '変更を保存',\n ko: '변경 사항 저장',\n zh: '保存更改',\n it: 'Salva le modifiche',\n pt: 'Salvar alterações',\n hi: 'परिवर्तनों को सहेजें',\n ar: 'احفظ التغييرات',\n ru: 'Сохранить изменения',\n }),\n label: t({\n en: 'Click to save changes',\n 'en-GB': 'Click to save changes',\n fr: 'Cliquez pour enregistrer les modifications',\n es: 'Haga clic para guardar cambios',\n de: 'Klicken Sie, um Änderungen zu speichern',\n ja: '変更を保存するにはクリックしてください',\n ko: '변경 사항을 저장하려면 클릭하세요',\n zh: '单击保存更改',\n it: 'Fai clic per salvare le modifiche',\n pt: 'Clique para salvar alterações',\n hi: 'परिवर्तनों को सहेजने के लिए क्लिक करें',\n ar: 'انقر لحفظ التغييرات',\n ru: 'Нажмите, чтобы сохранить изменения',\n }),\n },\n publishButton: {\n text: t({\n en: 'Publish dictionary',\n 'en-GB': 'Publish dictionary',\n fr: 'Publier dictionnaire',\n es: 'Publicar diccionario',\n de: 'Wörterbuch veröffentlichen',\n ja: '辞書を公開',\n ko: '사전을 게시합니다',\n zh: '发布字典',\n it: 'Pubblica dizionario',\n pt: 'Publicar dicionário',\n hi: 'शब्दकोश प्रकाशित करें',\n ar: 'نشر القاموس',\n ru: 'Опубликовать словарь',\n }),\n label: t({\n en: 'Click to publish dictionary',\n 'en-GB': 'Click to publish dictionary',\n fr: 'Cliquez pour publier dictionnaire',\n es: 'Haga clic para publicar diccionario',\n de: 'Klicken Sie, um das Wörterbuch zu veröffentlichen',\n ja: '辞書を公開するにはクリックしてください',\n ko: '사전을 게시하려면 클릭하세요',\n zh: '单击以发布字典',\n it: 'Fai clic per pubblicare il dizionario',\n pt: 'Clique para publicar dicionário',\n hi: 'शब्दकोश प्रकाशित करने के लिए क्लिक करें',\n ar: 'انقر لنشر القاموس',\n ru: 'Нажмите, чтобы опубликовать словарь',\n }),\n },\n downloadButton: {\n text: t({\n en: 'Download',\n 'en-GB': 'Download',\n fr: 'Télécharger',\n es: 'Descargar',\n de: 'Herunterladen',\n ja: 'ダウンロード',\n ko: '다운로드',\n zh: '下载',\n it: 'Scarica',\n pt: 'Baixar',\n hi: 'डाउनलोड',\n ar: 'تنزيل',\n ru: 'Скачать',\n }),\n label: t({\n en: 'Click to download',\n 'en-GB': 'Click to download',\n fr: 'Cliquez pour télécharger',\n es: 'Haga clic para descargar',\n de: 'Klicken Sie, um herunterzuladen',\n ja: 'ダウンロードするにはクリックしてください',\n ko: '다운로드를 클릭하세요',\n zh: '单击下载',\n it: 'Fai clic per scaricare',\n pt: 'Clique para baixar',\n hi: 'डाउनलोड करने के लिए क्लिक करें',\n ar: 'انقر لتنزيل',\n ru: 'Нажмите, чтобы скачать',\n }),\n },\n },\n} satisfies Dictionary;\n"],"names":["t"],"mappings":"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"}
1
+ {"version":3,"file":"saveForm.content.cjs","sources":["../../../../src/components/DictionaryFieldEditor/SaveForm/saveForm.content.tsx"],"sourcesContent":["import { t, type Dictionary } from 'intlayer';\n\nexport const saveDictionaryContent = {\n key: 'save-dictionary-details',\n content: {\n resetButton: {\n text: t({\n en: 'Reset all changes',\n 'en-GB': 'Reset all changes',\n fr: 'Réinitialiser toutes les modifications',\n es: 'Restablecer todas las modificaciones',\n de: 'Alle Änderungen zurücksetzen',\n ja: 'すべての変更をリセット',\n ko: '모든 변경 사항 초기화',\n zh: '重置所有更改',\n it: 'Reimposta tutte le modifiche',\n pt: 'Redefinir todas as alterações',\n hi: 'सभी परिवर्तनों को रीसेट करें',\n ar: 'إعادة تعيين جميع التغييرات',\n ru: 'Сбросить все изменения',\n }),\n label: t({\n en: 'Click to reset all the changes',\n 'en-GB': 'Click to reset all the changes',\n fr: 'Cliquez pour réinitialiser toutes les modifications',\n es: 'Haga clic para restablecer todas las modificaciones',\n de: 'Klicken Sie, um alle Änderungen zurückzusetzen',\n ja: 'すべての変更をリセットするにはクリックしてください',\n ko: '모든 변경 사항을 초기화하려면 클릭하세요',\n zh: '单击以重置所有更改',\n it: 'Fai clic per ripristinare tutte le modifiche',\n pt: 'Clique para redefinir todas as alterações',\n hi: 'सभी परिवर्तनों को रीसेट करने के लिए क्लिक करें',\n ar: 'انقر لإعادة تعيين جميع التغييرات',\n ru: 'Нажмите, чтобы сбросить все изменения',\n }),\n },\n saveButton: {\n text: t({\n en: 'Save changes',\n 'en-GB': 'Save changes',\n fr: 'Enregistrer les modifications',\n es: 'Guardar cambios',\n de: 'Änderungen speichern',\n ja: '変更を保存',\n ko: '변경 사항 저장',\n zh: '保存更改',\n it: 'Salva le modifiche',\n pt: 'Salvar alterações',\n hi: 'परिवर्तनों को सहेजें',\n ar: 'احفظ التغييرات',\n ru: 'Сохранить изменения',\n }),\n label: t({\n en: 'Click to save changes',\n 'en-GB': 'Click to save changes',\n fr: 'Cliquez pour enregistrer les modifications',\n es: 'Haga clic para guardar cambios',\n de: 'Klicken Sie, um Änderungen zu speichern',\n ja: '変更を保存するにはクリックしてください',\n ko: '변경 사항을 저장하려면 클릭하세요',\n zh: '单击保存更改',\n it: 'Fai clic per salvare le modifiche',\n pt: 'Clique para salvar alterações',\n hi: 'परिवर्तनों को सहेजने के लिए क्लिक करें',\n ar: 'انقر لحفظ التغييرات',\n ru: 'Нажмите, чтобы сохранить изменения',\n }),\n },\n publishButton: {\n text: t({\n en: 'Publish dictionary',\n 'en-GB': 'Publish dictionary',\n fr: 'Publier dictionnaire',\n es: 'Publicar diccionario',\n de: 'Wörterbuch veröffentlichen',\n ja: '辞書を公開',\n ko: '사전을 게시합니다',\n zh: '发布字典',\n it: 'Pubblica dizionario',\n pt: 'Publicar dicionário',\n hi: 'शब्दकोश प्रकाशित करें',\n ar: 'نشر القاموس',\n ru: 'Опубликовать словарь',\n }),\n label: t({\n en: 'Click to publish dictionary',\n 'en-GB': 'Click to publish dictionary',\n fr: 'Cliquez pour publier dictionnaire',\n es: 'Haga clic para publicar diccionario',\n de: 'Klicken Sie, um das Wörterbuch zu veröffentlichen',\n ja: '辞書を公開するにはクリックしてください',\n ko: '사전을 게시하려면 클릭하세요',\n zh: '单击以发布字典',\n it: 'Fai clic per pubblicare il dizionario',\n pt: 'Clique para publicar dicionário',\n hi: 'शब्दकोश प्रकाशित करने के लिए क्लिक करें',\n ar: 'انقر لنشر القاموس',\n ru: 'Нажмите, чтобы опубликовать словарь',\n }),\n },\n downloadButton: {\n text: t({\n en: 'Download',\n 'en-GB': 'Download',\n fr: 'Télécharger',\n es: 'Descargar',\n de: 'Herunterladen',\n ja: 'ダウンロード',\n ko: '다운로드',\n zh: '下载',\n it: 'Scarica',\n pt: 'Baixar',\n hi: 'डाउनलोड',\n ar: 'تنزيل',\n ru: 'Скачать',\n }),\n label: t({\n en: 'Click to download',\n 'en-GB': 'Click to download',\n fr: 'Cliquez pour télécharger',\n es: 'Haga clic para descargar',\n de: 'Klicken Sie, um herunterzuladen',\n ja: 'ダウンロードするにはクリックしてください',\n ko: '다운로드를 클릭하세요',\n zh: '单击下载',\n it: 'Fai clic per scaricare',\n pt: 'Clique para baixar',\n hi: 'डाउनलोड करने के लिए क्लिक करें',\n ar: 'انقر لتنزيل',\n ru: 'Нажмите, чтобы скачать',\n }),\n },\n\n confirmation: {\n title: t({\n en: 'Confirmation',\n 'en-GB': 'Confirmation',\n fr: 'Confirmation',\n es: 'Confirmation',\n de: 'Confirmation',\n ja: '確認',\n ko: '확인',\n zh: '确认',\n it: 'Conferma',\n pt: 'Confirmação',\n hi: 'पुष्टि करें',\n ar: 'تأكيد',\n ru: 'Подтверждение',\n }),\n message: t({\n en: 'This will overwrite the existing dictionary. Are you sure you want to continue?',\n 'en-GB':\n 'This will overwrite the existing dictionary. Are you sure you want to continue?',\n fr: 'Cela remplacera le dictionnaire existant. Êtes-vous sûr de vouloir continuer?',\n es: 'Esto sobrescribirá el diccionario existente. ¿Estás seguro de que quieres continuar?',\n de: 'Dies wird das existierende Wörterbuch überschreiben. Sind Sie sicher, dass Sie fortfahren möchten?',\n ja: '既存の辞書を上書きします。続行しますか?',\n ko: '이는 기존 사전을 덮어 쓸 것입니다. 계속하시겠습니까?',\n zh: '这将覆盖现有的字典。你确定要继续吗?',\n it: 'Questo sovrascriverà il dizionario esistente. Sei sicuro di voler continuare?',\n pt: 'Isso sobrescreverá o dicionário existente. Você tem certeza de que deseja continuar?',\n hi: 'यह मौजूदा शब्दकोश को ओवरराइट करने जारी है। आप क्या आप जारी रखना चाहते हैं?',\n ar: 'سيتم الكتابة على القاموس الحالي. هل أنت متأكد من أنك تريد المتابعة؟',\n ru: 'Это перезапишет существующий словарь. Вы уверены, что хотите продолжить?',\n }),\n differentFormatMessage: t({\n en: 'The dictionary is in a different format, it will be transformed into a JSON file. Are you sure you want to continue? This will overwrite the existing dictionary.',\n 'en-GB':\n 'The dictionary is in a different format, it will be transformed into a JSON file. Are you sure you want to continue? This will overwrite the existing dictionary.',\n fr: 'Le dictionnaire est dans un format différent, il sera transformé en un fichier JSON. Êtes-vous sûr de vouloir continuer ? Cela remplacera le dictionnaire existant.',\n es: 'El diccionario está en un formato diferente, se transformará en un archivo JSON. ¿Estás seguro de que quieres continuar? Esto sobrescribirá el diccionario existente.',\n de: 'Das Wörterbuch ist in einem anderen Format, es wird in eine JSON-Datei umgewandelt. Sind Sie sicher, dass Sie fortfahren möchten? Dies wird das existierende Wörterbuch überschreiben.',\n ja: '辞書は異なる形式です。JSONファイルに変換されます。続行しますか?既存の辞書を上書きします。',\n ko: '사전은 다른 형식입니다. JSON 파일로 변환됩니다. 계속하시겠습니까? 이는 기존 사전을 덮어 쓸 것입니다.',\n zh: '字典是在不同格式中,它将转换为JSON文件。你确定要继续吗?这将覆盖现有的字典。',\n it: 'Il dizionario è in un formato diverso, verrà trasformato in un file JSON. Sei sicuro di voler continuare? Questo sovrascriverà il dizionario esistente.',\n pt: 'O dicionário está em um formato diferente, ele será transformado em um arquivo JSON. Você tem certeza de que deseja continuar? Isso sobrescreverá o dicionário existente.',\n }),\n confirmButton: {\n text: t({\n en: 'Confirm',\n 'en-GB': 'Confirm',\n fr: 'Confirmer',\n es: 'Confirmar',\n de: 'Bestätigen',\n ja: '確認',\n ko: '확인',\n zh: '确认',\n it: 'Conferma',\n pt: 'Confirmar',\n hi: 'पुष्टि करें',\n ar: 'تأكيد',\n ru: 'Подтвердить',\n }),\n label: t({\n en: 'Click to confirm',\n 'en-GB': 'Click to confirm',\n fr: 'Cliquez pour confirmer',\n es: 'Haga clic para confirmar',\n de: 'Klicken Sie, um zu bestätigen',\n ja: '確認するにはクリックしてください',\n ko: '확인을 클릭하세요',\n zh: '单击确认',\n it: 'Fai clic per confermare',\n pt: 'Clique para confirmar',\n hi: 'पुष्टि करने के लिए क्लिक करें',\n ar: 'انقر لتأكيد',\n ru: 'Нажмите, чтобы подтвердить',\n }),\n },\n cancelButton: {\n text: t({\n en: 'Cancel',\n 'en-GB': 'Cancel',\n fr: 'Annuler',\n es: 'Cancelar',\n de: 'Abbrechen',\n ja: 'キャンセル',\n ko: '취소',\n zh: '取消',\n it: 'Annulla',\n pt: 'Cancelar',\n hi: 'रद्द करें',\n ar: 'إلغاء',\n ru: 'Отмена',\n }),\n label: t({\n en: 'Click to cancel',\n 'en-GB': 'Click to cancel',\n fr: 'Cliquez pour annuler',\n es: 'Haga clic para cancelar',\n de: 'Klicken Sie, um abzubrechen',\n ja: 'キャンセルするにはクリックしてください',\n ko: '취소를 클릭하세요',\n zh: '单击取消',\n it: 'Fai clic per annullare',\n pt: 'Clique para cancelar',\n hi: 'रद्द करने के लिए क्लिक करें',\n ar: 'انقر لإلغاء',\n ru: 'Нажмите, чтобы отменить',\n }),\n },\n },\n },\n} satisfies Dictionary;\n"],"names":["t"],"mappings":"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"}