From 8bc444407d54b6990ebfa5c4c9549c2e1be4108f Mon Sep 17 00:00:00 2001 From: KietNT <113796420+TanNhatCMS@users.noreply.github.com> Date: Sun, 1 Mar 2026 13:36:03 +0700 Subject: [PATCH 01/16] Remove legacy flag from createI18n Remove the legacy: true option from the createI18n configuration in src/lang/index.ts. This switches i18n initialization away from the legacy API and relies on the default (composition) behavior, simplifying the i18n setup and avoiding legacy API usage. --- src/lang/index.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lang/index.ts b/src/lang/index.ts index 75511b5d1..30a5ca84e 100644 --- a/src/lang/index.ts +++ b/src/lang/index.ts @@ -169,7 +169,6 @@ let i18n: I18n export const AppI18n = (l?: string): I18n => { if (!i18n) { i18n = createI18n({ - legacy: true, locale: l || 'en', fallbackLocale: 'en', messages: lang as any From 8ba1aa5518c22a20ef320bcaaac60f4f83c24c0f Mon Sep 17 00:00:00 2001 From: KietNT <113796420+TanNhatCMS@users.noreply.github.com> Date: Sun, 1 Mar 2026 13:42:15 +0700 Subject: [PATCH 02/16] Update .gitignore --- .gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index dd10ebc50..559e12e40 100644 --- a/.gitignore +++ b/.gitignore @@ -28,6 +28,8 @@ app-update.yml yarn-error.log /test .vscode/settings.json -src/main/lang/index.ts /data package-lock.json +src/helper-go/rsrc_windows_amd64.syso +src/helper-go/rsrc_windows_386.syso +src/helper-go/go.sum From 46904cbe3de435c5c73d23f14761d0e50e591f2f Mon Sep 17 00:00:00 2001 From: KietNT <113796420+TanNhatCMS@users.noreply.github.com> Date: Sun, 1 Mar 2026 13:52:28 +0700 Subject: [PATCH 03/16] =?UTF-8?q?=E2=9C=A8=20feat(lang):=20add=20Cloudflar?= =?UTF-8?q?e=20Tunnel=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds new Vietnamese translations for Cloudflare Tunnel related strings to the host.json file. --- src/lang/vi/host.json | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/lang/vi/host.json b/src/lang/vi/host.json index 819b89659..979781138 100644 --- a/src/lang/vi/host.json +++ b/src/lang/vi/host.json @@ -67,5 +67,13 @@ "copyCommand": "Sao chép lệnh", "showFile": "Hiển thị tệp", "sticky": "Ghim", - "dbclickRowToEdit": "Nhấp đúp vào dòng này để chỉnh sửa" + "dbclickRowToEdit": "Nhấp đúp vào dòng này để chỉnh sửa", + + + "OnlineDomain": "Tên miền trực tuyến", + "LocalDoman": "Tên miền cục bộ", + "CloudflareTunnel": { + "OnlineDomainExistsTips": "Tên miền trực tuyến tương tự đã tồn tại.", + "CloudflaredNoFoundTips": "Không tìm thấy Cloudflared. Vui lòng cài đặt nó." + } } From 1f70034da94f84ba74d3c142ad6b5e96bcd1ade4 Mon Sep 17 00:00:00 2001 From: KietNT <113796420+TanNhatCMS@users.noreply.github.com> Date: Sun, 1 Mar 2026 14:13:35 +0700 Subject: [PATCH 04/16] =?UTF-8?q?=E2=9C=A8=20feat(lang):=20add=20Vietnames?= =?UTF-8?q?e=20translations=20for=20image=20tools?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit adds Vietnamese translations for various image manipulation tools and their configurations. --- src/lang/vi/tools.json | 284 ++++++++++++++++++++--------------------- 1 file changed, 142 insertions(+), 142 deletions(-) diff --git a/src/lang/vi/tools.json b/src/lang/vi/tools.json index a423a46fa..e1c1270dd 100644 --- a/src/lang/vi/tools.json +++ b/src/lang/vi/tools.json @@ -74,167 +74,167 @@ "RuleUUID": "Định danh duy nhất", "CapturerFailTitle": "Chụp màn hình thất bại", "CapturerFailContent": "Không thể chụp màn hình, vui lòng thử lại", - "CapturerDo": "Screenshot", - "CapturerHideWindowDo": "Hide This Window and Screenshot", - "CapturerPointPosition": "Coordinates", + "CapturerDo": "Ảnh chụp màn hình", + "CapturerHideWindowDo": "Ẩn cửa sổ này và ảnh chụp màn hình", + "CapturerPointPosition": "Tọa độ", "ImageCompress": { - "title": "Image Compression", + "title": "Nén hình ảnh", "preview": { - "effectPreview": "Effect Preview", - "selectImageFile": "Select Image File", - "originalImage": "Original Image", - "dimensions": "Dimensions", - "fileSize": "File Size", - "compressedImage": "Compressed Image", - "compressionResult": "Compression Result", - "compressionRatio": "Compression Ratio", - "sizeReduction": "Size Reduction", - "originalSize": "Original Size", - "compressedSize": "Compressed Size", - "effectiveCompression": "Effective Compression", - "largerAfterCompression": "Larger After Compression", - "selectFilePrompt": "Please select an image file for effect preview", - "original": "Original", - "effect": "Effect", - "dragSliderPrompt": "Drag slider to compare image quality", - "compressionPreview": "Compression Preview", - "selectFileForCompression": "Please select an image file for compression preview" + "effectPreview": "Xem trước hiệu ứng", + "selectImageFile": "Chọn tệp hình ảnh", + "originalImage": "Hình ảnh gốc", + "dimensions": "Kích thước", + "fileSize": "Kích thước tệp", + "compressedImage": "Hình ảnh nén", + "compressionResult": "Kết quả nén", + "compressionRatio": "Tỷ lệ nén", + "sizeReduction": "Giảm kích thước", + "originalSize": "Kích thước ban đầu", + "compressedSize": "Kích thước nén", + "effectiveCompression": "Nén hiệu quả", + "largerAfterCompression": "Lớn hơn sau khi nén", + "selectFilePrompt": "Vui lòng chọn một tệp hình ảnh để xem trước hiệu ứng", + "original": "Bản gốc", + "effect": "Hiệu ứng", + "dragSliderPrompt": "Kéo thanh trượt để so sánh chất lượng hình ảnh", + "compressionPreview": "Xem trước nén", + "selectFileForCompression": "Vui lòng chọn một tệp hình ảnh để xem trước nén" }, "basicConfig": { - "title": "Basic Configuration", - "widthPixels": "Width (pixels)", - "heightPixels": "Height (pixels)", - "outputFormat": "Output Format", - "keepOriginalFormat": "Keep Original Format", - "enableCompression": "Enable Compression", - "advancedOptions": "Advanced Options", - "preventEnlargement": "Prevent Enlargement", - "fastShrinkLoading": "Fast Shrink Loading", - "preserveMetadata": "Preserve Metadata", - "auto": "Auto Fit" + "title": "Cấu hình cơ bản", + "widthPixels": "Chiều rộng (pixel)", + "heightPixels": "Chiều cao (pixel)", + "outputFormat": "Định dạng đầu ra", + "keepOriginalFormat": "Giữ định dạng gốc", + "enableCompression": "Bật tính năng nén", + "advancedOptions": "Tùy chọn nâng cao", + "preventEnlargement": "Ngăn chặn sự mở rộng", + "fastShrinkLoading": "Tải thu nhỏ nhanh", + "preserveMetadata": "Bảo toàn siêu dữ liệu", + "auto": "Tự động phù hợp" }, "batchProcessing": { - "title": "Batch Processing", - "overwriteSource": "Overwrite Source Files", - "saveLocation": "Save Location", - "backupLocation": "Backup Location", - "imageFiles": "Image Files", - "path": "Path", - "beforeProcessing": "Before Processing", - "afterProcessing": "After Processing", - "backupDirTips": "Source files will be automatically overwritten. For the security of your data, please select a backup folder.", - "saveDirTips": "Please select a save folder." + "title": "Xử lý hàng loạt", + "overwriteSource": "Ghi đè lên tệp nguồn", + "saveLocation": "Lưu vị trí", + "backupLocation": "Vị trí sao lưu", + "imageFiles": "Tệp hình ảnh", + "path": "Đường dẫn", + "beforeProcessing": "Trước khi xử lý", + "afterProcessing": "Sau khi xử lý", + "backupDirTips": "Các tệp nguồn sẽ tự động bị ghi đè. Để bảo mật dữ liệu của bạn, vui lòng chọn một thư mục sao lưu.", + "saveDirTips": "Vui lòng chọn một thư mục lưu." }, "compressConfig": { - "title": "Compression Configuration", - "quality": "Quality (0-100)", - "progressiveLoading": "Progressive Loading", - "progressiveLoadingTooltip": "Display low-quality blur version first, then gradually become clearer, allowing users to quickly see the overall outline of the image. File size increases by 2-10%", - "mozjpegOptimization": "MozJPEG Optimization", - "mozjpegTooltip": "Generate smaller JPEG images while maintaining the same (or better) visual quality. 5-15% smaller than standard JPEG", - "colorSampling": "Color Sampling", - "highestQuality": "Highest quality, largest file size", - "acceptableQuality": "Acceptable visual quality, highest compression rate, smallest file size", - "compressionLevel": "Compression Level (0-9)", - "adaptiveFiltering": "Adaptive Filtering", - "adaptiveFilteringTooltip": "Important optimization for PNG compression that significantly reduces file size (especially for gradient and text images). Recommended for most PNG images.", - "palette": "Palette", - "paletteTooltip": "PNG palette mode uses indexes instead of direct color values for compression, significantly reducing file size but limiting color count. Best for simple graphics, icons, interfaces, etc., not suitable for photos and complex gradient images.", - "alphaQuality": "Alpha Quality (0-100)", - "lossless": "Lossless Compression", - "smartSubsampling": "Smart Subsampling", - "encodingStrength": "Encoding Strength (1-9)", - "commonOptions": "Common Options", - "preventReduction": "Prevent Reduction", - "preventReductionTooltip": "Prevent quality degradation when reducing image size, especially for vector formats like SVG. May cause smaller images to have larger file sizes.", - "preserveIccProfile": "Preserve ICC Profile", - "iccProfileTooltip": "Whether to preserve the image's ICC color profile. This setting directly affects color accuracy and consistency across different devices. If not preserved, can reduce generated file size by 0.5-5KB.", - "kernelAlgorithm": "Kernel Algorithm", - "nearest": "Nearest", - "nearestTooltip": "Low quality, try for maximum compression", - "linear": "Bilinear", - "linearTooltip": "Medium quality", - "cubic": "Bicubic", - "cubicTooltip": "High quality, balanced image quality and file size, default choice for most situations", + "title": "Cấu hình nén", + "quality": "Chất lượng (0-100)", + "progressiveLoading": "Tải tiến dần", + "progressiveLoadingTooltip": "Hiển thị phiên bản mờ chất lượng thấp trước, sau đó dần trở nên rõ nét hơn, giúp người dùng nhanh chóng thấy bố cục tổng thể của hình ảnh. Kích thước tệp tăng thêm 2-10%.", + "mozjpegOptimization": "Tối ưu hóa MozJPEG", + "mozjpegTooltip": "Tạo ảnh JPEG nhỏ hơn trong khi giữ nguyên (hoặc tốt hơn) chất lượng hiển thị. Nhỏ hơn 5-15% so với JPEG tiêu chuẩn.", + "colorSampling": "Lấy mẫu màu", + "highestQuality": "Chất lượng cao nhất, kích thước tệp lớn nhất", + "acceptableQuality": "Chất lượng hiển thị chấp nhận được, tỷ lệ nén cao nhất, kích thước tệp nhỏ nhất", + "compressionLevel": "Mức độ nén (0-9)", + "adaptiveFiltering": "Lọc thích ứng", + "adaptiveFilteringTooltip": "Tối ưu quan trọng cho nén PNG, giúp giảm đáng kể kích thước tệp (đặc biệt với ảnh có gradient và văn bản). Khuyến nghị dùng cho hầu hết ảnh PNG.", + "palette": "Bảng màu", + "paletteTooltip": "Chế độ bảng màu PNG dùng chỉ mục thay vì giá trị màu trực tiếp để nén, giúp giảm kích thước tệp đáng kể nhưng giới hạn số lượng màu. Phù hợp cho đồ họa đơn giản, biểu tượng, giao diện,… không phù hợp cho ảnh chụp hoặc hình có gradient phức tạp.", + "alphaQuality": "Chất lượng Alpha (0-100)", + "lossless": "Nén không mất dữ liệu", + "smartSubsampling": "Lấy mẫu thông minh", + "encodingStrength": "Độ mạnh mã hóa (1-9)", + "commonOptions": "Tùy chọn chung", + "preventReduction": "Ngăn giảm chất lượng", + "preventReductionTooltip": "Ngăn chất lượng giảm khi thu nhỏ hình ảnh, đặc biệt đối với định dạng vector như SVG. Có thể khiến hình nhỏ hơn lại có kích thước tệp lớn hơn.", + "preserveIccProfile": "Giữ lại hồ sơ ICC", + "iccProfileTooltip": "Có giữ lại hồ sơ màu ICC của hình ảnh hay không. Tùy chọn này ảnh hưởng trực tiếp đến độ chính xác và nhất quán màu trên các thiết bị khác nhau. Nếu không giữ lại, có thể giảm kích thước tệp 0.5–5KB.", + "kernelAlgorithm": "Thuật toán Kernel", + "nearest": "Lân cận gần nhất", + "nearestTooltip": "Chất lượng thấp, thử dùng khi cần mức nén tối đa", + "linear": "Song tuyến tính", + "linearTooltip": "Chất lượng trung bình", + "cubic": "Đa tuyến tính", + "cubicTooltip": "Chất lượng cao, cân bằng giữa chất lượng và kích thước tệp, là lựa chọn mặc định trong hầu hết trường hợp", "lanczos2": "Lanczos 2", - "lanczos2Tooltip": "Very high quality", + "lanczos2Tooltip": "Chất lượng rất cao (Cân bằng giữa độ sắc nét và hiệu năng. Ít gây lỗi \"quầng sáng\" (ringing) ở rìa vật thể, phù hợp khi cần chất lượng tốt mà không muốn ảnh trông quá sắc cạnh hoặc giả tạo.).", "lanczos3": "Lanczos 3", - "lanczos3Tooltip": "Highest quality, largest file size" + "lanczos3Tooltip": "Chất lượng cao nhất, kích thước tệp lớn nhất (Mang lại độ chi tiết và sắc nét cao nhất. Sử dụng thuật toán phức tạp hơn để giữ lại các đường nét mảnh, cực kỳ phổ biến cho việc phóng to ảnh hoặc video nhưng có thể xuất hiện nhiễu nhẹ ở các vùng tương phản cao.)." }, "effectsConfig": { - "title": "Image Effects", - "rotateFlip": "Rotation and Flip", - "verticalFlip": "Vertical Flip", - "horizontalFlip": "Horizontal Flip", - "rotationAngle": "Rotation Angle", - "blurSharpen": "Blur and Sharpen", - "blurStrength": "Blur Strength (0-100)", - "sharpenStrength": "Sharpen Strength (Sigma)", - "colorAdjustment": "Color Adjustment", - "gamma": "Gamma Value", - "hue": "Hue (-180~180)", - "brightness": "Brightness", - "saturation": "Saturation", - "threshold": "Threshold", - "opacity": "Opacity", - "effects": "Effects", - "grayscale": "Grayscale", - "invert": "Invert", - "normalize": "Normalize", - "colorSpace": "Color Space", - "whiteEdgeRemoval": "White Edge Removal Settings", - "enableWhiteEdgeRemoval": "Enable White Edge Removal" + "title": "Hiệu ứng hình ảnh", + "rotateFlip": "Xoay và Lật", + "verticalFlip": "Lật dọc", + "horizontalFlip": "Lật ngang", + "rotationAngle": "Góc xoay", + "blurSharpen": "Làm mờ và Làm nét", + "blurStrength": "Mức độ làm mờ (0-100)", + "sharpenStrength": "Mức độ làm nét (Sigma)", + "colorAdjustment": "Điều chỉnh màu sắc", + "gamma": "Giá trị Gamma", + "hue": "Sắc độ (-180~180)", + "brightness": "Độ sáng", + "saturation": "Độ bão hòa", + "threshold": "Ngưỡng", + "opacity": "Độ mờ", + "effects": "Hiệu ứng", + "grayscale": "Thang xám", + "invert": "Đảo màu", + "normalize": "Chuẩn hóa", + "colorSpace": "Không gian màu", + "whiteEdgeRemoval": "Cài đặt loại bỏ viền trắng", + "enableWhiteEdgeRemoval": "Bật loại bỏ viền trắng" }, "textureConfig": { - "title": "Texture Configuration", - "enableTexture": "Enable Texture", - "textureType": "Texture Type", - "grid": "Grid", - "dot": "Dot", - "line": "Line", - "noise": "Noise", - "customImage": "Custom Image", - "customTextureImage": "Custom Texture Image", - "textureParameters": "Texture Parameters", - "textureColor": "Texture Color", - "lineWidth": "Line Width (pixels)", - "gridSpacing": "Grid Spacing (pixels)", - "dotSize": "Dot Size (pixels)", - "dotSpacing": "Dot Spacing (pixels)", - "noiseIntensity": "Noise Intensity", - "blendTransform": "Blend and Transform", - "blendMode": "Blend Mode", - "none": "None", + "title": "Cấu hình Texture", + "enableTexture": "Bật Texture", + "textureType": "Loại Texture", + "grid": "Lưới", + "dot": "Chấm", + "line": "Đường", + "noise": "Nhiễu", + "customImage": "Hình tùy chỉnh", + "customTextureImage": "Hình Texture tùy chỉnh", + "textureParameters": "Thông số Texture", + "textureColor": "Màu Texture", + "lineWidth": "Độ dày đường (pixel)", + "gridSpacing": "Khoảng cách lưới (pixel)", + "dotSize": "Kích thước chấm (pixel)", + "dotSpacing": "Khoảng cách chấm (pixel)", + "noiseIntensity": "Cường độ nhiễu", + "blendTransform": "Hòa trộn và Biến đổi", + "blendMode": "Chế độ hòa trộn", + "none": "Không", "overlay": "Overlay", "multiply": "Multiply", "screen": "Screen", "softLight": "Soft Light", "hardLight": "Hard Light", - "rotationAngleDeg": "Rotation Angle (°)", - "scale": "Scale" + "rotationAngleDeg": "Góc xoay (°)", + "scale": "Tỉ lệ" }, "watermarkConfig": { - "title": "Watermark Configuration", - "defaultWatermarkText": "Watermark", - "enableWatermark": "Enable Watermark", - "watermarkType": "Watermark Type", - "textWatermark": "Text Watermark", - "imageWatermark": "Image Watermark", - "watermarkText": "Watermark Text", - "fontSize": "Font Size", - "fontColor": "Font Color", - "backgroundColor": "Background Color", - "enableBackground": "Enable Background", - "watermarkImagePath": "Watermark Image Path", - "width": "Width", - "height": "Height", - "positionSettings": "Position Settings", - "horizontalOffset": "Horizontal Offset (pixels)", - "verticalOffset": "Vertical Offset (pixels)", - "repeatMode": "Repeat Mode", - "single": "Single Watermark", - "grid": "Grid", - "gridSpacing": "Grid Spacing (pixels)" + "title": "Cấu hình hình mờ", + "defaultWatermarkText": "Hình mờ", + "enableWatermark": "Bật hình mờ", + "watermarkType": "Loại hình mờ", + "textWatermark": "Hình mờ văn bản", + "imageWatermark": "Hình mờ hình ảnh", + "watermarkText": "Văn bản hình mờ", + "fontSize": "Kích thước phông chữ", + "fontColor": "Màu phông chữ", + "backgroundColor": "Màu nền", + "enableBackground": "Bật nền", + "watermarkImagePath": "Đường dẫn hình ảnh hình mờ", + "width": "Chiều rộng", + "height": "Chiều cao", + "positionSettings": "Cài đặt vị trí", + "horizontalOffset": "Độ lệch ngang (pixel)", + "verticalOffset": "Độ lệch dọc (pixel)", + "repeatMode": "Chế độ lặp lại", + "single": "Hình mờ đơn", + "grid": "Lưới", + "gridSpacing": "Khoảng cách lưới (pixel)" }, "formats": { "jpeg": "JPEG", @@ -249,8 +249,8 @@ "srgb": "sRGB", "rgb": "RGB", "cmyk": "CMYK", - "lab": "Lab", - "bw": "Black & White" + "lab": "Phòng thí nghiệm", + "bw": "Đen & trắng" } } } From 7229c6b25a3db23f6df59da5b34b84c629435f6b Mon Sep 17 00:00:00 2001 From: KietNT <113796420+TanNhatCMS@users.noreply.github.com> Date: Sun, 1 Mar 2026 15:13:05 +0700 Subject: [PATCH 05/16] =?UTF-8?q?=E2=9C=A8=20feat(lang):=20update=20Vietna?= =?UTF-8?q?mese=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit updates Vietnamese translations for various strings, improving the localization of the application. --- src/lang/vi/base.json | 94 +++++++++++++++++++-------------------- src/lang/vi/licenses.json | 4 +- 2 files changed, 49 insertions(+), 49 deletions(-) diff --git a/src/lang/vi/base.json b/src/lang/vi/base.json index d1579d573..bb271ff4d 100644 --- a/src/lang/vi/base.json +++ b/src/lang/vi/base.json @@ -1,28 +1,28 @@ { "add": "Thêm", "open": "Mở", - "enable": "Bật", "openHosts": "Mở tệp hosts", + "enable": "Kích hoạt", "edit": "Sửa", "links": "Liên kết", "configFile": "Cấu hình", - "log": "Nhật ký", + "log": "Nhật ký (Log)", "del": "Xóa", "version": "Phiên bản", - "commonTemplates": "Các mẫu chung", + "commonTemplates": "Mẫu chung", "save": "Lưu", "lang": "Ngôn ngữ", - "changeLang": "Thay đổi ngôn ngữ", + "changeLang": "Đổi ngôn ngữ", "setupBase": "Cài đặt", "attention": "Chú ý", - "nginxRewriteTips": "Url Rewrite của Nginx được đặt ở đây. Apache nên đặt nó trong tệp dự án", + "nginxRewriteTips": "URL Rewrite của Nginx được thiết lập ở đây. Đối với Apache thì nên được thiết lập trong thư mục dự án", "refresh": "Làm mới", "clean": "Dọn dẹp", - "prompt": "Lời nhắc", + "prompt": "Thông báo", "delAlertTitle": "Cảnh báo", "delAlertContent": "Xác nhận xóa?", "areYouSure": "Bạn có chắc chắn không?", - "confirm": "OK", + "confirm": "Đồng ý", "cancel": "Hủy", "service": "Dịch vụ", "versionManager": "Phiên bản", @@ -32,32 +32,32 @@ "install": "Cài đặt", "uninstall": "Gỡ cài đặt", "currentVersionLib": "Thư viện phiên bản", - "slowLog": "Nhật ký chậm", - "httpServerTips": "Nhấp để tải lên tệp hoặc kéo vào khoảng trống để tải lên tệp", + "slowLog": "Nhật ký chậm (Slow Log)", + "httpServerTips": "Nhấp để tải tệp lên hoặc kéo vào khoảng trống để tải tệp lên", "path": "Đường dẫn", "generate": "Tạo", - "fileInfoTips": "Kéo tệp vào đây hoặc nhấp để chọn tệp", - "cleanSelect": "Xóa lựa chọn", + "fileInfoTips": "Kéo tệp vào đây, hoặc nhấp để chọn tệp", + "cleanSelect": "Xóa mục đã chọn", "cleanAll": "Xóa tất cả", "brewSrcSwitch": "Chuyển đổi nguồn Brew", - "useProxy": "Sử dụng Proxy", - "proxySetting": "Proxy máy chủ", - "quickSetup": "Cài đặt nhanh", + "useProxy": "Dùng Proxy", + "proxySetting": "Máy chủ Proxy", + "quickSetup": "Thiết lập nhanh", "currentProxy": "Proxy hiện tại", "resetPassword": "Mật khẩu", - "customVersionDir": "Đường dẫn thư mục phiên bản tùy chỉnh", - "customVersionDirTips": "Tùy chỉnh đường dẫn phiên bản, nó sẽ tự động tìm thấy tệp thực thi trong thư mục bin&sbin của đường dẫn này.", + "customVersionDir": "Tùy chỉnh đường dẫn thư mục phiên bản", + "customVersionDirTips": "Tùy chỉnh đường dẫn phiên bản, hệ thống sẽ tự động tìm các tệp thực thi trong thư mục bin & sbin của đường dẫn này.", "inputPassword": "Nhập mật khẩu máy tính", - "passwordError": "Mật khẩu không chính xác, vui lòng nhập lại", - "linkCopySuccess": "Sao chép liên kết vào khay nhớ tạm thành công", - "needSelectVersion": "Vui lòng chọn phiên bản trước", - "hostsSaveFailed": "Không lưu được tệp System Hosts. Vui lòng kiểm tra xem tệp có tồn tại và quyền của tệp có chính xác không", - "hostsReadFailed": "Không đọc được tệp /private/etc/hosts. Vui lòng kiểm tra xem tệp có tồn tại và quyền của tệp có chính xác không", + "passwordError": "Mật khẩu sai, vui lòng nhập lại", + "linkCopySuccess": "Đã sao chép liên kết URL vào khay nhớ tạm!", + "needSelectVersion": "Vui lòng chọn một phiên bản trước", + "hostsSaveFailed": "Lưu file Hosts hệ thống thất bại. Vui lòng kiểm tra xem tệp có tồn tại và quyền truy cập tệp có đúng không", + "hostsReadFailed": "Không thể đọc tệp /private/etc/hosts. Vui lòng kiểm tra xem tệp có tồn tại và quyền truy cập tệp có đúng không", "needSelectDir": "Vui lòng chọn một thư mục!", - "processNotFound": "Không tìm thấy quy trình nào", + "processNotFound": "Không tìm thấy tiến trình nào", "default": "Mặc định", "copy": "Sao chép", - "hostsTitle": "System Hosts", + "hostsTitle": "Hosts hệ thống", "phpVersion": "Phiên bản PHP", "selectPhpVersion": "Chọn phiên bản PHP", "siteLinks": "Liên kết trang web", @@ -73,47 +73,47 @@ "logFileNotFound": "Tệp nhật ký không tồn tại", "name": "Tên", "status": "Trạng thái", - "operation": "Hoạt động", + "operation": "Thao tác", "action": "Hành động", "copyLink": "Sao chép liên kết", - "copySuccess": "Sao chép vào khay nhớ tạm thành công", - "killProcessConfirm": "Bạn có chắc chắn muốn kết thúc quy trình đã chọn không?", - "killAllProcessConfirm": "Bạn có chắc chắn muốn kết thúc tất cả các quy trình không?", - "portNotUse": "Cổng này không được sử dụng", - "sslMakeAlert": "Chứng chỉ tự ký SSL được tạo thành công, vui lòng tìm Dev Root CA {caFileName} trong keychain đã mở và sửa đổi nó thành \"luôn tin cậy\" chứng chỉ", + "copySuccess": "Đã sao chép vào khay nhớ tạm!", + "killProcessConfirm": "Bạn có chắc chắn muốn kết thúc tiến trình đã chọn?", + "killAllProcessConfirm": "Bạn có chắc chắn muốn kết thúc tất cả các tiến trình?", + "portNotUse": "Cổng này chưa được sử dụng", + "sslMakeAlert": "Tạo chứng chỉ tự ký SSL thành công. Vui lòng tìm Dev Root CA {caFileName} trong ứng dụng Keychain (Chuỗi khóa) vừa mở và chỉnh sửa thành \"Luôn tin tưởng\" (Always trust) chứng chỉ này", "second": "Giây", "millisecond": "Mili giây", - "versionError": "Lỗi tìm nạp phiên bản", - "versionErrorTips": "Phiên bản đã được cài đặt, nhưng có một lỗi ngăn nó chạy, vấn đề này về cơ bản là do thiếu phần mềm phụ thuộc hoặc phiên bản phụ thuộc không chính xác, hãy thử chạy lệnh \"brew update && brew upgrade\" để khắc phục nó", - "fileBigErr": "Tệp quá lớn, vui lòng chọn tệp cấu hình chính xác", - "hostParseErr": "Không tải được trang web, dữ liệu trang web ban đầu đã được sao lưu vào host.back.json, vui lòng kiểm tra và sửa chữa tệp trong thư mục đã mở", + "versionError": "Lấy phiên bản thất bại", + "versionErrorTips": "Phiên bản đã được cài đặt, nhưng có lỗi khiến nó không thể chạy. Vấn đề này chủ yếu là do thiếu phần mềm phụ thuộc hoặc phiên bản phụ thuộc không đúng. Hãy thử chạy lệnh \"brew update && brew upgrade\" để sửa lỗi", + "fileBigErr": "Tệp quá lớn, vui lòng chọn đúng tệp cấu hình", + "hostParseErr": "Tải trang web thất bại, dữ liệu trang web gốc đã được sao lưu vào host.back.json. Vui lòng kiểm tra và sửa chữa tệp trong thư mục vừa mở", "export": "Xuất", "import": "Nhập", "autoUpdate": "Tự động cập nhật", "loading": "Đang tải...", - "parkTitle": "Chuyển hướng tên miền con sang thư mục con", - "parkTips": "Ánh xạ tên miền con nếu tên miền con trùng với tên thư mục con (Ví dụ: {subfoldername}.mydomain.tld).", - "parkConfirm": "Điều này sẽ tự động tìm kiếm các thư mục con và tạo các trang web con, bạn có muốn tiếp tục không?", - "ftpDirNotExists": "Thư mục không tồn tại, vui lòng chọn lại", - "editorSettings": "Thiết lập trình soạn thảo", + "parkTitle": "Phân giải tên miền phụ vào thư mục con", + "parkTips": "Phân giải tên miền phụ nếu tên của nó khớp với tên thư mục con (Ví dụ: {subfoldername}.mydomain.tld)", + "parkConfirm": "Điều này sẽ làm cho tất cả các thư mục con có thể truy cập dưới dạng các trang web tên miền phụ, bạn có muốn tiếp tục không?", + "ftpDirNotExists": "Thư mục không tồn tại, vui lòng thử lại", + "editorSettings": "Cài đặt trình soạn thảo", "group": "Nhóm", - "leftHosts": "Hosts", + "leftHosts": "Trang Web", "leftTools": "Công cụ", "settings": "Cài đặt", - "theme": "Chủ đề", - "themeDark": "Tối", - "themeLight": "Sáng", - "themeAuto": "Hệ thống", + "theme": "Giao diện", + "themeDark": "Giao diện tối", + "themeLight": "Giao diện sáng", + "themeAuto": "Theo hệ thống", "addToPath": "Thêm vào PATH", "Official": "Chính thức", - "staticDelAlert": "Để đảm bảo an toàn cho dữ liệu người dùng, không còn cung cấp chức năng tự động xóa phần mềm đã cài đặt. Nếu bạn chắc chắn muốn xóa, hãy nhấp vào OK. Xóa thủ công phần mềm trong thư mục đã mở.", + "staticDelAlert": "Để đảm bảo an toàn cho dữ liệu người dùng, tính năng tự động xóa phần mềm đã cài đặt không còn được cung cấp nữa. Nếu bạn chắc chắn muốn xóa, hãy nhấp vào Đồng ý. Xóa thủ công phần mềm trong thư mục vừa mở.", "placeholderSearch": "Tìm kiếm", "projects": "Dự án", "cleanup": "Dọn dẹp", "preview": "Xem trước", "executing": "Đang thực thi", "info": "Thông tin", - "ForceDelete": "Xóa bắt buộc", - "DataDirPermissionTips": "Không thể tạo thư mục dữ liệu FlyEnv. Vui lòng khởi động FlyEnv với quyền quản trị viên hoặc thay đổi vị trí cài đặt FlyEnv.", - "needInstallHelperTips": "Một số thao tác đã thất bại vì yêu cầu quyền quản trị viên. Điều này bao gồm việc sửa đổi tệp Hosts, truy cập danh sách quá trình, kết nối với các cổng dưới 1024 hoặc quản lý biến môi trường hệ thống.\nVui lòng cài đặt FlyEnv Helper để cấp quyền cần thiết cho các tác vụ này. Nhấp vào \"OK\" để tiếp tục cài đặt." + "ForceDelete": "Bắt buộc xóa", + "DataDirPermissionTips": "Không thể tạo thư mục dữ liệu FlyEnv. Vui lòng khởi chạy FlyEnv bằng quyền Quản trị viên (Administrator), hoặc thay đổi vị trí cài đặt FlyEnv.", + "needInstallHelperTips": "Một số thao tác thất bại do yêu cầu quyền Quản trị viên. Các thao tác này bao gồm sửa đổi tệp Hosts, truy cập danh sách tiến trình, liên kết với các cổng dưới 1024 hoặc quản lý các biến môi trường của hệ thống.\nVui lòng cài đặt FlyEnv Helper để cấp các quyền cần thiết cho các tác vụ này. Nhấp vào \"Đồng ý\" để tiếp tục cài đặt." } diff --git a/src/lang/vi/licenses.json b/src/lang/vi/licenses.json index 25c7303aa..c1d954103 100644 --- a/src/lang/vi/licenses.json +++ b/src/lang/vi/licenses.json @@ -32,8 +32,8 @@ "messagePlaceholder": "Vui lòng gửi người hiến tặng, liên kết quyên góp hoặc ID đơn hàng khi chọn quyên góp.\nVui lòng gửi liên kết PR cho những người chọn tham gia vào phát triển dự án.\nVui lòng gửi liên kết bài viết/video nếu bạn chọn giúp quảng bá dự án", "requestButton": "Yêu cầu Giấy phép", "refreshButton": "Làm Mới Trạng Thái", - "licenseActivated": "License activated", - "licenseNoActivated": "License not activated", + "licenseActivated": "Giấy phép được kích hoạt", + "licenseNoActivated": "Giấy phép chưa được kích hoạt", "licenseInfo": "Giấy phép hiện được cung cấp là giấy phép vĩnh viễn, mỗi máy tính tương ứng với một giấy phép. Nếu bạn thay đổi máy tính, bạn cần liên kết uuid của thiết bị mới trong 'Giấy phép của tôi' hoặc nộp đơn xin giấy phép mới.", "logoutTips": "Bạn có chắc chắn muốn đăng xuất không?", "delBindTips": "Bạn có chắc chắn muốn hủy liên kết giấy phép với UUID này không?", From 6f501b3e431ba2efda66cc8c0ec74dd8e9778ded Mon Sep 17 00:00:00 2001 From: KietNT <113796420+TanNhatCMS@users.noreply.github.com> Date: Sun, 1 Mar 2026 15:25:42 +0700 Subject: [PATCH 06/16] =?UTF-8?q?=E2=9C=A8=20feat(lang):=20update=20Vietna?= =?UTF-8?q?mese=20translations?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This commit updates Vietnamese translations for various strings, improving the localization of the application. --- src/lang/vi/aside.json | 6 ++++-- src/lang/vi/base.json | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/lang/vi/aside.json b/src/lang/vi/aside.json index 5ccc1dd4e..2372f6a91 100644 --- a/src/lang/vi/aside.json +++ b/src/lang/vi/aside.json @@ -11,8 +11,10 @@ "containerRuntime": "Trình quản lý Container", "other": "Khác", "appLog": "Nhật ký ứng dụng", - "ai": "AI", + "ai": "Máy chủ AI", "objectStorage": "Lưu trữ đối tượng", "appExit": "Dừng tất cả các dịch vụ đang chạy và thoát FlyEnv", - "groupStart": "Khởi động tất cả các dịch vụ khả dụng hiển thị trên bảng điều khiển bằng một cú nhấp chuột" + "groupStart": "Khởi động tất cả các dịch vụ khả dụng hiển thị trên bảng điều khiển bằng một cú nhấp chuột", + + "networkTunnel": "Xuyên mạng nội bộ" } diff --git a/src/lang/vi/base.json b/src/lang/vi/base.json index bb271ff4d..343a4f130 100644 --- a/src/lang/vi/base.json +++ b/src/lang/vi/base.json @@ -97,7 +97,7 @@ "ftpDirNotExists": "Thư mục không tồn tại, vui lòng thử lại", "editorSettings": "Cài đặt trình soạn thảo", "group": "Nhóm", - "leftHosts": "Trang Web", + "leftHosts": "Máy chủ Web", "leftTools": "Công cụ", "settings": "Cài đặt", "theme": "Giao diện", From f69123a42b72d6709d66c1a8f157c54249e49d39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BE=90=E9=B9=8F=E9=A3=9E?= <250881478@qq.com> Date: Sun, 1 Mar 2026 21:38:15 +0800 Subject: [PATCH 07/16] 1. Add Cloudflare Tunnel Module --- .../CloudflareTunnel/CloudflareTunnel.ts | 3 +- src/fork/module/CloudflareTunnel/index.ts | 13 + src/lang/en/host.json | 4 +- src/lang/zh/host.json | 4 +- .../components/CloudflareTunnel/List.vue | 230 +++++++++++++---- .../components/CloudflareTunnel/add.vue | 59 ++++- .../components/CloudflareTunnel/addDNS.vue | 209 ++++++++++++++++ .../components/CloudflareTunnel/edit.vue | 149 +---------- .../components/CloudflareTunnel/editDNS.vue | 235 ++++++++++++++++++ .../components/CloudflareTunnel/setup.ts | 67 ++++- .../core/CloudflareTunnel/CloudflareTunnel.ts | 30 ++- src/render/core/CloudflareTunnel/type.ts | 1 + 12 files changed, 782 insertions(+), 222 deletions(-) create mode 100644 src/render/components/CloudflareTunnel/addDNS.vue create mode 100644 src/render/components/CloudflareTunnel/editDNS.vue diff --git a/src/fork/module/CloudflareTunnel/CloudflareTunnel.ts b/src/fork/module/CloudflareTunnel/CloudflareTunnel.ts index 21fb10df6..99762b24c 100644 --- a/src/fork/module/CloudflareTunnel/CloudflareTunnel.ts +++ b/src/fork/module/CloudflareTunnel/CloudflareTunnel.ts @@ -14,6 +14,7 @@ export class CloudflareTunnel { accountId: string = '' cloudflaredBin: string = '' + tunnelName: string = '' tunnelId: string = '' tunnelToken: string = '' @@ -59,7 +60,7 @@ export class CloudflareTunnel { // 取 API Token 的 MD5 前 12 位作为标识,保证同一 Token 下名称固定且不泄露明文 const tokenHash = crypto.createHash('md5').update(this.apiToken).digest('hex').substring(0, 12) const tunnelName = `FlyEnv-Tunnel-${tokenHash}` - + this.tunnelName = tunnelName console.log(`正在查找或创建隧道: ${tunnelName}`) // 1. 查询是否存在同名隧道 diff --git a/src/fork/module/CloudflareTunnel/index.ts b/src/fork/module/CloudflareTunnel/index.ts index a9d7016c5..4fc45e76c 100644 --- a/src/fork/module/CloudflareTunnel/index.ts +++ b/src/fork/module/CloudflareTunnel/index.ts @@ -24,6 +24,19 @@ class CloudflareTunnelBase extends Base { }) } + fetchTunnel(item: CloudflareTunnel) { + return new ForkPromise(async (resolve, reject) => { + try { + const model = new CloudflareTunnel() + Object.assign(model, item) + await model.fetchTunnel() + resolve(JSON.parse(JSON.stringify(model))) + } catch (e) { + reject(e) + } + }) + } + start(item: CloudflareTunnel) { return new ForkPromise(async (resolve, reject) => { try { diff --git a/src/lang/en/host.json b/src/lang/en/host.json index b3f74a1ea..4ce025c35 100644 --- a/src/lang/en/host.json +++ b/src/lang/en/host.json @@ -75,6 +75,8 @@ "LocalDoman": "Local Domain", "CloudflareTunnel": { "OnlineDomainExistsTips": "The same online domain name already exists.", - "CloudflaredNoFoundTips": "Cloudflared not found. Please install it." + "CloudflaredNoFoundTips": "Cloudflared not found. Please install it.", + "TunnelInitFailTips": "Tunnel creation failed: {error}. Please check if the ApiToken is correct and ensure you have Cloudflare Tunnel edit permissions.", + "TunnelRule": "Tunnel Rule" } } diff --git a/src/lang/zh/host.json b/src/lang/zh/host.json index 87c7b7e84..27310d2e8 100644 --- a/src/lang/zh/host.json +++ b/src/lang/zh/host.json @@ -73,6 +73,8 @@ "LocalDoman": "本地域名", "CloudflareTunnel": { "OnlineDomainExistsTips": "相同的线上域名已存在", - "CloudflaredNoFoundTips": "未找到Cloudflared,请先安装" + "CloudflaredNoFoundTips": "未找到Cloudflared,请先安装", + "TunnelInitFailTips": "隧道创建失败: {error}. 请检查ApiToken是否正确, 以及是否有Cloudflare Tunnel编辑权限.", + "TunnelRule": "隧道规则" } } diff --git a/src/render/components/CloudflareTunnel/List.vue b/src/render/components/CloudflareTunnel/List.vue index 1e9b81a71..15ddcd0ea 100644 --- a/src/render/components/CloudflareTunnel/List.vue +++ b/src/render/components/CloudflareTunnel/List.vue @@ -8,38 +8,112 @@ - - -