diff --git a/src/dashboard.py b/src/dashboard.py index 4256668..4ae3071 100644 --- a/src/dashboard.py +++ b/src/dashboard.py @@ -27,7 +27,7 @@ import threading from flask.json.provider import DefaultJSONProvider -DASHBOARD_VERSION = 'v4.1.3' +DASHBOARD_VERSION = 'v4.1.4' CONFIGURATION_PATH = os.getenv('CONFIGURATION_PATH', '.') DB_PATH = os.path.join(CONFIGURATION_PATH, 'db') if not os.path.isdir(DB_PATH): @@ -351,15 +351,13 @@ class PeerJobs: f"Peer {fp.id} from {c.Name} failed {job.Action}ed." ) else: - JobLogger.log(job.JobID, s["status"], + JobLogger.log(job.JobID,False, f"Somehow can't find this peer {job.Peer} from {c.Name} failed {job.Action}ed." ) - # needToDelete.append(job) else: - JobLogger.log(job.JobID, s["status"], + JobLogger.log(job.JobID, False, f"Somehow can't find this peer {job.Peer} from {job.Configuration} failed {job.Action}ed." ) - # needToDelete.append(job) for j in needToDelete: self.deleteJob(j) @@ -796,7 +794,7 @@ class WireguardConfiguration: for i in listOfPublicKeys: p = sqlSelect("SELECT * FROM '%s_restrict_access' WHERE id = ?" % self.Name, (i,)).fetchone() if p is not None: - sqlUpdate("INSERT INTO '%s' SELECT * FROM %s_restrict_access WHERE id = ?" + sqlUpdate("INSERT INTO '%s' SELECT * FROM '%s_restrict_access' WHERE id = ?" % (self.Name, self.Name,), (p['id'],)) sqlUpdate("DELETE FROM '%s_restrict_access' WHERE id = ?" % self.Name, (p['id'],)) @@ -830,7 +828,7 @@ class WireguardConfiguration: try: subprocess.check_output(f"wg set {self.Name} peer {pf.id} remove", shell=True, stderr=subprocess.STDOUT) - sqlUpdate("INSERT INTO '%s_restrict_access' SELECT * FROM %s WHERE id = ?" % + sqlUpdate("INSERT INTO '%s_restrict_access' SELECT * FROM '%s' WHERE id = ?" % (self.Name, self.Name,), (pf.id,)) sqlUpdate("UPDATE '%s_restrict_access' SET status = 'stopped' WHERE id = ?" % (self.Name,), (pf.id,)) @@ -1647,7 +1645,7 @@ def sqlSelect(statement: str, paramters: tuple = ()) -> sqlite3.Cursor: try: cursor = sqldb.cursor() return cursor.execute(statement, paramters) - except Exception as e: + except Exception as error: print("[WGDashboard] SQLite Error:" + str(error) + " | Statement: " + statement) return [] @@ -1661,7 +1659,7 @@ def sqlUpdate(statement: str, paramters: tuple = ()) -> sqlite3.Cursor: s = f'BEGIN TRANSACTION;{statement};END TRANSACTION;' cursor.execute(statement, paramters) sqldb.commit() - except Exception as e: + except Exception as error: print("[WGDashboard] SQLite Error:" + str(error) + " | Statement: " + statement) return [] diff --git a/src/static/app/package.json b/src/static/app/package.json index 16264f4..539c589 100644 --- a/src/static/app/package.json +++ b/src/static/app/package.json @@ -1,6 +1,6 @@ { "name": "app", - "version": "4.1.3", + "version": "4.1.4", "private": true, "type": "module", "scripts": { diff --git a/src/static/locale/active_languages.json b/src/static/locale/active_languages.json index 839f6c8..b7d1a8a 100644 --- a/src/static/locale/active_languages.json +++ b/src/static/locale/active_languages.json @@ -1,4 +1,9 @@ [ + { + "lang_id": "ar-sa", + "lang_name": "Arabic", + "lang_name_localized": "العربية" + }, { "lang_id": "cs", "lang_name": "Czech", @@ -29,6 +34,11 @@ "lang_name": "Italian", "lang_name_localized": "Italiano" }, + { + "lang_id": "ko", + "lang_name": "Korean", + "lang_name_localized": "한국어" + }, { "lang_id": "nl-nl", "lang_name": "Dutch", @@ -74,4 +84,4 @@ "lang_name": "Polish", "lang_name_localized": "Polski" } -] +] \ No newline at end of file diff --git a/src/static/locale/ar-sa.json b/src/static/locale/ar-sa.json new file mode 100644 index 0000000..0eddba1 --- /dev/null +++ b/src/static/locale/ar-sa.json @@ -0,0 +1,312 @@ +{ + "Welcome to": "مرحبا بك في ", + "Username": "اسم المستخدم", + "Password": "كلمة المرور", + "OTP from your authenticator": "كلمة المرور لمرة واحدة من المصادق الخاص بك", + "Sign In": "تسجيل الدخول", + "Signing In\\.\\.\\.": "جاري تسجيل الدخول ...", + "Access Remote Server": "الوصول الي الخادم البعيد", + "Server": "الخادم", + "Click": "انقر", + "Pinging...": " .جاري فحص الاتصال ...", + "to add your server": "لاضافة خادمك", + "Server List": "قائمة الخوادم", + "Sorry, your username or password is incorrect.": "عذرا ، اسم المستخدم او كلمة المرور غير صحيحة", + "Home": "الصفحة الرئيسية", + "Settings": "الإعدادات", + "Tools": "الادوات", + "Sign Out": "تسجيل الخروج", + "Checking for update...": "جاري تسجيل الخروج", + "You're on the latest version": "انت تستخدم احدث اصدار", + "WireGuard Configurations": "تكوينات WireGuard", + "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "ليس لديك أي تكوينات WireGuard بعد. يرجى التحقق من مجلد التكوين أو تغييره في الإعدادات. المجلد الافتراضي هو /etc/wireguard.", + "Configuration": "التكوين", + "Configurations": "التكوينات", + "Peers Default Settings": "إعدادات النظراء الافتراضية", + "Dashboard Theme": "سمة لوحة التحكم", + "Light": "فاتح", + "Dark": "داكن", + "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "سيتم تغيير هذا في كل الاعدادات وسيطبق على جميع رموز الاستجابة السريعة الخاصة بالنظراء وملفات التكوين.", + "WireGuard Configurations Settings": "إعدادات تكوينات WireGuard", + "Configurations Directory": "مسار التكوينات", + "Remember to remove / at the end of your path. e.g /etc/wireguard": "تذكر إزالة / في نهاية المسار الخاص بك. مثال: /etc/wireguard", + "WGDashboard Account Settings": "إعدادات حساب WGDashboard", + "Current Password": "كلمة المرور الحالية", + "New Password": "كلمة المرور الجديدة", + "Repeat New Password": "كرر كلمة المرور الجديدة", + "Update Password": "تحديث كلمة المرور", + "Multi-Factor Authentication \\(MFA\\)": "المصادقة متعددة العوامل (MFA)", + "Reset": "إعادة ضبط", + "Setup": "إعداد", + "API Keys": "مفاتيح API", + "API Key": "مفتاح API", + "Key": "مفتاح", + "Enabled": "مفعل", + "Disabled": "معطل", + "No WGDashboard API Key": "لا يوجد مفتاح API لـ WGDashboard", + "Expire At": "ينتهي في", + "Are you sure to delete this API key\\?": "هل انت متاكد ان تحذف هذا المفتاح للـAPI ", + "Create API Key": "إنشاء مفتاح API", + "When should this API Key expire\\?": "متي يجب ان ينتهي هذا المفتاح للـ API", + "Never Expire": "لا ينتهي أبدًا", + "Don't think that's a good idea": "لا أعتقد أن هذه فكرة جيدة", + "Creating\\.\\.\\.": "جاري الانشاء", + "Create": "إنشاء", + "Status": "الحالة", + "On": "مشغل", + "Off": "متوقف", + "Turning On\\.\\.\\.": "تشغيل", + "Turning Off\\.\\.\\.": "إيقاف", + "Address": "العنوان", + "Listen Port": "منفذ الاستماع", + "Public Key": "المفتاح العام", + "Connected Peers": "النظراء المتصلون", + "Total Usage": "الاستخدام الكلي", + "Total Received": "الإجمالي المستلم", + "Total Sent": "الإجمالي المرسل", + "Peers Data Usage": "استهلاك بيانات النظراء", + "Real Time Received Data Usage": "استهلاك البيانات المستلمة في الوقت الفعلي", + "Real Time Sent Data Usage": "استهلاك البيانات المرسلة في الوقت الفعلي", + "Peer": "نظير", + "Peers": "النظراء", + "Peer Settings": "إعدادات النظير", + "Download All": "تنزيل الكل", + "Search Peers\\.\\.\\.": "بحث في النظراء", + "Display": "عرض", + "Sort By": "فرز حسب", + "Refresh Interval": "فترة التحديث", + "Name": "الاسم", + "Allowed IPs": "عناوين IP المسموح بها", + "Restricted": "مقيد", + "(.*) Seconds": "$1 ثانية", + "(.*) Minutes": "$1 دقيقة", + "Configuration Settings": "إعدادات التكوين", + "Peer Jobs": "وظائف النظير", + "Active Jobs": "الوظائف النشطة", + "All Active Jobs": "جميع الوظائف النشطة", + "Logs": "السجلات", + "Private Key": "المفتاح الخاص", + "\\(Required for QR Code and Download\\)": " الزامي لرمز الاستجابة السريعة والتحميل", + "\\(Required\\)": "الزامي", + "Endpoint Allowed IPs": "عناوين IP المسموح بها لنقطة النهاية", + "DNS": "DNS", + "Optional Settings": "إعدادات اختيارية", + "Pre-Shared Key": "المفتاح المشترك مسبقًا", + "MTU": "MTU", + "Persistent Keepalive": "الاستمرار في الإبقاء على الاتصال", + "Reset Data Usage": "إعادة ضبط استهلاك البيانات", + "Total": "الإجمالي", + "Sent": "تم الإرسال", + "Received": "تم الاستلام", + "Revert": "إعادة", + "Save Peer": "حفظ النظير", + "QR Code": "رمز الاستجابة السريع", + "Schedule Jobs": "جدولة الوظائف", + "Job": "وظيفة", + "Job ID": "معرف الوظيفة", + "Unsaved Job": "وظيفة غير محفوظة", + "This peer does not have any job yet\\.": "هذا النظير ليس لدية وظيفة نشطة بعد", + "if": "إذا", + "is": "هو", + "then": "ثم", + "larger than": "أكبر من", + "Date": "التاريخ", + "Restrict Peer": "تقييد النظير", + "Delete Peer": "حذف النظير", + "Edit": "تعديل", + "Delete": "حذف", + "Deleting...": "جارٍ الحذف...", + "Cancel": "إلغاء", + "Save": "حفظ", + "No active job at the moment\\.": "لايوجد وظائف نشطة في الوقت الحالي", + "Jobs Logs": "سجلات الوظائف", + "Updated at": "تم التحديث في", + "Refresh": "تحديث", + "Filter": "تصفية", + "Success": "نجاح", + "Failed": "فشل", + "Log ID": "معرف السجل", + "Message": "رسالة", + "Share Peer": "مشاركة النظير", + "Currently the peer is not sharing": "النظير لا يشارك حاليًا", + "Sharing\\.\\.\\.": "جاري المشاركة", + "Start Sharing": "بدء المشاركة", + "Stop Sharing\\.\\.\\.": "جاري ايقاف المشاركة", + "Stop Sharing": "إيقاف المشاركة", + "Access Restricted": "الوصول مقيد", + "Restrict Access": "تقيد الوصول", + "Restricting\\.\\.\\.": "جاري التقيد ...", + "Allow Access": "السماح بالوصول", + "Allowing Access\\.\\.\\.": "جاري السماح بالوصول ...", + "Download \\& QR Code is not available due to no private key set for this peer": "التنزيل ورمز الاستجابة السريعة غير متاحين نظرًا لعدم تعيين مفتاح خاص لهذا القرين", + "Add Peers": "إضافة نظراء", + "Bulk Add": "إضافة بالجملة", + "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "عند إضافة الأقران بشكل جماعي، سيتم إنشاء اسم كل قرين تلقائيًا، وسيتم تخصيص عنوان IP المسموح به إلى عنوان IP التالي المتاح", + "How many peers you want to add\\?": "كم عدد النظراء التي تريد اضافتها", + "You can add up to (.*) peers": "يمكنك إضافة ما يصل إلى $1 نظير", + "Use your own Private and Public Key": "استخدم المفتاح الخاص والعام الخاص بك", + "Enter IP Address/CIDR": "أدخل عنوان IP/CIDR", + "IP Address/CIDR": "عنوان IP/CIDR", + "or": "أو", + "Pick Available IP": "اختر عنوان IP متاحًا", + "No available IP containing": "لا يوجد عنوان IP متاح يحتوي على", + "Add": "إضافة", + "Adding\\.\\.\\.": "جاري الاضافة", + "Failed to check available update": "فشل في التحقق من التحديث المتاح", + "Nice to meet you!": "تشرفت بلقائك!", + "Please fill in the following fields to finish setup": "يرجى ملء الحقول التالية لإكمال الإعداد", + "Create an account": "إنشاء حساب", + "Enter an username you like": "أدخل اسم مستخدم يعجبك", + "Enter a password": "أدخل كلمة مرور", + "\\(At least 8 characters and make sure is strong enough!\\)": "(يجب أن تكون 8 أحرف على الأقل وتأكد من قوتها!)", + "Confirm password": "تأكيد كلمة المرور", + "Next": "التالي", + "Saving\\.\\.\\.": "جارٍ الحفظ...", + "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1\\. يرجى مسح رمز الاستجابة السريعة التالي لإنشاء كلمة مرور لمرة واحدة (TOTP) باستخدام تطبيق المصادقة الذي تختاره", + "Or you can click the link below:": "أو يمكنك النقر على الرابط أدناه:", + "2\\. Enter the TOTP generated by your authenticator to verify": "2\\. أدخل كلمة المرور لمرة واحدة (TOTP) التي تم إنشاؤها بواسطة تطبيق المصادقة للتحقق", + "TOTP verified!": "تم التحقق من كلمة المرور لمرة واحدة (TOTP) بنجاح!", + "I don't need MFA": "لا أحتاج إلى المصادقة متعددة العوامل (MFA).", + "Complete": "اكتمل", + "(v[0-9.]{1,}) is now available for update!": "$1 متاح الآن للتحديث!", + "Current Version:": "الإصدار الحالي:", + "Oh no\\.\\.\\. This link is either expired or invalid\\.": "عذرًا... هذا الرابط إما منتهي الصلاحية أو غير صالح", + "Scan QR Code with the WireGuard App to add peer": "قم بمسح رمز الاستجابة السريعة باستخدام تطبيق WireGuard لإضافة قرين", + "or click the button below to download the ": "أو انقر على الزر أدناه لتحميل ", + " file": " الملف", + "FROM ": "من ", + "(.*) is on": "(.*) قيد التشغيل", + "(.*) is off": "(.*) متوقف", + "Allowed IPs is invalid": "عناوين IP المسموح بها غير صالحة", + "Peer created successfully": "تم إنشاء القرين بنجاح", + "Please fill in all required box": "يرجى ملء جميع الحقول المطلوبة", + "Please specify amount of peers you want to add": "يرجى تحديد عدد الأقران الذين ترغب في إضافتهم", + "No more available IP can assign": "لا توجد عناوين IP متاحة للتخصيص.", + "The maximum number of peers can add is (.*)": "الحد الأقصى لعدد الأقران الذين يمكن إضافتهم هو $1", + "Generating key pairs by bulk failed": "فشل إنشاء أزواج المفاتيح بشكل جماعي.", + "Failed to add peers in bulk": "فشل في إضافة الأقران بشكل جماعي.", + "This peer already exist": "هذا القرين موجود بالفعل.", + "This IP is not available: (.*)": "عنوان IP هذا غير متاح: $1", + "Configuration does not exist": "الإعداد غير موجود", + "Peer does not exist": "القرين غير موجود", + "Please provide a valid configuration name": "يرجى تقديم اسم إعداد صالح", + "Peer saved": "تم حفظ القرين.", + "Allowed IPs already taken by another peer": "عناوين IP المسموح بها مستخدمة بالفعل بواسطة قرين آخر", + "Endpoint Allowed IPs format is incorrect": "تنسيق عناوين IP المسموح بها للنقطة النهائية غير صحيح", + "DNS format is incorrect": "تنسيق DNS غير صحيح", + "MTU format is not correct": "تنسيق MTU غير صحيح", + "Persistent Keepalive format is not correct": "تنسيق الإبقاء النشط (Keepalive) غير صحيح", + "Private key does not match with the public key": "المفتاح الخاص لا يتطابق مع المفتاح العام", + "Update peer failed when updating Pre-Shared Key": "فشل تحديث القرين عند تحديث المفتاح المشترك مسبقًا", + "Update peer failed when updating Allowed IPs": "فشل تحديث القرين عند تحديث عناوين IP المسموح بها", + "Update peer failed when saving the configuration": "فشل تحديث القرين عند حفظ الإعداد", + "Peer data usage reset successfully": "تمت إعادة تعيين استخدام بيانات القرين بنجاح", + "Peer download started": "بدأ تنزيل القرين", + "Please specify one or more peers": "يرجى تحديد قرين واحد أو أكثر", + "Share link failed to create. Reason: (.*)": "فشل إنشاء رابط المشاركة. السبب: $1", + "Link expire date updated": "تم تحديث تاريخ انتهاء صلاحية الرابط.", + "Link expire date failed to update. Reason: (.*)": "فشل تحديث تاريخ انتهاء صلاحية الرابط. السبب: $1", + "Peer job saved": "تم حفظ وظيفة القرين", + "Please specify job": "يرجى تحديد الوظيفة.", + "Please specify peer and configuration": "يرجى تحديد القرين والإعداد", + "Peer job deleted": "تم حذف وظيفة القرين", + "API Keys function is successfully enabled": "تم تفعيل وظيفة مفاتيح API بنجاح", + "API Keys function is successfully disabled": "تم تعطيل وظيفة مفاتيح API بنجاح", + "API Keys function is failed to enable": "فشل تفعيل وظيفة مفاتيح API", + "API Keys function is failed to disable": "فشل تعطيل وظيفة مفاتيح API", + "WGDashboard API Keys function is disabled": "تم تعطيل وظيفة مفاتيح API في لوحة WGDashboard", + "WireGuard configuration path saved": "تم حفظ مسار إعداد WireGuard", + "API Key deleted": "تم حذف مفتاح API", + "API Key created": "تم إنشاء مفتاح API", + "Sign in session ended, please sign in again": "انتهت جلسة تسجيل الدخول، يرجى تسجيل الدخول مرة أخرى", + "Please specify an IP Address (v4/v6)": "يرجى تحديد عنوان IP (v4/v6)", + "Please provide ipAddress and count": "يرجى تقديم عنوان IP والعدد", + "Please provide ipAddress": "يرجى تقديم عنوان IP", + "Dashboard Language": "لغة لوحة التحكم", + "Dashboard language update failed": "فشل تحديث لغة لوحة التحكم", + "Peer Remote Endpoint": "النقطة الطرفية البعيدة للقرين", + "New Configuration": "إعداد جديد", + "Configuration Name": "اسم الإعداد", + "Configuration name is invalid. Possible reasons:": "اسم الإعداد غير صالح. الأسباب المحتملة:", + "Configuration name already exist\\.": "اسم الإعداد موجود بالفعل", + "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "يمكن أن يحتوي اسم الإعداد على 15 حرفًا فقط، بما في ذلك الحروف الكبيرة/الصغيرة، الأرقام، الشرطة السفلية، علامة التساوي، علامة الزائد، النقطة والشرطة", + "Invalid Port": "المنفذ غير صالح", + "Save Configuration": "حفظ الإعداد", + "IP Address/CIDR is invalid": "عنوان IP/CIDR غير صالح", + "IP Address": "عنوان IP", + "Enter IP Address / Hostname": "أدخل عنوان IP / اسم المضيف", + "IP Address / Hostname": "عنوان IP / اسم المضيف", + "Dashboard IP Address \\& Listen Port": "عنوان IP لوحة التحكم ومنفذ الاستماع", + "Count": "العدد", + "Geolocation": "الموقع الجغرافي", + "Is Alive": "نشط", + "Average / Min / Max Round Trip Time": "متوسط / أدنى / أقصى وقت للرحلة الكاملة", + "Sent / Received / Lost Package": "الحزم المرسلة / المستلمة / المفقودة", + "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "يتطلب إعادة تشغيل يدوي للوحة WGDashboard لتطبيق التغييرات على عنوان IP ومنفذ الاستماع", + "Restore Configuration": "استعادة الإعداد", + "Step (.*)": "الخطوة $1", + "Select a backup you want to restore": "حدد النسخة الاحتياطية التي تريد استعادتها", + "Click to change a backup": "انقر لتغيير النسخة الاحتياطية", + "Selected Backup": "النسخة الاحتياطية المحددة", + "You don't have any configuration to restore": "ليس لديك أي إعداد لاستعادته", + "Help": "مساعدة", + "Backup": "نسخة احتياطية", + "([0-9].*) Backups?": "$1 نسخة احتياطية؟", + "Yes": "نعم", + "No": "لا", + "Backup not selected": "لم يتم تحديد النسخة الاحتياطية", + "Confirm \\& edit restore information": "تأكيد وتحرير معلومات الاستعادة", + "(.*) Available IP Address": "عنوان IP متاح $1", + "Database File": "ملف قاعدة البيانات", + "Contain": "يحتوي على", + "Restricted Peers?": "الأقران المقيدون؟", + "Restore": "استعادة", + "Restoring": "جاري الاستعادة", + "WGDashboard Settings": "إعدادات WGDashboard", + "Peers Settings": "إعدادات الأقران", + "WireGuard Configuration Settings": "إعدادات تكوين WireGuard", + "Appearance": "المظهر", + "Theme": "السمة", + "Language": "اللغة", + "Account Settings": "إعدادات الحساب", + "Peer Default Settings": "الإعدادات الافتراضية للأقران", + "Toggle When Start Up": "التبديل عند بدء التشغيل", + "Other Settings": "إعدادات أخرى", + "Select Peers": "اختر الأقران", + "Backup & Restore": "النسخ الاحتياطي والاستعادة", + "Delete Configuration": "حذف الإعداد", + "Create Backup": "إنشاء نسخة احتياطية", + "No backup yet, click the button above to create backup\\.": "لا توجد نسخة احتياطية حتى الآن، انقر على الزر أعلاه لإنشاء نسخة احتياطية", + "Are you sure to delete this backup\\?": "هل أنت متأكد من حذف هذه النسخة الاحتياطية؟", + "Are you sure to restore this backup?\\": "هل أنت متأكد من استعادة هذه النسخة الاحتياطية؟", + "Backup Date": "تاريخ النسخة الاحتياطية", + "File": "الملف", + "Are you sure to delete this configuration\\?": "هل أنت متأكد من حذف هذا الإعداد؟", + "Once you deleted this configuration\\:": "بمجرد حذف هذا الإعداد:", + "All connected peers will get disconnected": "سيتم فصل جميع الأقران المتصلين", + "Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "سيتم حذف كل من ملف التكوين (.conf) وجدول قاعدة البيانات المرتبط بهذا التكوين", + "Checking backups...": "جارٍ التحقق من النسخ الاحتياطية...", + "This configuration have ([0-9].*) backups": "يحتوي هذا التكوين على $1 نسخة احتياطية", + "This configuration have no backup": "لا يحتوي هذا التكوين على نسخ احتياطية", + "If you're sure, please type in the configuration name below and click Delete": "إذا كنت متأكدًا، يرجى كتابة اسم الإعداد أدناه والنقر على حذف", + "Select All": "تحديد الكل", + "Clear Selection": "مسح التحديد", + "([0-9].*) Peers?": "$1 قرين؟", + "Downloading": "جاري التنزيل", + "Download Finished": "اكتمل التنزيل", + "Done": "تم", + "Are you sure to delete": "هل أنت متأكد من الحذف", + "Are you sure to delete this peer\\?": "هل أنت متأكد من حذف هذا القرين؟", + "Configuration deleted": "تم حذف الإعداد", + "Configuration saved": "تم حفظ الإعداد", + "WGDashboard language update failed": "فشل تحديث لغة لوحة WGDashboard", + "Configuration restored": "تم استعادة الإعداد", + "Allowed IP already taken by another peer": "عنوان IP المسموح به مستخدم بالفعل بواسطة قرين آخر", + "Failed to allow access of peer (.*)": "فشل السماح بوصول القرين $1", + "Failed to save configuration through WireGuard": "فشل حفظ الإعداد من خلال WireGuard", + "Allow access successfully": "تم السماح بالوصول بنجاح", + "Deleted ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين)", + "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "تم حذف $1 قرين(قرين) بنجاح. فشل في حذف $2 قرين(قرين)", + "Restricted ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين).", + "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "تم تقييد $1 قرين(قرين) بنجاح. فشل في تقييد $2 قرين(قرين)." +} \ No newline at end of file diff --git a/src/static/locale/cs.json b/src/static/locale/cs.json index 11c352e..a068d56 100644 --- a/src/static/locale/cs.json +++ b/src/static/locale/cs.json @@ -308,5 +308,5 @@ "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "Při hromadném importu bude jméno každého peera vygenerované automaticky, a povolená IP adresa bude nastavena na další v pořadí", "How many peers you want to add\\?": "Kolik peerů chcete přidat?", "Adding\\.\\.\\.": "Přidávám...", - "Dashboard IP Address \\& Listen Port": "" -} \ No newline at end of file + "Dashboard IP Address \\& Listen Port": "Dashboard IP adresa a otevřený port" +} diff --git a/src/static/locale/ko.json b/src/static/locale/ko.json new file mode 100644 index 0000000..bbbbb1d --- /dev/null +++ b/src/static/locale/ko.json @@ -0,0 +1,312 @@ +{ + "Welcome to": "환영합니다", + "Username": "사용자 이름", + "Password": "비밀번호", + "OTP from your authenticator": "인증기에서 생성된 OTP", + "Sign In": "로그인", + "Signing In\\.\\.\\.": "로그인하는 중...", + "Access Remote Server": "원격 서버 접속", + "Server": "서버", + "Click": "클릭", + "Pinging...": "핑 테스트 중...", + "to add your server": "서버를 추가하려면", + "Server List": "서버 목록", + "Sorry, your username or password is incorrect.": "죄송합니다. 사용자 이름 또는 비밀번호가 올바르지 않습니다.", + "Home": "홈", + "Settings": "설정", + "Tools": "도구", + "Sign Out": "로그아웃", + "Checking for update...": "업데이트 확인 중...", + "You're on the latest version": "최신 버전을 사용 중입니다", + "WireGuard Configurations": "WireGuard 구성", + "You don't have any WireGuard configurations yet. Please check the configuration folder or change it in Settings. By default the folder is /etc/wireguard.": "아직 WireGuard 구성이 없습니다. 구성 폴더를 확인하거나 설정에서 변경하세요. 기본 폴더는 /etc/wireguard 입니다.", + "Configuration": "구성", + "Configurations": "구성들", + "Peers Default Settings": "기본 피어 설정", + "Dashboard Theme": "대시보드 테마", + "Light": "밝은 테마", + "Dark": "어두운 테마", + "This will be changed globally, and will be apply to all peer's QR code and configuration file.": "이 설정은 전역적으로 변경되며, 모든 피어의 QR 코드 및 구성 파일에 적용됩니다.", + "WireGuard Configurations Settings": "WireGuard 구성 설정", + "Configurations Directory": "구성 디렉토리", + "Remember to remove / at the end of your path. e.g /etc/wireguard": "경로 끝의 '/'를 제거하세요. 예: /etc/wireguard", + "WGDashboard Account Settings": "WGDashboard 계정 설정", + "Current Password": "현재 비밀번호", + "New Password": "새 비밀번호", + "Repeat New Password": "새 비밀번호 확인", + "Update Password": "비밀번호 변경", + "Multi-Factor Authentication \\(MFA\\)": "다중 인증 (MFA)", + "Reset": "재설정", + "Setup": "설정", + "API Keys": "API 키", + "API Key": "API 키", + "Key": "키", + "Enabled": "활성화됨", + "Disabled": "비활성화됨", + "No WGDashboard API Key": "WGDashboard API 키가 없습니다", + "Expire At": "만료일", + "Are you sure to delete this API key\\?": "이 API 키를 삭제하시겠습니까?", + "Create API Key": "API 키 생성", + "When should this API Key expire\\?": "이 API 키는 언제 만료되나요?", + "Never Expire": "만료 없음", + "Don't think that's a good idea": "별로 좋은 생각이 아닌 것 같습니다", + "Creating\\.\\.\\.": "생성 중...", + "Create": "생성", + "Status": "상태", + "On": "켜짐", + "Off": "꺼짐", + "Turning On\\.\\.\\.": "켜는 중...", + "Turning Off\\.\\.\\.": "끄는 중...", + "Address": "주소", + "Listen Port": "수신 포트", + "Public Key": "공개 키", + "Connected Peers": "연결된 피어", + "Total Usage": "총 사용량", + "Total Received": "총 수신량", + "Total Sent": "총 송신량", + "Peers Data Usage": "피어 데이터 사용량", + "Real Time Received Data Usage": "실시간 수신 데이터 사용량", + "Real Time Sent Data Usage": "실시간 송신 데이터 사용량", + "Peer": "피어", + "Peers": "피어들", + "Peer Settings": "피어 설정", + "Download All": "전체 다운로드", + "Search Peers\\.\\.\\.": "피어 검색...", + "Display": "표시", + "Sort By": "정렬 기준", + "Refresh Interval": "새로고침 간격", + "Name": "이름", + "Allowed IPs": "허용된 IP", + "Restricted": "제한됨", + "(.*) Seconds": "$1 초", + "(.*) Minutes": "$1 분", + "Configuration Settings": "구성 설정", + "Peer Jobs": "피어 작업", + "Active Jobs": "활성 작업", + "All Active Jobs": "모든 활성 작업", + "Logs": "로그", + "Private Key": "개인 키", + "\\(Required for QR Code and Download\\)": "(QR 코드 및 다운로드에 필요)", + "\\(Required\\)": "(필수)", + "Endpoint Allowed IPs": "엔드포인트 허용된 IP", + "DNS": "DNS", + "Optional Settings": "선택적 설정", + "Pre-Shared Key": "사전 공유 키", + "MTU": "MTU", + "Persistent Keepalive": "Keepalive 지속 유지", + "Reset Data Usage": "데이터 사용량 초기화", + "Total": "총합", + "Sent": "전송됨", + "Received": "수신됨", + "Revert": "되돌리기", + "Save Peer": "피어 저장", + "QR Code": "QR 코드", + "Schedule Jobs": "작업 예약", + "Job": "작업", + "Job ID": "작업 ID", + "Unsaved Job": "저장되지 않은 작업", + "This peer does not have any job yet\\.": "이 피어에는 아직 작업이 없습니다.", + "if": "만약", + "is": "이다", + "then": "그러면", + "larger than": "보다 큼", + "Date": "날짜", + "Restrict Peer": "피어 제한", + "Delete Peer": "피어 삭제", + "Edit": "수정", + "Delete": "삭제", + "Deleting...": "삭제 중...", + "Cancel": "취소", + "Save": "저장", + "No active job at the moment\\.": "현재 활성 작업이 없습니다.", + "Jobs Logs": "작업 로그", + "Updated at": "업데이트된 날짜", + "Refresh": "새로고침", + "Filter": "필터", + "Success": "성공", + "Failed": "실패", + "Log ID": "로그 ID", + "Message": "메시지", + "Share Peer": "피어 공유", + "Currently the peer is not sharing": "현재 이 피어는 공유 중이 아닙니다", + "Sharing\\.\\.\\.": "공유 중...", + "Stop Sharing\\.\\.\\.": "공유 중지 중...", + "Start Sharing": "공유 시작", + "Stop Sharing": "공유 중지", + "Access Restricted": "접근 제한됨", + "Restrict Access": "접근 제한", + "Restricting\\.\\.\\.": "제한 중...", + "Allow Access": "접근 허용", + "Allowing Access\\.\\.\\.": "접근 허용 중...", + "Download \\& QR Code is not available due to no private key set for this peer": "이 피어에 대해 설정된 개인 키가 없기 때문에 다운로드 & QR 코드를 사용할 수 없습니다.", + "By adding peers by bulk, each peer's name will be auto generated, and Allowed IP will be assign to the next available IP\\.": "피어를 일괄로 추가하면 각 피어의 이름이 자동으로 생성되고 허용된 IP는 사용 가능한 다음 IP에 할당됩니다.", + "Add Peers": "피어 추가", + "Bulk Add": "일괄 추가", + "How many peers you want to add\\?": "몇 개의 피어를 추가하시겠습니까?", + "You can add up to (.*) peers": "$1 개의 피어까지 추가할 수 있습니다", + "Use your own Private and Public Key": "자체 개인 및 공개 키 사용", + "Enter IP Address/CIDR": "IP 주소/CIDR 입력", + "IP Address/CIDR": "IP 주소/CIDR", + "or": "또는", + "Pick Available IP": "사용 가능한 IP 선택", + "No available IP containing": "포함된 사용 가능한 IP가 없습니다", + "Add": "추가", + "Adding\\.\\.\\.": "추가 중...", + "Failed to check available update": "사용 가능한 업데이트 확인 실패", + "Nice to meet you!": "만나서 반가워요!", + "Please fill in the following fields to finish setup": "설정을 완료하려면 아래 필드를 작성하세요", + "Create an account": "계정 생성", + "Enter an username you like": "원하는 사용자 이름 입력", + "Enter a password": "비밀번호 입력", + "\\(At least 8 characters and make sure is strong enough!\\)": "(최소 8자 이상이고 강력한 비밀번호여야 합니다!)", + "Confirm password": "비밀번호 확인", + "Next": "다음", + "Saving\\.\\.\\.": "저장 중...", + "1\\. Please scan the following QR Code to generate TOTP with your choice of authenticator": "1. 다음 QR 코드를 스캔하여 선택한 인증기로 TOTP를 생성하세요", + "Or you can click the link below:": "또는 아래 링크를 클릭하세요", + "2\\. Enter the TOTP generated by your authenticator to verify": "2. 인증기에서 생성된 TOTP를 입력하여 확인하세요", + "TOTP verified!": "TOTP가 확인되었습니다!", + "I don't need MFA": "MFA가 필요 없습니다", + "Complete": "완료", + "(v[0-9.]{1,}) is now available for update!": "$1 업데이트가 가능합니다!", + "Current Version:": "현재 버전:", + "Oh no\\.\\.\\. This link is either expired or invalid\\.": "앗... 이 링크는 만료되었거나 잘못되었습니다.", + "Scan QR Code with the WireGuard App to add peer": "WireGuard 앱으로 QR 코드를 스캔하여 피어를 추가하세요", + "or click the button below to download the ": "또는 아래 버튼을 클릭하여 다운로드하세요 ", + " file": " 파일", + "FROM ": "FROM ", + "(.*) is on": "$1 켜짐", + "(.*) is off": "$1 꺼짐", + "Allowed IPs is invalid": "허용된 IP가 올바르지 않습니다", + "Peer created successfully": "피어가 성공적으로 생성되었습니다", + "Please fill in all required box": "모든 필수 항목을 입력하세요", + "Please specify amount of peers you want to add": "추가할 피어의 수를 지정하세요", + "No more available IP can assign": "더 이상 할당 가능한 IP가 없습니다", + "The maximum number of peers can add is (.*)": "추가할 수 있는 피어의 최대 수는 $1 개입니다", + "Generating key pairs by bulk failed": "일괄 키 쌍 생성 실패", + "Failed to add peers in bulk": "일괄 피어 추가 실패", + "This peer already exist": "이 피어는 이미 존재합니다", + "This IP is not available: (.*)": "이 IP는 사용할 수 없습니다: $1", + "Configuration does not exist": "구성이 존재하지 않습니다", + "Peer does not exist": "피어가 존재하지 않습니다", + "Please provide a valid configuration name": "유효한 구성 이름을 입력하세요", + "Peer saved": "피어가 저장되었습니다", + "Allowed IPs already taken by another peer": "허용된 IP가 다른 피어에 의해 이미 사용 중입니다", + "Endpoint Allowed IPs format is incorrect": "엔드포인트 허용된 IP 형식이 올바르지 않습니다", + "DNS format is incorrect": "DNS 형식이 올바르지 않습니다", + "MTU format is not correct": "MTU 형식이 올바르지 않습니다", + "Persistent Keepalive format is not correct": "지속적 Keepalive 형식이 올바르지 않습니다", + "Private key does not match with the public key": "개인 키가 공개 키와 일치하지 않습니다", + "Update peer failed when updating Pre-Shared Key": "사전 공유 키 업데이트 중 피어 업데이트 실패", + "Update peer failed when updating Allowed IPs": "허용된 IP 업데이트 중 피어 업데이트 실패", + "Update peer failed when saving the configuration": "구성 저장 중 피어 업데이트 실패", + "Peer data usage reset successfully": "피어 데이터 사용량이 성공적으로 초기화되었습니다", + "Peer download started": "피어 다운로드가 시작되었습니다", + "Please specify one or more peers": "하나 이상의 피어를 지정하세요", + "Share link failed to create. Reason: (.*)": "공유 링크 생성에 실패했습니다. 이유: $1", + "Link expire date updated": "링크 만료 날짜가 업데이트되었습니다", + "Link expire date failed to update. Reason: (.*)": "링크 만료 날짜 업데이트에 실패했습니다. 이유: $1", + "Peer job saved": "피어 작업이 저장되었습니다", + "Please specify job": "작업을 지정하세요", + "Please specify peer and configuration": "피어와 구성을 지정하세요", + "Peer job deleted": "피어 작업이 삭제되었습니다", + "API Keys function is successfully enabled": "API 키 기능이 성공적으로 활성화되었습니다", + "API Keys function is successfully disabled": "API 키 기능이 성공적으로 비활성화되었습니다", + "API Keys function is failed to enable": "API 키 기능 활성화에 실패했습니다", + "API Keys function is failed to disable": "API 키 기능 비활성화에 실패했습니다", + "WGDashboard API Keys function is disabled": "WGDashboard API 키 기능이 비활성화되었습니다", + "WireGuard configuration path saved": "WireGuard 구성 경로가 저장되었습니다", + "API Key deleted": "API 키가 삭제되었습니다", + "API Key created": "API 키가 생성되었습니다", + "Sign in session ended, please sign in again": "로그인 세션이 종료되었습니다. 다시 로그인해주세요", + "Please specify an IP Address (v4/v6)": "IP 주소 (v4/v6)를 지정하세요", + "Please provide ipAddress and count": "ipAddress와 개수를 제공하세요", + "Please provide ipAddress": "ipAddress를 제공하세요", + "Dashboard Language": "대시보드 언어", + "Dashboard language update failed": "대시보드 언어 업데이트 실패", + "Peer Remote Endpoint": "피어 원격 엔드포인트", + "New Configuration": "새 구성", + "Configuration Name": "구성 이름", + "Configuration name is invalid. Possible reasons:": "구성 이름이 올바르지 않습니다. 가능한 원인:", + "Configuration name already exist\\.": "구성 이름이 이미 존재합니다.", + "Configuration name can only contain 15 lower/uppercase alphabet, numbers, underscore, equal sign, plus sign, period and hyphen\\.": "구성 이름은 15자 이하의 소문자/대문자 알파벳, 숫자, 밑줄, 등호, 더하기 기호, 마침표 및 하이픈만 포함할 수 있습니다.", + "Invalid Port": "유효하지 않은 포트", + "Save Configuration": "구성 저장", + "IP Address/CIDR is invalid": "IP 주소/CIDR이 올바르지 않습니다", + "IP Address": "IP 주소", + "Enter IP Address / Hostname": "IP 주소 / 호스트명 입력", + "IP Address / Hostname": "IP 주소 / 호스트명", + "Dashboard IP Address \\& Listen Port": "대시보드 IP 주소 & 수신 포트", + "Count": "개수", + "Geolocation": "위치", + "Is Alive": "활성 상태", + "Average / Min / Max Round Trip Time": "평균 / 최소 / 최대 왕복 시간", + "Sent / Received / Lost Package": "전송 / 수신 / 손실 패킷", + "Manual restart of WGDashboard is needed to apply changes on IP Address and Listen Port": "IP 주소 및 수신 포트 변경 사항을 적용하려면 WGDashboard를 수동으로 재시작해야 합니다", + "Restore Configuration": "구성 복원", + "Step (.*)": "단계 $1", + "Select a backup you want to restore": "복원할 백업을 선택하세요", + "Click to change a backup": "백업을 변경하려면 클릭하세요", + "Selected Backup": "선택된 백업", + "You don't have any configuration to restore": "복원할 구성이 없습니다", + "Help": "도움말", + "Backup": "백업", + "([0-9].*) Backups?": "$1 백업", + "Yes": "예", + "No": "아니오", + "Backup not selected": "백업이 선택되지 않았습니다", + "Confirm \\& edit restore information": "복원 정보 확인 & 편집", + "(.*) Available IP Address": "$1 사용 가능한 IP 주소", + "Database File": "데이터베이스 파일", + "Contain": "포함", + "Restricted Peers?": "제한된 피어?", + "Restore": "복원", + "Restoring": "복원 중...", + "WGDashboard Settings": "WGDashboard 설정", + "Peers Settings": "피어 설정", + "WireGuard Configuration Settings": "WireGuard 구성 설정", + "Appearance": "외관", + "Theme": "테마", + "Language": "언어", + "Account Settings": "계정 설정", + "Peer Default Settings": "피어 기본 설정", + "Toggle When Start Up": "시작 시 실행", + "Other Settings": "기타 설정", + "Select Peers": "피어 선택", + "Backup & Restore": "백업 & 복원", + "Delete Configuration": "구성 삭제", + "Create Backup": "백업 생성", + "No backup yet, click the button above to create backup\\.": "아직 백업이 없습니다. 위의 버튼을 클릭하여 백업을 생성하세요.", + "Are you sure to delete this backup\\?": "이 백업을 삭제하시겠습니까?", + "Are you sure to restore this backup?\\": "이 백업을 복원하시겠습니까?", + "Backup Date": "백업 날짜", + "File": "파일", + "Are you sure to delete this configuration\\?": "이 구성을 삭제하시겠습니까?", + "Once you deleted this configuration\\:": "이 구성을 삭제하면:", + "All connected peers will get disconnected": "연결된 모든 피어의 연결이 끊깁니다", + "Both configuration file \\(\\.conf\\) and database table related to this configuration will get deleted": "이 구성과 관련된 구성 파일 (.conf) 및 데이터베이스 테이블이 삭제됩니다", + "Checking backups...": "백업 확인 중...", + "This configuration have ([0-9].*) backups": "이 구성에는 $1 개의 백업이 있습니다", + "This configuration have no backup": "이 구성에는 백업이 없습니다", + "If you're sure, please type in the configuration name below and click Delete": "확실하다면, 아래에 구성 이름을 입력하고 삭제를 클릭하세요", + "Select All": "전체 선택", + "Clear Selection": "선택 해제", + "([0-9].*) Peers?": "$1 피어", + "Downloading": "다운로드 중", + "Download Finished": "다운로드 완료", + "Done": "완료", + "Are you sure to delete": "정말로 삭제하시겠습니까", + "Are you sure to delete this peer\\?": "정말로 이 피어를 삭제하시겠습니까", + "Configuration deleted": "구성이 삭제되었습니다", + "Configuration saved": "구성이 저장되었습니다", + "WGDashboard language update failed": "WGDashboard 언어 업데이트 실패", + "Configuration restored": "구성이 복원되었습니다", + "Allowed IP already taken by another peer": "허용된 IP가 다른 피어에 의해 이미 사용 중입니다", + "Failed to allow access of peer (.*)": "피어 (.*)의 접근 허용에 실패했습니다", + "Failed to save configuration through WireGuard": "WireGuard를 통한 구성 저장에 실패했습니다", + "Allow access successfully": "접근 허용에 성공했습니다", + "Deleted ([0-9]{1,}) peer\\(s\\)": "$1 피어가 삭제되었습니다", + "Deleted ([0-9]{1,}) peer\\(s\\) successfully. Failed to delete ([0-9]{1,}) peer\\(s\\)": "$1 피어가 성공적으로 삭제되었습니다. $2 피어 삭제에 실패했습니다", + "Restricted ([0-9]{1,}) peer\\(s\\)": "$1 피어가 제한되었습니다", + "Restricted ([0-9]{1,}) peer\\(s\\) successfully. Failed to restrict ([0-9]{1,}) peer\\(s\\)": "$1 피어가 성공적으로 제한되었습니다. $2 피어 제한에 실패했습니다" +} \ No newline at end of file