From 04875a1e432db1d1cf9774ba5c897b6c79824dd0 Mon Sep 17 00:00:00 2001 From: KarimTamani Date: Mon, 21 Jul 2025 19:03:06 +0100 Subject: [PATCH] Add Multi language support --- favicon.ico | Bin 15086 -> 0 bytes index.html | 10 +- public/favicon.png | Bin 0 -> 1027 bytes src/components/navbar/connection-status.tsx | 153 ------- src/components/navbar/languages-dropdown.tsx | 108 +++++ src/components/navbar/navbar.tsx | 24 +- src/i18/index.ts | 38 +- src/i18/languages/ar.ts | 375 ++++++++++++------ src/i18/languages/de.ts | 254 ++++++++++++ src/i18/languages/en.ts | 1 + src/i18/languages/es.ts | 277 +++++++++++++ src/i18/languages/fr.ts | 225 ++++++++--- src/i18/languages/hi.ts | 266 +++++++++++++ src/i18/languages/pt.ts | 265 +++++++++++++ src/i18/languages/ru.ts | 255 ++++++++++++ src/i18/languages/zh.ts | 272 +++++++++++++ .../relationship-controller.tsx | 4 +- src/styles/globals.css | 94 ++++- 18 files changed, 2250 insertions(+), 371 deletions(-) delete mode 100644 favicon.ico create mode 100644 public/favicon.png delete mode 100644 src/components/navbar/connection-status.tsx create mode 100644 src/components/navbar/languages-dropdown.tsx create mode 100644 src/i18/languages/de.ts create mode 100644 src/i18/languages/es.ts create mode 100644 src/i18/languages/hi.ts create mode 100644 src/i18/languages/pt.ts create mode 100644 src/i18/languages/ru.ts create mode 100644 src/i18/languages/zh.ts diff --git a/favicon.ico b/favicon.ico deleted file mode 100644 index e38d32ab7f0ca4e9f43f6f51f433f4acb976edf2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15086 zcmeHNTP$=}6y7>N72*>2c+f#_;>9hb`Rgv8G%2ly_*0E1UaA#|h=f5jrR{?tdJ!Z- z2oWzHq^(M*zVT2=tC!zswAJcEJ&2;Uy1rx1Wai8n&WyRXvywIY?6cR}>sxEDz0d5k zj}SpZC$h2xmwGY(j1c)k2)*7^j~3!F-;3rF?adE_c!vd^XBk!zZ!qJ&L{Hxo4*WjB zvM(|ZF@MQ?$b7*}ZesLpWZq&PWPZpD49-vmD}BxEF05Mn{gyG*G6ykhp;#9Blv!*4 zo|0Q*Ofh#j@GQ6g;DgxZ7=6#!fKiR$8`@=AUo9Uq#yEuo$Sq&Y8GA8AE?Ls6T(KwX ztM^|vIiTZm-w*MB!h^sM{BOA$p!K!kUwg9q4i!Mf4rMNk&%&< zo1051DJeGp!)_bH)YMc-FFZWlMlU8NMrun=PPS>gtxr>%zrR2ENrR8h#KjXjM#k>% z?+-ul_QZU1rHxl4zRl+-O&ct4D$1kq2$dSmZch zOb{3OzNbozGji=MFW8oSL{6@I(LUzIuU@qOGu!^#QTq`Q5fl`J)&1T%quDmjspsbA z==AhdIxoT*{O0B+RaaN5;^^+~rm?Xx)iy_QmzI{&+1VK_E-q4ec{%CzddkVkq5l4U zIzK;`N@bropI%y8y0`t%&`{|-e`sh(wXd?WGP=6DqQb&Lt9Dn}udS_>VjdP2X4Su? zzbh*%G&MD4)$S_$I2+&E+Oq1~(l)L;J3DE6d)rFJRrWE)Yiny(eJky^wzksl?yi+g zz`kqpKM?;w{&{o$wY0R*=;)}`+*Z#2y1F{)*<^XYy}h06t=X1xe69HzsL;C=lSWzC zKGrDf3VX^vus8U^i}ta{dE1NjvCrb&u=v9Z7*0&Kxe%{=!9MnSmek7?Wq!D;Zm=|L zag8{*b1V?^M;7+fE|Cw&$qi;#?Y}X{u+PGN%ZhjbDCTzwQ5*bLfmvtZ*9BnVVv_sa zU>jiAgl)X1h-TI^o8MDB;EFmW^6ih9wd|Q7^C5ErGYGl|%#P+1bkN7gPUyyOSe2jy-G2ee<%@Oz diff --git a/index.html b/index.html index 102806f..fbdfdad 100644 --- a/index.html +++ b/index.html @@ -4,14 +4,14 @@ - Vite + HeroUI - + StackRender Studio + - +
diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..21f5c17f43f476f56aed1a78164618d63e0f5d0c GIT binary patch literal 1027 zcmV+e1pNDnP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1DHufK~z{r?NnWC zR7Dh?Gc&v0EvspwY^e=3V!}^@BqlzX`q)H6croEeODu^$fFVfxU=*G)kzkC8SWE?4 zQ#K&wjR#F6;RTcGlOak0tAPZ;a^^9iMN52^TE|F4B>X}B)vbZi)nU(VF0Y#n_MmPFL<>tWd8|^dc^hME-fYPeyDb04=d%YTj!ia`H z2LXybV$NOhI_i7lYT^5I*@AfB5|ma(uY>&CK%T|~5TN8fiJ>Q2o24aXR)Aw;f|TT&p-C!%t&W-^62By z(-QNJx&nD1O0JTguX=XxI2ZML<{iv@G0abXm;x8bp<=G+Nq_m#(y4v&yoUP(9Papi zPlbhxuh@_W_63 zf+;Bj<6xpGM;JR&s(^WC;N#+SpQT($Q$}lLl|ipHp&Es)*`s*X_UCo> zjL-2Q%4fNC3(O9~3@ z@~b@|t>3j7d)#FGST<*Ns-1bFPReIsZHOby_^*h6N zH_as%%o9*HzijkA{#0rgL`XiVh|qiLCa(`8{58bBhgiGJk@mNh;+7Aenu18M?-1NUIlo{bmv(R7Qt zu&4k5?5EMrXphmE0~)6jS;Jm}6Ce~~xsi$Fe}b+pAioe6J^=nvKn { - - const powerSync = usePowerSync(); - const [syncStatus, setSyncStatus] = useState(powerSync.currentStatus); - const [downloadProgress, setDownloadProgress] = useState(undefined); - const clearProgressHandler: any = useRef(undefined); - const { t } = useTranslation(); - - const [lastUploadAt, setLastUploadAt] = useState(() => { - const last_upload_at = localStorage.getItem("last_upload_at"); - if (last_upload_at) - return new Date(last_upload_at); - return undefined; - }) - - useEffect(() => { - const getLastUploadAtValue = () => { - const last_upload_at = localStorage.getItem("last_upload_at"); - if (last_upload_at) - setLastUploadAt(new Date(last_upload_at)); - - } - window.addEventListener("storage", getLastUploadAtValue); - return () => { - window.removeEventListener('storage', getLastUploadAtValue); - } - }, []) - useEffect(() => { - - const l = powerSync.registerListener({ - statusChanged: (status) => { - setSyncStatus(status); - }, - }); - return () => l?.(); - }, [powerSync]); - - - useEffect(() => { - if (syncStatus.downloadProgress?.downloadedOperations && syncStatus.downloadProgress?.totalOperations) { - - const progress: number = Math.round(syncStatus.downloadProgress.downloadedOperations / syncStatus.downloadProgress.totalOperations * 100); - if (progress <= 100) { - setDownloadProgress(progress); - } - if (downloadProgress == 100 && !clearProgressHandler.current) { - - clearProgressHandler.current = setTimeout(() => { - setDownloadProgress(undefined); - clearProgressHandler.current = undefined; - }, 700) - } - } - }, [syncStatus.downloadProgress]) - - const deltaUploadTime = useMemo(() => { - - if (lastUploadAt) { - const currentDate = new Date(); - const minutes = differenceInMinutes(currentDate, lastUploadAt) - const hours = differenceInHours(currentDate, lastUploadAt); - - if (hours > 0 && hours < 24) { - return `${hours} ${t("connection_status.hour_ago")}` - } - if (minutes > 0 && minutes < 60) - return `${minutes} ${t("connection_status.min_ago")}` - - if (hours > 24) { - return `${lastUploadAt.toLocaleDateString()}` - } - } - return t("connection_status.just_now") ; - - }, [lastUploadAt , t]); - - const lastSyncedDate: string | undefined = useMemo(() => { - return syncStatus.lastSyncedAt ? syncStatus.lastSyncedAt.toLocaleString("en-US") : undefined; - }, [syncStatus.lastSyncedAt]); - - return ( -
- - -
- - { - syncStatus.connected ? - : - - } - { - syncStatus.connected ? t("connection_status.online") : t("connection_status.offline") - } - - - - - - { - downloadProgress !== undefined ? - <> - - {t("connection_status.saving")} ... - - - - - - : - - {t("connection_status.saved")} {deltaUploadTime} - - - } -
- -
- { - lastSyncedDate && - - {t("connection_status.last_synced")} : {lastSyncedDate} - - } -
-
- ) -} - - - -export default ConnectionStatus; \ No newline at end of file diff --git a/src/components/navbar/languages-dropdown.tsx b/src/components/navbar/languages-dropdown.tsx new file mode 100644 index 0000000..f0bef5f --- /dev/null +++ b/src/components/navbar/languages-dropdown.tsx @@ -0,0 +1,108 @@ +import { languages } from "@/i18"; +import { Language } from "@/i18/types"; +import { Button, Input, Listbox, ListboxItem, Popover, PopoverContent, PopoverTrigger } from "@heroui/react"; +import { Check, Languages, Search } from "lucide-react"; +import React, { Ref, useCallback, useEffect, useMemo, useRef, useState } from "react"; +import { useTranslation } from "react-i18next"; + +const LanguagesDropDonw: React.FC = ({ }) => { + const { t, i18n } = useTranslation(); + const [currentLanguage, setCurrentLanguage] = useState(() => languages.find((language: Language) => language.code == i18n.language) as Language); + const [languageList, setLanguageList] = useState(languages); + const searchRef: Ref = useRef(null); + const changeLanguage = useCallback((language: Language) => { + i18n.changeLanguage(language.code); + }, [i18n]) + + + + useEffect(() => { + setCurrentLanguage(languages.find((language: Language) => language.code == i18n.language) as Language) + }, [i18n.language]) + + const searchLanguage = () => { + + if (!searchRef.current?.value || searchRef.current?.value.trim().length == 0) { + + setLanguageList(languages); + }else + setLanguageList(languages.filter((language: Language) => + language.code.toLowerCase().includes(searchRef.current?.value.toLowerCase() as string) || + language.name.toLowerCase().includes(searchRef.current?.value.toLowerCase() as string) || + language.nativeName.toLowerCase().includes(searchRef.current?.value.toLowerCase() as string) + )) + console.log(searchRef.current?.value); + } + + const openChange = useCallback((isOpen : boolean) => { + + if (isOpen) + setLanguageList(languages) + } , []) + + return ( + + + + + + + } + className="h-8 w-full focus-visible:ring-0 shadow-none " + classNames={{ + inputWrapper: "dark:bg-default border-divider group-hover:border-primary group-data-[focus=true]:border-primary group-data-[focus=true]:bg-default", + + }} + /> +
+ + + { + languageList.map((language: Language) => ( + + } + onPressEnd={() => changeLanguage(language)} + className="text-font/90" + > + + {language.nativeName} ({language.name}) + + )) + } + + + +
+
+ ) +} + + +export default React.memo(LanguagesDropDonw); \ No newline at end of file diff --git a/src/components/navbar/navbar.tsx b/src/components/navbar/navbar.tsx index e1a595a..241ea3f 100644 --- a/src/components/navbar/navbar.tsx +++ b/src/components/navbar/navbar.tsx @@ -1,20 +1,13 @@ - - import { useDatabase } from "@/providers/database-provider/database-provider"; import Menu from "../menu/menu"; -import ConnectionStatus from "./connection-status"; import RenameDatabase from "./rename-database"; - -interface Props { - -} +import LanguagesDropdown from "./languages-dropdown"; -const Navbar: React.FC = ({ }) => { + +const Navbar: React.FC = ({ }) => { const { database } = useDatabase(); - return ( - diff --git a/src/i18/index.ts b/src/i18/index.ts index 7f24947..796870d 100644 --- a/src/i18/index.ts +++ b/src/i18/index.ts @@ -1,26 +1,50 @@ -import { en, enLanguage } from "./languages/en"; -import { fr, frLanguage } from "./languages/fr"; + + import { Language } from "./types"; import i18n from 'i18next'; import { initReactI18next } from 'react-i18next'; import LanguageDetector from 'i18next-browser-languagedetector'; + + +import { en, enLanguage } from "./languages/en"; +import { fr, frLanguage } from "./languages/fr"; import { ar, arLanguage } from "./languages/ar"; +import { es, esLanguage } from "./languages/es"; +import { zh, zhLanguage } from "./languages/zh"; +import { hi, hiLanguage } from "./languages/hi"; +import { pt, ptLanguage } from "./languages/pt"; +import { ru, ruLanguage } from "./languages/ru"; +import { de, deLanguage } from "./languages/de"; + export const languages: Language[] = [ enLanguage, - frLanguage , - arLanguage + frLanguage, + arLanguage, + esLanguage, + zhLanguage, + hiLanguage, + ptLanguage, + ruLanguage, + deLanguage, ]; + const resources = { en, fr, - ar + ar, + es, + zh, + hi, + pt, + ru, + de, }; i18n.use(LanguageDetector) .use(initReactI18next) .init({ - resources , - lng: 'en', + resources, + lng: 'en', interpolation: { escapeValue: false, diff --git a/src/i18/languages/ar.ts b/src/i18/languages/ar.ts index a60bb73..6a9aea5 100644 --- a/src/i18/languages/ar.ts +++ b/src/i18/languages/ar.ts @@ -1,140 +1,251 @@ import { Language } from "../types"; export const ar = { - translation: { - sidebar: { - tables: "الجداول", - relationships: "العلاقات" - }, - modal: { - close: "إغلاق", - create: "إنشاء" - }, - color_picker: { - default_color: "اللون الافتراضي" - }, - db_controller: { - filter: "تصفية", - add_table: "إضافة جدول", - add_field: "إضافة حقل", - add_index: "إضافة فهرس", - add_relationship: "إضافة علاقة", - show_code: "عرض الكود", - fields: "الحقول", - indexes: "الفهارس", - note: "ملاحظة", - name: "الاسم", - type: "النوع", - nullable: "يمكن أن يكون فارغًا", - select_fields: "اختر الحقول", - unique: "فريد", - table_note: "ملاحظة الجدول", - collapse: "طي الكل", - - primary_key: "المفتاح الأساسي", - foreign_key: "المفتاح الخارجي", - - source_table: "جدول المصدر", - target_table: "جدول الهدف", - - select_table: "اختر الجدول", - select_field: "اختر الحقل", - - cardinality: { - name: "التعددية", - one_to_one: "واحد إلى واحد", - one_to_many: "واحد إلى متعدد", - many_to_one: "متعدد إلى واحد", - many_to_many: "متعدد إلى متعدد" - }, - delete: "حذف", - field_setting: "إعدادات الحقل", - table_actions: "إجراءات الحقل", - actions: "إجراءات", - - field_note: "ملاحظة الحقل", - delete_field: "حذف الحقل", - - create_relationship: "إنشاء علاقة", - relationship_error: "لإنشاء علاقة، يجب أن يكون نوع مفتاح المصدر ونوع المفتاح المرجعي متماثلين.", - - invalid_relationship: { - title: "علاقة غير صالحة", - description: "نوع مفتاح المصدر لا يتطابق مع نوع المفتاح المرجعي. يرجى التأكد من أن كلا المفتاحين لهما نفس نوع البيانات." - } - }, - table: { - double_click: "انقر مزدوجًا للتعديل", - overlapping_tables: "الجداول المتداخلة", - }, - control_buttons: { - redo: "إعادة", - undo: "تراجع", - zoom_in: "تكبير", - zoom_out: "تصغير", - adjust_positions: "تعديل المواقع", - show_all: "عرض الكل" - }, - menu: { - file: "ملف", - new: "جديد", - open: "فتح", - save: "حفظ", - import: "استيراد", - json: ".json", - dbml: ".dbml", - mysql: "MySql", - postgresql: "Postgresql", - export_sql: "تصدير SQL", - generic: "عام", - export_orm_models: "تصدير ORM Models", - delete_project: "حذف المشروع", - edit: "تحرير", - undo: "تراجع", - redo: "إعادة", - clear: "مسح", - view: "عرض", - hide_controller: "إخفاء المتحكم", - zoom_on_scroll: "التكبير عند التمرير", - on: "تشغيل", - off: "إيقاف", - theme: "الثيم", - light: "فاتح", - dark: "داكن", - help: "مساعدة", - show_docs: "عرض المستندات", - join_discord: "الانضمام إلى ديسكورد" - }, - connection_status: { - online: "متصل", - offline: "غير متصل", - saving: "جارٍ الحفظ", - saved: "تم الحفظ", - last_synced: "آخر مزامنة" - }, - import: { - instructions: "التعليمات", - install: "التثبيت", - run_command: "قم بتشغيل الأمر التالي في الطرفية.", - example: "مثال", - copy_code: "انسخ محتوى ملف .sql إلى قسم الكود أدناه.", - pg_admin: { - step1: "افتح Pg Admin.", - step2: "انقر بزر الفأرة الأيمن على قاعدة البيانات واختر Backup من القائمة السياقية.", - step3: "قم بتسمية ملف .sql، ثم اختر التنسيق Plain، وحدد Encoding: UTF8.", - step4: "تأكد من أن Only schema محددة، وOnly data غير محددة، وذلك في علامة تبويب Data Options.", - step5: "انقر على Backup لتصدير الملف، ثم انسخ محتواه إلى قسم محرر الكود أدناه." - }, - workbench: { - step1: "افتح MySQL Workbench واتصل بخادم MySQL الخاص بك.", - step2: "من القائمة العلوية، انتقل إلى Server > Data Export.", - step3: "في قسم خيارات التصدير، اختر Dump Structure Only.", - step4: "حدد Export to Self-Contained File، ثم اختر مكان الحفظ واسم ملف الإخراج .sql.", - step5: "انقر على Start Export لبدء عملية التصدير، ثم انسخ محتوى الملف إلى قسم محرر الكود أدناه." - } + translation: { + sidebar: { + tables: "الجداول", + relationships: "العلاقات" + }, + color_picker: { + default_color: "اللون الافتراضي" + }, + navbar: { + rename_db: "إعادة تسمية قاعدة البيانات", + search: "بحث" + }, + db_controller: { + filter: "تصفية", + add_table: "إضافة جدول", + add_field: "إضافة حقل", + add_index: "إضافة فهرس", + delete_table: "حذف الجدول", + duplicate: "تكرار", + add_relationship: "إضافة علاقة", + show_code: "عرض الكود", + fields: "الحقول", + indexes: "الفهارس", + note: "ملاحظة", + name: "الاسم", + type: "النوع", + nullable: "يسمح بالقيمة الفارغة", + select_fields: "اختر الحقول", + unique: "فريد", + table_note: "ملاحظة الجدول", + collapse: "طي الكل", + primary_key: "المفتاح الأساسي", + foreign_key: "المفتاح الخارجي", + source_table: "الجدول المصدر", + referenced_table: "الجدول المشار إليه", + select_table: "اختر جدولًا", + select_field: "اختر حقلًا", + empty_list: { + no_tables: "لا توجد جداول", + no_tables_description: "أنشئ جدولًا للبدء.", + no_relationships: "لا توجد علاقات", + no_relationships_description: "أنشئ علاقات لربط جدولين" + }, + cardinality: { + name: "القرينة", + one_to_one: "واحد إلى واحد", + one_to_many: "واحد إلى متعدد", + many_to_one: "متعدد إلى واحد", + many_to_many: "متعدد إلى متعدد" + }, + foreign_key_actions: { + title: "إجراءات المفتاح الخارجي", + on_delete: "عند الحذف", + on_update: "عند التحديث", + actions: { + no_action: "لا إجراء", + cascade: "تسلسل", + set_null: "تعيين كـ Null", + set_default: "تعيين كافتراضي", + restrict: "تقييد" } + }, + field_settings: { + title: "إعدادات الحقل", + unique: "فريد", + unsigned: "بدون إشارة", + numeric_setting: "إعداد رقمي", + decimal_setting: "إعداد عشري", + zeroFill: "تعبئة بالأصفار", + autoIncrement: "زيادة تلقائية", + note: "ملاحظة", + delete_field: "حذف الحقل", + field_note: "ملاحظة الحقل", + precision: "الدقة", + text_setting: "إعداد النص", + charset: "ترميز الحروف", + collation: "التجميع", + scale: "المقياس", + max_length: "الطول الأقصى", + integer_width: "عرض العدد الصحيح", + width: "العرض", + default_value: "القيمة الافتراضية", + value: "القيمة", + length: "الطول", + values: "القيم", + type_enter: "اكتب واضغط Enter", + precision_def: "إجمالي الأرقام المسموحة (قبل + بعد الفاصلة).", + scale_def: "عدد الأرقام بعد الفاصلة.", + time_default_value: { + no_value: "لا توجد قيمة", + custom: "وقت مخصص", + now: "الآن" + }, + errors: { + max_length: "يجب أن يكون عددًا موجبًا بدون فواصل عشرية.", + integer_default_value: "قيمة افتراضية غير صالحة لعدد صحيح", + precision: "يجب أن تكون الدقة عددًا موجبًا بدون فواصل عشرية.", + scale: "يجب أن يكون المقياس عددًا موجبًا بدون فواصل عشرية.", + scale_max_value: "يجب أن يكون المقياس ≤ الدقة." + }, + pick_value: "اختر قيمة" + }, + delete: "حذف", + index_setting: "إعدادات الفهرس", + table_actions: "إجراءات الجدول", + actions: "إجراءات", + delete_index: "حذف الفهرس", + index_name: "اسم الفهرس", + create_relationship: "إنشاء علاقة", + relationship_error: "لإنشاء علاقة، يجب أن يكون المفتاح الأساسي والمفتاح الخارجي من نفس النوع.", + invalid_relationship: { + title: "علاقة غير صالحة", + description: "نوع مفتاح المصدر لا يتطابق مع نوع المفتاح المشار إليه. تأكد من أن كليهما من نفس نوع البيانات." + }, + circular_dependency: { + title: "تم الكشف عن تبعية دائرية", + toast_description: "تم العثور على مرجع دائري بين الجداول. تحقق من المخطط على اليسار وقم بإزالة إحدى العلاقات لإصلاح ذلك.", + description: "يحتوي المخطط الخاص بك على علاقة مفتاح خارجي دائرية بين الجداول. لإصلاحها،", + suggestion: "قم بإزالة إحدى العلاقات أدناه التي تسبب الدورة.", + remove_relationship: "إزالة العلاقة" + } + }, + table: { + double_click: "انقر مرتين للتعديل", + overlapping_tables: "جداول متداخلة", + show_more: "عرض المزيد", + show_less: "عرض أقل" + }, + control_buttons: { + redo: "إعادة", + undo: "تراجع", + zoom_in: "تكبير", + zoom_out: "تصغير", + adjust_positions: "ضبط المواقع", + show_all: "عرض الكل" + }, + menu: { + file: "ملف", + new: "جديد", + open: "فتح", + save: "حفظ", + import: "استيراد", + json: ".json", + dbml: ".dbml", + mysql: "MySQL", + postgresql: "PostgreSQL", + export_sql: "تصدير SQL", + generic: "عام", + export_orm_models: "تصدير نماذج ORM", + delete_project: "حذف المشروع", + edit: "تعديل", + undo: "تراجع", + redo: "إعادة", + clear: "مسح", + view: "عرض", + hide_controller: "إخفاء لوحة التحكم", + show_controller: "عرض لوحة التحكم", + cardinality_style: "نمط القرينة", + hidden: "مخفي", + numeric: "رقمي", + symbolic: "رمزي", + theme: "الثيم", + light: "فاتح", + dark: "داكن", + help: "مساعدة", + show_docs: "عرض المستندات", + join_discord: "انضم إلى Discord" + }, + modals: { + close: "إغلاق", + create: "إنشاء", + pick_database: "اختر قاعدة البيانات الخاصة بك.", + create_database_header: "كل قاعدة بيانات تقدم ميزات مختلفة.", + db_name: "اسم قاعدة البيانات", + db_name_error: "يرجى إدخال اسم قاعدة البيانات", + continue: "متابعة", + open: "فتح", + open_database: "فتح قاعدة بيانات", + open_database_header: "افتح قاعدة بيانات عن طريق اختيار واحدة من القائمة.", + delete_database: "حذف قاعدة البيانات", + delete_database_content: "هذا الإجراء لا يمكن التراجع عنه وسيمسح المخطط نهائيًا.", + delete: "حذف", + import_database: { + title: "استيراد قاعدة البيانات", + import: "استيراد", + import_options: "هل ترغب في الاستيراد باستخدام:", + import_error: "خطأ في تحليل SQL", + import_error_description: "تعذر استيراد SQL الخاص بك بسبب وجود صيغة غير صحيحة.", + import_warning: "تحذير تحليل SQL", + import_warning_description: "بعض العناصر لم يتم معالجتها بسبب تصريحات غير مدعومة أو غير مكتملة." + }, + export_sql: "تصدير SQL", + export_sql_header: "تصدير مخطط قاعدة البيانات على شكل كود SQL" + }, + clipboard: { + copy: "نسخ", + copied: "تم النسخ" + }, + connection_status: { + online: "متصل", + offline: "غير متصل", + saving: "يتم الحفظ...", + saved: "تم الحفظ", + last_synced: "آخر مزامنة", + min_ago: "دقيقة مضت", + hour_ago: "ساعة مضت", + just_now: "الآن" + }, + import: { + instructions: "التعليمات", + install: "تثبيت", + run_command: "قم بتشغيل الأمر التالي في الطرفية:", + example: "مثال", + copy_code: "انسخ محتوى ملف .sql إلى محرر الكود أدناه.", + pg_admin: { + step1: "افتح Pg Admin.", + step2: "انقر بزر الماوس الأيمن على قاعدة البيانات واختر Backup.", + step3: "قم بتسمية ملف .sql، حدد Format إلى Plain، واختر Encoding: UTF8.", + step4: "تأكد من تحديد Only schema وإلغاء تحديد Only data في علامة تبويب خيارات البيانات.", + step5: "اضغط Backup لتصدير الملف، ثم انسخ محتواه إلى محرر الكود أدناه." + }, + workbench: { + step1: "افتح MySQL Workbench واتصل بخادم MySQL الخاص بك.", + step2: "من القائمة العلوية، اذهب إلى Server > Data Export.", + step3: "في خيارات التصدير، اختر Dump Structure Only.", + step4: "حدد Export to Self-Contained File، ثم اختر مكانًا واسمًا لملف .sql.", + step5: "اضغط على Start Export، ثم انسخ محتوى الملف إلى محرر الكود أدناه." + }, + heidisql: { + step1: "افتح HeidiSQL واتصل بالخادم.", + step2: "في الشريط الجانبي الأيسر، انقر بزر الماوس الأيمن على قاعدة البيانات التي تريد تصديرها.", + step3: "اختر Export database as SQL.", + step4: "حدد No data وتأكد من تحديد Create لتصدير البنية فقط.", + step5: "انقر على Export، ثم انسخ محتوى ملف .sql إلى محرر الكود." + }, + dbbrowser: { + step1: "شغل DB Browser for SQLite.", + step2: "اذهب إلى File > Open Database واختر ملف .sqlite أو .db.", + step3: "من القائمة، اختر File > Export > Database to SQL file.", + step4: "في النافذة، اختر Export schema only ثم انقر Save.", + step5: "أخيرًا، انسخ محتوى ملف .sql إلى محرر الكود أدناه." + } } -}; + } +} export const arLanguage: Language = { name: 'Arabic', diff --git a/src/i18/languages/de.ts b/src/i18/languages/de.ts new file mode 100644 index 0000000..f49d74f --- /dev/null +++ b/src/i18/languages/de.ts @@ -0,0 +1,254 @@ +import { Language } from "../types"; + +export const de = { + translation: { + sidebar: { + tables: "Tabellen", + relationships: "Beziehungen" + }, + color_picker: { + default_color: "Standardfarbe" + }, + navbar: { + rename_db: "Datenbank umbenennen", + search: "Suchen" + }, + db_controller: { + filter: "Filter", + add_table: "Tabelle hinzufügen", + add_field: "Feld hinzufügen", + add_index: "Index hinzufügen", + delete_table: "Tabelle löschen", + duplicate: "Duplizieren", + add_relationship: "Beziehung hinzufügen", + show_code: "Code anzeigen", + fields: "Felder", + indexes: "Indizes", + note: "Notiz", + name: "Name", + type: "Typ", + nullable: "Nullwert zulässig", + select_fields: "Felder auswählen", + unique: "Eindeutig", + table_note: "Tabellennotiz", + collapse: "Alle einklappen", + primary_key: "Primärschlüssel", + foreign_key: "Fremdschlüssel", + source_table: "Quelltabelle", + referenced_table: "Referenzierte Tabelle", + select_table: "Tabelle auswählen", + select_field: "Feld auswählen", + empty_list: { + no_tables: "Keine Tabellen", + no_tables_description: "Erstelle eine Tabelle, um zu beginnen.", + no_relationships: "Keine Beziehungen", + no_relationships_description: "Erstelle Beziehungen, um zwei Tabellen zu verbinden" + }, + cardinality: { + name: "Kardinalität", + one_to_one: "Eins zu eins", + one_to_many: "Eins zu viele", + many_to_one: "Viele zu eins", + many_to_many: "Viele zu viele" + }, + foreign_key_actions: { + title: "Fremdschlüssel-Aktionen", + on_delete: "Beim Löschen", + on_update: "Beim Aktualisieren", + actions: { + no_action: "Keine Aktion", + cascade: "Kaskadieren", + set_null: "Auf Null setzen", + set_default: "Standardwert setzen", + restrict: "Einschränken" + } + }, + field_settings: { + title: "Feld-Einstellungen", + unique: "Eindeutig", + unsigned: "Ohne Vorzeichen", + numeric_setting: "Numerische Einstellung", + decimal_setting: "Dezimaleinstellung", + zeroFill: "Mit Nullen auffüllen", + autoIncrement: "Automatische Erhöhung", + note: "Notiz", + delete_field: "Feld löschen", + field_note: "Feldnotiz", + precision: "Genauigkeit", + text_setting: "Texteinstellung", + charset: "Zeichensatz", + collation: "Sortierung", + scale: "Skalierung", + max_length: "Maximale Länge", + integer_width: "Ganzzahlbreite", + width: "Breite", + default_value: "Standardwert", + value: "Wert", + length: "Länge", + values: "Werte", + type_enter: "Tippen und Enter drücken", + precision_def: "Zulässige Gesamtanzahl an Ziffern (vor + nach dem Dezimalpunkt).", + scale_def: "Ziffern nach dem Dezimalpunkt.", + time_default_value: { + no_value: "Kein Wert", + custom: "Benutzerdefinierte Zeit", + now: "Jetzt" + }, + errors: { + max_length: "muss eine positive Zahl ohne Dezimalstellen sein.", + integer_default_value: "Ungültiger Standardwert für Ganzzahl", + precision: "Genauigkeit muss eine positive Zahl ohne Dezimalstellen sein.", + scale: "Skalierung muss eine positive Zahl ohne Dezimalstellen sein.", + scale_max_value: "Skalierung muss ≤ Genauigkeit sein." + }, + pick_value: "Wert auswählen" + }, + delete: "Löschen", + index_setting: "Index-Einstellungen", + table_actions: "Tabellenaktionen", + actions: "Aktionen", + delete_index: "Index löschen", + index_name: "Indexname", + create_relationship: "Beziehung erstellen", + relationship_error: "Um eine Beziehung zu erstellen, müssen Primär- und Fremdschlüssel denselben Typ haben.", + invalid_relationship: { + title: "Ungültige Beziehung", + description: "Der Typ des Quellschlüssels stimmt nicht mit dem des referenzierten Schlüssels überein. Bitte stelle sicher, dass beide den gleichen Datentyp haben." + }, + circular_dependency: { + title: "Zirkuläre Abhängigkeit erkannt", + toast_description: "Eine zirkuläre Referenz zwischen Tabellen wurde gefunden. Überprüfe das Diagramm links und entferne eine der Beziehungen.", + description: "Dein Schema enthält eine zirkuläre Fremdschlüssel-Beziehung zwischen Tabellen. Um dies zu beheben,", + suggestion: "entferne eine der unten aufgeführten Beziehungen, die den Kreis verursachen.", + remove_relationship: "Beziehung entfernen" + } + }, + table: { + double_click: "Doppelklick zum Bearbeiten", + overlapping_tables: "Überlappende Tabellen", + show_more: "Mehr anzeigen", + show_less: "Weniger anzeigen" + }, + control_buttons: { + redo: "Wiederholen", + undo: "Rückgängig", + zoom_in: "Vergrößern", + zoom_out: "Verkleinern", + adjust_positions: "Positionen anpassen", + show_all: "Alles anzeigen" + }, + menu: { + file: "Datei", + new: "Neu", + open: "Öffnen", + save: "Speichern", + import: "Importieren", + json: ".json", + dbml: ".dbml", + mysql: "MySQL", + postgresql: "PostgreSQL", + export_sql: "SQL exportieren", + generic: "Allgemein", + export_orm_models: "ORM-Modelle exportieren", + delete_project: "Projekt löschen", + edit: "Bearbeiten", + undo: "Rückgängig", + redo: "Wiederholen", + clear: "Leeren", + view: "Ansicht", + hide_controller: "Controller ausblenden", + show_controller: "Controller anzeigen", + cardinality_style: "Kardinalitätsstil", + hidden: "Versteckt", + numeric: "Numerisch", + symbolic: "Symbolisch", + theme: "Design", + light: "Hell", + dark: "Dunkel", + help: "Hilfe", + show_docs: "Dokumentation anzeigen", + join_discord: "Discord beitreten" + }, + modals: { + close: "Schließen", + create: "Erstellen", + pick_database: "Wähle deine Datenbank.", + create_database_header: "Jede Datenbank bietet unterschiedliche Funktionen.", + db_name: "Datenbankname", + db_name_error: "Bitte gib einen Datenbanknamen ein", + continue: "Weiter", + open: "Öffnen", + open_database: "Datenbank öffnen", + open_database_header: "Wähle eine Datenbank aus der Liste aus.", + delete_database: "Datenbank löschen", + delete_database_content: "Diese Aktion ist unwiderruflich und wird das Diagramm dauerhaft löschen.", + delete: "Löschen", + import_database: { + title: "Datenbank importieren", + import: "Importieren", + import_options: "Möchtest du importieren mit:", + import_error: "SQL-Parsing-Fehler", + import_error_description: "Wir konnten dein SQL nicht importieren, da es ungültige Syntax enthält.", + import_warning: "SQL-Parsing-Warnung", + import_warning_description: "Einige Elemente konnten aufgrund nicht unterstützter oder unvollständiger Deklarationen nicht verarbeitet werden." + }, + export_sql: "SQL exportieren", + export_sql_header: "Exportiere dein Datenbankdiagramm als SQL-Code" + }, + clipboard: { + copy: "Kopieren", + copied: "Kopiert" + }, + connection_status: { + online: "Online", + offline: "Offline", + saving: "Speichern...", + saved: "Gespeichert", + last_synced: "Zuletzt synchronisiert", + min_ago: "Min. zuvor", + hour_ago: "Std. zuvor", + just_now: "Gerade eben" + }, + import: { + instructions: "Anleitung", + install: "Installieren", + run_command: "Führe den folgenden Befehl im Terminal aus.", + example: "Beispiel", + copy_code: "Kopiere den Inhalt der .sql-Datei in den Code-Editor unten.", + pg_admin: { + step1: "Öffne Pg Admin.", + step2: "Rechtsklicke auf deine Datenbank und wähle Backup.", + step3: "Benenne deine .sql-Datei, stelle Format auf Plain und wähle Encoding: UTF8.", + step4: "Stelle sicher, dass Only schema aktiviert und Only data deaktiviert ist.", + step5: "Klicke auf Backup, um die Datei zu exportieren, und kopiere dann den Inhalt in den untenstehenden Editor." + }, + workbench: { + step1: "Öffne MySQL Workbench und stelle eine Verbindung zu deinem Server her.", + step2: "Gehe im oberen Menü zu Server > Data Export.", + step3: "Wähle unter Export Options Dump Structure Only.", + step4: "Aktiviere Export to Self-Contained File, wähle einen Speicherort und Dateinamen.", + step5: "Klicke auf Start Export und kopiere den Inhalt in den Code-Editor unten." + }, + heidisql: { + step1: "Öffne HeidiSQL und verbinde dich mit deinem Server.", + step2: "Klicke in der linken Seitenleiste mit der rechten Maustaste auf die Datenbank.", + step3: "Wähle Export database as SQL.", + step4: "Wähle No data und stelle sicher, dass Create aktiviert ist.", + step5: "Klicke auf Export und kopiere den Inhalt der .sql-Datei in den Editor." + }, + dbbrowser: { + step1: "Starte DB Browser for SQLite.", + step2: "Gehe zu File > Open Database und wähle deine .sqlite- oder .db-Datei.", + step3: "Gehe zu File > Export > Database to SQL file.", + step4: "Wähle im Dialog Export schema only und klicke auf Save.", + step5: "Kopiere abschließend den Inhalt der .sql-Datei in den Editor." + } + } + } +} + +export const deLanguage: Language = { + name: "German", + nativeName: "Deutsch", + code: "de", +}; diff --git a/src/i18/languages/en.ts b/src/i18/languages/en.ts index 2406ee2..1cc70e0 100644 --- a/src/i18/languages/en.ts +++ b/src/i18/languages/en.ts @@ -14,6 +14,7 @@ export const en = { }, navbar: { rename_db: "Rename database", + search : "Search" }, db_controller: { filter: "Filter", diff --git a/src/i18/languages/es.ts b/src/i18/languages/es.ts new file mode 100644 index 0000000..51c0783 --- /dev/null +++ b/src/i18/languages/es.ts @@ -0,0 +1,277 @@ +import { Language } from "../types"; + +export const es = { + + translation: { + sidebar: { + tables: "Tablas", + relationships: "Relaciones" + }, + + color_picker: { + default_color: "Color predeterminado" + }, + navbar: { + rename_db: "Renombrar base de datos", + search : "Buscar" + }, + db_controller: { + filter: "Filtrar", + add_table: "Agregar tabla", + add_field: "Agregar campo", + add_index: "Agregar índice", + delete_table: "Eliminar tabla", + duplicate: "Duplicar", + add_relationship: "Agregar relación", + show_code: "Mostrar código", + fields: "Campos", + indexes: "Índices", + note: "Nota", + name: "Nombre", + type: "Tipo", + nullable: "Permite nulo", + select_fields: "Seleccionar campos", + unique: "Único", + table_note: "Nota de la tabla", + collapse: "Colapsar todo", + primary_key: "Clave primaria", + foreign_key: "Clave foránea", + + source_table: "Tabla de origen", + referenced_table: "Tabla referenciada", + + select_table: "Seleccionar tabla", + select_field: "Seleccionar campo", + + empty_list : { + no_tables : "Sin tablas" , + no_tables_description : "Crea una tabla para comenzar." , + + no_relationships : "Sin relaciones" , + no_relationships_description : "Crea relaciones para conectar dos tablas" + } , + + cardinality: { + name: "Cardinalidad", + one_to_one: "Uno a uno", + one_to_many: "Uno a muchos", + many_to_one: "Muchos a uno", + many_to_many: "Muchos a muchos", + + }, + foreign_key_actions : { + title : "Acciones de clave foránea" , + on_delete : "Al eliminar" , + on_update : "Al actualizar" , + actions : { + no_action : "Sin acción" , + cascade : "Cascada" , + set_null : "Establecer nulo" , + set_default : "Establecer valor predeterminado" , + restrict : "Restringir" + } + } , + field_settings: { + title: "Configuración de campo", + unique: "Único", + unsigned: "Sin signo", + numeric_setting: "Configuración numérica", + decimal_setting: "Configuración decimal", + zeroFill: "Relleno con ceros", + autoIncrement: "Autoincremento", + note: "Nota", + + delete_field: "Eliminar campo", + field_note: "Nota del campo", + precision: "Precisión", + text_setting: "Configuración de texto", + charset: "Charset", + collation: "Intercalación", + scale: "Escala", + max_length: "Longitud máxima", + integer_width: "Ancho de entero", + width: "Ancho", + default_value: "Valor predeterminado", + value: "Valor", + length: "Longitud", + values: "Valores", + type_enter: "Escribe y presiona enter", + precision_def: "Total de dígitos permitidos (antes + después del decimal).", + scale_def: "Dígitos permitidos después del decimal.", + time_default_value: { + no_value: "Sin valor", + custom: "Hora personalizada", + now: "Ahora" + }, + errors: { + max_length: "debe ser un número positivo, sin decimales.", + integer_default_value: "Valor predeterminado inválido para entero", + precision: "La precisión debe ser un número positivo, sin decimales.", + scale: "La escala debe ser un número positivo, sin decimales.", + scale_max_value: "La escala debe ser ≤ precisión." + + }, + pick_value: "Seleccionar valor" + }, + delete: "Eliminar", + + index_setting: "Configuración del índice", + table_actions: "Acciones de la tabla", + actions: "Acciones", + delete_index: "Eliminar índice", + index_name: "Nombre del índice", + create_relationship: "Crear relación", + relationship_error: "Para crear una relación, la clave primaria y la clave foránea deben ser del mismo tipo.", + + invalid_relationship: { + title: "Relación inválida", + description: "El tipo de clave de origen no coincide con el tipo de clave referenciada. Asegúrese de que ambas claves tengan el mismo tipo de datos." + }, + circular_dependency: { + title: "Dependencia circular detectada", + toast_description: "Se encontró una referencia circular entre tablas. Revisa el diagrama a la izquierda y elimina una de las relaciones para corregirlo.", + description: "Tu esquema contiene una relación foránea circular entre tablas. Para corregirlo", + suggestion: "elimina una de las relaciones que se indican a continuación y que están causando el ciclo.", + remove_relationship: "Eliminar relación" + } + }, + table: { + double_click: "Doble clic para editar", + overlapping_tables: "Tablas superpuestas", + show_more: "Mostrar más", + show_less: "Mostrar menos" + }, + control_buttons: { + redo: "Rehacer", + undo: "Deshacer", + zoom_in: "Acercar", + zoom_out: "Alejar", + adjust_positions: "Ajustar posiciones", + show_all: "Mostrar todo" + }, + menu: { + file: "Archivo", + new: "Nuevo", + open: "Abrir", + save: "Guardar", + import: "Importar", + json: ".json", + dbml: ".dbml", + mysql: "MySql", + postgresql: "Postgresql", + export_sql: "Exportar SQL", + generic: "Genérico", + export_orm_models: "Exportar modelos ORM", + delete_project: "Eliminar proyecto", + edit: "Editar", + undo: "Deshacer", + redo: "Rehacer", + clear: "Limpiar", + view: "Vista", + hide_controller: "Ocultar controlador", + show_controller : "Mostrar controlador" , + cardinality_style: "Estilo de cardinalidad", + hidden: "Oculto", + numeric: "Numérico", + symbolic : "Simbólico" , + theme: "Tema", + light: "Claro", + dark: "Oscuro", + help: "Ayuda", + show_docs: "Mostrar documentación", + join_discord: "Unirse a Discord", + + + }, + + modals: { + close: "Cerrar", + create: "Crear", + pick_database: "Selecciona tu base de datos.", + create_database_header: "Cada base de datos ofrece características y funcionalidades distintas.", + db_name: "Nombre de la base de datos", + db_name_error: "Por favor, proporciona un nombre para la base de datos", + continue: "Continuar", + open: "Abrir", + open_database: "Abrir base de datos", + open_database_header: "Abre una base de datos seleccionando una de la lista.", + delete_database: "Eliminar base de datos", + delete_database_content: "Esta acción es irreversible y eliminará permanentemente el diagrama.", + delete: "Eliminar", + + import_database: { + title: "Importar tu base de datos", + import: "Importar", + import_options: "¿Te gustaría importar usando :" , + import_error : "Error al analizar SQL" , + import_error_description : "No pudimos importar tu SQL porque contiene sintaxis inválida." , + import_warning : "Advertencia al analizar SQL" , + import_warning_description : "Algunos elementos no pudieron ser procesados debido a declaraciones no compatibles o incompletas." , + } , + export_sql : "Exportar SQL" , + export_sql_header : "Exporta tu diagrama de base de datos en código SQL" + }, + clipboard: { + copy: "Copiar", + copied: "Copiado" + }, + + connection_status : { + online: "En línea" , + offline : "Sin conexión" , + saving : "Guardando" , + saved : "Guardado" , + last_synced : "Última sincronización" , + min_ago : "min atrás" , + hour_ago : "hace una hora" , + just_now : "Justo ahora" + }, + import: { + instructions: "Instrucciones", + install: "Instalar", + run_command: "Ejecuta el siguiente comando en tu terminal.", + example: "Ejemplo", + copy_code: "Copia el contenido del archivo .sql en la sección de código a continuación.", + pg_admin: { + "step1": "Abre Pg Admin.", + "step2": "Haz clic derecho en tu base de datos y selecciona Backup del menú contextual.", + "step3": "Nombra tu archivo .sql, establece el formato en Plain y elige Encoding: UTF8.", + "step4": "Asegúrate de que Only schema esté marcado y Only data desmarcado en la pestaña Data Options.", + "step5": "Haz clic en Backup para exportar el archivo, luego copia su contenido en el editor de código a continuación." + }, + workbench: { + "step1": "Abre MySQL Workbench y conéctate a tu servidor MySQL.", + "step2": "En el menú superior, ve a Server > Data Export.", + "step3": "En las Opciones de exportación, elige Dump Structure Only.", + "step4": "Marca Export to Self-Contained File, luego elige una ubicación y un nombre para el archivo .sql.", + "step5": "Haz clic en Start Export para iniciar el proceso. Luego copia su contenido en el editor de código." + + }, + heidisql: { + "step1": "Abre HeidiSQL y conéctate a tu servidor.", + "step2": "En la barra lateral izquierda, haz clic derecho sobre la base de datos que quieres exportar.", + "step3": "Selecciona Exportar base de datos como SQL del menú contextual.", + "step4": "Selecciona Sin datos y asegúrate de que Crear esté marcado para exportar solo la estructura.", + "step5": "Haz clic en el botón Exportar y finalmente copia el contenido del archivo .sql en el editor de código a continuación." + + }, + dbbrowser: { + step1: "Inicia DB Browser for SQLite.", + step2: "Haz clic en Archivo > Abrir base de datos y selecciona tu archivo .sqlite o .db.", + step3: "Ve a Archivo > Exportar > Base de datos a archivo SQL desde el menú superior.", + step4: "En el diálogo, elige Exportar solo esquema y haz clic en Guardar.", + step5: "Finalmente, copia el contenido del archivo .sql en el editor de código a continuación." + + }, + + } + + } + +} + +export const esLanguage: Language = { + name: "Spanish", + nativeName: "Español", + code: "es", +}; diff --git a/src/i18/languages/fr.ts b/src/i18/languages/fr.ts index 79f7aaf..29178cf 100644 --- a/src/i18/languages/fr.ts +++ b/src/i18/languages/fr.ts @@ -7,74 +7,136 @@ export const fr = { tables: "Tables", relationships: "Relations" }, - modal: { - close: "Fermer", - create: "Créer" - }, color_picker: { default_color: "Couleur par défaut" }, + navbar: { + rename_db: "Renommer la base de données", + search: "Rechercher" + }, db_controller: { filter: "Filtrer", - add_table: "Ajouter une Table", - add_field: "Ajouter un Champ", - add_index: "Ajouter un Index", - add_relationship: "Ajouter une Relation", + add_table: "Ajouter une table", + add_field: "Ajouter un champ", + add_index: "Ajouter un index", + delete_table: "Supprimer la table", + duplicate: "Dupliquer", + add_relationship: "Ajouter une relation", show_code: "Afficher le code", fields: "Champs", - indexes: "Indexes", + indexes: "Index", note: "Note", name: "Nom", type: "Type", nullable: "Nullable", select_fields: "Sélectionner les champs", unique: "Unique", - table_note: "Note de la Table", + table_note: "Note de la table", collapse: "Tout réduire", - primary_key: "Clé primaire", foreign_key: "Clé étrangère", - source_table: "Table source", - target_table: "Table cible", - - select_table: "Sélectionner la table", - select_field: "Sélectionner le champ", - + referenced_table: "Table référencée", + select_table: "Sélectionner une table", + select_field: "Sélectionner un champ", + empty_list: { + no_tables: "Aucune table", + no_tables_description: "Créez une table pour commencer.", + no_relationships: "Aucune relation", + no_relationships_description: "Créez des relations pour connecter deux tables" + }, cardinality: { name: "Cardinalité", - one_to_one: "Un à Un", - one_to_many: "Un à Plusieurs", - many_to_one: "Plusieurs à Un", - many_to_many: "Plusieurs à Plusieurs" + one_to_one: "Un à un", + one_to_many: "Un à plusieurs", + many_to_one: "Plusieurs à un", + many_to_many: "Plusieurs à plusieurs" + }, + foreign_key_actions: { + title: "Actions de clé étrangère", + on_delete: "Lors de la suppression", + on_update: "Lors de la mise à jour", + actions: { + no_action: "Aucune action", + cascade: "Cascade", + set_null: "Définir à null", + set_default: "Définir par défaut", + restrict: "Restreindre" + } + }, + field_settings: { + title: "Paramètres du champ", + unique: "Unique", + unsigned: "Non signé", + numeric_setting: "Paramètres numériques", + decimal_setting: "Paramètres décimaux", + zeroFill: "Complément zéro", + autoIncrement: "Auto-incrémentation", + note: "Note", + delete_field: "Supprimer le champ", + field_note: "Note du champ", + precision: "Précision", + text_setting: "Paramètres de texte", + charset: "Jeu de caractères", + collation: "Collation", + scale: "Échelle", + max_length: "Longueur max", + integer_width: "Largeur entière", + width: "Largeur", + default_value: "Valeur par défaut", + value: "Valeur", + length: "Longueur", + values: "Valeurs", + type_enter: "Tapez et appuyez sur Entrée", + precision_def: "Nombre total de chiffres autorisés (avant + après la virgule).", + scale_def: "Nombre de chiffres autorisés après la virgule.", + time_default_value: { + no_value: "Aucune valeur", + custom: "Heure personnalisée", + now: "Maintenant" + }, + errors: { + max_length: "doit être un nombre positif sans décimales.", + integer_default_value: "Valeur par défaut invalide pour un entier", + precision: "La précision doit être un nombre positif sans décimales.", + scale: "L'échelle doit être un nombre positif sans décimales.", + scale_max_value: "L'échelle doit être ≤ à la précision." + }, + pick_value: "Choisir une valeur" }, delete: "Supprimer", - field_setting: "Paramètres du champ", - table_actions: "Actions sur le champ", + index_setting: "Paramètres de l'index", + table_actions: "Actions de table", actions: "Actions", - - field_note: "Note sur le champ", - delete_field: "Supprimer le champ", - - create_relationship: "Créer une Relation", - relationship_error: "Pour créer une relation, la primary key et la foreign key doivent être du même type.", - + delete_index: "Supprimer l'index", + index_name: "Nom de l'index", + create_relationship: "Créer une relation", + relationship_error: "Pour créer une relation, la clé primaire et la clé étrangère doivent être du même type.", invalid_relationship: { title: "Relation invalide", - description: "Le type de la source key ne correspond pas au type de la referenced key. Veuillez vous assurer que les deux clés ont le même type de données." + description: "Le type de la clé source ne correspond pas à celui de la clé référencée. Assurez-vous qu'elles aient le même type de données." + }, + circular_dependency: { + title: "Dépendance circulaire détectée", + toast_description: "Une référence circulaire entre les tables a été détectée. Vérifiez le diagramme à gauche et supprimez une des relations pour corriger cela.", + description: "Votre schéma contient une relation de clé étrangère circulaire entre les tables. Pour corriger cela,", + suggestion: "supprimez l’une des relations ci-dessous qui provoque le cycle.", + remove_relationship: "Supprimer la relation" } }, table: { - double_click: "Double-cliquez pour éditer", + double_click: "Double-cliquez pour modifier", overlapping_tables: "Tables qui se chevauchent", + show_more: "Afficher plus", + show_less: "Afficher moins" }, control_buttons: { - redo: "Refaire", + redo: "Rétablir", undo: "Annuler", zoom_in: "Zoom avant", zoom_out: "Zoom arrière", adjust_positions: "Ajuster les positions", - show_all: "Tout afficher" + show_all: "Afficher tout" }, menu: { file: "Fichier", @@ -84,21 +146,23 @@ export const fr = { import: "Importer", json: ".json", dbml: ".dbml", - mysql: "MySql", - postgresql: "Postgresql", - export_sql: "Exporter SQL", + mysql: "MySQL", + postgresql: "PostgreSQL", + export_sql: "Exporter en SQL", generic: "Générique", - export_orm_models: "Exporter les ORM Models", + export_orm_models: "Exporter les modèles ORM", delete_project: "Supprimer le projet", edit: "Éditer", undo: "Annuler", - redo: "Refaire", + redo: "Rétablir", clear: "Effacer", - view: "Affichage", + view: "Vue", hide_controller: "Masquer le contrôleur", - zoom_on_scroll: "Zoom au défilement", - on: "Activé", - off: "Désactivé", + show_controller: "Afficher le contrôleur", + cardinality_style: "Style de cardinalité", + hidden: "Caché", + numeric: "Numérique", + symbolic: "Symbolique", theme: "Thème", light: "Clair", dark: "Sombre", @@ -106,30 +170,83 @@ export const fr = { show_docs: "Afficher la documentation", join_discord: "Rejoindre Discord" }, - + modals: { + close: "Fermer", + create: "Créer", + pick_database: "Choisissez votre base de données.", + create_database_header: "Chaque base de données offre des fonctionnalités différentes.", + db_name: "Nom de la base de données", + db_name_error: "Veuillez saisir un nom de base de données", + continue: "Continuer", + open: "Ouvrir", + open_database: "Ouvrir une base de données", + open_database_header: "Ouvrez une base de données en sélectionnant une dans la liste.", + delete_database: "Supprimer la base de données", + delete_database_content: "Cette action est irréversible et supprimera définitivement le diagramme.", + delete: "Supprimer", + import_database: { + title: "Importer votre base de données", + import: "Importer", + import_options: "Souhaitez-vous importer en utilisant :", + import_error: "Erreur d’analyse SQL", + import_error_description: "Nous n'avons pas pu importer votre SQL car il contient une syntaxe invalide.", + import_warning: "Avertissement d’analyse SQL", + import_warning_description: "Certains éléments n'ont pas pu être traités à cause de déclarations non prises en charge ou incomplètes." + }, + export_sql: "Exporter en SQL", + export_sql_header: "Exporter votre diagramme de base de données en code SQL" + }, + clipboard: { + copy: "Copier", + copied: "Copié" + }, + connection_status: { + online: "En ligne", + offline: "Hors ligne", + saving: "Enregistrement...", + saved: "Enregistré", + last_synced: "Dernière synchronisation", + min_ago: "min auparavant", + hour_ago: "heure auparavant", + just_now: "À l’instant" + }, import: { instructions: "Instructions", install: "Installer", run_command: "Exécutez la commande suivante dans votre terminal.", example: "Exemple", - copy_code: "Copiez le contenu du fichier .sql dans la section de code ci-dessous.", + copy_code: "Copiez le contenu du fichier .sql dans la section code ci-dessous.", pg_admin: { step1: "Ouvrez Pg Admin.", - step2: "Faites un clic droit sur votre base de données et sélectionnez Sauvegarder dans le menu contextuel.", - step3: "Nommez votre fichier .sql, définissez le format sur Plain et choisissez Encodage : UTF8.", - step4: "Assurez-vous que Only schema est coché et que Only data ne l'est pas dans l'onglet Data Options.", - step5: "Cliquez sur Sauvegarder pour exporter le fichier, puis copiez son contenu dans la section de l'éditeur de code ci-dessous." + step2: "Faites un clic droit sur votre base de données et sélectionnez Sauvegarder.", + step3: "Nommez votre fichier .sql, définissez le format sur Simple, et choisissez Encodage : UTF8.", + step4: "Assurez-vous que Schéma uniquement est coché et que Données uniquement ne l'est pas dans l’onglet Options de données.", + step5: "Cliquez sur Sauvegarder pour exporter le fichier, puis copiez son contenu dans l’éditeur de code ci-dessous." }, workbench: { step1: "Ouvrez MySQL Workbench et connectez-vous à votre serveur MySQL.", - step2: "Dans le menu du haut, allez dans Server > Data Export.", - step3: "Dans les Options d'exportation, choisissez Dump Structure Only.", - step4: "Cochez Export to Self-Contained File, puis choisissez un emplacement et donnez un nom au fichier .sql de sortie.", - step5: "Cliquez sur Démarrer l'exportation pour lancer le processus. Ensuite, copiez son contenu dans la section de l'éditeur de code ci-dessous." + step2: "Dans le menu principal, allez à Serveur > Exportation de données.", + step3: "Dans les Options d’exportation, choisissez Exporter la structure uniquement.", + step4: "Cochez Exporter dans un fichier autonome, puis choisissez un emplacement et entrez un nom pour le fichier .sql.", + step5: "Cliquez sur Commencer l’exportation. Ensuite, copiez son contenu dans l’éditeur de code ci-dessous." + }, + heidisql: { + step1: "Ouvrez HeidiSQL et connectez-vous à votre serveur.", + step2: "Dans la barre latérale gauche, faites un clic droit sur la base de données à exporter.", + step3: "Choisissez Exporter la base de données en SQL.", + step4: "Sélectionnez Pas de données et assurez-vous que Créer est coché pour exporter uniquement la structure.", + step5: "Cliquez sur le bouton Exporter, puis copiez le contenu du fichier .sql dans l’éditeur de code ci-dessous." + }, + dbbrowser: { + step1: "Lancez DB Browser for SQLite.", + step2: "Cliquez sur Fichier > Ouvrir une base de données et sélectionnez votre fichier .sqlite ou .db.", + step3: "Allez à Fichier > Exporter > Base de données vers fichier SQL.", + step4: "Dans la fenêtre, sélectionnez Exporter uniquement le schéma et cliquez sur Enregistrer.", + step5: "Enfin, copiez le contenu du fichier .sql dans l’éditeur de code ci-dessous." } } } -}; +} export const frLanguage: Language = { name: "French", diff --git a/src/i18/languages/hi.ts b/src/i18/languages/hi.ts new file mode 100644 index 0000000..21defbb --- /dev/null +++ b/src/i18/languages/hi.ts @@ -0,0 +1,266 @@ +import { Language } from "../types"; + +export const hi = { + translation: { + sidebar: { + tables: "तालिकाएँ", + relationships: "रिलेशनशिप्स" + }, + + color_picker: { + default_color: "डिफ़ॉल्ट रंग" + }, + navbar: { + rename_db: "डेटाबेस का नाम बदलें", + search: "खोजें" + }, + db_controller: { + filter: "फ़िल्टर", + add_table: "तालिका जोड़ें", + add_field: "फ़ील्ड जोड़ें", + add_index: "इंडेक्स जोड़ें", + delete_table: "तालिका हटाएँ", + duplicate: "कॉपी करें", + add_relationship: "रिलेशनशिप जोड़ें", + show_code: "कोड दिखाएं", + fields: "फ़ील्ड्स", + indexes: "इंडेक्सेस", + note: "नोट", + name: "नाम", + type: "प्रकार", + nullable: "नल योग्य", + select_fields: "फ़ील्ड चुनें", + unique: "अद्वितीय", + table_note: "तालिका नोट", + collapse: "सभी को संक्षिप्त करें", + primary_key: "प्राथमिक कुंजी", + foreign_key: "विदेशी कुंजी", + + source_table: "स्रोत तालिका", + referenced_table: "संदर्भित तालिका", + + select_table: "तालिका चुनें", + select_field: "फ़ील्ड चुनें", + + empty_list: { + no_tables: "कोई तालिकाएँ नहीं", + no_tables_description: "शुरू करने के लिए एक तालिका बनाएं।", + + no_relationships: "कोई रिलेशनशिप्स नहीं", + no_relationships_description: "दो तालिकाओं को जोड़ने के लिए रिलेशनशिप बनाएं" + }, + + cardinality: { + name: "कार्डिनैलिटी", + one_to_one: "एक से एक", + one_to_many: "एक से अनेक", + many_to_one: "अनेक से एक", + many_to_many: "अनेक से अनेक" + }, + foreign_key_actions: { + title: "विदेशी कुंजी क्रियाएँ", + on_delete: "हटाने पर", + on_update: "अपडेट पर", + actions: { + no_action: "कोई क्रिया नहीं", + cascade: "कैस्केड", + set_null: "नल सेट करें", + set_default: "डिफ़ॉल्ट सेट करें", + restrict: "प्रतिबंधित करें" + } + }, + field_settings: { + title: "फ़ील्ड सेटिंग", + unique: "अद्वितीय", + unsigned: "असाइन किए बिना", + numeric_setting: "संख्यात्मक सेटिंग", + decimal_setting: "दशमलव सेटिंग", + zeroFill: "शून्य भरें", + autoIncrement: "स्वतः वृद्धि", + note: "नोट", + + delete_field: "फ़ील्ड हटाएं", + field_note: "फ़ील्ड नोट", + precision: "सटीकता", + text_setting: "टेक्स्ट सेटिंग", + charset: "अक्षरसेट", + collation: "कोलेशन", + scale: "स्केल", + max_length: "अधिकतम लंबाई", + integer_width: "पूर्णांक चौड़ाई", + width: "चौड़ाई", + default_value: "डिफ़ॉल्ट मान", + value: "मान", + length: "लंबाई", + values: "मान", + type_enter: "टाइप करें और एंटर दबाएं", + precision_def: "कुल अनुमत अंक (दशमलव से पहले और बाद)।", + scale_def: "दशमलव के बाद अनुमत अंक।", + time_default_value: { + no_value: "कोई मान नहीं", + custom: "कस्टम समय", + now: "अभी" + }, + errors: { + max_length: "सकारात्मक संख्या होनी चाहिए, दशमलव नहीं।", + integer_default_value: "पूर्णांक के लिए अमान्य डिफ़ॉल्ट मान", + precision: "सटीकता सकारात्मक संख्या होनी चाहिए, दशमलव नहीं।", + scale: "स्केल सकारात्मक संख्या होनी चाहिए, दशमलव नहीं।", + scale_max_value: "स्केल ≤ सटीकता होनी चाहिए।" + }, + pick_value: "मान चुनें" + }, + delete: "हटाएँ", + + index_setting: "इंडेक्स सेटिंग", + table_actions: "तालिका क्रियाएँ", + actions: "क्रियाएँ", + delete_index: "इंडेक्स हटाएं", + index_name: "इंडेक्स नाम", + create_relationship: "रिलेशनशिप बनाएं", + relationship_error: "रिलेशनशिप बनाने के लिए, प्राथमिक कुंजी और विदेशी कुंजी समान प्रकार की होनी चाहिए।", + + invalid_relationship: { + title: "अमान्य रिलेशनशिप", + description: "स्रोत कुंजी प्रकार संदर्भित कुंजी प्रकार से मेल नहीं खाता। कृपया सुनिश्चित करें कि दोनों कुंजी एक ही डेटा प्रकार की हों।" + }, + circular_dependency: { + title: "परिपत्र निर्भरता मिली", + toast_description: "तालिकाओं के बीच परिपत्र संदर्भ पाया गया। बाईं ओर के आरेख की जाँच करें और एक रिलेशनशिप हटाएं।", + description: "आपकी स्कीमा में तालिकाओं के बीच एक परिपत्र विदेशी कुंजी संबंध है। इसे ठीक करने के लिए", + suggestion: "नीचे दी गई चक्र उत्पन्न करने वाली रिलेशनशिप में से एक को हटाएं।", + remove_relationship: "रिलेशनशिप हटाएं" + } + }, + table: { + double_click: "संपादन के लिए डबल क्लिक करें", + overlapping_tables: "ओवरलैपिंग तालिकाएँ", + show_more: "और दिखाएं", + show_less: "कम दिखाएं" + }, + control_buttons: { + redo: "फिर से करें", + undo: "पूर्ववत करें", + zoom_in: "ज़ूम इन", + zoom_out: "ज़ूम आउट", + adjust_positions: "स्थिति समायोजित करें", + show_all: "सभी दिखाएं" + }, + menu: { + file: "फ़ाइल", + new: "नया", + open: "खोलें", + save: "सहेजें", + import: "आयात करें", + json: ".json", + dbml: ".dbml", + mysql: "MySQL", + postgresql: "PostgreSQL", + export_sql: "SQL निर्यात करें", + generic: "सामान्य", + export_orm_models: "ORM मॉडल निर्यात करें", + delete_project: "परियोजना हटाएं", + edit: "संपादित करें", + undo: "पूर्ववत करें", + redo: "फिर से करें", + clear: "साफ करें", + view: "दृश्य", + hide_controller: "कंट्रोलर छिपाएं", + show_controller: "कंट्रोलर दिखाएं", + cardinality_style: "कार्डिनैलिटी शैली", + hidden: "छिपा हुआ", + numeric: "संख्यात्मक", + symbolic: "प्रतीकात्मक", + theme: "थीम", + light: "हल्का", + dark: "गहरा", + help: "मदद", + show_docs: "दस्तावेज़ दिखाएं", + join_discord: "डिस्कॉर्ड से जुड़ें" + }, + + modals: { + close: "बंद करें", + create: "बनाएं", + pick_database: "अपना डेटाबेस चुनें।", + create_database_header: "हर डेटाबेस विशिष्ट विशेषताएं और कार्यक्षमता प्रदान करता है।", + db_name: "डेटाबेस का नाम", + db_name_error: "कृपया डेटाबेस का नाम प्रदान करें", + continue: "जारी रखें", + open: "खोलें", + open_database: "डेटाबेस खोलें", + open_database_header: "सूची में से एक डेटाबेस चुनकर खोलें।", + delete_database: "डेटाबेस हटाएं", + delete_database_content: "यह क्रिया अपरिवर्तनीय है और आरेख को स्थायी रूप से हटा देगी।", + delete: "हटाएँ", + + import_database: { + title: "अपना डेटाबेस आयात करें", + import: "आयात करें", + import_options: "क्या आप निम्न के माध्यम से आयात करना चाहेंगे:", + import_error: "SQL पार्सिंग त्रुटि", + import_error_description: "हम आपका SQL आयात नहीं कर सके क्योंकि इसमें अमान्य सिंटैक्स है।", + import_warning: "SQL पार्सिंग चेतावनी", + import_warning_description: "कुछ तत्वों को समर्थन न होने या अधूरे घोषणाओं के कारण संसाधित नहीं किया जा सका।" + }, + export_sql: "SQL निर्यात करें", + export_sql_header: "अपने डेटाबेस आरेख को SQL कोड में निर्यात करें" + }, + clipboard: { + copy: "कॉपी करें", + copied: "कॉपी किया गया" + }, + + connection_status: { + online: "ऑनलाइन", + offline: "ऑफ़लाइन", + saving: "सहेजा जा रहा है", + saved: "सहेजा गया", + last_synced: "अंतिम समन्वय", + min_ago: "मिनट पहले", + hour_ago: "घंटा पहले", + just_now: "अभी" + }, + import: { + instructions: "निर्देश", + install: "इंस्टॉल करें", + run_command: "अपने टर्मिनल में निम्न कमांड चलाएं।", + example: "उदाहरण", + copy_code: "नीचे दिए गए कोड सेक्शन में .sql फ़ाइल की सामग्री कॉपी करें।", + pg_admin: { + step1: "Pg Admin खोलें।", + step2: "अपने डेटाबेस पर राइट-क्लिक करें और Backup चुनें।", + step3: "अपनी .sql फ़ाइल को नाम दें, फॉर्मेट को Plain पर सेट करें और Encoding: UTF8 चुनें।", + step4: "Data Options टैब में सुनिश्चित करें कि Only schema चयनित है और Only data चयनित नहीं है।", + step5: "Backup पर क्लिक करें और फिर उसकी सामग्री को नीचे दिए गए कोड एडिटर में पेस्ट करें।" + }, + workbench: { + step1: "MySQL Workbench खोलें और अपने MySQL सर्वर से connect करें।", + step2: "शीर्ष मेनू में Server > Data Export पर जाएं।", + step3: "Export Options में Dump Structure Only चुनें।", + step4: "Export to Self-Contained File को चेक करें, स्थान और नाम चुनें।", + step5: "Start Export पर क्लिक करें और फिर फ़ाइल की सामग्री को नीचे दिए गए कोड एडिटर में कॉपी करें।" + }, + heidisql: { + step1: "HeidiSQL खोलें और अपने सर्वर से कनेक्ट करें।", + step2: "बाएं साइडबार में, उस डेटाबेस पर राइट-क्लिक करें जिसे आप निर्यात करना चाहते हैं।", + step3: "Export database as SQL चुनें।", + step4: "No data चुनें और सुनिश्चित करें कि Create चेक किया गया है।", + step5: "Export बटन पर क्लिक करें और फिर .sql फ़ाइल की सामग्री को नीचे कोड एडिटर में कॉपी करें।" + }, + dbbrowser: { + step1: "DB Browser for SQLite लॉन्च करें।", + step2: "File > Open Database पर क्लिक करें और अपनी .sqlite या .db फ़ाइल चुनें।", + step3: "शीर्ष मेनू से File > Export > Database to SQL file पर जाएं।", + step4: "डायलॉग में Export schema only चुनें और Save पर क्लिक करें।", + step5: "अंत में, .sql फ़ाइल की सामग्री को नीचे दिए गए code editor में कॉपी करें।" + } + } + } +}; + +export const hiLanguage: Language = { + name: "Hindi", + nativeName: "हिन्दी", + code: "hi", +}; diff --git a/src/i18/languages/pt.ts b/src/i18/languages/pt.ts new file mode 100644 index 0000000..35a6012 --- /dev/null +++ b/src/i18/languages/pt.ts @@ -0,0 +1,265 @@ +import { Language } from "../types"; + +export const pt = { + translation: { + sidebar: { + tables: "Tabelas", + relationships: "Relacionamentos" + }, + + color_picker: { + default_color: "Cor padrão" + }, + navbar: { + rename_db: "Renomear banco de dados", + search: "Pesquisar" + }, + db_controller: { + filter: "Filtrar", + add_table: "Adicionar Tabela", + add_field: "Adicionar Campo", + add_index: "Adicionar Índice", + delete_table: "Excluir Tabela", + duplicate: "Duplicar", + add_relationship: "Adicionar Relacionamento", + show_code: "Mostrar código", + fields: "Campos", + indexes: "Índices", + note: "Nota", + name: "Nome", + type: "Tipo", + nullable: "Aceita Nulo", + select_fields: "Selecionar campos", + unique: "Único", + table_note: "Nota da tabela", + collapse: "Recolher Tudo", + primary_key: "Chave Primária", + foreign_key: "Chave Estrangeira", + + source_table: "Tabela de Origem", + referenced_table: "Tabela Referenciada", + + select_table: "Selecionar tabela", + select_field: "Selecionar campo", + + empty_list: { + no_tables: "Nenhuma Tabela", + no_tables_description: "Crie uma tabela para começar.", + no_relationships: "Nenhum Relacionamento", + no_relationships_description: "Crie relacionamentos para conectar duas tabelas" + }, + + cardinality: { + name: "Cardinalidade", + one_to_one: "Um para Um", + one_to_many: "Um para Muitos", + many_to_one: "Muitos para Um", + many_to_many: "Muitos para Muitos" + }, + foreign_key_actions: { + title: "Ações da Chave Estrangeira", + on_delete: "Ao Excluir", + on_update: "Ao Atualizar", + actions: { + no_action: "Nenhuma Ação", + cascade: "Cascata", + set_null: "Definir como Nulo", + set_default: "Definir como Padrão", + restrict: "Restringir" + } + }, + field_settings: { + title: "Configuração de Campo", + unique: "Único", + unsigned: "Sem Sinal", + numeric_setting: "Configuração Numérica", + decimal_setting: "Configuração Decimal", + zeroFill: "Preencher com Zeros", + autoIncrement: "Auto Incremento", + note: "Nota", + + delete_field: "Excluir Campo", + field_note: "Nota do Campo", + precision: "Precisão", + text_setting: "Configuração de Texto", + charset: "Charset", + collation: "Colação", + scale: "Escala", + max_length: "Comprimento Máximo", + integer_width: "Largura do Inteiro", + width: "Largura", + default_value: "Valor Padrão", + value: "Valor", + length: "Comprimento", + values: "Valores", + type_enter: "Digite e pressione enter", + precision_def: "Dígitos totais permitidos (antes + depois do decimal).", + scale_def: "Dígitos permitidos após o decimal.", + time_default_value: { + no_value: "Sem valor", + custom: "Hora personalizada", + now: "Agora" + }, + errors: { + max_length: "deve ser um número positivo, sem decimais.", + integer_default_value: "Valor padrão inválido para Inteiro", + precision: "Precisão deve ser um número positivo, sem decimais.", + scale: "Escala deve ser um número positivo, sem decimais.", + scale_max_value: "A escala deve ser ≤ à precisão." + }, + pick_value: "Escolher valor" + }, + delete: "Excluir", + + index_setting: "Configuração de Índice", + table_actions: "Ações da Tabela", + actions: "Ações", + delete_index: "Excluir Índice", + index_name: "Nome do Índice", + create_relationship: "Criar Relacionamento", + relationship_error: "Para criar um relacionamento, a chave primária e a chave estrangeira devem ser do mesmo tipo.", + + invalid_relationship: { + title: "Relacionamento Inválido", + description: "O tipo da chave de origem não corresponde ao tipo da chave referenciada. Verifique se ambos têm o mesmo tipo de dado." + }, + circular_dependency: { + title: "Dependência Circular Detectada", + toast_description: "Foi encontrado um ciclo entre tabelas. Verifique o diagrama à esquerda e remova um dos relacionamentos para corrigir.", + description: "Seu esquema contém uma relação circular de chave estrangeira entre tabelas. Para corrigir,", + suggestion: "remova um dos relacionamentos listados abaixo que está causando o ciclo.", + remove_relationship: "Remover relacionamento" + } + }, + table: { + double_click: "Clique duas vezes para editar", + overlapping_tables: "Tabelas Sobrepostas", + show_more: "Mostrar mais", + show_less: "Mostrar menos" + }, + control_buttons: { + redo: "Refazer", + undo: "Desfazer", + zoom_in: "Aumentar Zoom", + zoom_out: "Diminuir Zoom", + adjust_positions: "Ajustar Posições", + show_all: "Mostrar tudo" + }, + menu: { + file: "Arquivo", + new: "Novo", + open: "Abrir", + save: "Salvar", + import: "Importar", + json: ".json", + dbml: ".dbml", + mysql: "MySQL", + postgresql: "PostgreSQL", + export_sql: "Exportar SQL", + generic: "Genérico", + export_orm_models: "Exportar Modelos ORM", + delete_project: "Excluir Projeto", + edit: "Editar", + undo: "Desfazer", + redo: "Refazer", + clear: "Limpar", + view: "Visualizar", + hide_controller: "Ocultar Controlador", + show_controller: "Mostrar Controlador", + cardinality_style: "Estilo de Cardinalidade", + hidden: "Oculto", + numeric: "Numérico", + symbolic: "Simbólico", + theme: "Tema", + light: "Claro", + dark: "Escuro", + help: "Ajuda", + show_docs: "Mostrar Documentação", + join_discord: "Entrar no Discord" + }, + + modals: { + close: "Fechar", + create: "Criar", + pick_database: "Escolha seu Banco de Dados.", + create_database_header: "Cada banco de dados oferece recursos e funcionalidades distintas.", + db_name: "Nome do Banco de Dados", + db_name_error: "Por favor, forneça um nome para o Banco de Dados", + continue: "Continuar", + open: "Abrir", + open_database: "Abrir Banco de Dados", + open_database_header: "Abra um banco de dados selecionando um da lista.", + delete_database: "Excluir Banco de Dados", + delete_database_content: "Esta ação é irreversível e removerá o diagrama permanentemente.", + delete: "Excluir", + + import_database: { + title: "Importar seu Banco de Dados", + import: "Importar", + import_options: "Gostaria de importar usando:", + import_error: "Erro de Análise SQL", + import_error_description: "Não foi possível importar seu SQL porque contém sintaxe inválida.", + import_warning: "Aviso de Análise SQL", + import_warning_description: "Alguns elementos não puderam ser processados devido a declarações não suportadas ou incompletas." + }, + export_sql: "Exportar SQL", + export_sql_header: "Exporte seu diagrama de banco de dados em código SQL" + }, + clipboard: { + copy: "Copiar", + copied: "Copiado" + }, + + connection_status: { + online: "Online", + offline: "Offline", + saving: "Salvando", + saved: "Salvo", + last_synced: "Última sincronização", + min_ago: "min atrás", + hour_ago: "hora atrás", + just_now: "Agora mesmo" + }, + import: { + instructions: "Instruções", + install: "Instalar", + run_command: "Execute o seguinte comando no seu terminal.", + example: "Exemplo", + copy_code: "Copie o conteúdo do arquivo .sql na seção de código abaixo.", + pg_admin: { + step1: "Abra o Pg Admin.", + step2: "Clique com o botão direito no seu banco de dados e selecione Backup.", + step3: "Dê um nome ao seu arquivo .sql, defina o formato como Plain e escolha Encoding: UTF8.", + step4: "Certifique-se de que Apenas esquema esteja marcado e Apenas dados esteja desmarcado na aba Opções de Dados.", + step5: "Clique em Backup para exportar o arquivo e depois copie seu conteúdo para o editor de código abaixo." + }, + workbench: { + step1: "Abra o MySQL Workbench e conecte-se ao seu servidor MySQL.", + step2: "No menu superior, vá para Servidor > Exportação de Dados.", + step3: "Nas Opções de Exportação, escolha Dump Structure Only.", + step4: "Marque Exportar para Arquivo Autônomo, escolha um local e nome para o arquivo .sql.", + step5: "Clique em Iniciar Exportação. Depois, copie o conteúdo para o editor de código abaixo." + }, + heidisql: { + step1: "Abra o HeidiSQL e conecte-se ao seu servidor.", + step2: "Na barra lateral esquerda, clique com o botão direito no banco de dados que deseja exportar.", + step3: "Escolha Exportar banco de dados como SQL.", + step4: "Selecione Sem dados e certifique-se de que Criar esteja marcado para exportar apenas a estrutura.", + step5: "Clique em Exportar e copie o conteúdo do arquivo .sql para o editor de código abaixo." + }, + dbbrowser: { + step1: "Inicie o DB Browser for SQLite.", + step2: "Clique em Arquivo > Abrir Banco de Dados e selecione seu arquivo .sqlite ou .db.", + step3: "Vá para Arquivo > Exportar > Banco de Dados para Arquivo SQL.", + step4: "Na janela de diálogo, escolha Exportar apenas o esquema e clique em Salvar.", + step5: "Finalmente, copie o conteúdo do arquivo .sql para o editor de código abaixo." + } + } + } +}; + +export const ptLanguage: Language = { + name: "Portuguese", + nativeName: "Português", + code: "pt", +}; diff --git a/src/i18/languages/ru.ts b/src/i18/languages/ru.ts new file mode 100644 index 0000000..516c6e4 --- /dev/null +++ b/src/i18/languages/ru.ts @@ -0,0 +1,255 @@ +import { Language } from "../types"; + +export const ru = { + translation: { + sidebar: { + tables: "Таблицы", + relationships: "Связи" + }, + color_picker: { + default_color: "Цвет по умолчанию" + }, + navbar: { + rename_db: "Переименовать базу данных", + search: "Поиск" + }, + db_controller: { + filter: "Фильтр", + add_table: "Добавить таблицу", + add_field: "Добавить поле", + add_index: "Добавить индекс", + delete_table: "Удалить таблицу", + duplicate: "Дублировать", + add_relationship: "Добавить связь", + show_code: "Показать код", + fields: "Поля", + indexes: "Индексы", + note: "Заметка", + name: "Имя", + type: "Тип", + nullable: "Допускает NULL", + select_fields: "Выберите поля", + unique: "Уникальный", + table_note: "Заметка к таблице", + collapse: "Свернуть все", + primary_key: "Первичный ключ", + foreign_key: "Внешний ключ", + source_table: "Исходная таблица", + referenced_table: "Связанная таблица", + select_table: "Выберите таблицу", + select_field: "Выберите поле", + empty_list: { + no_tables: "Нет таблиц", + no_tables_description: "Создайте таблицу, чтобы начать.", + no_relationships: "Нет связей", + no_relationships_description: "Создайте связи для соединения двух таблиц" + }, + cardinality: { + name: "Кардинальность", + one_to_one: "Один к одному", + one_to_many: "Один ко многим", + many_to_one: "Многие к одному", + many_to_many: "Многие ко многим" + }, + foreign_key_actions: { + title: "Действия внешнего ключа", + on_delete: "При удалении", + on_update: "При обновлении", + actions: { + no_action: "Без действия", + cascade: "Каскад", + set_null: "Установить NULL", + set_default: "Установить по умолчанию", + restrict: "Ограничить" + } + }, + field_settings: { + title: "Настройки поля", + unique: "Уникальный", + unsigned: "Без знака", + numeric_setting: "Числовые настройки", + decimal_setting: "Десятичные настройки", + zeroFill: "Дополнение нулями", + autoIncrement: "Автоинкремент", + note: "Заметка", + delete_field: "Удалить поле", + field_note: "Заметка к полю", + precision: "Точность", + text_setting: "Настройки текста", + charset: "Кодировка", + collation: "Сравнение", + scale: "Масштаб", + max_length: "Макс. длина", + integer_width: "Ширина целого числа", + width: "Ширина", + default_value: "Значение по умолчанию", + value: "Значение", + length: "Длина", + values: "Значения", + type_enter: "Введите и нажмите Enter", + precision_def: "Общее количество допустимых цифр (до и после запятой).", + scale_def: "Допустимое количество цифр после запятой.", + time_default_value: { + no_value: "Нет значения", + custom: "Произвольное время", + now: "Сейчас" + }, + errors: { + max_length: "должно быть положительным числом без десятичных.", + integer_default_value: "Недопустимое значение по умолчанию для целого", + precision: "Точность должна быть положительным числом без десятичных.", + scale: "Масштаб должен быть положительным числом без десятичных.", + scale_max_value: "Масштаб должен быть ≤ точности." + }, + pick_value: "Выберите значение" + }, + delete: "Удалить", + index_setting: "Настройки индекса", + table_actions: "Действия с таблицей", + actions: "Действия", + delete_index: "Удалить индекс", + index_name: "Имя индекса", + create_relationship: "Создать связь", + relationship_error: "Для создания связи типы первичного и внешнего ключа должны совпадать.", + invalid_relationship: { + title: "Недопустимая связь", + description: "Тип исходного ключа не совпадает с типом связанного ключа. Убедитесь, что оба ключа имеют одинаковый тип данных." + }, + circular_dependency: { + title: "Обнаружена циклическая зависимость", + toast_description: "Обнаружена циклическая ссылка между таблицами. Проверьте диаграмму слева и удалите одну из связей, чтобы исправить.", + description: "В вашей схеме есть циклическая связь между таблицами. Чтобы устранить её,", + suggestion: "удалите одну из перечисленных ниже связей, вызывающих цикл.", + remove_relationship: "Удалить связь" + } + }, + table: { + double_click: "Дважды щелкните для редактирования", + overlapping_tables: "Перекрывающиеся таблицы", + show_more: "Показать больше", + show_less: "Показать меньше" + }, + control_buttons: { + redo: "Повтор", + undo: "Отменить", + zoom_in: "Увеличить", + zoom_out: "Уменьшить", + adjust_positions: "Настроить позиции", + show_all: "Показать все" + }, + menu: { + file: "Файл", + new: "Новый", + open: "Открыть", + save: "Сохранить", + import: "Импорт", + json: ".json", + dbml: ".dbml", + mysql: "MySql", + postgresql: "PostgreSQL", + export_sql: "Экспорт SQL", + generic: "Общий", + export_orm_models: "Экспорт ORM моделей", + delete_project: "Удалить проект", + edit: "Редактировать", + undo: "Отменить", + redo: "Повторить", + clear: "Очистить", + view: "Вид", + hide_controller: "Скрыть панель управления", + show_controller: "Показать панель управления", + cardinality_style: "Стиль кардинальности", + hidden: "Скрытый", + numeric: "Числовой", + symbolic: "Символический", + theme: "Тема", + light: "Светлая", + dark: "Тёмная", + help: "Помощь", + show_docs: "Показать документацию", + join_discord: "Присоединиться к Discord" + }, + modals: { + close: "Закрыть", + create: "Создать", + pick_database: "Выберите вашу базу данных.", + create_database_header: "Каждая база данных предлагает уникальные функции и возможности.", + db_name: "Имя базы данных", + db_name_error: "Пожалуйста, укажите имя базы данных", + continue: "Продолжить", + open: "Открыть", + open_database: "Открыть базу данных", + open_database_header: "Откройте базу данных, выбрав одну из списка.", + delete_database: "Удалить базу данных", + delete_database_content: "Это действие необратимо и навсегда удалит диаграмму.", + delete: "Удалить", + import_database: { + title: "Импортируйте вашу базу данных", + import: "Импорт", + import_options: "Вы хотите импортировать с помощью:", + import_error: "Ошибка разбора SQL", + import_error_description: "Не удалось импортировать SQL, так как он содержит недопустимый синтаксис.", + import_warning: "Предупреждение разбора SQL", + import_warning_description: "Некоторые элементы не были обработаны из-за неподдерживаемых или неполных объявлений." + }, + export_sql: "Экспорт SQL", + export_sql_header: "Экспортируйте диаграмму базы данных в виде SQL-кода" + }, + clipboard: { + copy: "Копировать", + copied: "Скопировано" + }, + connection_status: { + online: "Онлайн", + offline: "Оффлайн", + saving: "Сохранение", + saved: "Сохранено", + last_synced: "Последняя синхронизация", + min_ago: "мин назад", + hour_ago: "час назад", + just_now: "Только что" + }, + import: { + instructions: "Инструкции", + install: "Установить", + run_command: "Выполните следующую команду в терминале.", + example: "Пример", + copy_code: "Скопируйте содержимое .sql файла в кодовую секцию ниже.", + pg_admin: { + step1: "Откройте Pg Admin.", + step2: "Щёлкните правой кнопкой мыши по базе данных и выберите Резервное копирование.", + step3: "Назовите файл .sql, выберите Формат: Обычный и Кодировка: UTF8.", + step4: "Убедитесь, что Только схема включена, а Только данные выключены.", + step5: "Нажмите Резервное копирование для экспорта, затем скопируйте содержимое в редактор кода ниже." + }, + workbench: { + step1: "Откройте MySQL Workbench и подключитесь к серверу.", + step2: "В верхнем меню перейдите в Сервер > Экспорт данных.", + step3: "Выберите Только структура в Настройках экспорта.", + step4: "Выберите Экспорт в автономный файл, укажите путь и имя файла .sql.", + step5: "Нажмите Начать экспорт, затем скопируйте содержимое в редактор кода ниже." + }, + heidisql: { + step1: "Откройте HeidiSQL и подключитесь к серверу.", + step2: "В левой панели щёлкните правой кнопкой по нужной базе.", + step3: "Выберите Экспортировать базу как SQL.", + step4: "Выберите Без данных, включите Создание для экспорта только структуры.", + step5: "Нажмите Экспорт и скопируйте содержимое файла .sql в редактор." + }, + dbbrowser: { + step1: "Запустите DB Browser for SQLite.", + step2: "Перейдите в Файл > Открыть базу данных и выберите .sqlite или .db файл.", + step3: "Выберите Файл > Экспорт > База данных в SQL файл.", + step4: "Выберите Экспортировать только схему и нажмите Сохранить.", + step5: "Скопируйте содержимое .sql файла в редактор ниже." + } + } + } +} + + +export const ruLanguage: Language = { + name: "Russian", + nativeName: "Русский", + code: "ru", +}; diff --git a/src/i18/languages/zh.ts b/src/i18/languages/zh.ts new file mode 100644 index 0000000..fb6292b --- /dev/null +++ b/src/i18/languages/zh.ts @@ -0,0 +1,272 @@ +import { Language } from "../types"; + +export const zh = { + translation: { + sidebar: { + tables: "数据表", + relationships: "关系" + }, + + color_picker: { + default_color: "默认颜色" + }, + navbar: { + rename_db: "重命名数据库", + search: "搜索" + }, + db_controller: { + filter: "筛选", + add_table: "添加表", + add_field: "添加字段", + add_index: "添加索引", + delete_table: "删除表", + duplicate: "复制", + add_relationship: "添加关系", + show_code: "显示代码", + fields: "字段", + indexes: "索引", + note: "备注", + name: "名称", + type: "类型", + nullable: "可为空", + select_fields: "选择字段", + unique: "唯一", + table_note: "表备注", + collapse: "全部折叠", + primary_key: "主键", + foreign_key: "外键", + + source_table: "源表", + referenced_table: "引用表", + + select_table: "选择表", + select_field: "选择字段", + + empty_list: { + no_tables: "暂无数据表", + no_tables_description: "创建一个表以开始。", + no_relationships: "暂无关系", + no_relationships_description: "创建关系以连接两个表" + }, + + cardinality: { + name: "基数", + one_to_one: "一对一", + one_to_many: "一对多", + many_to_one: "多对一", + many_to_many: "多对多" + }, + + foreign_key_actions: { + title: "外键操作", + on_delete: "删除时", + on_update: "更新时", + actions: { + no_action: "无操作", + cascade: "级联", + set_null: "设为 NULL", + set_default: "设为默认值", + restrict: "限制" + } + }, + + field_settings: { + title: "字段设置", + unique: "唯一", + unsigned: "无符号", + numeric_setting: "数值设置", + decimal_setting: "小数设置", + zeroFill: "零填充", + autoIncrement: "自动递增", + note: "备注", + delete_field: "删除字段", + field_note: "字段备注", + precision: "精度", + text_setting: "文本设置", + charset: "字符集", + collation: "排序规则", + scale: "小数位数", + max_length: "最大长度", + integer_width: "整数宽度", + width: "宽度", + default_value: "默认值", + value: "值", + length: "长度", + values: "值集合", + type_enter: "输入并按回车", + precision_def: "允许的总位数(小数点前+后)。", + scale_def: "小数点后的位数。", + time_default_value: { + no_value: "无值", + custom: "自定义时间", + now: "当前时间" + }, + errors: { + max_length: "必须为正整数,不能为小数。", + integer_default_value: "整数默认值无效", + precision: "精度必须为正整数,不能为小数。", + scale: "小数位数必须为正整数,不能为小数。", + scale_max_value: "小数位数必须小于等于精度值。" + }, + pick_value: "选择值" + }, + + delete: "删除", + index_setting: "索引设置", + table_actions: "表操作", + actions: "操作", + delete_index: "删除索引", + index_name: "索引名称", + create_relationship: "创建关系", + relationship_error: "要创建关系,主键和外键的数据类型必须相同。", + + invalid_relationship: { + title: "无效关系", + description: "源键类型与引用键类型不匹配,请确保两个键的数据类型一致。" + }, + + circular_dependency: { + title: "检测到循环依赖", + toast_description: "发现表之间存在循环引用。请检查左侧图表并移除其中一个关系以修复。", + description: "您的架构中存在表之间的循环外键关系。要修复它,", + suggestion: "请移除以下导致循环的关系之一。", + remove_relationship: "移除关系" + } + }, + + table: { + double_click: "双击进行编辑", + overlapping_tables: "表重叠", + show_more: "显示更多", + show_less: "显示更少" + }, + + control_buttons: { + redo: "重做", + undo: "撤销", + zoom_in: "放大", + zoom_out: "缩小", + adjust_positions: "调整位置", + show_all: "显示全部" + }, + + menu: { + file: "文件", + new: "新建", + open: "打开", + save: "保存", + import: "导入", + json: ".json", + dbml: ".dbml", + mysql: "MySql", + postgresql: "Postgresql", + export_sql: "导出 SQL", + generic: "通用", + export_orm_models: "导出 ORM 模型", + delete_project: "删除项目", + edit: "编辑", + undo: "撤销", + redo: "重做", + clear: "清除", + view: "视图", + hide_controller: "隐藏控制器", + show_controller: "显示控制器", + cardinality_style: "基数样式", + hidden: "隐藏", + numeric: "数值", + symbolic: "符号", + theme: "主题", + light: "浅色", + dark: "深色", + help: "帮助", + show_docs: "查看文档", + join_discord: "加入 Discord" + }, + + modals: { + close: "关闭", + create: "创建", + pick_database: "选择您的数据库。", + create_database_header: "每种数据库提供不同的功能与特性。", + db_name: "数据库名称", + db_name_error: "请输入数据库名称", + continue: "继续", + open: "打开", + open_database: "打开数据库", + open_database_header: "从列表中选择一个数据库进行打开。", + delete_database: "删除数据库", + delete_database_content: "该操作不可撤销,将永久删除该图表。", + delete: "删除", + + import_database: { + title: "导入数据库", + import: "导入", + import_options: "请选择导入方式:", + import_error: "SQL 解析错误", + import_error_description: "我们无法导入您的 SQL,因为它包含无效语法。", + import_warning: "SQL 解析警告", + import_warning_description: "由于不支持或不完整的声明,某些元素无法处理。" + }, + export_sql: "导出 SQL", + export_sql_header: "将您的数据库图导出为 SQL 代码" + }, + + clipboard: { + copy: "复制", + copied: "已复制" + }, + + connection_status: { + online: "在线", + offline: "离线", + saving: "保存中", + saved: "已保存", + last_synced: "上次同步", + min_ago: "分钟前", + hour_ago: "小时前", + just_now: "刚刚" + }, + + import: { + instructions: "说明", + install: "安装", + run_command: "在终端中运行以下命令。", + example: "示例", + copy_code: "将 .sql 文件的内容复制到下方代码区域。", + pg_admin: { + step1: "打开 Pg Admin。", + step2: "右键点击数据库并选择 备份。", + step3: "命名 .sql 文件,设置格式为 纯文本,编码为 UTF8。", + step4: "确保 仅结构 选中,仅数据 未选中。", + step5: "点击 备份 进行导出,然后将内容复制到下方代码编辑器。" + }, + workbench: { + step1: "打开 MySQL Workbench 并连接到服务器。", + step2: "顶部菜单选择 Server > 数据导出。", + step3: "在 导出选项 中选择 仅导出结构。", + step4: "勾选 导出为自包含文件,设置保存位置和文件名。", + step5: "点击 开始导出,然后复制 .sql 文件内容至代码编辑器。" + }, + heidisql: { + step1: "打开 HeidiSQL 并连接到服务器。", + step2: "在 左侧栏中右键 要导出的数据库。", + step3: "选择 导出为 SQL。", + step4: "选择 无数据,并勾选 创建 以仅导出结构。", + step5: "点击 导出,将 .sql 文件内容复制到下方代码编辑器中。" + }, + dbbrowser: { + step1: "启动 DB Browser for SQLite。", + step2: "点击 文件 > 打开数据库,选择您的 .sqlite.db 文件。", + step3: "顶部菜单选择 文件 > 导出 > 导出为 SQL 文件。", + step4: "选择 仅导出结构 并点击 保存。", + step5: "将 .sql 文件内容复制到下方 代码编辑器 中。" + } + } + } +}; + +export const zhLanguage: Language = { + name: "Chinese", + nativeName: "简体中文", + code: "zh", +}; diff --git a/src/pages/database/db-controller/relationship-controller/relationship-controller.tsx b/src/pages/database/db-controller/relationship-controller/relationship-controller.tsx index 1f7abe7..e68101e 100644 --- a/src/pages/database/db-controller/relationship-controller/relationship-controller.tsx +++ b/src/pages/database/db-controller/relationship-controller/relationship-controller.tsx @@ -27,7 +27,7 @@ const RelationshipController: React.FC = ({ }) => { const { open } = useModal(); - const { database, isSyncing } = useDatabase(); + const { database ,isLoading } = useDatabase(); const { relationships: allRelationships } = database || { relationships: [] }; const [relationships, setRelationships] = useState(allRelationships); @@ -169,7 +169,7 @@ const RelationshipController: React.FC = ({ }) => { { - !isSyncing && allRelationships.length == 0 && + !isLoading && allRelationships.length == 0 &&