From c44e67d80ce3b000568017c0df4e5a7f436cf4a9 Mon Sep 17 00:00:00 2001 From: akib22 Date: Wed, 8 Oct 2025 19:59:24 +0600 Subject: [PATCH 1/8] Add missing Bengali translations - ordered the translation keys same as en.js file to check the difference easily - improve word selection and sentence structure Issue: #627 --- src/i18n/locales/bn.js | 169 +++++++++++++++++++++++++---------------- 1 file changed, 104 insertions(+), 65 deletions(-) diff --git a/src/i18n/locales/bn.js b/src/i18n/locales/bn.js index 740f83384..468acb4b0 100644 --- a/src/i18n/locales/bn.js +++ b/src/i18n/locales/bn.js @@ -7,12 +7,17 @@ const bengali = { const bn = { translation: { report_bug: "বাগ রিপোর্ট করুন", - import_from: "ইম্পোর্ট করুন", import: "ইম্পোর্ট করুন", + inherits: "উত্তরাধিকার", + merging_column_w_inherited_definition: + "টেবিল '{{tableName}}'-এর '{{fieldName}}' কলাম উত্তরাধিকারসূত্রে একীভূত হবে", + import_from: "ইম্পোর্ট করুন", file: "ফাইল", new: "নতুন", new_window: "নতুন উইন্ডো", + no_saved_diagrams: "আপনার কোনো সেভ করা ডায়াগ্রাম নেই", open: "ওপেন করুন", + open_recent: "সাম্প্রতিক ফাইল খুলুন", save: "সেভ করুন", save_as: "নতুন নামে সেভ করুন", save_as_template: "টেমপ্লেট হিসাবে সেভ করুন", @@ -20,24 +25,23 @@ const bn = { rename: "নাম পরিবর্তন করুন", delete_diagram: "ডায়াগ্রাম ডিলিট করুন", are_you_sure_delete_diagram: - "আপনি কি এই ডায়াগ্রামটি মুছে ফেলতে চান? এই অপারেশনটি অপরিবর্তনীয়।", + "আপনি কি নিশ্চিত যে আপনি ডায়াগ্রাম মুছে ফেলবেন? একবার মুছে ফেললে আর ফেরত আনা যাবে না।", oops_smth_went_wrong: "ওহো! কিছু ভুল হয়েছে।", import_diagram: "ডায়াগ্রাম ইম্পোর্ট করুন", import_from_source: "SQL থেকে ইম্পোর্ট করুন", export_as: "রপ্তানি হিসাবে", - export_source: "SQL রপ্তানি করুন", + export_source: "SQL এক্সপোর্ট করুন", models: "মডেল", exit: "বেরিয়ে যান", edit: "এডিট করুন", undo: "পূর্বাবস্থা ফিরিয়ে নিন", redo: "পুনরায় করুন", clear: "মুছে ফেলুন", - are_you_sure_clear: - "আপনি কি ডায়াগ্রামটি মুছে ফেলতে চান? এটি অপরিবর্তনীয়।", + are_you_sure_clear: "আপনি কি নিশ্চিত যে আপনি ডায়াগ্রাম মুছে ফেলবেন? একবার মুছে ফেললে আর ফেরত আনা যাবে না।", cut: "কাট করুন", copy: "কপি করুন", paste: "পেস্ট করুন", - duplicate: "প্রতিলিপি করুন", + duplicate: "ডুপ্লিকেট করুন", delete: "মুছে ফেলুন", copy_as_image: "ছবি হিসাবে কপি করুন", view: "ভিউ", @@ -46,9 +50,11 @@ const bn = { issues: "সমস্যা", presentation_mode: "প্রেজেন্টেশন মোড", strict_mode: "স্ট্রিক্ট মোড", - field_details: "ক্ষেত্রের বিস্তারিত", + field_details: "ফিল্ডের বিবরণ", reset_view: "ভিউ রিসেট করুন", show_grid: "গ্রিড দেখান", + snap_to_grid: "গ্রিডে স্ন্যাপ করুন", + show_datatype: "ডেটা টাইপ দেখান", show_cardinality: "কার্ডিনালিটি দেখান", theme: "থিম", light: "লাইট", @@ -70,18 +76,17 @@ const bn = { table_width: "টেবিলের প্রস্থ", language: "ভাষা", flush_storage: "স্টোরেজ ফ্লাশ করুন", - are_you_sure_flush_storage: - "আপনি কি স্টোরেজ ফ্লাশ করতে চান? এটি আপনার সমস্ত ডায়াগ্রাম এবং কাস্টম টেমপ্লেটগুলি মুছে ফেলবে।", + are_you_sure_flush_storage: "আপনি কি নিশ্চিত যে আপনি স্টোরেজ ফ্লাশ করতে চান? এই পদক্ষেপের ফলে আপনার সকল ডায়াগ্রাম ও কাস্টম টেমপ্লেট স্থায়ীভাবে মুছে যাবে এবং আর ফিরে পাওয়া যাবে না।", storage_flushed: "স্টোরেজ ফ্লাশ হয়েছে", help: "সাহায্য", shortcuts: "শর্টকাট", ask_on_discord: "ডিসকর্ডে আমাদের জিজ্ঞাসা করুন", - feedback: "প্রতিক্রিয়া", + feedback: "ফিডব্যাক দিন", no_changes: "কোনও পরিবর্তন নেই", loading: "লোড হচ্ছে...", last_saved: "শেষ সেভ", saving: "সেভ হচ্ছে...", - failed_to_save: "সেভ ব্যর্থ হয়েছে", + failed_to_save: "সেভ করতে ব্যর্থ হয়েছে", fit_window_reset: "উইন্ডোতে ফিট করুন / রিসেট করুন", zoom: "জুম", add_table: "টেবিল যোগ করুন", @@ -90,38 +95,38 @@ const bn = { add_type: "টাইপ যোগ করুন", to_do: "টু-ডু", tables: "টেবিল", - relationships: "সম্পর্কগুলি", - subject_areas: "বিষয় এলাকা", + relationships: "রিলেশনশিপগুলি", + subject_areas: "সাবজেক্ট এরিয়া", notes: "নোট", - types: "প্রকার", + types: "টাইপ", search: "অনুসন্ধান করুন...", no_tables: "কোনও টেবিল নেই", no_tables_text: "আপনার ডায়াগ্রামটি তৈরি করা শুরু করুন!", - no_relationships: "কোনও সম্পর্ক নেই", - no_relationships_text: - "ক্ষেত্রগুলিকে সংযুক্ত করতে এবং সম্পর্ক গঠনের জন্য টানুন!", - no_subject_areas: "কোনও বিষয় এলাকা নেই", - no_subject_areas_text: "টেবিলগুলি গোষ্ঠীবদ্ধ করতে বিষয় এলাকা যোগ করুন!", + no_relationships: "কোনও রিলেশন নেই", + no_relationships_text: "ফিল্ডগুলো টেনে একে অপরের সঙ্গে সংযুক্ত করুন এবং রিলেশন তৈরি করুন!", + no_subject_areas: "কোনও সাবজেক্ট এরিয়া নেই", + no_subject_areas_text: "টেবিলগুলি গ্রুপ করতে সাবজেক্ট এরিয়া যোগ করুন!", no_notes: "কোনও নোট নেই", no_notes_text: "অতিরিক্ত তথ্য রেকর্ড করার জন্য নোট ব্যবহার করুন", - no_types: "কোনও প্রকার নেই", + no_types: "কোনও টাইপ নেই", no_types_text: "আপনার নিজস্ব কাস্টম ডেটা টাইপগুলি তৈরি করুন", - no_issues: "কোনও সমস্যা সনাক্ত করা হয়নি।", + no_issues: "কোনও সমস্যা সনাক্ত করা যায়নি।", strict_mode_is_on_no_issues: "স্ট্রিক্ট মোড বন্ধ রয়েছে, তাই কোনও সমস্যা প্রদর্শিত হবে না।", name: "নাম", - type: "প্রকার", + type: "টাইপ", null: "নাল", not_null: "নাল নয়", + nullable: "নালযোগ্য", primary: "প্রাথমিক", - unique: "অনন্য", - autoincrement: "স্বয়ংক্রিয় বৃদ্ধি", - default_value: "ডিফল্ট মান", + unique: "ইউনিক", + autoincrement: "অটোমেটিক বৃদ্ধি পাবে", + default_value: "ডিফল্ট ভ্যালু", check: "চেক এক্সপ্রেশন", this_will_appear_as_is: "*এটি তৈরি করা স্ক্রিপ্টে অপরিবর্তিত অবস্থায় প্রদর্শিত হবে।", comment: "মন্তব্য", - add_field: "ক্ষেত্র যোগ করুন", + add_field: "ফিল্ড যোগ করুন", values: "মান", size: "আকার", precision: "প্রেসিশন", @@ -129,33 +134,33 @@ const bn = { use_for_batch_input: "ব্যাচ ইনপুটের জন্য ব্যবহার করুন", indices: "ইনডিসেস", add_index: "ইনডেক্স যোগ করুন", - select_fields: "ক্ষেত্রগুলি নির্বাচন করুন", + select_fields: "ফিল্ড নির্বাচন করুন", title: "শিরোনাম", not_set: "সেট করা হয়নি", - foreign: "বৈদেশিক", + foreign: "ফরেন", cardinality: "কার্ডিনালিটি", on_update: "আপডেটের সময়", on_delete: "ডিলিটের সময়", swap: "সোয়াপ", - one_to_one: "এক থেকে এক", - one_to_many: "এক থেকে অনেক", - many_to_one: "অনেক থেকে এক", + one_to_one: "ওয়ান টু ওয়ান", + one_to_many: "ওয়ান টু ম্যানি", + many_to_one: "ম্যানি টু ওয়ান", content: "বিষয়বস্তু", types_info: "এই বৈশিষ্ট্যটি PostgreSQL-এর মত অবজেক্ট-রিলেশনাল DBMS-এর জন্য।\nযদি MySQL বা MariaDB এর জন্য ব্যবহার করা হয় তবে একটি JSON টাইপ তৈরি হবে সংশ্লিষ্ট json বৈধতা যাচাই সহ।\nযদি SQLite এর জন্য ব্যবহার করা হয় তবে এটি একটি BLOB এ অনুবাদ হবে।\nযদি MSSQL এর জন্য ব্যবহার করা হয় তবে প্রথম ক্ষেত্রের একটি টাইপ এলিয়াস তৈরি হবে।", table_deleted: "টেবিল মুছে ফেলা হয়েছে", area_deleted: "এরিয়া মুছে ফেলা হয়েছে", note_deleted: "নোট মুছে ফেলা হয়েছে", - relationship_deleted: "সম্পর্ক মুছে ফেলা হয়েছে", + relationship_deleted: "রিলেশন মুছে ফেলা হয়েছে", type_deleted: "টাইপ মুছে ফেলা হয়েছে", - cannot_connect: "সংযোগ করা যাচ্ছে না, কলামগুলির বিভিন্ন প্রকার আছে", + cannot_connect: "সংযোগ করা যাচ্ছে না, কলামগুলির টাইপ ভিন্ন", copied_to_clipboard: "ক্লিপবোর্ডে কপি করা হয়েছে", create_new_diagram: "নতুন ডায়াগ্রাম তৈরি করুন", cancel: "বাতিল করুন", open_diagram: "ডায়াগ্রাম ওপেন করুন", rename_diagram: "ডায়াগ্রামের নাম পরিবর্তন করুন", - export: "রপ্তানি করুন", - export_image: "ছবি রপ্তানি করুন", + export: "এক্সপোর্ট করুন", + export_image: "ছবি এক্সপোর্ট করুন", create: "তৈরি করুন", confirm: "নিশ্চিত করুন", last_modified: "শেষ সংশোধন", @@ -165,36 +170,36 @@ const bn = { "আপনার টেবিল এবং কলামগুলি স্বয়ংক্রিয়ভাবে তৈরি করতে একটি SQL ফাইল আপলোড করুন।", overwrite_existing_diagram: "বিদ্যমান ডায়াগ্রামটি ওভাররাইট করুন", only_mysql_supported: - "*এখন পর্যন্ত শুধুমাত্র MySQL স্ক্রিপ্ট লোডিং সমর্থিত।", + "*এখন পর্যন্ত শুধুমাত্র MySQL স্ক্রিপ্ট সাপোর্ট করে।", blank: "খালি", filename: "ফাইলের নাম", table_w_no_name: "নাম ছাড়াই একটি টেবিল ঘোষণা করা হয়েছে", - duplicate_table_by_name: "'{{tableName}}' নামকরণ করা টেবিলের অনুলিপি", - empty_field_name: "'{{tableName}}' টেবিলে ফাঁকা ক্ষেত্রের `name`", - empty_field_type: "'{{tableName}}' টেবিলে ফাঁকা ক্ষেত্রের `type`", + duplicate_table_by_name: "'{{tableName}}' নামের টেবিল ডুপ্লিকেট হয়েছে।", + empty_field_name: "টেবিল '{{tableName}}'-এ `name` ফিল্ডটি খালি আছে", + empty_field_type: "টেবিল '{{tableName}}'-এ `type` ফিল্ডটি খালি আছে", no_values_for_field: - "'{{tableName}}' টেবিলের '{{fieldName}}' ক্ষেত্রটি `{{type}}` প্রকারের, তবে কোনও মান নির্দিষ্ট করা হয়নি", + "টেবিল '{{tableName}}'-এর '{{fieldName}}' ফিল্ডটি `{{type}}` টাইপের, তবে কোনও ভ্যালু প্রদান করা হয়নি", default_doesnt_match_type: - "'{{tableName}}' টেবিলের '{{fieldName}}' ক্ষেত্রটির জন্য ডিফল্ট মান তার প্রকারের সাথে মেলে না", + "টেবিল '{{tableName}}'-এর '{{fieldName}}' ফিল্ডটির জন্য ডিফল্ট ভ্যালু তার টাইপের সাথে মেলে না", not_null_is_null: - "'{{tableName}}' টেবিলের '{{fieldName}}' ক্ষেত্রটি NOT NULL তবে ডিফল্ট NULL", + "টেবিল '{{tableName}}'-এর '{{fieldName}}' ফিল্ডটি NOT NULL তবে ডিফল্ট ভ্যালু NULL", duplicate_fields: - "'{{tableName}}' টেবিলের '{{fieldName}}' নামে ডুপ্লিকেট ক্ষেত্র", + "টেবিল '{{tableName}}'-এর '{{fieldName}}' নামে ডুপ্লিকেট ফিল্ড আছে", duplicate_index: - "'{{tableName}}' টেবিলের '{{indexName}}' নামে ডুপ্লিকেট ইনডেক্স", - empty_index: "'{{tableName}}' টেবিলের ইনডেক্স কোনও কলামকে ইনডেক্স করে না", - no_primary_key: "'{{tableName}}' টেবিলের কোনও প্রাথমিক কী নেই", - type_with_no_name: "নাম ছাড়াই একটি টাইপ ঘোষণা করা হয়েছে", + "টেবিল '{{tableName}}'-এর '{{indexName}}' নামে ডুপ্লিকেট ইনডেক্স আছে", + empty_index: "টেবিল '{{tableName}}'-এর ইনডেক্স কোনও কলামকে ইনডেক্স করে না", + no_primary_key: "টেবিল '{{tableName}}'-এর কোনও প্রাইমারি কী নেই", + type_with_no_name: "নাম ছাড়াই একটি টাইপ ডিক্লেয়ার করা হয়েছে", duplicate_types: "'{{typeName}}' নামকরণের সাথে ডুপ্লিকেট টাইপ", - type_w_no_fields: "ক্ষেত্র ছাড়াই '{{typeName}}' টাইপ ঘোষণা করা হয়েছে", - empty_type_field_name: "'{{typeName}}' টাইপের ফাঁকা ক্ষেত্রের `name`", - empty_type_field_type: "'{{typeName}}' টাইপের ফাঁকা ক্ষেত্রের `type`", + type_w_no_fields: "ফিল্ড ছাড়াই '{{typeName}}' টাইপ ডিক্লেয়ার করা হয়েছে", + empty_type_field_name: "টাইপ '{{typeName}}'-এ `name` ফিল্ডটি খালি আছে", + empty_type_field_type: "টাইপ '{{typeName}}'-এ `type` ফিল্ডটি খালি আছে", no_values_for_type_field: - "'{{typeName}}' টাইপের '{{fieldName}}' ক্ষেত্রটি `{{type}}` প্রকারের, তবে কোনও মান নির্দিষ্ট করা হয়নি", + "টাইপ '{{typeName}}'-এর '{{fieldName}}' ফিল্ডটি `{{type}}` টাইপের, তবে কোনও ভ্যালু প্রদান করা হয়নি", duplicate_type_fields: - "'{{typeName}}' টাইপের '{{fieldName}}' নামে ডুপ্লিকেট ক্ষেত্র", - duplicate_reference: "'{{refName}}' নামে ডুপ্লিকেট রেফারেন্স", - circular_dependency: "'{{refName}}' টেবিল জড়িত একটি চক্রাকার নির্ভরতা", + "টাইপ '{{typeName}}'-এর '{{fieldName}}' নামে ডুপ্লিকেট ফিল্ড আছে", + duplicate_reference: "'{{refName}}' নামে ডুপ্লিকেট রেফারেন্স আছে", + circular_dependency: "টেবিল '{{refName}}'-এ সার্কুলার ডিপেন্ডেন্সি তৈরি হয়েছে", timeline: "টাইমলাইন", priority: "অগ্রাধিকার", none: "কোনও নয়", @@ -210,28 +215,27 @@ const bn = { no_tasks: "আপনার এখনও কোনও কাজ নেই।", no_activity: "আপনার এখনও কোনও কার্যকলাপ নেই।", move_element: "{{name}} কে {{coords}} তে সরান", - edit_area: "{{extra}} এরিয়া {{areaName}} সম্পাদনা করুন", + edit_area: "{{extra}} এরিয়া {{areaName}} এডিট করুন", delete_area: "এরিয়া {{areaName}} মুছুন", - edit_note: "{{extra}} নোট {{noteTitle}} সম্পাদনা করুন", + edit_note: "{{extra}} নোট {{noteTitle}} এডিট করুন", delete_note: "নোট {{noteTitle}} মুছুন", - edit_table: "{{extra}} টেবিল {{tableName}} সম্পাদনা করুন", + edit_table: "{{extra}} টেবিল {{tableName}} এডিট করুন", delete_table: "টেবিল {{tableName}} মুছুন", - edit_type: "{{extra}} টাইপ {{typeName}} সম্পাদনা করুন", + edit_type: "{{extra}} টাইপ {{typeName}} এডিট করুন", delete_type: "টাইপ {{typeName}} মুছুন", - add_relationship: "সম্পর্ক যোগ করুন", - edit_relationship: "{{extra}} সম্পর্ক {{refName}} সম্পাদনা করুন", - delete_relationship: "সম্পর্ক {{refName}} মুছুন", + add_relationship: "রিলেশন যোগ করুন", + edit_relationship: "{{extra}} রিলেশন {{refName}} এডিট করুন", + delete_relationship: "রিলেশন {{refName}} মুছুন", not_found: "খুঁজে পাওয়া যায়নি", pick_db: "একটি ডাটাবেস নির্বাচন করুন", generic: "জেনেরিক", - generic_description: - "জেনেরিক ডায়াগ্রামগুলি যে কোনও SQL ফ্লেভারে রপ্তানি করা যেতে পারে তবে কয়েকটি ডেটা টাইপ সমর্থন করে।", + generic_description: "জেনেরিক ডায়াগ্রামগুলি যে কোনও SQL ফ্লেভারে এক্সপোর্ট করা যেতে পারে কিন্তু এতে অল্প কিছু ডেটা টাইপেরই সাপোর্ট আছে।", enums: "এনামস", add_enum: "এনাম যোগ করুন", - edit_enum: "{{extra}} এনাম {{enumName}} সম্পাদনা করুন", + edit_enum: "{{extra}} এনাম {{enumName}} এডিট করুন", delete_enum: "এনাম মুছুন", enum_w_no_name: "নাম ছাড়াই একটি এনাম পাওয়া গেছে", - enum_w_no_values: "কোনও মান ছাড়াই এনাম '{{enumName}}' পাওয়া গেছে", + enum_w_no_values: "কোনও ভ্যালু ছাড়াই এনাম '{{enumName}}' পাওয়া গেছে", duplicate_enums: "'{{enumName}}' নামে ডুপ্লিকেট এনামস", no_enums: "কোনও এনাম নেই", no_enums_text: "এখানে এনামগুলি সংজ্ঞায়িত করুন", @@ -240,6 +244,41 @@ const bn = { "'{{tableName}}' টেবিলে নাম ছাড়াই একটি ইনডেক্স ঘোষণা করা হয়েছে", didnt_find_diagram: "ওহো! ডায়াগ্রামটি পাওয়া যায়নি।", unsigned: "আনসাইন্ড", + share: "শেয়ার করুন", + unshare: "শেয়ার বন্ধ করুন", + copy_link: "লিংক কপি করুন", + readme: "README", + failed_to_load: "লোড করা যায়নি", + share_info: + "*এই লিঙ্ক শেয়ার করলে লাইভ রিয়েল-টাইম সহযোগিতা সৃষ্টি হবে না।", + show_relationship_labels: "রিলেশনশিপের লেবেল দেখান", + docs: "ডকুমেন্টেশন", + supported_types: "সমর্থিত ফাইল টাইপসমূহ:", + bulk_update: "বাল্ক আপডেট", + multiselect: "একাধিক নির্বাচন", + export_saved_data: "সেভ করা ডেটা এক্সপোর্ট করুন", + dbml_view: "DBML ভিউ", + tab_view: "ট্যাব ভিউ", + label: "লেবেল", + many_side_label: "Many(n) সাইড লেবেল", + version: "ভার্সন", + versions: "ভার্সনসমূহ", + no_saved_versions: "কোনো সেভ করা ভার্সন নেই", + record_version: "ভার্সন রেকর্ড করুন", + commited_at: "কমিট করা হয়েছে", + read_only: "রিড-অনলি", + continue: "চালিয়ে যান", + restore_version: "ভার্সন পুনরুদ্ধার করুন", + restore_warning: "অন্য ভার্সন লোড করলে যে কোনো পরিবর্তন ওভাররাইট হবে।", + return_to_current: "বর্তমান ডায়াগ্রামে ফিরে যান", + no_changes_to_record: "রেকর্ড করার জন্য কোনো পরিবর্তন নেই", + click_to_view: "দেখতে ক্লিক করুন", + load_more: "আরও লোড করুন", + clear_cache: "ক্যাশ পরিষ্কার করুন", + cache_cleared: "ক্যাশ পরিষ্কার করা হয়েছে", + failed_to_record_version: "ভার্সন রেকর্ড করতে ব্যর্থ হয়েছে", + failed_to_load_diagram: "ডায়াগ্রাম লোড করতে ব্যর্থ হয়েছে", + see_all: "সব দেখুন", }, }; From b2088c9efb5dddf9ca91c90b20472e5b9aa61b40 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Thu, 9 Oct 2025 21:22:12 +0400 Subject: [PATCH 2/8] Allow string ids for relationships in json import (#636) --- src/data/schemas.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/data/schemas.js b/src/data/schemas.js index bc95658d4..2b4e0e228 100644 --- a/src/data/schemas.js +++ b/src/data/schemas.js @@ -148,7 +148,7 @@ export const jsonSchema = { cardinality: { type: "string" }, updateConstraint: { type: "string" }, deleteConstraint: { type: "string" }, - id: { type: "integer" }, + id: { type: ["integer", "string"] }, }, required: [ "startTableId", From b7bd04ef06507a67830278ddb3551eef85f7ea8b Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Thu, 9 Oct 2025 22:26:23 +0400 Subject: [PATCH 3/8] Fix import and export failing on non string column defaults for oracle (#637) --- src/data/schemas.js | 10 +++++----- src/utils/issues.js | 13 +++++++++++-- src/utils/utils.js | 4 +++- 3 files changed, 19 insertions(+), 8 deletions(-) diff --git a/src/data/schemas.js b/src/data/schemas.js index 2b4e0e228..2c28a4b43 100644 --- a/src/data/schemas.js +++ b/src/data/schemas.js @@ -13,7 +13,7 @@ export const tableSchema = { id: { type: ["integer", "string"] }, name: { type: "string" }, type: { type: "string" }, - default: { type: "string" }, + default: { type: ["string", "number", "boolean"] }, check: { type: "string" }, primary: { type: "boolean" }, unique: { type: "boolean" }, @@ -55,10 +55,10 @@ export const tableSchema = { }, }, color: { type: "string", pattern: "^#[0-9a-fA-F]{6}$" }, - }, - inherits: { - type: "array", - items: { type: ["string"] }, + inherits: { + type: "array", + items: { type: ["string"] }, + }, }, required: ["id", "name", "x", "y", "fields", "comment", "indices", "color"], }; diff --git a/src/utils/issues.js b/src/utils/issues.js index 0553bb495..4ab0fcb4c 100644 --- a/src/utils/issues.js +++ b/src/utils/issues.js @@ -5,7 +5,12 @@ import { isFunction } from "./utils"; function checkDefault(field, database) { if (field.default === "") return true; if (isFunction(field.default)) return true; - if (!field.notNull && field.default.toLowerCase() === "null") return true; + if ( + !field.notNull && + typeof field === "string" && + field.default.toLowerCase() === "null" + ) + return true; if (!dbToTypes[database][field.type].checkDefault) return true; return dbToTypes[database][field.type].checkDefault(field); @@ -67,7 +72,11 @@ export function getIssues(diagram) { ); } - if (field.notNull && field.default.toLowerCase() === "null") { + if ( + field.notNull && + typeof field.default === "string" && + field.default.toLowerCase() === "null" + ) { issues.push( i18n.t("not_null_is_null", { tableName: table.name, diff --git a/src/utils/utils.js b/src/utils/utils.js index afc3b75d3..a9a1ddbb2 100644 --- a/src/utils/utils.js +++ b/src/utils/utils.js @@ -41,10 +41,12 @@ const keywords = [ "CURRENT_TIME", "CURRENT_TIMESTAMP", "LOCALTIME", - "LOCALTIMESTAMP" + "LOCALTIMESTAMP", ]; export function isKeyword(str) { + if (typeof str !== "string") return false; + return keywords.includes(str.toUpperCase()); } From 63d60467ca2931d590204cc583b0cb90b3a59f72 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Thu, 9 Oct 2025 22:45:43 +0400 Subject: [PATCH 4/8] Fix non-string defaults in dbml export --- src/utils/exportAs/dbml.js | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/exportAs/dbml.js b/src/utils/exportAs/dbml.js index 7123c2b78..3be6a8a6d 100644 --- a/src/utils/exportAs/dbml.js +++ b/src/utils/exportAs/dbml.js @@ -29,7 +29,11 @@ function parseDefaultDbml(field, database) { } function columnDefault(field, database) { - if (!field.default || field.default.trim() === "") { + if (!field.default) { + return ""; + } + + if (typeof field.default === "string" && !field.default.trim()) { return ""; } From 3fbecf6a7ff92bc2e076b56c3ce8d3dbc21dae7c Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Thu, 9 Oct 2025 23:11:34 +0400 Subject: [PATCH 5/8] Fix type self-referencing --- src/components/EditorSidePanel/TypesTab/TypeField.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/EditorSidePanel/TypesTab/TypeField.jsx b/src/components/EditorSidePanel/TypesTab/TypeField.jsx index f07be3558..588dab80a 100644 --- a/src/components/EditorSidePanel/TypesTab/TypeField.jsx +++ b/src/components/EditorSidePanel/TypesTab/TypeField.jsx @@ -78,7 +78,7 @@ export default function TypeField({ data, tid, fid }) { })), ...types .filter( - (type) => type.name.toLowerCase() !== data.name.toLowerCase(), + (type) => type.name.toLowerCase() !== types[tid].name.toLowerCase(), ) .map((type) => ({ label: type.name.toUpperCase(), From 9959f0baad384fe5876c4b00c60d13417579ee59 Mon Sep 17 00:00:00 2001 From: Aditya Karwa <152879478+AdityaK-github@users.noreply.github.com> Date: Fri, 10 Oct 2025 11:56:01 +0530 Subject: [PATCH 6/8] Add translations for thai (#639) * add translations for thai * Add Thai language to i18n support --------- Co-authored-by: Aditya Satish Karwa --- src/i18n/i18n.js | 3 + src/i18n/locales/th.js | 240 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 243 insertions(+) create mode 100644 src/i18n/locales/th.js diff --git a/src/i18n/i18n.js b/src/i18n/i18n.js index 8d5a588a7..7e79d2747 100644 --- a/src/i18n/i18n.js +++ b/src/i18n/i18n.js @@ -43,6 +43,7 @@ import { cz, czech } from "./locales/cz"; import { ml, malayalam } from "./locales/ml"; import { nl, dutch } from './locales/nl'; import { sd, sindhi } from './locales/sd'; +import { th, thai } from './locales/th'; export const languages = [ english, @@ -87,6 +88,7 @@ export const languages = [ malayalam, dutch, sindhi, + thai, ].sort((a, b) => a.name.localeCompare(b.name)); i18n @@ -141,6 +143,7 @@ i18n ml, nl, sd, + th, }, }); diff --git a/src/i18n/locales/th.js b/src/i18n/locales/th.js new file mode 100644 index 000000000..db90746cb --- /dev/null +++ b/src/i18n/locales/th.js @@ -0,0 +1,240 @@ +const thai = { + name: "Thai", + native_name: "ไทย", + code: "th", +}; + +const th = { + translation: { + report_bug: "รายงานข้อผิดพลาด", + import: "นำเข้า", + inherits: "สืบทอด", + merging_column_w_inherited_definition: + "คอลัมน์ '{{fieldName}}' ในตาราง '{{tableName}}' ที่มีคำนิยามสืบทอดจะถูกรวมเข้าด้วยกัน", + import_from: "นำเข้าจาก", + file: "ไฟล์", + new: "ใหม่", + new_window: "หน้าต่างใหม่", + no_saved_diagrams: "คุณยังไม่มีไดอะแกรมที่บันทึกไว้", + open: "เปิด", + open_recent: "เปิดล่าสุด", + save: "บันทึก", + save_as: "บันทึกเป็น", + save_as_template: "บันทึกเป็นเทมเพลต", + template_saved: "บันทึกเทมเพลตแล้ว!", + rename: "เปลี่ยนชื่อ", + delete_diagram: "ลบไดอะแกรม", + are_you_sure_delete_diagram: + "คุณแน่ใจหรือไม่ว่าต้องการลบไดอะแกรมนี้? การดำเนินการนี้ไม่สามารถย้อนกลับได้", + oops_smth_went_wrong: "โอ๊ะ! เกิดข้อผิดพลาดบางอย่าง", + import_diagram: "นำเข้าไดอะแกรม", + import_from_source: "นำเข้าจาก SQL", + export_as: "ส่งออกเป็น", + export_source: "ส่งออก SQL", + models: "โมเดล", + exit: "ออก", + edit: "แก้ไข", + undo: "เลิกทำ", + redo: "ทำซ้ำ", + clear: "ล้าง", + are_you_sure_clear: + "คุณแน่ใจหรือไม่ว่าต้องการล้างไดอะแกรม? สิ่งนี้ไม่สามารถย้อนกลับได้", + cut: "ตัด", + copy: "คัดลอก", + paste: "วาง", + duplicate: "ทำซ้ำ", + delete: "ลบ", + copy_as_image: "คัดลอกเป็นภาพ", + view: "มุมมอง", + header: "แถบเมนู", + sidebar: "แถบด้านข้าง", + issues: "ปัญหา", + presentation_mode: "โหมดนำเสนอ", + strict_mode: "โหมดเข้มงวด", + field_details: "รายละเอียดฟิลด์", + reset_view: "รีเซ็ตมุมมอง", + show_grid: "แสดงเส้นกริด", + snap_to_grid: "ยึดกับกริด", + show_datatype: "แสดงชนิดข้อมูล", + show_cardinality: "แสดงความสัมพันธ์", + theme: "ธีม", + light: "สว่าง", + dark: "มืด", + zoom_in: "ซูมเข้า", + zoom_out: "ซูมออก", + fullscreen: "เต็มจอ", + settings: "การตั้งค่า", + show_timeline: "แสดงเส้นเวลา", + autosave: "บันทึกอัตโนมัติ", + panning: "เลื่อนดู", + show_debug_coordinates: "แสดงพิกัดดีบัก", + transform: "แปลง", + viewbox: "กล่องมุมมอง", + cursor_coordinates: "พิกัดเคอร์เซอร์", + coordinate_space: "พื้นที่พิกัด", + coordinate_space_screen: "หน้าจอ", + coordinate_space_diagram: "ไดอะแกรม", + table_width: "ความกว้างของตาราง", + language: "ภาษา", + flush_storage: "ล้างข้อมูลเก็บ", + are_you_sure_flush_storage: + "คุณแน่ใจหรือไม่ว่าต้องการล้างที่เก็บข้อมูล? การดำเนินการนี้จะลบไดอะแกรมและเทมเพลตทั้งหมดอย่างถาวร", + storage_flushed: "ล้างข้อมูลแล้ว", + help: "ช่วยเหลือ", + shortcuts: "ทางลัด", + ask_on_discord: "ถามเราใน Discord", + feedback: "ข้อเสนอแนะ", + no_changes: "ไม่มีการเปลี่ยนแปลง", + loading: "กำลังโหลด...", + last_saved: "บันทึกล่าสุด", + saving: "กำลังบันทึก...", + failed_to_save: "บันทึกล้มเหลว", + fit_window_reset: "พอดีกับหน้าต่าง / รีเซ็ต", + zoom: "ซูม", + add_table: "เพิ่มตาราง", + add_area: "เพิ่มพื้นที่", + add_note: "เพิ่มบันทึก", + add_type: "เพิ่มชนิด", + to_do: "สิ่งที่ต้องทำ", + tables: "ตาราง", + relationships: "ความสัมพันธ์", + subject_areas: "พื้นที่หัวข้อ", + notes: "บันทึก", + types: "ชนิด", + search: "ค้นหา...", + no_tables: "ไม่มีตาราง", + no_tables_text: "เริ่มสร้างไดอะแกรมของคุณเลย!", + no_relationships: "ไม่มีความสัมพันธ์", + no_relationships_text: "ลากเพื่อเชื่อมฟิลด์และสร้างความสัมพันธ์!", + no_subject_areas: "ไม่มีพื้นที่หัวข้อ", + no_subject_areas_text: "เพิ่มพื้นที่หัวข้อเพื่อจัดกลุ่มตาราง!", + no_notes: "ไม่มีบันทึก", + no_notes_text: "ใช้บันทึกเพื่อเก็บข้อมูลเพิ่มเติม", + no_types: "ไม่มีชนิด", + no_types_text: "สร้างชนิดข้อมูลของคุณเอง", + no_issues: "ไม่พบปัญหา", + strict_mode_is_on_no_issues: + "โหมดเข้มงวดปิดอยู่ ดังนั้นจะไม่แสดงปัญหา", + name: "ชื่อ", + type: "ชนิด", + null: "ค่าว่าง", + not_null: "ไม่อนุญาตให้ว่าง", + nullable: "สามารถว่างได้", + primary: "คีย์หลัก", + unique: "ไม่ซ้ำ", + autoincrement: "เพิ่มอัตโนมัติ", + default_value: "ค่าเริ่มต้น", + check: "ตรวจสอบเงื่อนไข", + this_will_appear_as_is: "*สิ่งนี้จะปรากฏในสคริปต์ที่สร้างขึ้นตามเดิม", + comment: "หมายเหตุ", + add_field: "เพิ่มฟิลด์", + values: "ค่า", + size: "ขนาด", + precision: "ความละเอียด", + set_precision: "ตั้งความละเอียด: 'ขนาด, หลักทศนิยม'", + use_for_batch_input: "ใช้ , สำหรับการป้อนหลายค่า", + indices: "ดัชนี", + add_index: "เพิ่มดัชนี", + select_fields: "เลือกฟิลด์", + title: "ชื่อเรื่อง", + not_set: "ยังไม่ตั้งค่า", + foreign: "คีย์ต่างประเทศ", + cardinality: "คาร์ดินัลลิตี้", + on_update: "เมื่ออัปเดต", + on_delete: "เมื่อลบ", + swap: "สลับ", + one_to_one: "หนึ่งต่อหนึ่ง", + one_to_many: "หนึ่งต่อหลาย", + many_to_one: "หลายต่อหนึ่ง", + content: "เนื้อหา", + table_deleted: "ลบตารางแล้ว", + area_deleted: "ลบพื้นที่แล้ว", + note_deleted: "ลบบันทึกแล้ว", + relationship_deleted: "ลบความสัมพันธ์แล้ว", + type_deleted: "ลบชนิดแล้ว", + cannot_connect: "ไม่สามารถเชื่อมต่อได้ คอลัมน์มีชนิดข้อมูลต่างกัน", + copied_to_clipboard: "คัดลอกไปยังคลิปบอร์ดแล้ว", + create_new_diagram: "สร้างไดอะแกรมใหม่", + cancel: "ยกเลิก", + open_diagram: "เปิดไดอะแกรม", + rename_diagram: "เปลี่ยนชื่อไดอะแกรม", + export: "ส่งออก", + export_image: "ส่งออกเป็นภาพ", + create: "สร้าง", + confirm: "ยืนยัน", + last_modified: "แก้ไขล่าสุด", + drag_and_drop_files: "ลากและวางไฟล์ที่นี่ หรือคลิกเพื่ออัปโหลด", + upload_sql_to_generate_diagrams: + "อัปโหลดไฟล์ SQL เพื่อสร้างตารางและคอลัมน์อัตโนมัติ", + overwrite_existing_diagram: "เขียนทับไดอะแกรมที่มีอยู่", + only_mysql_supported: "*ขณะนี้รองรับเฉพาะสคริปต์ MySQL เท่านั้น", + blank: "ว่างเปล่า", + filename: "ชื่อไฟล์", + table_w_no_name: "ประกาศตารางโดยไม่มีชื่อ", + duplicate_table_by_name: "พบตารางชื่อซ้ำ '{{tableName}}'", + empty_field_name: "ฟิลด์ไม่มีชื่อในตาราง '{{tableName}}'", + empty_field_type: "ฟิลด์ไม่มีชนิดในตาราง '{{tableName}}'", + no_primary_key: "ตาราง '{{tableName}}' ไม่มีคีย์หลัก", + timeline: "เส้นเวลา", + priority: "ลำดับความสำคัญ", + none: "ไม่มี", + low: "ต่ำ", + medium: "ปานกลาง", + high: "สูง", + sort_by: "เรียงตาม", + my_order: "ตามลำดับของฉัน", + completed: "เสร็จสิ้น", + alphabetically: "ตามตัวอักษร", + add_task: "เพิ่มงาน", + details: "รายละเอียด", + no_tasks: "ยังไม่มีงานของคุณ", + no_activity: "ยังไม่มีกิจกรรม", + move_element: "ย้าย {{name}} ไปที่ {{coords}}", + delete_table: "ลบตาราง {{tableName}}", + edit_table: "{{extra}} แก้ไขตาราง {{tableName}}", + add_relationship: "เพิ่มความสัมพันธ์", + delete_relationship: "ลบความสัมพันธ์ {{refName}}", + not_found: "ไม่พบ", + pick_db: "เลือกฐานข้อมูล", + generic: "ทั่วไป", + enums: "อีนัม", + add_enum: "เพิ่มอีนัม", + no_enums: "ไม่มีอีนัม", + declare_array: "ประกาศอาเรย์", + unsigned: "ไม่ติดลบ", + share: "แชร์", + unshare: "ยกเลิกการแชร์", + copy_link: "คัดลอกลิงก์", + readme: "README", + failed_to_load: "โหลดไม่สำเร็จ ตรวจสอบว่าลิงก์ถูกต้อง", + show_relationship_labels: "แสดงป้ายชื่อความสัมพันธ์", + docs: "เอกสาร", + supported_types: "ประเภทไฟล์ที่รองรับ:", + bulk_update: "อัปเดตหลายรายการ", + multiselect: "เลือกหลายรายการ", + export_saved_data: "ส่งออกข้อมูลที่บันทึกไว้", + dbml_view: "มุมมอง DBML", + tab_view: "มุมมองแท็บ", + label: "ป้ายชื่อ", + version: "เวอร์ชัน", + versions: "เวอร์ชันทั้งหมด", + no_saved_versions: "ยังไม่มีเวอร์ชันที่บันทึกไว้", + record_version: "บันทึกเวอร์ชัน", + commited_at: "คอมมิตเมื่อ", + read_only: "อ่านอย่างเดียว", + continue: "ดำเนินการต่อ", + restore_version: "กู้คืนเวอร์ชัน", + restore_warning: "การโหลดเวอร์ชันอื่นจะเขียนทับการเปลี่ยนแปลงปัจจุบัน", + return_to_current: "กลับไปยังไดอะแกรมปัจจุบัน", + no_changes_to_record: "ไม่มีการเปลี่ยนแปลงที่จะบันทึก", + click_to_view: "คลิกเพื่อดู", + load_more: "โหลดเพิ่มเติม", + clear_cache: "ล้างแคช", + cache_cleared: "ล้างแคชแล้ว", + failed_to_record_version: "บันทึกเวอร์ชันล้มเหลว", + failed_to_load_diagram: "โหลดไดอะแกรมล้มเหลว", + see_all: "ดูทั้งหมด", + }, +}; + +export { th, thai }; From faf0e35a606c9b318b0d25fcad648d3103e2ab53 Mon Sep 17 00:00:00 2001 From: 1ilit <1ilit@proton.me> Date: Sat, 11 Oct 2025 00:26:04 +0400 Subject: [PATCH 7/8] Fix patch when gist gets deleted #641 (#643) --- src/api/gists.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/api/gists.js b/src/api/gists.js index 1b7d45b1d..e5f8c4f1c 100644 --- a/src/api/gists.js +++ b/src/api/gists.js @@ -18,12 +18,12 @@ export async function create(filename, content) { } export async function patch(gistId, filename, content) { - const { deleted } = await axios.patch(`${baseUrl}/gists/${gistId}`, { + const { data } = await axios.patch(`${baseUrl}/gists/${gistId}`, { filename, content, }); - return deleted; + return data.deleted; } export async function del(gistId) { From 7f0633e4e341a21f43474f74147198d042049713 Mon Sep 17 00:00:00 2001 From: akib22 Date: Sat, 11 Oct 2025 18:42:17 +0600 Subject: [PATCH 8/8] Fix translation message formatting in AreasContext Issue: #644 --- src/context/AreasContext.jsx | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/context/AreasContext.jsx b/src/context/AreasContext.jsx index 4e5670d1d..2e18c1c22 100644 --- a/src/context/AreasContext.jsx +++ b/src/context/AreasContext.jsx @@ -1,8 +1,8 @@ -import { createContext, useState } from "react"; -import { Action, ObjectType, defaultBlue } from "../data/constants"; -import { useUndoRedo, useTransform, useSelect } from "../hooks"; import { Toast } from "@douyinfe/semi-ui"; +import { createContext, useState } from "react"; import { useTranslation } from "react-i18next"; +import { Action, ObjectType, defaultBlue } from "../data/constants"; +import { useSelect, useTransform, useUndoRedo } from "../hooks"; export const AreasContext = createContext(null); @@ -59,7 +59,7 @@ export default function AreasContextProvider({ children }) { action: Action.DELETE, element: ObjectType.AREA, data: areas[id], - message: t("delete_area", areas[id].name), + message: t("delete_area", { areaName: areas[id].name }), }, ]); setRedoStack([]);