diff --git a/package-lock.json b/package-lock.json index 63486fc0..bf185e0d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -38,12 +38,14 @@ "dexie": "^4.0.8", "eslint-config-airbnb-typescript": "^18.0.0", "html-to-image": "^1.11.11", + "i18next": "^23.14.0", "lucide-react": "^0.424.0", "nanoid": "^5.0.7", "react": "^18.3.1", "react-code-blocks": "^0.1.6", "react-dom": "^18.3.1", "react-hotkeys-hook": "^4.5.0", + "react-i18next": "^15.0.1", "react-resizable-panels": "^2.0.22", "react-responsive": "^10.0.0", "react-router-dom": "^6.26.0", @@ -6329,6 +6331,15 @@ "node": "*" } }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "license": "MIT", + "dependencies": { + "void-elements": "3.1.0" + } + }, "node_modules/html-to-image": { "version": "1.11.11", "resolved": "https://registry.npmjs.org/html-to-image/-/html-to-image-1.11.11.tgz", @@ -6357,6 +6368,29 @@ "integrity": "sha512-WDC/ui2VVRrz3jOVi+XtjqkDjiVjTtFaAGiW37k6b+ohyQ5wYDOGkvCZa8+H0nx3gyvv0+BST9xuOgIyGQ00gw==", "license": "BSD-3-Clause" }, + "node_modules/i18next": { + "version": "23.14.0", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.14.0.tgz", + "integrity": "sha512-Y5GL4OdA8IU2geRrt2+Uc1iIhsjICdHZzT9tNwQ3TVqdNzgxHToGCKf/TPRP80vTCAP6svg2WbbJL+Gx5MFQVA==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.23.2" + } + }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -8030,6 +8064,28 @@ "react-dom": ">=16.8.1" } }, + "node_modules/react-i18next": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-15.0.1.tgz", + "integrity": "sha512-NwxLqNM6CLbeGA9xPsjits0EnXdKgCRSS6cgkgOdNcPXqL+1fYNl8fBg1wmnnHvFy812Bt4IWTPE9zjoPmFj3w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.24.8", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -9683,6 +9739,15 @@ } } }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/vue": { "version": "3.4.38", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.38.tgz", diff --git a/package.json b/package.json index 87c9787a..13be9f7a 100644 --- a/package.json +++ b/package.json @@ -42,12 +42,14 @@ "dexie": "^4.0.8", "eslint-config-airbnb-typescript": "^18.0.0", "html-to-image": "^1.11.11", + "i18next": "^23.14.0", "lucide-react": "^0.424.0", "nanoid": "^5.0.7", "react": "^18.3.1", "react-code-blocks": "^0.1.6", "react-dom": "^18.3.1", "react-hotkeys-hook": "^4.5.0", + "react-i18next": "^15.0.1", "react-resizable-panels": "^2.0.22", "react-responsive": "^10.0.0", "react-router-dom": "^6.26.0", diff --git a/src/context/storage-context/storage-provider.tsx b/src/context/storage-context/storage-provider.tsx index 161cf3c9..408b2951 100644 --- a/src/context/storage-context/storage-provider.tsx +++ b/src/context/storage-context/storage-provider.tsx @@ -68,9 +68,11 @@ export const StorageProvider: React.FC = ({ const config = await getConfig(); if (!config) { + const diagrams = await db.diagrams.toArray(); + await db.config.add({ id: 1, - defaultDiagramId: '', + defaultDiagramId: diagrams?.[0]?.id ?? '', }); } }); diff --git a/src/dialogs/create-diagram-dialog/create-diagram-dialog-import-database/create-diagram-dialog-import-database.tsx b/src/dialogs/create-diagram-dialog/create-diagram-dialog-import-database/create-diagram-dialog-import-database.tsx index 9678dd47..521dd73f 100644 --- a/src/dialogs/create-diagram-dialog/create-diagram-dialog-import-database/create-diagram-dialog-import-database.tsx +++ b/src/dialogs/create-diagram-dialog/create-diagram-dialog-import-database/create-diagram-dialog-import-database.tsx @@ -25,6 +25,7 @@ import { } from '@/components/avatar/avatar'; import { CreateDiagramDialogStep } from '../create-diagram-dialog-step'; import { SSMSInfo } from './ssms-info/ssms-info'; +import { useTranslation } from 'react-i18next'; export interface CreateDiagramDialogImportDatabaseProps { setStep: React.Dispatch>; @@ -51,6 +52,7 @@ export const CreateDiagramDialogImportDatabase: React.FC< setDatabaseEdition, errorMessage, }) => { + const { t } = useTranslation(); const handleInputChange = useCallback( (e: React.ChangeEvent) => { const inputValue = e.target.value; @@ -62,10 +64,12 @@ export const CreateDiagramDialogImportDatabase: React.FC< const renderHeader = useCallback(() => { return ( - Import your Database + + {t('new_diagram_dialog.import_database.title')} + ); - }, []); + }, [t]); const renderContent = useCallback(() => { return ( @@ -73,7 +77,9 @@ export const CreateDiagramDialogImportDatabase: React.FC< {databaseTypeToEditionMap[databaseType].length > 0 ? (

- Database edition: + {t( + 'new_diagram_dialog.import_database.database_edition' + )}

-
1. Run this script in your database:
+
+ 1. {t('new_diagram_dialog.import_database.step_1')} +
{databaseType === DatabaseType.SQL_SERVER && ( )} @@ -159,11 +167,13 @@ export const CreateDiagramDialogImportDatabase: React.FC<

- 2. Paste the script result here: + 2. {t('new_diagram_dialog.import_database.step_2')}