dns-worker 1.0.2-3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/LICENSE +662 -0
  2. package/README.md +294 -0
  3. package/dist/serverfull.mjs +11777 -0
  4. package/migrations/0000_init.sql +80 -0
  5. package/migrations/0001_move_lists_to_d1.sql +12 -0
  6. package/migrations/0002_activity_tracking.sql +7 -0
  7. package/migrations/0003_fix_profiles_cascade.sql +21 -0
  8. package/migrations/0004_system_settings.sql +12 -0
  9. package/migrations/0005_add_bloom_storage.sql +3 -0
  10. package/migrations/0006_cleanup_profiles_table.sql +18 -0
  11. package/migrations/0007_user_activity_and_totp.sql +37 -0
  12. package/migrations/0008_add_profile_key.sql +8 -0
  13. package/migrations/0009_add_profile_blooms.sql +5 -0
  14. package/migrations/0010_session_device_info.sql +3 -0
  15. package/migrations/0011_session_created_at.sql +2 -0
  16. package/migrations/0012_profile_bloom_chunks.sql +9 -0
  17. package/migrations/0013_add_session_revoked_to_activity_log.sql +29 -0
  18. package/migrations/0014_add_session_geo.sql +3 -0
  19. package/migrations/0015_add_signup_to_activity_log.sql +30 -0
  20. package/migrations/0016_add_session_rotation_counter.sql +2 -0
  21. package/migrations/0017_add_access_points.sql +31 -0
  22. package/migrations/0018_add_list_updated_at.sql +2 -0
  23. package/migrations/0019_add_list_sync_error.sql +2 -0
  24. package/migrations/0020_add_session_last_active.sql +5 -0
  25. package/migrations/0021_add_user_timezone.sql +2 -0
  26. package/migrations/0022_add_user_locale.sql +2 -0
  27. package/migrations/0023_add_user_password_version.sql +2 -0
  28. package/migrations/0024_session_pin_and_pause.sql +37 -0
  29. package/migrations/0025_add_secret_table.sql +10 -0
  30. package/migrations/0026_session_lock_config.sql +2 -0
  31. package/migrations/0027_add_session_id_to_activity_log.sql +2 -0
  32. package/migrations/0028_rename_session_id_to_session_id_hash.sql +2 -0
  33. package/migrations/0029_profile_blooms_staging.sql +12 -0
  34. package/migrations/0030_add_list_blooms.sql +7 -0
  35. package/migrations/0031_list_blooms_chunks.sql +13 -0
  36. package/migrations/0032_profile_blooms_cascade.sql +40 -0
  37. package/migrations/0033_remove_system_secrets.sql +2 -0
  38. package/migrations/0034_remove_list_entries.sql +2 -0
  39. package/migrations/0035_add_envelope_encryption_columns.sql +5 -0
  40. package/migrations/0036_add_cf_proxy_cidrs_setting.sql +7 -0
  41. package/migrations/0037_optimize_logs_composite_indexes.sql +25 -0
  42. package/migrations/0038_optimize_logs_table_and_indexes.sql +49 -0
  43. package/migrations/0039_add_lists_profile_id_index.sql +5 -0
  44. package/migrations/0040_reduce_logs_indexes_write_cost.sql +9 -0
  45. package/migrations/0041_create_log_hourly_rollups.sql +21 -0
  46. package/migrations/0042_add_rule_created_at.sql +3 -0
  47. package/migrations/0043_create_client_hourly_rollups.sql +26 -0
  48. package/migrations/0044_create_destination_hourly_rollups.sql +29 -0
  49. package/migrations/0045_transform_logs_without_rowid.sql +38 -0
  50. package/migrations/0046_add_passkeys.sql +19 -0
  51. package/migrations/0047_add_passkey_actions_to_activity_log.sql +35 -0
  52. package/migrations/0048_add_recovery_key_rotated_to_activity_log.sql +35 -0
  53. package/migrations/0049_optimize_rollups_and_add_domain_rollups.sql +26 -0
  54. package/migrations/0050_add_dest_columns_to_logs.sql +6 -0
  55. package/migrations/0051_add_registration_enabled_setting.sql +2 -0
  56. package/package.json +71 -0
  57. package/static/assets/AccountView-BvRvODjN.js +4 -0
  58. package/static/assets/AnalyticsView-DQ7hDChh.js +2 -0
  59. package/static/assets/AuthView-Bwv6hbdi.js +2 -0
  60. package/static/assets/DestinationMap-BEQNbcb-.js +1 -0
  61. package/static/assets/FilteringView-BWD3e-DS.js +1 -0
  62. package/static/assets/LogsView-kQy7qTGd.js +5 -0
  63. package/static/assets/QRCodeCanvas-X07w5x_G.js +2 -0
  64. package/static/assets/RulesView-3d5hga0L.js +1 -0
  65. package/static/assets/SettingsView-B9D0kPUF.js +1 -0
  66. package/static/assets/SetupView-D7d-Gsdr.js +1 -0
  67. package/static/assets/SwipeableDrawer-B-MfxTWM.js +1 -0
  68. package/static/assets/TrendChart-B20w7SzD.js +53 -0
  69. package/static/assets/allPaths-BEI3QvIM.js +1 -0
  70. package/static/assets/allPathsLoader-DM2JAMeC.js +1 -0
  71. package/static/assets/browser-icErLjuM.js +1 -0
  72. package/static/assets/date-C4b8kvr-.js +1 -0
  73. package/static/assets/de-DE-CXKS_pep.js +10 -0
  74. package/static/assets/es-ES-B2e3ea35.js +10 -0
  75. package/static/assets/formatCountryName-CSBD8pP8.js +1 -0
  76. package/static/assets/fr-FR-1qQHEpoW.js +10 -0
  77. package/static/assets/getFlagEmoji-_Wxhq0lT.js +1 -0
  78. package/static/assets/index-7FKlsF79.js +16 -0
  79. package/static/assets/index-DdQuGqR5.css +2 -0
  80. package/static/assets/ja-JP-CCVeJXwX.js +10 -0
  81. package/static/assets/ko-KR-bQ1okpC2.js +10 -0
  82. package/static/assets/obex_cat_eye_logo-256-CgYNvUIC.webp +0 -0
  83. package/static/assets/paths-CfqdBnl8.js +1 -0
  84. package/static/assets/paths-cc-gUzxh.js +1 -0
  85. package/static/assets/rolldown-runtime-C4Xdq4VV.js +1 -0
  86. package/static/assets/ru-RU-DeRsms_o.js +10 -0
  87. package/static/assets/services-fIMx5oSx.js +1 -0
  88. package/static/assets/splitPathsBySizeLoader-BgBwSA38.js +1 -0
  89. package/static/assets/vendor-i18next-cO7FDf_e.js +1 -0
  90. package/static/assets/vendor-icons-16-BgwRBCeU.js +1 -0
  91. package/static/assets/vendor-icons-20-X5NPN60g.js +1 -0
  92. package/static/assets/vendor-icons-other-Bme3ywH9.js +2 -0
  93. package/static/assets/vendor-react-Kt98jRfM.js +11 -0
  94. package/static/assets/vendor-ui-core-BpucEp_q.js +1 -0
  95. package/static/assets/vendor-utils-CfYGGC23.js +9 -0
  96. package/static/assets/vi-VN-BcXfqmzH.js +10 -0
  97. package/static/assets/zh-CN-D8YK7j27.js +12 -0
  98. package/static/assets/zh-TW-C2_-uaZk.js +12 -0
  99. package/static/favicon.webp +0 -0
  100. package/static/index.html +27 -0
  101. package/static/manifest.webmanifest +1 -0
  102. package/static/registerSW.js +1 -0
  103. package/static/sw.js +1 -0
@@ -0,0 +1,10 @@
1
+ const e={account:`Tài khoản`,logout:`Đăng xuất`,selectProfile:`Chọn cấu hình`,add:`Thêm`,newProfileName:`Tên cấu hình mới...`,profileNameFormatTip:`Gợi ý tên cấu hình: 1-30 ký tự và không được trùng với tên hiện có`,profileLimitExceeded:`Đạt giới hạn số lượng cấu hình (tối đa {{max}})`,profileNameExists:`Tên cấu hình này đã tồn tại`,profileNameFormatError:`Định dạng tên cấu hình không hợp lệ`,create:`Tạo`,welcome:`Chào mừng`,createProfileToStart:`Tạo một cấu hình để bắt đầu.`,loading:`Đang tải...`,errorNetwork:`Lỗi mạng`,confirmDelete:`Bạn có chắc chắn muốn xóa cấu hình này không?`,confirmLogout:`Bạn có chắc chắn muốn đăng xuất không?`,notFound:`404 - Không tìm thấy trang`,notFoundDesc:`Trang bạn đang tìm kiếm không tồn tại hoặc đã bị xóa.`,backToHome:`Quay lại trang chủ`,apac:`Châu Á - Thái Bình Dương`,mainlandChina:`Trung Quốc Đại Lục`,HongKong:`Hồng Kông`,Singapore:`Singapore`,Tokyo:`Tokyo`,NorthAmerica:`Bắc Mỹ`,nae:`Miền Đông Bắc Mỹ`,naw:`Miền Tây Bắc Mỹ`,eu:`Châu Âu`,invalidFormat:`Định dạng tệp không hợp lệ`,import:`Nhập`,importSuccess:`Nhập cấu hình thành công`,importError:`Nhập cấu hình thất bại, vui lòng đảm bảo định dạng đúng và thử lại sau`,save:`Lưu`,saveSuccess:`Đã lưu cài đặt`},t={setup:`Thiết lập`,rules:`Quy tắc`,stats:`Thống kê`,logs:`Nhật ký`,filter:`Bộ lọc`,settings:`Cài đặt`},n={light:`Sáng`,dark:`Tối`,system:`Theo hệ thống`},r={login:`Đăng nhập DNS Worker`,signup:`Tạo tài khoản để bắt đầu`,welcomeBack:`Chào mừng trở lại, vui lòng nhập thông tin đăng nhập`,protectInternet:`Bảo vệ bước nhảy internet đầu tiên của bạn`,error:`Lỗi`,username:`Tên đăng nhập`,usernamePlaceholder:`Tên đăng nhập của bạn`,password:`Mật khẩu`,passwordPlaceholder:`Mật khẩu của bạn`,loginBtn:`Đăng nhập`,signupBtn:`Đăng ký`,totpVerification:`Xác thực TOTP`,noAccount:`Chưa có tài khoản? Đăng ký ngay`,haveAccount:`Đã có tài khoản? Quay lại đăng nhập`,formatTipUsername:`Định dạng tên đăng nhập: Chỉ từ 5 đến 32 ký tự theo định dạng Unix (bắt đầu bằng chữ thường hoặc dấu gạch dưới, bao gồm chữ thường, số, dấu gạch dưới và dấu gạch ngang)`,formatTipPassword:`Định dạng mật khẩu: 12-100 ký tự`,authFailed:`Xác thực thất bại, vui lòng kiểm tra tên đăng nhập hoặc mật khẩu`,networkError:`Lỗi mạng, vui lòng thử lại sau`,turnstileRequired:`Vui lòng hoàn thành xác minh người máy`,turnstileError:`Không thể tải dịch vụ xác minh, vui lòng kiểm tra Site Key hoặc cấu hình tên miền`,verifying:`Đang thực hiện xác minh bảo mật...`,passwordLeaked:`Mật khẩu của bạn đã bị lộ, vì an toàn tài khoản, vui lòng sử dụng mật khẩu ngẫu nhiên/mạnh.`,usernameExists:`Tên đăng nhập này đã được đăng ký, vui lòng thử tên khác.`,skip:`Bỏ qua`,showPassword:`Hiện mật khẩu`,hidePassword:`Ẩn mật khẩu`,geolocationRequired:`Lấy vị trí địa lý thất bại, vui lòng thử đăng nhập lại.`,unauthorizedDefault:`Phiên đăng nhập của bạn đã hết hạn, vui lòng đăng nhập lại.`,unauthorizedGeo:`Phát hiện thay đổi vị trí địa lý (vượt quá giới hạn khoảng cách), phiên hiện tại đã bị buộc đăng xuất.`,unauthorizedExpired:`Đăng nhập của bạn đã hết hạn, vui lòng đăng nhập lại.`,unauthorizedReuse:`Cảnh báo bảo mật: Phát hiện đăng nhập trùng lặp, phiên đã bị chấm dứt.`,unauthorizedRevoked:`Phiên của bạn đã bị đăng xuất hoặc xóa, vui lòng đăng nhập lại.`,sessionLockTitle:`Khóa phiên khi không hoạt động`,sessionLockDesc:`Khóa giao diện bằng mã PIN 4 chữ số khi ứng dụng không hoạt động để bảo vệ các phiên đang mở khỏi truy cập vật lý trái phép.`,enableSessionLock:`Bật khóa phiên`,inactivityTimeout:`Thời gian chờ không hoạt động`,timeout1m:`1 phút`,timeout2m:`2 phút`,timeout5m:`5 phút`,timeout15m:`15 phút`,timeout30m:`30 phút`,timeout60m:`60 phút`,changePin:`Thay đổi mã PIN`,disablePin:`Tắt khóa phiên`,configurePin:`Cấu hình mã PIN`,newPin:`Mã PIN 4 chữ số mới`,pinHelper:`Chỉ nhập số, ví dụ: 1234`,confirmPin:`Xác nhận mã PIN mới`,verifyIdentity:`Xác minh danh tính`,usePassword:`Sử dụng mật khẩu`,use2fa:`Sử dụng mã TOTP`,totpCode:`Mã TOTP`,currentPassword:`Mật khẩu hiện tại`,disablePinWarning:`Tắt mã PIN sẽ vô hiệu hóa hoàn toàn tính năng khóa phiên khi không hoạt động.`,pinFormatTip:`Mã PIN phải chứa đúng 4 chữ số`,pinMatchTip:`Mã PIN không khớp`,passwordRequired:`Yêu cầu nhập mật khẩu để xác minh`,sessionLocked:`Phiên bị khóa do không hoạt động`,sessionExpired:`Quá nhiều lần thử thất bại. Phiên đã bị chấm dứt.`,pinIncorrect:`Mã PIN không chính xác`,attemptsRemaining:`Còn lại {{count}} lần thử`,logoutAndReturn:`Đăng xuất phiên`,lockNow:`Khóa ngay`,cfErrorWithDetails:`Lỗi Cloudflare Edge (Lỗi {{code}}: {{desc}}). Dịch vụ tạm thời không khả dụng, vui lòng thử lại sau. {{rayId}}`,cfErrorCodeOnly:`Lỗi Cloudflare Edge (Lỗi {{code}}). Dịch vụ tạm thời không khả dụng. {{rayId}}`,cfErrorGeneric:`Lỗi Cloudflare Edge, dịch vụ tạm thời không khả dụng. Vui lòng thử lại sau. {{rayId}}`,htmlErrorGeneric:`Máy chủ đã trả về phản hồi không mong muốn (HTTP {{status}}). Vui lòng thử lại sau.`,tooManyAttempts:`Quá nhiều yêu cầu hoặc lần thử. Vui lòng thử lại sau.`,dbQuotaExceeded:`Đã vượt quá hạn mức đọc cơ sở dữ liệu hàng ngày. Vui lòng đợi thiết lập lại hàng ngày.`,noUsersRegistered:`Chưa có tài khoản nào được đăng ký. Vui lòng đăng ký làm quản trị viên.`,registerAdminTitle:`Đăng ký tài khoản quản trị viên`,registerAdminDesc:`Hệ thống chưa có tài khoản. Người dùng đầu tiên sẽ trở thành quản trị viên hệ thống.`,goToRegisterAdmin:`Đăng ký quản trị`,dbNotInitialized:`Cơ sở dữ liệu chưa được khởi tạo hoặc thiếu bảng. Vui lòng chạy npm run db:migrate:prod trong terminal.`,verifyWithPasskey:`Xác minh bằng Passkey`,orUseTotp:`Hoặc sử dụng mã xác thực`,passwordRequiredFirst:`Vui lòng nhập mật khẩu trước`,passkeyVerification:`Xác minh Passkey`,passkeyPromptDesc:`Xác minh bằng sinh trắc học hoặc khóa bảo mật đã đăng ký`,forgotPassword:`Quên mật khẩu?`,forgotPasswordTitle:`Đặt lại mật khẩu`,forgotPasswordDesc:`Khôi phục tài khoản an toàn bằng xác thực đa yếu tố (Passkey hoặc TOTP).`,noMfaContactAdmin:`Tài khoản này chưa cấu hình xác thực đa yếu tố (Passkey hoặc TOTP). Vui lòng liên hệ quản trị viên để được đặt lại mật khẩu.`,chooseMfaForReset:`Chọn phương thức xác thực để xác minh danh tính của bạn:`,authViaPasskey:`Xác minh bằng Passkey`,authViaPasskeyDesc:`Xác thực một chạm bằng sinh trắc học hoặc khóa bảo mật phần cứng`,authViaTotp:`Xác minh bằng ứng dụng xác thực (TOTP)`,authViaTotpDesc:`Nhập mã động 6 chữ số từ ứng dụng xác thực của bạn`,authViaRecoveryKey:`Sử dụng khóa khôi phục khẩn cấp`,authViaRecoveryKeyDesc:`Nhập khóa khôi phục khẩn cấp 10 ký tự`,verifyAndProceed:`Xác minh và tiếp tục`,setNewPassword:`Đặt mật khẩu mới`,setNewPasswordDesc:`Xác minh danh tính thành công. Vui lòng đặt mật khẩu mới cho tài khoản của bạn.`,newPassword:`Mật khẩu mới`,confirmNewPassword:`Xác nhận mật khẩu mới`,passwordMismatch:`Mật khẩu mới không khớp`,saveAndReset:`Lưu và đặt lại mật khẩu`,resetSuccessTitle:`Đặt lại mật khẩu thành công`,resetSuccessDesc:`Mật khẩu của bạn đã được cập nhật và tất cả các phiên đăng nhập đã bị hủy. Vui lòng đăng nhập bằng mật khẩu mới.`,goToLogin:`Đến trang đăng nhập`,mfaSetupTitle:`Tăng cường bảo mật tài khoản`,mfaSetupDesc:`Cấu hình xác thực đa yếu tố (MFA) giúp bảo vệ tài khoản, mở khóa đăng nhập không cần mật khẩu và khôi phục tài khoản.`,mfaRecommended:`Khuyên dùng`,passkeySignupDesc:`Sử dụng Touch ID, Face ID hoặc khóa bảo mật. Cực nhanh và chống lừa đảo hiệu quả.`,bindPasskeyNow:`Đăng ký Passkey ngay`,mfaUniversal:`Phổ thông`,totpSignupDesc:`Sử dụng Google Authenticator, 1Password hoặc bất kỳ ứng dụng TOTP tiêu chuẩn nào.`,setupTotpBtn:`Cấu hình ứng dụng xác thực`,skipMfaSetup:`Bỏ qua lúc này`,backToMfaOptions:`Quay lại tùy chọn`,otherOptions:`Tùy chọn khác`,next:`Tiếp theo`,mfaVerification:`Xác thực đa yếu tố`,totpPrompt:`Nhập mã động 6 chữ số từ ứng dụng xác thực của bạn`,recoveryPrompt:`Nhập khóa khôi phục 30 chữ số của bạn (5 nhóm, mỗi nhóm 6 chữ số)`,recoveryChecksumError:`Lỗi tổng kiểm tra: nhóm này không chia hết cho 11`,recoveryChecksumErrorDesc:`Lỗi tổng kiểm tra ở nhóm {{groups}}, vui lòng kiểm tra và thử lại`,backToPasskey:`Quay lại xác thực Passkey`,recoveryKeyRequired:`Vui lòng nhập khóa khôi phục của bạn`,totpFormatError:`Vui lòng nhập mã hợp lệ gồm 6 chữ số`,registrationDisabledTitle:`Đăng ký đã bị tắt`,registrationDisabledDesc:`Tính năng đăng ký người dùng mới hiện đang tạm khóa. Vui lòng liên hệ quản trị viên hệ thống để nhận tài khoản.`,backToLogin:`Quay lại đăng nhập`,jwtSecretPreset:`Đã phát hiện JWT_SECRET mặc định. Vui lòng sửa đổi JWT_SECRET đặt sẵn trong các biến môi trường trước khi triển khai.`,jwtSecretMissing:`Thiếu JWT_SECRET. Vui lòng định cấu hình khóa bảo mật trong các biến môi trường trước khi triển khai.`,jwtSecretInvalid:`Định dạng JWT_SECRET không hợp lệ, vui lòng kiểm tra cấu hình.`},i={title:`Hướng dẫn cài đặt`,subtitle:`Cấu hình thiết bị của bạn để sử dụng DNS Worker và làm chủ an ninh internet.`,regionOptimization:`Tối ưu hóa vùng truy cập (Windows)`,otherRegion:`Các khu vực khác`,copied:`Đã sao chép vào bộ nhớ tạm`,verifyConnection:`Xác minh kết nối của bạn`,verifying:`Đang xác minh...`,connected:`Kết nối bình thường`,notConnected:`Hoặc chưa kết nối`,profileMatch:`Bạn đang lọc thông qua cấu hình này.`,profileMismatch:`Bạn đang sử dụng Obex, nhưng ID cấu hình không khớp.`,verifyHint:`Sau khi hoàn thành cấu hình bên dưới, nhấp vào nút để xác minh.`,refreshStatus:`Làm mới trạng thái`,egressIp:`Địa chỉ IP thoát (Egress IP)`,currentLocation:`Vị trí hiện tại`,edgeServer:`Máy chủ Edge`,dohUrlTitle:`DoH URL của cấu hình hiện tại`,accessPointTitle:`Access DoH URL`,defaultAccessPointName:`Thiết bị-1`,moreAccessPoints:`Xem thêm điểm truy cập ↗`,accessPointName:`Tên điểm truy cập`,accessPointToken:`Khóa truy cập (Access Token)`,addAccessPoint:`Thêm điểm truy cập mới`,renameAccessPoint:`Đổi tên`,rotateToken:`Làm mới khóa (Rotate Token)`,rotateTokenConfirmDesc:`Việc làm mới khóa sẽ khiến tất cả các thiết bị sử dụng khóa cũ bị ngắt kết nối ngay lập tức. Bạn có chắc chắn muốn tiếp tục không?`,deleteAccessPoint:`Xóa`,deleteAccessPointConfirm:`Bạn có chắc chắn muốn xóa điểm truy cập này không?`,manageAccessPoints:`Quản lý điểm truy cập`,searchAccessPoints:`Tìm kiếm điểm truy cập...`,accessPointNameExists:`Tên điểm truy cập đã tồn tại`,accessPointCreated:`Tạo điểm truy cập thành công`,accessPointRenamed:`Đổi tên điểm truy cập thành công`,accessPointDeleted:`Xóa điểm truy cập thành công`,accessPointNameFormatTip:`Gợi ý tên điểm truy cập: 1-30 ký tự, chỉ cho phép chữ cái, số, dấu gạch dưới và dấu gạch ngang`,accessPointLimitExceeded:`Đạt giới hạn số lượng điểm truy cập (tối đa {{max}})`,tokenRotated:`Làm mới khóa truy cập thành công`,whatIsDoh:`DoH là gì?`,dohDesc:`DNS over HTTPS (DoH) là một công nghệ phân giải tên miền thông qua giao thức HTTPS được mã hóa.`,dohBenefit1:`Giảm thiểu việc bị nhà mạng hoặc bên thứ ba chặn và theo dõi`,dohBenefit2:`Tăng cường bảo mật khi phân giải tên miền và truy cập internet`,learnMore:`Tìm hiểu thêm`,copyUrl:`Sao chép URL`,browsers:`Trình duyệt`,browserTitle:`Cấu hình trình duyệt (Chrome/Edge)`,browserSteps:`Cài đặt > Quyền riêng tư và bảo mật > Bảo mật > Sử dụng DNS bảo mật > Tùy chỉnh > Dán URL.`,browserTips:`Hoặc sao chép địa chỉ này vào thanh địa chỉ:`,apple:`Apple`,appleTitle:`macOS / iOS / iPadOS / tvOS`,appleDesc:`Các thiết bị Apple hỗ trợ cấu hình nhanh thông qua tệp cấu hình (Profile).`,appleWarning:`Không thể cài đặt tệp cấu hình trong "Chế độ phong tỏa (Lockdown Mode)", vui lòng đảm bảo hệ thống không ở trạng thái này trước khi cài đặt.`,downloadConfig:`Tải tệp cấu hình`,appleInstallHint:`Sau khi tải về, vui lòng đi tới "Cài đặt" > "Đã tải về hồ sơ" để cài đặt`,windows:`MS Windows`,windowsTitle:`Cấu hình Windows 11 [Vùng: {{region}}]`,windowsStep0:`Cài đặt > Mạng & Internet`,windowsStep1:`Thuộc tính > Máy chủ DNS > Chỉnh sửa > Thủ công.`,windowsStep2:`Chọn và nhập DNS IP:`,windowsStep3:`Bật DoH (Mẫu thủ công) và dán URL.`,windowsStep4:`Tắt "Dự phòng sang bản rõ" (Fallback to plaintext).`,android:`Android`,androidTitle:`Android 9+`,androidDesc:`Hỗ trợ 'DNS riêng tư' gốc của hệ thống (DoT) hoặc ứng dụng bên thứ ba cho DoH.`,androidDotTitle:`DNS riêng tư (DoT - Chế độ Serverfull)`,androidDotDesc:`Cài đặt > Mạng và internet > DNS riêng tư > Tên máy chủ của nhà cung cấp DNS riêng tư:`,androidWarning:`Lưu ý: 'DNS riêng tư' gốc của Android sử dụng giao thức DoT. Khi triển khai trên Cloudflare Workers, hãy dùng ứng dụng như Intra cho DoH. Khi chạy ở chế độ Serverfull đã cấu hình TLS, bạn có thể sử dụng trực tiếp tên máy chủ DoT ở trên.`,dynamicFromDomain:`Động (từ "{{domain}}")`,dynamicFromDomainV6:`Động IPv6 (từ "{{domain}}")`,linux:`Linux`,linuxTitle:`Linux (Proxy Cloudflared DoH)`,linuxDesc:`Chạy một proxy DNS nhẹ tại địa phương, mã hóa và chuyển tiếp các yêu cầu phân giải đến Obex thông qua DoH.`,linuxStep1:`Chạy đoạn mã sau để cài đặt cloudflared và tạo dịch vụ systemd (lắng nghe tại 127.0.0.1:53).`,linuxStep2:`Thay đổi DNS hệ thống thành 127.0.0.1.`,routeros:`MikroTik`,routerosTitle:`MikroTik RouterOS`,routerosDesc:`Dùng trình phân giải này cho mọi thiết bị trong mạng bằng cách đặt nó làm máy chủ DoH của router.`,routerosStep1:`Chạy trong terminal RouterOS (RouterOS 7):`,routerosNote:`Các truy vấn do router chuyển tiếp sẽ hiển thị trong nhật ký là router, không phải từng thiết bị. Hãy cấu hình trực tiếp trên thiết bị nếu bạn cần nhật ký theo từng thiết bị.`,routerosDocs:`Tài liệu DNS của MikroTik`,accessPointsCardTitle:`Điểm truy cập`,currentAccessPoint:`Điểm truy cập hiện tại`,selectAccessPointToConfigure:`Chọn điểm truy cập để định cấu hình`},a={title:`Quy tắc tùy chỉnh`,subtitle:`Kiểm soát thủ công hành vi phân giải cho các tên miền cụ thể (Chặn, Cho phép hoặc Chuyển hướng).`,action:`Hành động`,typeBlock:`Chặn (BLOCK)`,typeAllow:`Cho phép (ALLOW)`,typeRedirect:`Chuyển hướng (REDIRECT)`,pattern:`Mẫu tên miền (Pattern)`,patternPlaceholder:`example.com hoặc *.test.com`,addRule:`Thêm quy tắc`,redirectSettings:`Cài đặt bản ghi chuyển hướng`,aRecord:`Bản ghi A (IPv4)`,aaaaRecord:`Bản ghi AAAA (IPv6)`,cnameRecord:`Bản ghi CNAME`,txtRecord:`Bản ghi TXT`,optional:`(Tùy chọn)`,ipv4Placeholder:`Ví dụ: 1.2.3.4`,ipv6Placeholder:`Ví dụ: 2001:db8::1`,cnamePlaceholder:`Ví dụ: target.com`,txtPlaceholder:`Nhập nội dung văn bản...`,saveRedirectRule:`Lưu và thêm quy tắc chuyển hướng`,noRulesTitle:`Không có quy tắc tùy chỉnh`,noRulesDesc:`Bạn chưa thêm bất kỳ quy tắc thủ công nào.`,tableAction:`Hành động`,tablePattern:`Mẫu`,tableDetails:`Chi tiết phân giải`,tableOps:`Thao tác`,labelBlock:`Chặn`,labelAllow:`Cho phép`,labelRedirect:`Chuyển hướng`,detailBlock:`Phân giải thành`,detailAllow:`Chuyển tiếp đến dịch vụ thượng nguồn`,patternEmpty:`Mẫu tên miền không được để trống`,duplicatePattern:`Quy tắc cho tên miền này đã tồn tại`,addSuccess:`Thêm quy tắc thành công`,addFailed:`Thêm quy tắc thất bại`,updateSuccess:`Cập nhật quy tắc thành công`,updateFailed:`Cập nhật quy tắc thất bại`,tableCreatedAt:`Thời gian thêm`,clickToSort:`Nhấp để sắp xếp`},o={customRange:`Khoảng thời gian tùy chỉnh`,startTime:`Thời gian bắt đầu`,endTime:`Thời gian kết thúc`,apply:`Áp dụng`,custom:`Tùy chỉnh`,totalQueries:`Tổng số truy vấn`,blocked:`Đã chặn`,redirected:`Đã chuyển hướng`,blockRate:`Tỷ lệ chặn`,activeDevices:`Thiết bị đang hoạt động`,activeIPs:`Địa chỉ IP đang hoạt động`,queryTrend:`Xu hướng truy vấn`,noRecords:`Không có bản ghi nào trong khoảng thời gian này`,topAllowed:`Tên miền thường dùng (Được cho phép)`,topBlocked:`Tên miền bị chặn nhiều nhất (Bị chặn)`,noData:`Không có dữ liệu`,clientActivity:`Hoạt động của máy khách`,ipAddress:`Địa chỉ IP`,location:`Vị trí`,queries:`Số truy vấn`,destinationDistribution:`Phân bổ đích đến của lưu lượng`,requests:`Yêu cầu`,topIsps:`Nhà mạng chính (ISP)`,pressToShowMore:`Nhấn để xem thêm`,maximize:`Phóng to`,minimize:`Thu nhỏ`},s={title:`Nhật ký truy vấn`,subtitle:`Xem nhật ký phân giải DNS và bản ghi chặn của cấu hình này.`,realtime:`Thời gian thực`,allStatus:`Tất cả trạng thái`,onlyPass:`Đã cho phép`,onlyBlock:`Đã chặn`,onlyRedirect:`Đã chuyển hướng`,searchPlaceholder:`Tìm kiếm tên miền...`,noResults:`Không tìm thấy kết quả`,noRecords:`Chưa có bản ghi nào`,noResultsDesc:`Không tìm thấy bản ghi tên miền nào khớp với "{{query}}".`,noRecordsDesc:`Không nhận được truy vấn DNS nào trong khoảng thời gian đã chọn.`,tableTime:`Thời gian`,tableDomain:`Tên miền`,tableAnswer:`Kết quả phân giải`,tableSource:`Nguồn`,tableType:`Loại`,tableStatus:`Trạng thái`,tableReason:`Lý do`,loadedAll:`Đã tải toàn bộ {{count}} bản ghi`,realtimeLoadMoreTip:`Tắt chế độ “Thời gian thực” để tải thêm`,filterAccessPoint:`Điểm truy cập`,allAccessPoint:`Tất cả điểm truy cập`,allCountry:`Tất cả quốc gia`,filterCountry:`Quốc gia đích`,allIsp:`Tất cả ISP`,filterIsp:`ISP`,timeRange:`Khoảng thời gian`,clearFilters:`Xóa bộ lọc`,details:`Chi tiết truy vấn`,detailAccessPoint:`Điểm truy cập`,basicInfo:`Thông tin cơ bản`,detailDomain:`Tên miền`,detailType:`Loại`,detailTime:`Thời gian`,detailLatency:`Thời gian phản hồi`,detailProfile:`Cấu hình sử dụng`,detailStatus:`Trạng thái`,detailUpstream:`Máy chủ thượng nguồn`,detailReason:`Lý do`,detailNoReason:`Không có (Đã cho phép)`,detailECS:`ECS`,resolutionResult:`Kết quả phân giải`,noResult:`Không có kết quả`,networkDetails:`Chi tiết mạng`,clientSource:`Máy khách (Nguồn)`,destination:`Đích đến (Địa chỉ phân giải)`,quickActions:`Thao tác nhanh`,actionAllow:`Cho phép`,actionBlock:`Chặn`,actionRedirect:`Chuyển hướng`,statusPass:`Đã cho phép`,statusBlock:`Đã chặn`,statusRedirect:`Đã chuyển hướng`,export:`Xuất nhật ký`,rewritten:`Đã viết lại`,logDetails:`Chi tiết nhật ký`,searchCountry:`Tìm kiếm quốc gia...`,noMatchingCountries:`Không tìm thấy quốc gia phù hợp`,searchIsp:`Tìm kiếm nhà mạng/ISP...`,noMatchingIsps:`Không tìm thấy ISP phù hợp`,loadingIsps:`Đang tải danh sách ISP...`,loggingDisabledTitle:`Ghi nhật ký đã bị tắt`,loggingDisabledDesc:`Thời gian lưu giữ nhật ký cho hồ sơ này được đặt thành 'Tắt'. Không có nhật ký truy vấn nào được ghi lại. Để xem nhật ký, hãy bật lưu giữ nhật ký trong Cài đặt.`},c={title:`Danh sách chặn bên ngoài`,subtitle:`Đăng ký danh sách chặn tên miền do bên thứ ba duy trì (như AdGuard, v.v.).`,formatDisclaimer:`Hệ thống này chỉ hỗ trợ một số định dạng danh sách AdGuard giới hạn và danh sách tên miền thuần túy. Chỉ hỗ trợ các quy tắc chặn cơ bản (ví dụ: ||example.com^), sẽ bỏ qua danh sách trắng "@@", hiện chưa hỗ trợ các quy tắc viết lại "$" và quy tắc rút gọn "*". Hệ thống sẽ tự động khớp tất cả các tên miền phụ của tên miền.`,syncAll:`Đồng bộ tất cả danh sách`,urlPlaceholder:`Nhập URL danh sách chặn...`,addSubscription:`Thêm đăng ký`,supportedFormats:`Các định dạng danh sách được hỗ trợ:`,formatAdGuard:`Tương thích với các quy tắc lọc như ||domain.com^.`,formatHosts:`Tương thích với tệp hosts tiêu chuẩn (ví dụ: 0.0.0.0 domain.com).`,noListsTitle:`Chưa thêm danh sách nào`,noListsDesc:`Bạn chưa đăng ký bất kỳ danh sách chặn bên ngoài nào.`,tableUrl:`URL danh sách`,tableLastSync:`Lần đồng bộ cuối`,tableStatus:`Trạng thái`,tableOps:`Thao tác`,neverSynced:`Chưa bao giờ`,enabled:`Bình thường`,disabled:`Đồng bộ thất bại`,statusNormal:`Bình thường`,statusDisabled:`Đã tắt`,statusOutdated:`Hết hạn`,statusMissing:`Thiếu`,presetOisdBig:`OISD Big (Chặn quảng cáo/phần mềm độc hại, v.v.)`,presetOisdNsfw:`OISD NSFW (Chặn nội dung khiêu dâm/nhạy cảm/người lớn)`,presetAdGuard:`AdGuard AdServers (Máy chủ quảng cáo)`,presetStevenBlack:`StevenBlack Hosts (Chặn tổng hợp)`,syncTaskStarted:`Bắt đầu tác vụ đồng bộ`,syncCheckComplete:`Kiểm tra đồng bộ hoàn tất`,syncTaskFailed:`Đồng bộ thất bại`,syncing:`Đang đồng bộ...`,syncSuccess:`Đồng bộ thành công`,syncError:`Đồng bộ thất bại`,syncErrorDesc:`Không thể tải xuống hoặc phân tích danh sách chặn này. Vui lòng kiểm tra xem liên kết có đúng không và đảm bảo liên kết có thể truy cập bình thường.`,deleteConfirm:`Xác nhận xóa đăng ký?`,deleteSuccess:`Xóa danh sách thành công`,deleteError:`Xóa danh sách thất bại`,addSuccess:`Thêm danh sách thành công`,addError:`Thêm danh sách thất bại`,listEnabled:`Danh sách hoạt động`,listEnabledHint:`Tắt để ngừng lọc bằng danh sách này mà không cần xoá. Đăng ký và lịch sử đồng bộ vẫn được giữ lại.`,listEnabledToast:`Đã bật danh sách - đang xây dựng lại bộ lọc`,listDisabledToast:`Đã tắt danh sách - đang xây dựng lại bộ lọc`,checkDomain:`Kiểm tra một tên miền`,checkDomainHint:`Danh sách được lưu dưới dạng bộ lọc nén, do đó không thể duyệt các mục trong đó. Bạn có thể kiểm tra ngay bất kỳ tên miền nào với danh sách này.`,check:`Kiểm tra`,checkBlocked:`Bị chặn bởi danh sách này`,checkNotBlocked:`Không bị chặn bởi danh sách này`,checkViaParent:`(khớp với tên miền cha)`,checkNotSynced:`Danh sách này chưa đồng bộ xong, nên chưa có gì để kiểm tra.`,checkListDisabled:`Danh sách này hiện đang tắt, nên không lọc gì vào lúc này.`,checkProbabilisticRate:`Bộ lọc mang tính xác suất: khoảng 1 trong {{odds}} lượt khớp là dương tính giả. Thêm ngoại lệ cũng áp dụng cho mọi tên miền con của nó.`,checkProbabilistic:`Bộ lọc mang tính xác suất, nên một phần nhỏ các lượt khớp là dương tính giả. Thêm ngoại lệ cũng áp dụng cho mọi tên miền con của nó.`,checkAllowAction:`Vẫn cho phép`,checkAllowed:`Đã thêm ngoại lệ - tên miền này giờ đã phân giải được`,allowRuleAdded:`Đã thêm ngoại lệ cho {{domain}}`},l={title:`Cài đặt cấu hình`,subtitle:`Quản lý chiến lược phân giải DNS và các tùy chọn nâng cao của bạn.`,saveChanges:`Lưu tất cả thay đổi`,saveSuccess:`Lưu cài đặt thành công`,saveError:`Lưu cài đặt thất bại, vui lòng thử lại sau`,upstreamTitle:`Dịch vụ thượng nguồn`,dohUrl:`DoH URL`,dnsIP:`DNS IP`,classicDns:`DNS truyền thống`,httpsOnly:`Chỉ hỗ trợ HTTPS`,upstreamDesc:`Tất cả các truy vấn không bị chặn sẽ được chuyển tiếp đến máy chủ này. Hỗ trợ DoH (HTTPS), DoT (tls://), DNS Stamp (sdns://) hoặc DNS truyền thống. DNS truyền thống được chuyển tiếp qua TCP.`,defaultPolicyTitle:`Hành vi chặn mặc định`,onNoMatch:`Khi không khớp quy tắc`,allowAll:`Cho phép tất cả truy vấn`,blockAll:`Chặn tất cả truy vấn`,logRetentionTitle:`Lưu giữ nhật ký`,retentionDuration:`Thời gian lưu giữ`,retentionDesc:`Nhật ký được xóa tự động. `,skipLogOnPass:`Không ghi nhật ký các truy vấn được phép`,skipLogOnPassDesc:`Khi bật, các truy vấn được phép thông thường sẽ không được ghi lại. Chỉ các truy vấn bị chặn, chuyển hướng hoặc thất bại mới được lưu.`,ecsTitle:`EDNS Client Subnet (ECS)`,ecsUpstreamHint:`ECS-подсеть, отправляемая на upstream-сервер`,sendEcs:`Gửi ECS`,customSubnet:`Mạng con tùy chỉnh`,customIpv4:`Mạng con IPv4 tùy chỉnh`,customIpv6:`Mạng con IPv6 tùy chỉnh`,ipv4Hint:`(Ví dụ: 1.2.3.0/24)`,ipv6Hint:`(Ví dụ: 2001:db8::/32)`,testToolTitle:`Công cụ kiểm tra phân giải thời gian thực`,testDomain:`Tên miền kiểm tra`,recordType:`Loại bản ghi`,runTest:`Chạy kiểm tra`,domainPlaceholder:`Ví dụ: google.com`,hitRule:`Quy tắc khớp / Lý do`,defaultAllow:`Chiến lược cho phép mặc định`,parseLatency:`Thời gian phân giải`,sourceIp:`Địa chỉ IP nguồn`,answerSection:`Kết quả phân giải (Answer Section)`,noRecordsReturned:`Truy vấn này không trả về bất kỳ bản ghi nào.`,diagnostics:`Thông tin chẩn đoán`,errorDetail:`Chi tiết lỗi`,upstreamResponse:`Phản hồi từ máy chủ nguồn`,presetCloudflareSecurity:`Cloudflare Security (Nhanh/Chặn tên miền độc hại/Chặn tên miền lừa đảo)`,presetCloudflareFamilies:`Cloudflare Families (Nhanh/Chặn tên miền độc hại/Chặn nội dung người lớn)`,presetQuad9:`Quad9 (Chặn tên miền độc hại/Không lưu nhật ký/Không gửi ECS)`,presetQuad9Ecs:`Quad9 ECS (Chặn tên miền độc hại/Không lưu nhật ký/Có gửi ECS)`,presetControlDFree:`ControlD Free (Chặn quảng cáo/Theo dõi/Tên miền độc hại/Lừa đảo)`,presetControlDUncensored:`ControlD Uncensored (Chống kiểm duyệt)`,presetAdGuard:`AdGuard (Chặn quảng cáo/Theo dõi)`,presetAdGuardFamily:`Bảo vệ gia đình AdGuard (Chặn quảng cáo/Theo dõi/Nội dung người lớn/Tìm kiếm an toàn)`,retention10m:`10 phút`,retention1h:`1 giờ`,retention24h:`24 giờ`,retention7d:`7 ngày`,retention30d:`30 ngày`,retention90d:`90 ngày (Tối đa)`,blockModeTitle:`Chế độ phản hồi khi chặn`,blockModeDesc:`Nội dung trả về khi tên miền bị chặn`,default:`Mặc định`,NXDOMAIN:`Tên miền không tồn tại (NXDOMAIN)`,NODATA:`Không có dữ liệu (NODATA)`,customIP:`IP tùy chỉnh`,export:`Xuất cấu hình`,exportSuccess:`Xuất cấu hình thành công`,exportError:`Xuất cấu hình thất bại, vui lòng thử lại sau`,nameUpdateSuccess:`Tên cấu hình đã được cập nhật`,saving:`Đang lưu...`,echTitle:`Ghi đè ECH`,enableEch:`Bật ghi đè ECH`,echDesc:`Đối với các miền qua Cloudflare, tự động ghi đè tham số ECH và SNI bên ngoài khi truy vấn HTTPS (Type 65) / SVCB (Type 64) để bảo vệ quyền riêng tư.`,echFrontingTitle:`SNI bên ngoài (ECH Fronting)`,echFrontingDesc:`Tên miền hiển thị ở dạng văn bản thuần trong bắt tay TLS bên ngoài`,echFrontingCustomPlaceholder:`Nhập miền fronting tùy chỉnh, ví dụ: crypto.cloudflare.com`,echPreferred:`Ưu tiên`,whatIsEch:`ECH (Encrypted Client Hello) là gì?`,echHelpDesc:`ECH là tiện ích mở rộng quyền riêng tư của TLS 1.3 giúp mã hóa hoàn toàn tên miền thực (Inner SNI), chỉ để lộ tên miền ngụy trang (Outer SNI) cho bên trung gian.`,echHelpBenefit1:`Ngăn chặn nhà mạng và bên trung gian theo dõi miền phụ bạn đang truy cập`,echHelpBenefit2:`Kết hợp với DoH để loại bỏ rò rỉ SNI dạng văn bản thuần`,retentionDisabled:`Tắt (Bảo vệ quyền riêng tư)`,retentionDisabledDesc:`Ghi nhật ký đã bị tắt. Hệ thống sẽ không ghi lại bất kỳ nhật ký truy vấn DNS nào và sẽ xóa ngay nhật ký lịch sử.`},u=JSON.parse(`{"title":"Cài đặt tài khoản","subtitle":"Quản lý thông tin bảo mật và người dùng hệ thống của bạn.","jwtSecretWarningTitle":"Cảnh báo bảo mật: Mã bí mật JWT yếu","jwtSecretWarningDesc":"JWT_SECRET hiện tại có ít hơn 32 ký tự, tiềm ẩn rủi ro bảo mật. Vui lòng cấu hình biến môi trường KEK_v1 trước khi xoay vòng JWT_SECRET để đảm bảo các khóa TOTP và khóa khôi phục được mã hóa phong bì vẫn có thể giải mã được.","roleAdmin":"Quản trị viên hệ thống","roleUser":"Người dùng","personalInfo":"Thông tin cá nhân","username":"Tên đăng nhập","userId":"ID người dùng","changePassword":"Đổi mật khẩu","currentPassword":"Mật khẩu hiện tại","newPassword":"Mật khẩu mới","updatePassword":"Cập nhật mật khẩu","userManagement":"Quản lý người dùng (Quản trị viên)","createUser":"Tạo người dùng","role":"Vai trò","createdAt":"Thời gian tạo","lastActive":"Hoạt động lần cuối","lastResolve":"Phân giải lần cuối","actions":"Thao tác","dangerZone":"Khu vực nguy hiểm","clearLogs":"Xóa tất cả nhật ký","clearLogsDesc":"Hành động này sẽ xóa nhật ký truy vấn được tạo bởi tất cả các cấu hình DNS dưới tên bạn. Hành động này không thể hoàn tác.","clearLogsBtn":"Xóa nhật ký ngay bây giờ","deleteAccount":"Xóa tài khoản","deleteAccountDesc":"Xóa vĩnh viễn tài khoản của bạn và tất cả dữ liệu liên quan. Hành động này sẽ khiến bạn mất tất cả các cấu hình phân giải.","deleteAccountBtn":"Xóa tài khoản vĩnh viễn","createNewUser":"Tạo người dùng mới","initialPassword":"Mật khẩu khởi tạo","userRole":"Vai trò người dùng","cancel":"Hủy","createNow":"Tạo ngay","formatTipUsername":"Định dạng tên đăng nhập: Chỉ từ 5 đến 32 ký tự theo định dạng Unix","formatTipPassword":"Định dạng mật khẩu: 12-100 ký tự","passwordSuccess":"Đổi mật khẩu thành công","updateFailed":"Cập nhật thất bại","confirmDeleteUser":"Bạn có chắc chắn muốn xóa người dùng này không? Tất cả cấu hình họ sở hữu cũng sẽ bị xóa.","confirmClearLogs":"Bạn có chắc chắn muốn xóa nhật ký truy vấn của tất cả cấu hình dưới tên bạn không? Hành động này không thể hoàn tác.","clearLogsSuccess":"Nhật ký đã được xóa thành công","confirmDeleteAccount":"Cảnh báo: Bạn có chắc chắn muốn xóa tài khoản này không?\\n\\nTất cả cấu hình DNS, quy tắc tùy chỉnh và nhật ký truy vấn của bạn sẽ bị xóa vĩnh viễn. Hành động này không thể đảo ngược!","inactivityPolicy":"Chính sách hoạt động","inactivityDesc":"Để bảo vệ quyền riêng tư của người dùng và tiết kiệm tài nguyên, tất cả nhật ký truy vấn và cấu hình DNS của các tài khoản không có hoạt động phân giải trong 30 ngày sẽ được tự động xóa. Bản thân tài khoản sẽ bị xóa sau 90 ngày không đăng nhập.","systemSettings":"Cài đặt hệ thống (Quản trị viên)","adminOnlyView":"Chỉ dành cho quản trị viên","featureToggle":"Bật/Tắt tính năng","enableTurnstileSignup":"Bật xác minh người máy trên trang đăng ký","enableTurnstileLogin":"Bật xác minh người máy trên trang đăng nhập","totp":{"title":"Ứng dụng xác thực (TOTP)","enabled":"Đã bật","disabled":"Chưa bật","setupDesc":"Thêm một lớp bảo mật bổ sung cho tài khoản của bạn. Sử dụng Google Authenticator, Authy hoặc bất kỳ ứng dụng tương thích TOTP nào.","setupBtn":"Cấu hình ứng dụng xác thực (TOTP)","scanQR":"Sử dụng ứng dụng xác thực để quét mã QR này:","orEnterManually":"Hoặc nhập khóa thủ công:","enterCode":"Vui lòng nhập mã từ ứng dụng xác thực để xác nhận:","enterCodeHint":"Nhập mã xác thực 6 chữ số để xác nhận khóa đã được ghi lại chính xác.","activate":"Kích hoạt TOTP","skipPassword":"Đăng nhập không mật khẩu — Chỉ hiển thị ô nhập TOTP khi đăng nhập (không hiển thị mật khẩu)","disable":"Tắt ứng dụng xác thực (TOTP)","disableTitle":"Tắt ứng dụng xác thực (TOTP)","disableWarning":"Sau khi tắt TOTP, nếu chưa cấu hình Passkey, tài khoản của bạn sẽ chỉ được bảo vệ bằng mật khẩu.","confirmDisable":"Tắt TOTP","recoveryKeysTitle":"Vui lòng lưu các khóa khôi phục của bạn","recoveryKeysWarning":"Vui lòng lưu khóa khôi phục ở nơi an toàn (như trình quản lý mật khẩu). Mỗi khóa chỉ có thể sử dụng một lần.","copyKeys":"Sao chép tất cả khóa","copied":"Đã sao chép!","done":"Xong, tôi đã lưu khóa","activeDesc":"Ứng dụng xác thực (TOTP) đang hoạt động và tạo mã xác nhận 6 chữ số."},"activity":{"title":"Nhật ký hoạt động tài khoản","action":"Sự kiện","time":"Thời gian","ip":"IP địa chỉ","session":"Phiên làm việc","empty":"Chưa có nhật ký hoạt động.","loadMore":"Tải thêm","signup":"Đăng ký","loginSuccess":"Đăng nhập thành công","loginFail":"Đăng nhập thất bại","logout":"Đăng xuất","pwChangeSuccess":"Đổi mật khẩu thành công","pwChangeFail":"Đổi mật khẩu thất bại","totpVerifySuccess":"Xác minh TOTP thành công","totpVerifyFail":"Xác minh TOTP thất bại","totpSetup":"Đã thiết lập ứng dụng TOTP","totpRemoved":"Đã tắt ứng dụng TOTP","recoveryKeyUsed":"Sử dụng khóa khôi phục","sessionRevoked":"Phiên làm việc đã bị thu hồi","reasons":{"user_active":"Người dùng chủ động đăng xuất","user_revoke":"Thu hồi phiên làm việc","expired":"Phiên đã hết hạn","geolocation_mismatch":"Hạn chế truy cập từ vị trí khác","geolocation_missing":"Thiếu thông tin vị trí địa lý","token_reuse":"Sử dụng lại mã xác thực (Cảnh báo bảo mật)"},"passkeyRegistered":"Đăng ký Passkey","passkeyDeleted":"Xóa Passkey","passkeyVerifySuccess":"Xác minh Passkey thành công","passkeyVerifyFail":"Xác minh Passkey thất bại","recoveryKeyRotated":"Khóa khôi phục đã được xoay vòng"},"sessions":{"title":"Phiên hoạt động","session":"Phiên","device":"Thiết bị","ip":"Địa chỉ IP","loginTime":"Thời gian đăng nhập","expires":"Hết hạn","action":"Hành động","current":"Hiện tại","revoke":"Thu hồi","revokeFailed":"Không thể thu hồi phiên.","empty":"Không tìm thấy phiên hoạt động nào.","unknownDevice":"Thiết bị không xác định","revokeOthers":"Thu hồi các phiên khác","confirmRevokeOthers":"Thu hồi các phiên khác","revokeOthersConfirmText":"Bạn có chắc chắn muốn thu hồi tất cả các phiên hoạt động khác không? Tất cả các thiết bị đã đăng nhập khác sẽ bị đăng xuất ngay lập tức."},"passkey":{"title":"Mã khóa (Passkey)","addBtn":"Thêm Passkey","desc":"Sử dụng xác thực sinh trắc học (Touch ID, Face ID, Windows Hello) hoặc khóa bảo mật (YubiKey) để xác thực đa yếu tố nhanh chóng và chống lừa đảo.","empty":"Chưa có Passkey nào được thêm.","addTitle":"Thêm Passkey","nameLabel":"Tên Passkey","namePlaceholder":"vd: my_passkey","promptNotice":"Sau khi nhấp tiếp tục, trình duyệt sẽ nhắc bạn hoàn tất đăng ký sinh trắc học hoặc khóa bảo mật.","continue":"Tiếp tục","renameTitle":"Đổi tên Passkey","deleteTitle":"Xóa Passkey","deleteConfirm":"Bạn có chắc chắn muốn xóa Passkey \\"{{name}}\\" không? Bạn sẽ không thể sử dụng nó để xác thực đa yếu tố nữa.","defaultName":"Passkey","notSupported":"Trình duyệt hoặc môi trường hiện tại của bạn không hỗ trợ Passkey (WebAuthn).","regFailed":"Đăng ký Passkey thất bại","count":"{{count}} đã định cấu hình","none":"Chưa định cấu hình","created":"Thời gian tạo","lastUsed":"Sử dụng lần cuối","neverUsed":"Chưa từng sử dụng","updated":"Cập nhật Passkey thành công","registered":"Đã đăng ký Passkey thành công","deleted":"Đã xóa Passkey","appNameLabel":"Tên miền","appNameHelper":"Mã khóa sẽ được liên kết với tên miền này","formatTip":"Gợi ý tên Passkey: 1-30 ký tự, chỉ cho phép chữ cái, số, dấu gạch dưới và dấu gạch ngang","verifyPrompt":"Xác thực bằng sinh trắc học thiết bị hoặc khóa bảo mật.","changePwNotice":"Bạn sẽ được nhắc xác thực bằng Passkey khi gửi biểu mẫu.","submitNotice":"Bạn sẽ được nhắc xác thực bằng Passkey khi gửi biểu mẫu."},"mfaNone":"Không","resetUserPassword":"Đặt lại mật khẩu","resetPasswordTitle":"Đặt lại mật khẩu người dùng","resetPasswordWarning":"Sau khi đặt lại, tất cả các phiên đăng nhập của người dùng sẽ bị hủy ngay lập tức.","resetPasswordSuccess":"Đặt lại mật khẩu thành công. Các phiên trước đó đã bị hủy.","confirmReset":"Xác nhận đặt lại","mfa":{"title":"Xác thực đa yếu tố (MFA)","enabled":"Đã cấu hình","notConfigured":"Chưa cấu hình","desc":"Khóa truy cập (Passkey) và ứng dụng xác thực (TOTP) đều là phương thức MFA. Cấu hình ít nhất một phương thức để bảo vệ tài khoản.","passwordlessTitle":"Đăng nhập không mật khẩu","passwordlessDesc":"Khi bật, đăng nhập sẽ bỏ qua mật khẩu và xác minh danh tính trực tiếp qua Passkey hoặc TOTP.","unconfiguredHint":"Chưa có phương thức MFA nào được cấu hình. Hãy thiết lập Passkey hoặc ứng dụng xác thực bên dưới."},"recoveryKey":{"title":"Khóa khôi phục khẩn cấp","desc":"Khóa khôi phục khẩn cấp cho phép bạn lấy lại quyền truy cập hoặc đặt lại mật khẩu nếu mất tất cả Passkey hoặc ứng dụng xác thực. Được bảo vệ bởi mã hóa phong bì KEK.","configured":"Đã cấu hình","notConfigured":"Chưa cấu hình","kekProtected":"Được mã hóa KEK","kekTooltip":"Được bảo vệ bằng mã hóa phong bì AES-256-GCM dựa trên KEK.","viewBtn":"Xem khóa khôi phục","rotateBtn":"Xoay vòng khóa","yourKey":"Khóa khôi phục 30 chữ số của bạn","securityTip":"Giữ bí mật khóa này. Bất kỳ ai có quyền truy cập đều có thể truy cập tài khoản của bạn.","rotateConfirm":"Xoay vòng khóa sẽ vô hiệu hóa khóa hiện tại ngay lập tức. Bạn có muốn tiếp tục không?","confirmRotateBtn":"Tiến hành xoay vòng","viewVerifyTitle":"Xác minh danh tính để xem khóa","rotateVerifyTitle":"Xác minh danh tính để xoay vòng khóa","rotateSuccess":"Khóa khôi phục đã được xoay vòng thành công! Vui lòng lưu trữ khóa mới ở nơi an toàn ngay lập tức.","legacyNotice":"Khóa của bạn được lưu trữ dưới dạng băm một chiều cũ và không thể giải mã. Vui lòng xoay vòng khóa để tạo khóa mới được mã hóa KEK."},"verifyIdentity":"Xác minh bảo mật","verifyIdentityDesc":"Để bảo vệ tài khoản của bạn, vui lòng xác minh danh tính trước khi tiếp tục.","usePasskeyInstead":"Xác thực bằng Passkey","changePasswordWithPasskey":"Xác minh bằng Passkey & Cập nhật mật khẩu","enableRegistration":"Cho phép đăng ký người dùng mới"}`),d={item1Title:`Obex Protective DNS`,item1Desc:`Bộ phân giải DNS dựa trên Cloudflare Workers & D1, nỗ lực tối đa vì tốc độ và bảo mật.`,item2Title:`Bảo vệ quyền riêng tư DoH`,item2Desc:`Ngăn chặn việc bị chặn và tăng cường quyền riêng tư thông qua đường hầm mã hóa DNS over HTTPS (RFC 8484).`,item3Title:`Mạng lưới biên toàn cầu`,item3Desc:`Dựa trên mạng lưới biên rộng lớn của Cloudflare để có tốc độ phân giải cực nhanh và độ trễ cực thấp.`,item4Title:`Lọc tinh vi`,item4Desc:`Hỗ trợ đầy đủ danh sách đen/trắng, quy tắc AdGuard và chuyển hướng bản ghi DNS tùy chỉnh.`,item5Title:`Thống kê và phân tích thời gian thực`,item5Desc:`Hiển thị trực quan tình trạng sức khỏe của mạng thông qua nhật ký truy vấn chi tiết và bảng điều khiển thống kê tổng hợp.`,item6Title:`Giao diện hiện đại & Chế độ tối`,item6Desc:`Bảng quản lý mật độ cao được thiết kế cho các kỹ sư và người dùng gia đình, dựa trên Blueprint UI của Palantir.`,item7Title:`Cơ sở hạ tầng Cloud Native`,item7Desc:`Kiến trúc không máy chủ (Serverless) đảm bảo không tốn công bảo trì và khả năng mở rộng vô hạn cho DNS cá nhân.`,item8Title:`Quản lý nhiều cấu hình`,item8Desc:`Tạo và quản lý nhiều cấu hình độc lập cho các thiết bị hoặc môi trường mạng khác nhau.`,item9Title:`Quản lý nhiều điểm truy cập`,item9Desc:`Cấu hình các điểm truy cập DNS riêng cho các thiết bị khác nhau, thực hiện cách ly và phân tích tinh vi dữ liệu nhật ký và thống kê.`},f={title:`Hướng dẫn Thiết lập & Triển khai DNS Worker`,subtitle:`Phiên bản của bạn chưa được cấu hình đầy đủ. Vui lòng hoàn thành các bước bên dưới để kích hoạt DNS Worker.`,dbStatus:`Liên kết Cơ sở Dữ liệu D1 (env.DB)`,jwtStatus:`Khóa Bí mật JWT (env.JWT_SECRET)`,configured:`Đã cấu hình`,missing:`Thiếu / Chưa cấu hình`,refresh:`Tải lại & Xác minh`,methodCli:`Triển khai bằng CLI`,methodDash:`Triển khai bằng Bảng điều khiển Cloudflare`,copy:`Sao chép`,copied:`Đã sao chép!`,stepDbTitle:`1. Liên kết Cơ sở Dữ liệu D1`,stepDbDesc:`Tạo một cơ sở dữ liệu D1 và liên kết nó với worker của bạn. Chạy lệnh sau trong terminal:`,stepDbCommand1:`wrangler d1 create dns_worker_db`,stepDbDesc2:`Sao chép thông tin cơ sở dữ liệu D1 đầu ra và dán vào file wrangler.toml dưới mục [[d1_databases]]:`,stepDbCommand2:`[[d1_databases]]
2
+ binding = "DB"
3
+ database_name = "dns_worker_db"
4
+ database_id = "<D1_DATABASE_ID_CỦA_BẠN>"
5
+ migrations_dir = "migrations"`,stepDbDashDesc:`1. Truy cập Bảng điều khiển Cloudflare -> Workers & Pages -> D1 -> Tạo Cơ sở dữ liệu -> Đặt tên là 'dns_worker_db'.
6
+ 2. Truy cập Worker của bạn -> Cài đặt -> Biến -> Liên kết Cơ sở Dữ liệu D1 -> Thêm liên kết.
7
+ 3. Đặt tên liên kết là 'DB', và chọn cơ sở dữ liệu 'dns_worker_db'. Lưu.
8
+ 4. Truy cập Cơ sở dữ liệu D1 -> Bảng điều khiển, sao chép và chạy script SQL trong thư mục migrations để cấu trúc các bảng dữ liệu.`,stepJwtTitle:`2. Thiết lập Khóa Bí mật JWT`,stepJwtDesc:`DNS Worker yêu cầu mã bí mật JWT để ký mã xác thực phiên làm việc. Hãy cấu hình nó làm Cloudflare Secret:`,stepJwtCommand1:`wrangler secret put JWT_SECRET`,stepJwtDashDesc:`1. Truy cập Worker của bạn -> Cài đặt -> Biến -> Biến Môi trường -> Thêm biến.
9
+ 2. Đặt tên là 'JWT_SECRET', chọn kiểu 'Secret', và điền một chuỗi ký tự ngẫu nhiên an toàn.
10
+ 3. Lưu và triển khai.`,stepJwtDesc2:`Bảng điều khiển Cloudflare`,stepJwtCommand2:`https://dash.cloudflare.com/`,stepDeployTitle:`3. Triển khai & Áp dụng Migrations`,stepDeployDesc:`Chạy lệnh triển khai để biên dịch giao diện người dùng, tự động áp dụng các di chuyển cấu trúc bảng D1 và xuất bản trực tuyến:`,stepDeployCommand:`npm run deploy`,stepDeployDashDesc:`If bạn đã hoàn tất mọi cấu hình qua Bảng điều khiển Cloudflare, hãy truy cập tab Triển khai của Worker và nhấp vào nút 'Triển khai' hoặc 'Triển khai lại'.`,jwtGeneratorTitle:`Bộ tạo JWT_SECRET An toàn`,jwtGeneratorDesc:`Sử dụng bộ tạo khóa an toàn mật mã này để tạo mã bí mật chữ số ngẫu nhiên gồm 64 ký tự cho env.JWT_SECRET.`,regenerate:`Tạo lại`};var p={common:e,nav:t,theme:n,auth:r,setup:i,rules:a,analytics:o,logs:s,filtering:c,settings:l,account:u,intro:d,deploymentGuide:f};export{u as account,o as analytics,r as auth,e as common,p as default,f as deploymentGuide,c as filtering,d as intro,s as logs,t as nav,a as rules,l as settings,i as setup,n as theme};
@@ -0,0 +1,12 @@
1
+ const e={account:`账号`,logout:`登出`,selectProfile:`选择配置`,add:`添加`,newProfileName:`新配置名称...`,profileNameFormatTip:`配置名称提示:1-30个字符,且不能与已有配置重名`,profileLimitExceeded:`配置数量已达上限(最多{{max}}个)`,profileNameExists:`该配置名称已存在`,profileNameFormatError:`配置名称格式不正确`,create:`创建`,welcome:`欢迎`,createProfileToStart:`创建一个配置以开始。`,loading:`加载中...`,errorNetwork:`网络错误`,confirmDelete:`确定要删除此配置吗?`,confirmLogout:`确定注销登录吗?`,notFound:`404 - 页面未找到`,notFoundDesc:`您尝试访问的页面不存在或已被移除。`,backToHome:`返回首页`,apac:`亚太`,mainlandChina:`中国大陆`,HongKong:`香港`,Singapore:`新加坡`,Tokyo:`东京`,NorthAmerica:`北美`,nae:`北美东部`,naw:`北美西部`,eu:`欧洲`,invalidFormat:`无效文件格式`,import:`导入`,importSuccess:`配置成功导入`,importError:`配置导入失败,请确保格式正确且稍后再试`,save:`保存`,saveSuccess:`设置已保存`},t={setup:`安装`,rules:`规则`,stats:`统计`,logs:`日志`,filter:`过滤项`,settings:`设置`},n={light:`浅色`,dark:`深色`,system:`跟随系统`},r={keepLoggedIn:`保持登录 {{days}} 天`,login:`登录 DNS Worker`,signup:`创建账户以开始`,welcomeBack:`欢迎回来,请输入凭据`,protectInternet:`保护您的互联网第一跳`,error:`错误`,username:`用户名`,usernamePlaceholder:`您的用户名`,password:`密码`,passwordPlaceholder:`您的密码`,loginBtn:`登录`,signupBtn:`注册`,totpVerification:`TOTP 验证`,noAccount:`没有账户?立即注册`,haveAccount:`已有账户?返回登录`,formatTipUsername:`用户名格式提示:仅限 5 到 32 位 Unix 用户名格式(小写字母或下划线开头,包含小写字母、数字、下划线及中划线)`,formatTipPassword:`密码格式提示:12-100位字符`,authFailed:`认证失败,请检查用户名或密码`,networkError:`网络错误,请稍后再试`,turnstileRequired:`请完成人机身份验证`,turnstileError:`验证服务加载失败,请检查 Site Key 或域名配置`,verifying:`正在进行安全验证...`,passwordLeaked:`您的密码已被泄露,为了您的账户安全,请使用随机密码/强密码。`,usernameExists:`该用户名已被注册,请尝试其他用户名。`,skip:`跳过`,showPassword:`显示密码`,hidePassword:`隐藏密码`,geolocationRequired:`地理信息获取失败,请重新进入。`,unauthorizedDefault:`您的登录会话已失效,请重新登录。`,unauthorizedGeo:`检测到地理位置变更(超出距离限制),当前会话已被强制注销。`,unauthorizedExpired:`您的登录已过期,请重新登录。`,unauthorizedReuse:`安全警报:检测到重复登录,会话已终止。`,unauthorizedRevoked:`您的会话已被注销或删除,请重新登录。`,sessionLockTitle:`空闲会话锁定`,sessionLockDesc:`当应用程序空闲时,使用 4 位数字 PIN 锁定界面,以防止未授权的物理访问来保护活动会话。`,enableSessionLock:`启用会话锁定`,inactivityTimeout:`空闲超时时间`,timeout1m:`1 分钟`,timeout2m:`2 分钟`,timeout5m:`5 分钟`,timeout15m:`15 分钟`,timeout30m:`30 分钟`,timeout60m:`60 分钟`,changePin:`修改 PIN 码`,disablePin:`禁用会话锁定`,configurePin:`配置 PIN 码`,newPin:`新 4 位 PIN 码`,pinHelper:`仅限数字,例如:1234`,confirmPin:`确认新 PIN 码`,verifyIdentity:`验证身份`,usePassword:`使用密码验证`,use2fa:`使用 TOTP 验证码`,totpCode:`TOTP 验证码`,currentPassword:`当前密码`,disablePinWarning:`禁用 PIN 码将彻底关闭空闲会话锁定功能。`,pinFormatTip:`PIN 码必须为 4 位数字`,pinMatchTip:`两次输入的 PIN 码不匹配`,passwordRequired:`需要输入密码以验证身份`,sessionLocked:`由于长时间未活动,会话已锁定`,sessionExpired:`尝试次数过多,会话已终结。`,pinIncorrect:`PIN 码错误`,attemptsRemaining:`还剩 {{count}} 次尝试机会`,logoutAndReturn:`登出会话`,lockNow:`立即锁定`,cfErrorWithDetails:`Cloudflare 边缘节点异常 (错误代码 {{code}}: {{desc}})。服务暂时不可用,请稍后重试。{{rayId}}`,cfErrorCodeOnly:`Cloudflare 边缘服务异常 (错误代码 {{code}})。服务暂时不可用,请稍后重试。{{rayId}}`,cfErrorGeneric:`Cloudflare 边缘服务异常,服务暂时不可用,请稍后重试。{{rayId}}`,htmlErrorGeneric:`服务器返回异常网页响应 (HTTP {{status}}),请稍后重试。`,tooManyAttempts:`请求过于频繁或尝试次数过多,已被临时限制,请稍后再试。`,dbQuotaExceeded:`数据库每日免费读取配额已用尽,请等待次日自动重置或升级配额。`,noUsersRegistered:`系统尚无账号,请注册成为管理员。`,registerAdminTitle:`注册管理员账号`,registerAdminDesc:`系统尚无账号,首位注册用户将自动成为系统管理员。`,goToRegisterAdmin:`注册管理员`,dbNotInitialized:`数据库未初始化或缺少数据表,请在终端执行 npm run db:migrate:prod 应用数据库迁移。`,verifyWithPasskey:`使用通行密钥验证`,orUseTotp:`或使用数字验证器`,passwordRequiredFirst:`请先输入密码`,passkeyVerification:`通行密钥验证`,passkeyPromptDesc:`使用已注册的设备生物识别或硬件安全密钥进行验证`,forgotPassword:`忘记密码?`,forgotPasswordTitle:`找回密码`,forgotPasswordDesc:`通过多因素认证(通行密钥或数字验证码)安全找回您的账号。`,noMfaContactAdmin:`该账号未配置任何多因素认证(Passkey 或 TOTP),无法自助找回密码。请联系系统管理员为您重置密码。`,chooseMfaForReset:`请选择一种认证方式以核验您的身份:`,authViaPasskey:`使用通行密钥验证`,authViaPasskeyDesc:`使用指纹、面容或硬件安全密钥一键完成验证`,authViaTotp:`使用数字验证器 (TOTP)`,authViaTotpDesc:`输入身份验证器应用生成的 6 位动态验证码`,authViaRecoveryKey:`使用紧急恢复密钥`,authViaRecoveryKeyDesc:`输入 10 位应急恢复密钥`,verifyAndProceed:`核验并继续`,setNewPassword:`设置新密码`,setNewPasswordDesc:`身份核验成功,请为您的账号设置一个新密码。`,newPassword:`新密码`,confirmNewPassword:`确认新密码`,passwordMismatch:`两次输入的新密码不一致`,saveAndReset:`保存并重置密码`,resetSuccessTitle:`密码重置成功`,resetSuccessDesc:`您的密码已更新,所有现有登录会话已注销。请使用新密码重新登录。`,goToLogin:`前往登录`,mfaSetupTitle:`增强账号安全`,mfaSetupDesc:`配置多因素认证 (MFA) 可有效保护您的账号,并解锁无密码快捷登录与密码自助找回功能。`,mfaRecommended:`推荐`,passkeySignupDesc:`使用指纹、面容或安全密钥,无需繁琐输入,兼顾极速体验与最高等级安全防护。`,bindPasskeyNow:`立即绑定通行密钥`,mfaUniversal:`通用`,totpSignupDesc:`使用 Google Authenticator、1Password 等身份验证器生成 6 位动态验证码。`,setupTotpBtn:`配置数字验证器`,skipMfaSetup:`暂不配置,直接完成`,backToMfaOptions:`返回选择其他方式`,otherOptions:`其他选项`,next:`下一步`,mfaVerification:`多因素认证`,totpPrompt:`请输入身份验证应用中的 6 位动态验证码`,recoveryPrompt:`请输入 30 位应急恢复密钥(5 组,每组 6 位数字)`,recoveryChecksumError:`校验码错误:该组 6 位数无法被 11 整除`,recoveryChecksumErrorDesc:`第 {{groups}} 组校验码错误,请核对后重试`,backToPasskey:`返回通行密钥验证`,recoveryKeyRequired:`请输入应急恢复密钥`,totpFormatError:`请输入有效的 6 位验证码`,registrationDisabledTitle:`注册已停用`,registrationDisabledDesc:`当前系统已暂停开放新用户注册,请联系系统管理员获取账号。`,backToLogin:`返回登录`,jwtSecretPreset:`检测到正在使用预设的 JWT_SECRET,请在环境变量中修改并替换为自定义安全密钥后重新部署。`,jwtSecretMissing:`缺少 JWT_SECRET,请在环境变量中配置安全密钥后重新部署。`,jwtSecretInvalid:`JWT_SECRET 密钥格式无效,请检查配置。`},i={title:`安装指南`,subtitle:`配置设备以使用 DNS Worker 主掌您的互联网安全。`,regionOptimization:`接入地区优化 (Windows)`,otherRegion:`其他地区`,copied:`已复制到剪贴板`,verifyConnection:`验证您的连接`,verifying:`正在验证...`,connected:`连接正常`,notConnected:`或未连接`,profileMatch:`您正通过此配置进行过滤。`,profileMismatch:`您正使用 Obex,但配置 ID 不匹配。`,verifyHint:`完成下方配置后,点击按钮验证。`,refreshStatus:`刷新状态`,egressIp:`出口 IP 地址`,currentLocation:`当前位置`,edgeServer:`边缘服务器`,dohUrlTitle:`当前配置 DoH URL`,accessPointTitle:`Access DoH URL`,defaultAccessPointName:`设备-1`,moreAccessPoints:`更多接入点 ↗`,accessPointName:`接入点名称`,accessPointToken:`访问密钥`,addAccessPoint:`新增接入点`,renameAccessPoint:`重命名`,rotateToken:`轮换密钥`,rotateTokenConfirmDesc:`轮换密钥将使所有使用旧密钥的设备立即断开连接。确定要继续吗?`,deleteAccessPoint:`删除`,deleteAccessPointConfirm:`确定要删除此接入点吗?`,manageAccessPoints:`管理接入点`,searchAccessPoints:`搜索接入点...`,accessPointNameExists:`接入点名称已存在`,accessPointCreated:`接入点创建成功`,accessPointRenamed:`接入点重命名成功`,accessPointDeleted:`接入点删除成功`,accessPointNameFormatTip:`接入点名称提示:1-30 位字符,只允许字母、数字、下划线和中划线`,accessPointLimitExceeded:`接入点数量已达上限(最多{{max}}个)`,tokenRotated:`访问密钥轮换成功`,whatIsDoh:`何为 DoH?`,dohDesc:`DNS over HTTPS (DoH) 是一种通过加密的 HTTPS 协议进行域名解析技术。`,dohBenefit1:`减少运营商等网络中间人的劫持与监听`,dohBenefit2:`提升域名解析及互联网访问安全性`,learnMore:`了解更多`,copyUrl:`复制 URL`,browsers:`浏览器`,browserTitle:`浏览器配置 (Chrome/Edge)`,browserSteps:`设置 > 隐私和安全 > 安全 > 使用安全 DNS > 自定义 > 粘贴 URL。`,browserTips:`或者将此网址复制到地址栏:`,apple:`Apple`,appleTitle:`macOS / iOS / iPadOS / tvOS`,appleDesc:`Apple 设备支持通过描述文件快速配置。`,appleWarning:`描述文件不可在 "锁定模式 (Lockdown Mode)" 下安装,安装前请确认系统不处于相关状态。`,downloadConfig:`下载描述文件`,appleInstallHint:`下载后请前往“设置”>“已下载的描述文件”进行安装`,windows:`MS Windows`,windowsTitle:`Windows 11 配置 [地区: {{region}}]`,windowsStep0:`设置 > 网络与互联网`,windowsStep1:`属性 > DNS 服务器 > 编辑 > 手动。`,windowsStep2:`选择并填入 DNS IP:`,windowsStep3:`启用 DoH (手动模板) 并粘贴 URL。`,windowsStep4:`关闭 回退到明文。`,android:`Android`,androidTitle:`Android 9+`,androidDesc:`支持系统原生“私有 DNS (DoT)”或使用第三方 App 配置 DoH。`,androidDotTitle:`私有 DNS (DoT - Serverfull 模式)`,androidDotDesc:`设置 > 网络和互联网 > 私有 DNS > 提供商主机名:`,androidWarning:`注:系统原生的“私有 DNS”使用 DoT 协议。若部署在 Cloudflare Workers,建议使用 Intra 等 App 配置 DoH;若运行在 Serverfull 模式并配置了 TLS 证书,可直接使用上述 DoT 主机名。`,dynamicFromDomain:`动态 (来自 "{{domain}}")`,dynamicFromDomainV6:`动态 IPv6 (来自 "{{domain}}")`,linux:`Linux`,linuxTitle:`Linux (Cloudflared DoH 代理)`,linuxDesc:`在本地运行轻量级 DNS 代理,通过 DoH 将解析请求加密转发至 Obex。`,linuxStep1:`运行以下脚本安装 cloudflared 并创建 systemd 服务(监听 127.0.0.1:53)。`,linuxStep2:`将系统 DNS 修改为 127.0.0.1。`,routeros:`MikroTik`,routerosTitle:`MikroTik RouterOS`,routerosDesc:`将其设置为路由器的 DoH 服务器,即可让网络中的所有设备使用此解析器。`,routerosStep1:`在 RouterOS 终端中运行(RouterOS 7):`,routerosNote:`经路由器转发的查询在日志中显示为路由器,而不是各个设备。如需按设备查看日志,请直接在设备上配置。`,routerosDocs:`MikroTik DNS 文档`,accessPointsCardTitle:`接入点`,currentAccessPoint:`当前接入点`,selectAccessPointToConfigure:`选择接入点以配置`},a={title:`自定义规则`,subtitle:`手动控制特定域名的解析行为(屏蔽、放行或重定向)。`,action:`动作`,typeBlock:`拦截 (BLOCK)`,typeAllow:`放行 (ALLOW)`,typeRedirect:`重定向 (REDIRECT)`,pattern:`域名模式 (Pattern)`,patternPlaceholder:`example.com 或 *.test.com`,addRule:`添加规则`,redirectSettings:`重定向记录设置`,aRecord:`A 记录 (IPv4)`,aaaaRecord:`AAAA 记录 (IPv6)`,cnameRecord:`CNAME 记录`,txtRecord:`TXT 记录`,optional:`(选填)`,ipv4Placeholder:`例如: 1.2.3.4`,ipv6Placeholder:`例如: 2001:db8::1`,cnamePlaceholder:`例如: target.com`,txtPlaceholder:`输入文本内容...`,saveRedirectRule:`保存并添加重定向规则`,noRulesTitle:`无自定义规则`,noRulesDesc:`您还没有添加任何手动规则。`,tableAction:`动作`,tablePattern:`模式`,tableDetails:`解析详情`,tableOps:`操作`,labelBlock:`拦截`,labelAllow:`放行`,labelRedirect:`重定向`,detailBlock:`解析至`,detailAllow:`转发至上游服务`,patternEmpty:`域名模式不能为空`,duplicatePattern:`该域名的规则已存在`,addSuccess:`规则添加成功`,addFailed:`添加规则失败`,updateSuccess:`规则更新成功`,updateFailed:`更新规则失败`,tableCreatedAt:`添加时间`,clickToSort:`点击排序`},o={customRange:`自定义时间范围`,startTime:`开始时间`,endTime:`结束时间`,apply:`应用`,custom:`自定义`,totalQueries:`总查询`,blocked:`已拦截`,redirected:`已重定向`,blockRate:`拦截率`,activeDevices:`活跃设备`,activeIPs:`活跃 IP 地址`,queryTrend:`查询趋势`,noRecords:`此时间段内暂无记录`,topAllowed:`常用域名 (Allowed)`,topBlocked:`拦截频率最高 (Blocked)`,noData:`暂无数据`,clientActivity:`客户端活跃度`,ipAddress:`IP 地址`,location:`归属地`,queries:`查询数`,destinationDistribution:`流量目的地分布`,requests:`请求`,topIsps:`主要运营商`,pressToShowMore:`按下显示更多`,maximize:`放大`,minimize:`缩小`},s={title:`查询日志`,subtitle:`查看本配置 DNS 解析日志和拦截记录。`,realtime:`实时`,allStatus:`全部状态`,onlyPass:`已放行`,onlyBlock:`已拦截`,onlyRedirect:`已重定向`,searchPlaceholder:`搜索域名...`,noResults:`未找到结果`,noRecords:`尚无记录`,noResultsDesc:`没有找到匹配 "{{query}}" 的域名记录。`,noRecordsDesc:`选定的时间范围内没有收到任何 DNS 查询。`,tableTime:`时间`,tableDomain:`域名`,tableAnswer:`解析结果`,tableSource:`来源`,tableType:`类型`,tableStatus:`状态`,tableReason:`原因`,loadedAll:`已加载全部 {{count}} 条记录`,realtimeLoadMoreTip:`关闭“实时”模式以加载更多`,filterAccessPoint:`接入点`,allAccessPoint:`全部接入点`,allCountry:`全部国家`,filterCountry:`目的地国家`,allIsp:`全部运营商`,filterIsp:`运营商`,timeRange:`时间范围`,clearFilters:`清除筛选`,details:`查询详情`,detailAccessPoint:`接入点`,basicInfo:`基础信息`,detailDomain:`域名`,detailType:`类型`,detailTime:`时间`,detailLatency:`耗时`,detailProfile:`所用配置`,detailStatus:`状态`,detailUpstream:`上游服务器`,detailReason:`原因`,detailNoReason:`无 (已放行)`,detailECS:`ECS`,resolutionResult:`解析结果`,noResult:`无结果`,networkDetails:`网络详情`,clientSource:`客户端 (源)`,destination:`目的地 (解析地址)`,quickActions:`快捷操作`,actionAllow:`放行`,actionBlock:`拦截`,actionRedirect:`重定向`,statusPass:`已放行`,statusBlock:`已拦截`,statusRedirect:`已重定向`,export:`导出日志`,rewritten:`已重写`,logDetails:`查询详情`,searchCountry:`搜索国家...`,noMatchingCountries:`未找到匹配国家`,searchIsp:`搜索运营商...`,noMatchingIsps:`未找到匹配运营商`,loadingIsps:`正在加载运营商...`,loggingDisabledTitle:`日志记录已关闭`,loggingDisabledDesc:`当前配置的日志留存已设置为“关闭”,系统不记录任何查询日志。如需查看,请在设置中启用日志留存。`},c={title:`外部拦截列表`,subtitle:`订阅第三方维护的域名屏蔽清单 (如 AdGuard 等)。`,formatDisclaimer:`本系统只支持有限的 AdGuard 格式列表和纯域名列表。仅支持基础的拦截规则(如 ||example.com^),会绕过 "@@" 白名单,暂不支持 "$" 重写规则以及 "*" 省略规则。系统会自动匹配域名的所有子域名。`,syncAll:`同步所有列表`,urlPlaceholder:`输入拦截列表 URL...`,addSubscription:`添加订阅`,supportedFormats:`支持的列表格式:`,formatAdGuard:`兼容 ||domain.com^ 等过滤规则。`,formatHosts:`兼容标准 hosts 文件 (例如 0.0.0.0 domain.com)。`,noListsTitle:`尚未添加列表`,noListsDesc:`您还没有订阅任何外部拦截列表。`,tableUrl:`列表 URL`,tableLastSync:`上次同步`,tableStatus:`状态`,tableOps:`操作`,neverSynced:`从未`,enabled:`正常`,disabled:`同步失败`,statusNormal:`正常`,statusDisabled:`已禁用`,statusOutdated:`过时`,statusMissing:`缺失`,presetOisdBig:`OISD Big (广告/恶意软件等拦截)`,presetOisdNsfw:`OISD NSFW (色情/震撼/成人内容拦截)`,presetAdGuard:`AdGuard AdServers (广告服务器)`,presetStevenBlack:`StevenBlack Hosts (综合拦截)`,syncTaskStarted:`开始同步任务`,syncCheckComplete:`同步检查完成`,syncTaskFailed:`同步失败`,syncing:`同步中...`,syncSuccess:`同步成功`,syncError:`同步失败`,syncErrorDesc:`无法下载或解析此拦截列表。请检查链接是否正确,并确保该链接可以正常访问。`,deleteConfirm:`确认删除订阅?`,deleteSuccess:`列表删除成功`,deleteError:`列表删除失败`,addSuccess:`列表添加成功`,addError:`列表添加失败`,listEnabled:`列表已启用`,listEnabledHint:`禁用后将停止使用此列表进行过滤,但不会删除该列表,其订阅和同步历史会保留。`,listEnabledToast:`已启用列表 - 正在重建过滤器`,listDisabledToast:`已禁用列表 - 正在重建过滤器`,checkDomain:`检查域名`,checkDomainHint:`列表以紧凑过滤器的形式存储,因此无法浏览其中的条目。你可以立即针对此列表测试任意域名。`,check:`检查`,checkBlocked:`已被此列表拦截`,checkNotBlocked:`未被此列表拦截`,checkViaParent:`(匹配到上级域名)`,checkNotSynced:`此列表尚未完成同步,因此暂无可供检查的内容。`,checkListDisabled:`此列表当前已禁用,因此现在不会过滤任何内容。`,checkProbabilisticRate:`过滤器基于概率:大约每 {{odds}} 次匹配中有 1 次为误判。添加例外规则也会覆盖其所有子域名。`,checkProbabilistic:`过滤器基于概率,因此少部分匹配属于误判。添加例外规则也会覆盖其所有子域名。`,checkAllowAction:`仍然允许`,checkAllowed:`已添加例外 - 该域名现在可以解析`,allowRuleAdded:`已为 {{domain}} 添加例外`},l={title:`配置设置`,subtitle:`管理您的 DNS 解析策略和高级选项。`,saveChanges:`保存所有更改`,saveSuccess:`设置已成功保存`,saveError:`保存设置失败,请稍后再试`,upstreamTitle:`上游服务`,dohUrl:`DoH URL`,dnsIP:`DNS IP`,classicDns:`经典 DNS`,httpsOnly:`仅支持 HTTPS`,upstreamDesc:`所有未被拦截的查询将由本应用转发至此服务器。支持 DoH (HTTPS)、DoT (tls://)、DNS Stamp (sdns://) 或经典 DNS。经典 DNS 通过 TCP 转发。`,defaultPolicyTitle:`默认过滤行为`,onNoMatch:`未匹配规则时`,allowAll:`允许所有查询`,blockAll:`拦截所有查询`,logRetentionTitle:`日志留存`,retentionDuration:`留存时长`,retentionDesc:`日志将自动清除。`,skipLogOnPass:`不记录放行记录`,skipLogOnPassDesc:`启用后不记录正常放行的 DNS 查询,仅记录被拦截、重定向或解析失败的记录。可大幅减少存储占用与写操作。`,ecsTitle:`EDNS 客户端子网 (ECS)`,ecsUpstreamHint:`并非所有上游 DNS 都支持 ECS。对于 ControlD 等递归解析器,ECS 仅影响其内部路由,不会传递给上游权威服务器。`,sendEcs:`呈递 ECS`,customSubnet:`自定义子网`,customIpv4:`自定义 IPv4 子网`,customIpv6:`自定义 IPv6 子网`,ipv4Hint:`(例如 1.2.3.0/24)`,ipv6Hint:`(例如 2001:db8::/32)`,testToolTitle:`实时解析测试工具`,testDomain:`测试域名`,recordType:`记录类型`,runTest:`运行测试`,domainPlaceholder:`例如 google.com`,hitRule:`命中规则 / 原因`,defaultAllow:`默认放行策略`,parseLatency:`解析耗时`,sourceIp:`源 IP 地址`,answerSection:`解析结果回显 (Answer Section)`,noRecordsReturned:`本次查询未返回任何记录。`,diagnostics:`诊断信息`,errorDetail:`错误详情`,upstreamResponse:`上游响应内容`,presetCloudflareSecurity:`Cloudflare Security (快速/去恶意域名/去钓鱼域名)`,presetCloudflareFamilies:`Cloudflare Families (快速/去恶意域名/去成人内容)`,presetQuad9:`Quad9 (去恶意域名/无日志/不呈递 ECS)`,presetQuad9Ecs:`Quad9 ECS (去恶意域名/无日志/呈递 ECS)`,presetControlDFree:`ControlD Free (去广告/去跟踪/去恶意域名/去钓鱼域名)`,presetControlDUncensored:`ControlD Uncensored (抗审查)`,presetAdGuard:`AdGuard (去广告/去跟踪)`,presetAdGuardFamily:`AdGuard Family protection (去广告/去跟踪/去成人内容/安全搜索)`,retention10m:`10 分钟`,retention1h:`1 小时`,retention24h:`24 小时`,retention7d:`7 天`,retention30d:`30 天`,retention90d:`90 天 (最长)`,blockModeTitle:`拦截响应模式`,blockModeDesc:`当域名被拦截时返回的内容`,default:`默认`,NXDOMAIN:`域名不存在`,NODATA:`空回答`,customIP:`自定义 IP`,export:`导出配置`,exportSuccess:`配置成功导出`,exportError:`配置导出失败,请稍后再试`,nameUpdateSuccess:`配置名称已更新`,saving:`正在保存...`,echTitle:`重写 ECH`,enableEch:`启用重写 ECH`,echDesc:`针对由 Cloudflare 代理的域名,当查询 HTTPS (Type 65) 或 SVCB (Type 64) 记录时,自动重写注入 ECH 参数与表层 SNI 以保护访问隐私。`,echFrontingTitle:`表层 SNI (ECH Fronting)`,echFrontingDesc:`TLS 握手外层可见的伪装域名`,echFrontingCustomPlaceholder:`输入自定义表层域名,例如 crypto.cloudflare.com`,echPreferred:`首选`,whatIsEch:`何为 ECH (Encrypted Client Hello)?`,echHelpDesc:`ECH (加密客户端问候) 是 TLS 1.3 的重要隐私扩展,它将 TLS 握手中的真实目标域名 (Inner SNI) 全程加密,仅向网络中间人暴露表层伪装域名 (Outer SNI / ECH Fronting)。`,echHelpBenefit1:`防止中间人及 ISP 窥探您正在访问的具体网页与子域名`,echHelpBenefit2:`配合 DoH 与自定义表层 SNI,消除明文 SNI 阻断与识别风险`,retentionDisabled:`关闭 (隐私需要)`,retentionDisabledDesc:`已关闭日志记录。系统将不会记录任何 DNS 查询日志并立即清空历史日志。`},u={title:`账号设置`,subtitle:`管理您的安全凭据和系统用户。`,jwtSecretWarningTitle:`安全提示:JWT 密钥强度较弱`,jwtSecretWarningDesc:`当前 JWT_SECRET 长度小于 32 位字符,存在潜在安全隐患。请先配置环境变量 KEK_v1 完成凭据信封加密迁移,然后再轮换 JWT_SECRET,以防止存量加密的 TOTP 或恢复密钥无法解密。`,roleAdmin:`系统管理员`,roleUser:`用户`,personalInfo:`个人信息`,username:`用户名`,userId:`用户 ID`,changePassword:`修改密码`,currentPassword:`当前密码`,newPassword:`新密码`,updatePassword:`更新密码`,userManagement:`用户管理 (管理员)`,createUser:`创建用户`,role:`角色`,createdAt:`创建时间`,lastActive:`最后活动时间`,lastResolve:`最后解析时间`,actions:`操作`,dangerZone:`危险区域`,clearLogs:`清空所有日志`,clearLogsDesc:`这将删除您名下所有 DNS 配置生成的查询日志。此操作不可恢复。`,clearLogsBtn:`立即清空日志`,deleteAccount:`注销账号`,deleteAccountDesc:`永久删除您的账号及所有关联数据。此操作将导致您失去所有解析配置。`,deleteAccountBtn:`注销并删除账号`,createNewUser:`创建新用户`,initialPassword:`初始密码`,userRole:`用户角色`,cancel:`取消`,createNow:`立即创建`,formatTipUsername:`用户名格式提示:仅限 5 至 32 位 Unix 用户名格式`,formatTipPassword:`密码格式提示:12-100位字符`,passwordSuccess:`密码修改成功`,updateFailed:`修改失败`,confirmDeleteUser:`确定要删除此用户吗?其拥有的所有配置也将被移除。`,confirmClearLogs:`确定要清空您名下所有配置的查询日志吗?此操作不可撤销。`,clearLogsSuccess:`日志已成功清空`,confirmDeleteAccount:`警告:确定要注销并删除本账号吗?
2
+
3
+ 阁下所有 DNS 配置、自定义规则和查询日志将被永久删除。此操作不可逆!`,inactivityPolicy:`活跃度政策`,inactivityDesc:`为保护用户隐私并节省资源,超过 30 天无解析记录的账户,其所有关联查询日志及 DNS 配置将被自动清理。账户本身在 90 天无登录后将予移除。`,systemSettings:`系统设置 (管理员)`,adminOnlyView:`仅管理员可见`,featureToggle:`功能开关`,enableTurnstileSignup:`注册页面启用人机验证`,enableTurnstileLogin:`登录页面启用人机验证`,totp:{title:`数字验证器 (TOTP)`,enabled:`已启用`,disabled:`停用`,setupDesc:`为账号添加额外的安全层。使用 Google Authenticator、Authy 或任何 TOTP 兼容应用。`,setupBtn:`配置数字验证器`,scanQR:`使用验证器应用扫描此二维码:`,orEnterManually:`或手动输入密钥:`,enterCode:`请输入验证器代码进行确认:`,enterCodeHint:`输入 6 位验证码以确认密钥已正确录入。`,activate:`激活数字验证器`,skipPassword:`无密码登录 — 登录时只显示 TOTP 输入框(不显示密码)`,disable:`停用数字验证器`,disableTitle:`停用数字验证器`,disableWarning:`停用数字验证器后,若未配置通行密钥,账号将仅受密码保护。确定要停用吗?`,confirmDisable:`确认停用`,recoveryKeysTitle:`请保存您的恢复密钥`,recoveryKeysWarning:`请将恢复密钥妥善保存(如密码管理器)。每个密钥只能使用一次。`,copyKeys:`复制全部密钥`,copied:`已复制!`,done:`完成,我已保存密钥`,activeDesc:`数字验证器已启用,正在为您的账号提供 6 位动态验证码保护。`},sessions:{session:`会话`,title:`活跃会话`,device:`设备`,ip:`IP 地址`,loginTime:`登录时间`,expires:`过期时间`,action:`操作`,current:`当前会话`,revoke:`撤销`,revokeFailed:`撤销会话失败。`,empty:`未找到活跃会话。`,unknownDevice:`未知设备`,revokeOthers:`撤销其他会话`,confirmRevokeOthers:`撤销其他会话`,revokeOthersConfirmText:`确定要撤销所有其他活跃会话吗?除当前设备外,其他已登录设备将立即退出。`},activity:{title:`账号活动记录`,action:`事件`,time:`时间`,session:`会话`,ip:`IP 地址`,empty:`暂无活动记录。`,loadMore:`加载更多`,signup:`注册`,loginSuccess:`登录成功`,loginFail:`登录失败`,logout:`退出登录`,pwChangeSuccess:`密码已修改`,pwChangeFail:`密码修改失败`,totpVerifySuccess:`TOTP 验证通过`,totpVerifyFail:`TOTP 验证失败`,totpSetup:`配置数字验证器`,totpRemoved:`停用数字验证器`,recoveryKeyUsed:`使用了恢复密钥`,sessionRevoked:`会话已撤销`,reasons:{user_active:`主动登出`,user_revoke:`撤销会话`,expired:`会话已过期`,geolocation_mismatch:`异地访问限制`,geolocation_missing:`缺少地理位置信息`,token_reuse:`凭证重复使用(安全警告)`},passkeyRegistered:`添加通行密钥`,passkeyDeleted:`删除通行密钥`,passkeyVerifySuccess:`通行密钥验证通过`,passkeyVerifyFail:`通行密钥验证失败`,recoveryKeyRotated:`应急恢复密钥已轮换`},passkey:{title:`通行密钥 (Passkey)`,addBtn:`添加通行密钥`,desc:`使用生物识别(Touch ID / Face ID / Windows Hello)或硬件安全密钥(YubiKey)进行快捷且防钓鱼的多因素认证。`,empty:`尚未添加任何通行密钥。`,addTitle:`添加通行密钥`,nameLabel:`通行密钥名称`,namePlaceholder:`例如:my_passkey`,promptNotice:`点击继续后,浏览器将弹出系统提示,引导您完成生物识别或硬件安全密钥录入。`,continue:`继续`,renameTitle:`重命名通行密钥`,deleteTitle:`删除通行密钥`,deleteConfirm:`确定要删除通行密钥 "{{name}}" 吗?删除后将无法使用该通行密钥进行多因素认证。`,defaultName:`通行密钥`,notSupported:`您的浏览器或当前环境不支持通行密钥 (WebAuthn)。`,regFailed:`通行密钥注册失败`,count:`{{count}} 个已配置`,none:`未配置`,created:`添加时间`,lastUsed:`最后使用`,neverUsed:`从未在登录中使用`,updated:`通行密钥更新成功`,registered:`通行密钥添加成功`,deleted:`通行密钥已删除`,appNameLabel:`域名`,appNameHelper:`通行密钥将绑定至此域名`,formatTip:`通行密钥名称提示:1-30 位字符,只允许字母、数字、下划线和中划线`,verifyPrompt:`请使用设备的生物识别(人脸、指纹、Windows Hello)或安全密钥进行身份验证。`,changePwNotice:`提交修改时将调用通行密钥 (Passkey) 生物识别或硬件密钥核验身份。`,submitNotice:`提交时将调用通行密钥 (Passkey) 生物识别或硬件密钥核验身份。`},mfaNone:`无`,resetUserPassword:`重置密码`,resetPasswordTitle:`重置用户密码`,resetPasswordWarning:`重置后,该用户的所有现有会话将立即注销,用户需使用新密码重新登录。`,resetPasswordSuccess:`密码已成功重置,用户旧登录会话已注销。`,confirmReset:`确认重置`,mfa:{title:`多因素认证 (MFA)`,enabled:`已配置`,notConfigured:`未配置`,desc:`通行密钥 (Passkey) 与数字验证器 (TOTP) 均可作为多因素认证方式,配置任选其一即可保障账号安全并支持无密码登录与密码重置。`,passwordlessTitle:`无密码登录 (Passwordless Login)`,passwordlessDesc:`启用后,登录时无需输入密码,直接通过通行密钥 (Passkey) 或数字验证码 (TOTP) 完成身份核验。`,unconfiguredHint:`当前账号尚未配置任何多因素认证。配置通行密钥或数字验证器后,可启用无密码快捷登录并在忘记密码时安全找回账号。`},recoveryKey:{title:`应急恢复密钥`,desc:`应急恢复密钥用于在丢失所有通行密钥或数字验证器时重新登录账户或重置密码。恢复密钥受 KEK 信封加密保护。`,configured:`已配置`,notConfigured:`未配置`,kekProtected:`KEK 加密保护`,kekTooltip:`该恢复密钥在数据库中受根密钥 (KEK) 与数据密钥 (DEK) 双层信封加密保护。`,viewBtn:`查看恢复密钥`,rotateBtn:`轮换密钥`,yourKey:`您的 30 位应急恢复密钥`,securityTip:`请妥善保管此恢复密钥。拥有此密钥者可以重获您的账户访问权限。`,rotateConfirm:`轮换恢复密钥将使旧密钥立即失效。确定继续吗?`,confirmRotateBtn:`确认轮换`,viewVerifyTitle:`验证身份以查看恢复密钥`,rotateVerifyTitle:`验证身份以轮换恢复密钥`,rotateSuccess:`恢复密钥轮换成功!请立即妥善备份并保存新密钥。`,legacyNotice:`您的恢复密钥以旧版单向哈希格式存储,无法直接解密明文展示。请点击“轮换密钥”重新生成。`},verifyIdentity:`安全身份核验`,verifyIdentityDesc:`为了保护您的账户安全,执行此敏感操作前请先验证您的身份。`,usePasskeyInstead:`使用通行密钥验证`,changePasswordWithPasskey:`使用通行密钥核验并修改密码`,enableRegistration:`开放新用户注册`},d={item1Title:`Obex 保护性 DNS`,item1Desc:`基于 Cloudflare Workers & D1 的 DNS 解析器,尽力提高速度与安全。`,item2Title:`DoH 隐私保护`,item2Desc:`通过 DNS over HTTPS (RFC 8484) 加密隧道防止劫持并增强隐私。`,item3Title:`全球边缘网络`,item3Desc:`依托 Cloudflare 庞大的边缘网络,获得极速解析与极低延迟体验。`,item4Title:`精细化过滤`,item4Desc:`全面支持黑白名单、AdGuard 规则以及自定义 DNS 记录重定向。`,item5Title:`实时统计分析`,item5Desc:`通过详细的查询日志和综合统计仪表盘,直观展现网络健康状况。`,item6Title:`现代 UI 与暗黑模式`,item6Desc:`为工程师和家庭用户设计的高密度管理面板,基于由 Palantir 开发的 Blueprint UI。`,item7Title:`云原生基础架构`,item7Desc:`无服务器架构确保零维护和私人 DNS 的无限扩展性。`,item8Title:`多配置管理`,item8Desc:`为不同设备或网络环境创建并管理多个独立配置。`,item9Title:`多接入点管理`,item9Desc:`为不同设备配置专属的 DNS 接入点,实现日志和统计数据的精细化隔离与分析。`},f={title:`DNS Worker 部署与配置指南`,subtitle:`您的系统实例尚未完全配置。请按照以下步骤完成部署以启用 DNS Worker。`,dbStatus:`D1 数据库绑定 (env.DB)`,jwtStatus:`JWT 密钥 Secrets (env.JWT_SECRET)`,configured:`已配置`,missing:`缺失 / 未配置`,refresh:`重新检测并刷新`,methodCli:`CLI 命令行部署`,methodDash:`Cloudflare 控制台部署`,copy:`复制`,copied:`已复制!`,stepDbTitle:`1. 创建与绑定 D1 数据库`,stepDbDesc:`在 Cloudflare 中创建 D1 数据库实例,在终端运行以下命令:`,stepDbCommand1:`wrangler d1 create dns_worker_db`,stepDbDesc2:`复制终端输出的配置信息,并粘贴到项目根目录的 wrangler.toml 里的 [[d1_databases]] 中:`,stepDbCommand2:`[[d1_databases]]
4
+ binding = "DB"
5
+ database_name = "dns_worker_db"
6
+ database_id = "<您的_D1_DATABASE_ID>"
7
+ migrations_dir = "migrations"`,stepDbDashDesc:`1. 登录 Cloudflare 网页控制台 -> Workers & Pages -> D1 -> 创建数据库 -> 命名为 'dns_worker_db'。
8
+ 2. 进入您的 Worker -> 设置 -> 变量 -> D1 数据库绑定 -> 添加绑定。
9
+ 3. 将绑定名称设置为 'DB',D1 数据库选择 'dns_worker_db',并保存。
10
+ 4. 进入您的 D1 数据库 -> 控制台,复制并运行 migrations 目录下的 SQL 迁移脚本以初始化数据库表结构。`,stepJwtTitle:`2. 设置 JWT 密钥 Secrets`,stepJwtDesc:`系统使用 JWT 密钥签署会话令牌,请将其设置为 Cloudflare Secrets 密钥:`,stepJwtCommand1:`wrangler secret put JWT_SECRET`,stepJwtDashDesc:`1. 进入您的 Worker -> 设置 -> 变量 -> 环境变量 -> 添加变量。
11
+ 2. 设置名称为 'JWT_SECRET',选择类型为 '机密 (Secret)',并在值中输入一个随机安全字符串(例如 64 位十六进制字符)。
12
+ 3. 点击保存并部署。`,stepJwtDesc2:`Cloudflare 网页控制台`,stepJwtCommand2:`https://dash.cloudflare.com/`,stepDeployTitle:`3. 部署并应用迁移`,stepDeployDesc:`执行项目部署命令。该命令会自动编译 frontend 静态资源,执行 D1 数据库迁移结构,并发布至 Cloudflare 远程端:`,stepDeployCommand:`npm run deploy`,stepDeployDashDesc:`如果您已通过 Cloudflare 网页控制台完成了所有绑定配置,请进入您的 Worker 控制面板的 Deployments (部署) 选项卡下,点击“部署”按钮进行发布上线。`,jwtGeneratorTitle:`安全 JWT_SECRET 生成器`,jwtGeneratorDesc:`使用此加密安全的随机数生成器生成 64 位字符的随机字母数字组合,用于 env.JWT_SECRET。`,regenerate:`重新生成`};var p={common:e,nav:t,theme:n,auth:r,setup:i,rules:a,analytics:o,logs:s,filtering:c,settings:l,account:u,intro:d,deploymentGuide:f};export{u as account,o as analytics,r as auth,e as common,p as default,f as deploymentGuide,c as filtering,d as intro,s as logs,t as nav,a as rules,l as settings,i as setup,n as theme};
@@ -0,0 +1,12 @@
1
+ const e={account:`帳號`,logout:`登出`,selectProfile:`選擇配置`,add:`添加`,newProfileName:`新配置名稱...`,profileNameFormatTip:`配置名稱提示:1-30個字元,且不能與已有配置重名`,profileLimitExceeded:`配置數量已達上限(最多{{max}}個)`,profileNameExists:`該配置名稱已存在`,profileNameFormatError:`配置名稱格式不正確`,create:`創建`,welcome:`歡迎`,createProfileToStart:`創建一個配置以開始。`,loading:`載入中...`,errorNetwork:`網路錯誤`,confirmDelete:`確定要刪除此配置嗎?`,confirmLogout:`確定注銷登入嗎?`,notFound:`404 - 頁面未找到`,notFoundDesc:`您嘗試訪問的頁面不存在或已被移除。`,backToHome:`返回首頁`,apac:`亞太`,mainlandChina:`中國大陸`,HongKong:`香港`,Singapore:`新加坡`,Tokyo:`東京`,NorthAmerica:`北美`,nae:`北美東部`,naw:`北美西部`,eu:`歐洲`,invalidFormat:`無效文件格式`,import:`匯入`,importSuccess:`配置成功匯入`,importError:`配置匯入失敗,請確保格式正確且稍後再試`,save:`儲存`,saveSuccess:`設定已儲存`},t={setup:`安裝`,rules:`規則`,stats:`統計`,logs:`日誌`,filter:`過濾項`,settings:`設定`},n={light:`淺色`,dark:`深色`,system:`跟隨系統`},r={keepLoggedIn:`保持登入 {{days}} 天`,login:`登入 DNS Worker`,signup:`創建帳戶以開始`,welcomeBack:`歡迎回來,請輸入憑據`,protectInternet:`保護您的網際網路第一跳`,error:`錯誤`,username:`用戶名`,usernamePlaceholder:`您的用戶名`,password:`密碼`,passwordPlaceholder:`您的密碼`,loginBtn:`登入`,signupBtn:`註冊`,totpVerification:`TOTP 驗證`,noAccount:`沒有帳戶?立即註冊`,haveAccount:`已有帳戶?返回登入`,formatTipUsername:`用戶名格式提示:僅限 5 到 32 位 Unix 用戶名格式(小寫字母或底線開頭,包含小寫字母、數字、底線及中線)`,formatTipPassword:`密碼格式提示:12-100位字元`,authFailed:`認證失敗,請檢查用戶名或密碼`,networkError:`網路錯誤,請稍後再試`,turnstileRequired:`請完成人機身份驗證`,turnstileError:`驗證服務加載失敗,請檢查 Site Key 或域名配置`,verifying:`正在進行安全驗證...`,passwordLeaked:`您的密碼已被洩露,為了您的帳戶安全,請使用隨機密碼/強密碼。`,usernameExists:`該用戶名已被註冊,請嘗試其他用戶名。`,skip:`跳過`,showPassword:`顯示密碼`,hidePassword:`隱藏密碼`,geolocationRequired:`地理資訊獲取失敗,請重新進入。`,unauthorizedDefault:`您的登入會話已失效,請重新登入。`,unauthorizedGeo:`檢測到地理位置變更(超出距離限制),當前會話已被強制註銷。`,unauthorizedExpired:`您的登入已過期,請重新登入。`,unauthorizedReuse:`安全警報:檢測到重複登入,會話已終止。`,unauthorizedRevoked:`您的會話已被註銷或刪除,請重新登入。`,sessionLockTitle:`空閒會話鎖定`,sessionLockDesc:`當應用程式空閒時,使用 4 位數字 PIN 鎖定介面,以防止未授權的物理存取來保護活動會話。`,enableSessionLock:`啟用會話鎖定`,inactivityTimeout:`空閒逾時時間`,timeout1m:`1 分鐘`,timeout2m:`2 分鐘`,timeout5m:`5 分鐘`,timeout15m:`15 分鐘`,timeout30m:`30 分鐘`,timeout60m:`60 分鐘`,changePin:`修改 PIN 碼`,disablePin:`停用會話鎖定`,configurePin:`設定 PIN 碼`,newPin:`新 4 位 PIN 碼`,pinHelper:`僅限數字,例如:1234`,confirmPin:`確認新 PIN 碼`,verifyIdentity:`驗證身份`,usePassword:`使用密碼驗證`,use2fa:`使用 TOTP 驗證碼`,totpCode:`TOTP 驗證碼`,currentPassword:`目前密碼`,disablePinWarning:`停用 PIN 碼將徹底關閉空閒會话鎖定功能。`,pinFormatTip:`PIN 碼必須為 4 位數字`,pinMatchTip:`兩次輸入的 PIN 碼不符合`,passwordRequired:`需要輸入密碼以驗證身份`,sessionLocked:`由於長時間未活動,會話已鎖定`,sessionExpired:`嘗試次數過多,會話已終結。`,pinIncorrect:`PIN 碼錯誤`,attemptsRemaining:`還剩 {{count}} 次嘗試機會`,logoutAndReturn:`登出會話`,lockNow:`立即鎖定`,cfErrorWithDetails:`Cloudflare 邊緣節點異常 (錯誤代碼 {{code}}: {{desc}})。服務暫時不可用,請稍後重試。{{rayId}}`,cfErrorCodeOnly:`Cloudflare 邊緣服務異常 (錯誤代碼 {{code}})。服務暫時不可用,請稍後重試。{{rayId}}`,cfErrorGeneric:`Cloudflare 邊緣服務異常,服務暫時不可用,請稍後重試。{{rayId}}`,htmlErrorGeneric:`伺服器傳回異常網頁回應 (HTTP {{status}}),請稍後重試。`,tooManyAttempts:`請求過於頻繁或嘗試次數過多,已被臨時限制,請稍後再試。`,dbQuotaExceeded:`資料庫每日免費讀取配額已用盡,請等待次日自動重置或升級配額。`,noUsersRegistered:`系統尚無帳號,請註冊成為管理員。`,registerAdminTitle:`註冊管理員帳號`,registerAdminDesc:`系統尚無帳號,首位註冊用戶將自動成為系統管理員。`,goToRegisterAdmin:`註冊管理員`,dbNotInitialized:`資料庫未初始化或缺少資料表,請在終端執行 npm run db:migrate:prod 套用資料庫遷移。`,verifyWithPasskey:`使用通行密鑰驗證`,orUseTotp:`或使用數字驗證器`,passwordRequiredFirst:`請先輸入密碼`,passkeyVerification:`通行密鑰驗證`,passkeyPromptDesc:`使用已註冊的裝置生物識別或硬體安全金鑰進行驗證`,forgotPassword:`忘記密碼?`,forgotPasswordTitle:`重設密碼`,forgotPasswordDesc:`透過多因素驗證(通行金鑰或數位驗證碼)安全找回您的帳號。`,noMfaContactAdmin:`該帳號未設定任何多因素驗證(Passkey 或 TOTP),無法自助重設密碼。請聯絡系統管理員為您重設密碼。`,chooseMfaForReset:`請選擇一種驗證方式以核驗您的身分:`,authViaPasskey:`使用通行金鑰驗證`,authViaPasskeyDesc:`使用指紋、臉孔或硬體安全金鑰一鍵完成驗證`,authViaTotp:`使用數位驗證器 (TOTP)`,authViaTotpDesc:`輸入身分驗證器應用程式產生的 6 位動態驗證碼`,authViaRecoveryKey:`使用緊急復原金鑰`,authViaRecoveryKeyDesc:`輸入 10 位緊急復原金鑰`,verifyAndProceed:`核驗並繼續`,setNewPassword:`設定新密碼`,setNewPasswordDesc:`身分核驗成功,請為您的帳號設定一個新密碼。`,newPassword:`新密碼`,confirmNewPassword:`確認新密碼`,passwordMismatch:`兩次輸入的新密碼不相符`,saveAndReset:`儲存並重設密碼`,resetSuccessTitle:`密碼重設成功`,resetSuccessDesc:`您的密碼已更新,所有現有登入工作階段已登出。請使用新密碼重新登入。`,goToLogin:`前往登入`,mfaSetupTitle:`強化帳號安全`,mfaSetupDesc:`設定多因素驗證 (MFA) 可有效保護您的帳號,並解鎖無密碼快速登入與密碼自助找回功能。`,mfaRecommended:`推薦`,passkeySignupDesc:`使用指紋、臉孔或安全金鑰,免去繁瑣輸入,兼顧極速體驗與頂級安全防護。`,bindPasskeyNow:`立即綁定通行金鑰`,mfaUniversal:`通用`,totpSignupDesc:`使用 Google Authenticator、1Password 等身分驗證器產生 6 位動態驗證碼。`,setupTotpBtn:`設定數位驗證器`,skipMfaSetup:`暫不設定,直接完成`,backToMfaOptions:`返回選擇其他方式`,otherOptions:`其他選項`,next:`下一步`,mfaVerification:`多因素認證`,totpPrompt:`請輸入身份驗證應用程式中的 6 位動態驗證碼`,recoveryPrompt:`請輸入 30 位應急恢復密鑰(5 組,每組 6 位數字)`,recoveryChecksumError:`校驗碼錯誤:該組 6 位數無法被 11 整除`,recoveryChecksumErrorDesc:`第 {{groups}} 組校驗碼錯誤,請核對後重試`,backToPasskey:`返回通行密鑰驗證`,recoveryKeyRequired:`請輸入應急恢復密鑰`,totpFormatError:`請輸入有效的 6 位驗證碼`,registrationDisabledTitle:`註冊已停用`,registrationDisabledDesc:`目前系統已暫停開放新使用者註冊,請聯絡系統管理員取得帳號。`,backToLogin:`返回登入`,jwtSecretPreset:`檢測到正在使用預設的 JWT_SECRET,請在環境變數中修改並替換為自訂安全金鑰後重新部署。`,jwtSecretMissing:`缺少 JWT_SECRET,請在環境變數中配置安全金鑰後重新部署。`,jwtSecretInvalid:`JWT_SECRET 金鑰格式無效,請檢查設定。`},i={title:`安裝指南`,subtitle:`配置裝置以使用 DNS Worker 主掌您的網際網路安全。`,regionOptimization:`接入地區優化 (Windows)`,otherRegion:`其他地區`,copied:`已複製到剪貼簿`,verifyConnection:`驗證您的連接`,verifying:`正在驗證...`,connected:`連接正常`,notConnected:`或未連接`,profileMatch:`您正透過此配置進行過濾。`,profileMismatch:`您正使用 Obex,但配置 ID 不匹配。`,verifyHint:`完成下方配置後,點擊按鈕驗證。`,refreshStatus:`重新整理狀態`,egressIp:`出口 IP 地址`,currentLocation:`當前位置`,edgeServer:`邊緣伺服器`,dohUrlTitle:`當前配置 DoH URL`,accessPointTitle:`Access DoH URL`,defaultAccessPointName:`裝置-1`,moreAccessPoints:`更多存取點 ↗`,accessPointName:`存取點名稱`,accessPointNameFormatTip:`存取點名稱提示:1-30 位字元,只允許字母、數字、下劃線和中劃線`,accessPointLimitExceeded:`存取點數量已達上限(最多{{max}}個)`,accessPointToken:`訪問密鑰`,addAccessPoint:`新增存取點`,renameAccessPoint:`重命名`,rotateToken:`輪換密鑰`,rotateTokenConfirmDesc:`輪換密鑰將使所有使用舊密鑰的裝置立即斷開連接。確定要繼續嗎?`,deleteAccessPoint:`刪除`,deleteAccessPointConfirm:`確定要刪除此存取點嗎?`,manageAccessPoints:`管理存取點`,searchAccessPoints:`搜尋存取點...`,accessPointNameExists:`存取點名稱已存在`,accessPointCreated:`存取點創建成功`,accessPointRenamed:`存取點重命名成功`,accessPointDeleted:`存取點刪除成功`,tokenRotated:`訪問密鑰輪換成功`,whatIsDoh:`何為 DoH?`,dohDesc:`DNS over HTTPS (DoH) 是一種透過加密的 HTTPS 協議進行域名解析技術。`,dohBenefit1:`減少營運商等網路中間人的劫持與監聽`,dohBenefit2:`提升域名解析及網際網路訪問安全性`,learnMore:`瞭解更多`,copyUrl:`複製 URL`,browsers:`瀏覽器`,browserTitle:`瀏覽器配置 (Chrome/Edge)`,browserSteps:`設定 > 隱私和安全 > 安全 > 使用安全 DNS > 自訂 > 粘貼 URL。`,browserTips:`或者將此網址複製到地址欄:`,apple:`Apple`,appleTitle:`macOS / iOS / iPadOS / tvOS`,appleDesc:`Apple 裝置支援透過設定描述檔快速配置。`,appleWarning:`設定描述檔不可在 "封閉模式 (Lockdown Mode)" 下安裝,安裝前請確認系統不處於相關狀態。`,downloadConfig:`下載設定描述檔`,appleInstallHint:`下載後請前往「設定」>「已下載的設定描述檔」進行安裝`,windows:`MS Windows`,windowsTitle:`Windows 11 配置 [地區: {{region}}]`,windowsStep0:`設定 > 網路與網際網路`,windowsStep1:`屬性 > DNS 伺服器 > 編輯 > 手動。`,windowsStep2:`選擇並填入 DNS IP:`,windowsStep3:`啟用 DoH (手動模板) 並粘貼 URL。`,windowsStep4:`關閉 回退到明文。`,android:`Android`,androidTitle:`Android 9+`,androidDesc:`支援系統原生的「私有 DNS (DoT)」或使用第三方 App 設定 DoH。`,androidDotTitle:`私有 DNS (DoT - Serverfull 模式)`,androidDotDesc:`設定 > 網絡和互聯網 > 私有 DNS > 提供者主機名:`,androidWarning:`註:系統原生的「私有 DNS」使用 DoT 協議。若部署在 Cloudflare Workers,建議使用 Intra 等 App 設定 DoH;若運行在 Serverfull 模式並配置了 TLS 證書,可直接使用上述 DoT 主機名。`,dynamicFromDomain:`動態 (來自 "{{domain}}")`,dynamicFromDomainV6:`動態 IPv6 (來自 "{{domain}}")`,linux:`Linux`,linuxTitle:`Linux (Cloudflared DoH 代理)`,linuxDesc:`在本地執行輕量級 DNS 代理,透過 DoH 將解析請求加密轉發至 Obex。`,linuxStep1:`執行以下腳本安裝 cloudflared 並建立 systemd 服務(監聽 127.0.0.1:53)。`,linuxStep2:`將系統 DNS 修改為 127.0.0.1。`,routeros:`MikroTik`,routerosTitle:`MikroTik RouterOS`,routerosDesc:`將其設定為路由器的 DoH 伺服器,即可讓網路中的所有裝置使用此解析器。`,routerosStep1:`在 RouterOS 終端機中執行(RouterOS 7):`,routerosNote:`經路由器轉發的查詢在日誌中會顯示為路由器,而非個別裝置。如需依裝置查看日誌,請直接在裝置上設定。`,routerosDocs:`MikroTik DNS 文件`,accessPointsCardTitle:`接入點`,currentAccessPoint:`目前接入點`,selectAccessPointToConfigure:`選擇接入點以設定`},a={title:`自訂規則`,subtitle:`手動控制特定域名的解析行為(屏蔽、放行或重新導向)。`,action:`行動`,typeBlock:`攔截 (BLOCK)`,typeAllow:`放行 (ALLOW)`,typeRedirect:`重新導向 (REDIRECT)`,pattern:`域名模式 (Pattern)`,patternPlaceholder:`example.com 或 *.test.com`,addRule:`添加規則`,redirectSettings:`重新導向記錄設定`,aRecord:`A 記錄 (IPv4)`,aaaaRecord:`AAAA 記錄 (IPv6)`,cnameRecord:`CNAME 記錄`,txtRecord:`TXT 記錄`,optional:`(選填)`,ipv4Placeholder:`例如: 1.2.3.4`,ipv6Placeholder:`例如: 2001:db8::1`,cnamePlaceholder:`例如: target.com`,txtPlaceholder:`輸入文本內容...`,saveRedirectRule:`儲存並添加重新導向規則`,noRulesTitle:`無自訂規則`,noRulesDesc:`您還沒有添加任何手動規則。`,tableAction:`行動`,tablePattern:`模式`,tableDetails:`解析詳情`,tableOps:`操作`,labelBlock:`攔截`,labelAllow:`放行`,labelRedirect:`重新導向`,detailBlock:`解析至`,detailAllow:`轉發至上游服務`,patternEmpty:`域名模式不能為空`,duplicatePattern:`該域名的規則已存在`,addSuccess:`規則新增成功`,addFailed:`新增規則失敗`,updateSuccess:`規則更新成功`,updateFailed:`更新規則失敗`,tableCreatedAt:`新增時間`,clickToSort:`點擊排序`},o={customRange:`自訂時間範圍`,startTime:`開始時間`,endTime:`結束時間`,apply:`應用`,custom:`自訂`,totalQueries:`總查詢`,blocked:`攔截`,redirected:`重新導向`,blockRate:`攔截率`,activeDevices:`活躍裝置`,activeIPs:`活躍 IP 地址`,queryTrend:`查詢趨勢`,noRecords:`此時間段內暫無記錄`,topAllowed:`常用域名 (Allowed)`,topBlocked:`攔截頻率最高 (Blocked)`,noData:`暫無數據`,clientActivity:`客戶端活躍度`,ipAddress:`IP 地址`,location:`歸屬地`,queries:`查詢數`,destinationDistribution:`流量目的地分佈`,requests:`請求`,topIsps:`主要營運商`,pressToShowMore:`按下顯示更多`,maximize:`放大`,minimize:`縮小`},s={title:`查詢日誌`,subtitle:`查看本配置 DNS 解析日誌和攔截記錄。`,realtime:`即時`,allStatus:`全部狀態`,onlyPass:`放行`,onlyBlock:`攔截`,onlyRedirect:`重新導向`,searchPlaceholder:`搜尋域名...`,noResults:`未找到結果`,noRecords:`尚無記錄`,noResultsDesc:`沒有找到匹配 "{{query}}" 的域名記錄。`,noRecordsDesc:`選定的時間範圍內沒有收到任何 DNS 查詢。`,tableTime:`時間`,tableDomain:`域名`,tableAnswer:`解析結果`,tableSource:`來源`,tableType:`類型`,tableStatus:`狀態`,tableReason:`原因`,loadedAll:`已載入全部 {{count}} 條記錄`,realtimeLoadMoreTip:`關閉「即時」模式以載入更多`,filterAccessPoint:`存取點`,allAccessPoint:`全部存取點`,allCountry:`全部國家`,filterCountry:`目的地國家`,allIsp:`全部營運商`,filterIsp:`營運商`,timeRange:`時間範圍`,clearFilters:`清除篩選`,details:`查詢詳情`,detailAccessPoint:`存取點`,basicInfo:`基礎資訊`,detailDomain:`域名`,detailType:`類型`,detailTime:`時間`,detailLatency:`耗時`,detailProfile:`所用配置`,detailStatus:`狀態`,detailUpstream:`上游伺服器`,detailReason:`原因`,detailNoReason:`無 (已放行)`,detailECS:`ECS`,resolutionResult:`解析結果`,noResult:`無結果`,networkDetails:`網路詳情`,clientSource:`客戶端 (源)`,destination:`目的地 (解析地址)`,quickActions:`快捷操作`,actionAllow:`放行`,actionBlock:`攔截`,actionRedirect:`重新導向`,statusPass:`放行`,statusBlock:`攔截`,statusRedirect:`重新導向`,export:`匯出日誌`,rewritten:`已重寫`,logDetails:`查詢詳情`,searchCountry:`搜尋國家...`,noMatchingCountries:`未找到相符國家`,searchIsp:`搜尋電信業者...`,noMatchingIsps:`未找到相符電信業者`,loadingIsps:`正在載入電信業者...`,loggingDisabledTitle:`日誌記錄已關閉`,loggingDisabledDesc:`目前設定的日誌留存已設為「關閉」,系統不記錄任何查詢日誌。如需查看,請在設定中啟用日誌留存。`},c={title:`外部攔截清單`,subtitle:`訂閱第三方維護的域名屏蔽清單 (如 AdGuard 等)。`,formatDisclaimer:`本系統只支援有限的 AdGuard 格式列表和純域名列表。僅支援基礎的攔截規則(如 ||example.com^),會繞過 "@@" 白名單,暫不支援 "$" 重寫規則以及 "*" 省略規則。系統會自動匹配域名的所有子域名。`,syncAll:`同步所有清单`,urlPlaceholder:`輸入攔截清單 URL...`,addSubscription:`添加訂閱`,supportedFormats:`支援的清單格式:`,formatAdGuard:`相容 ||domain.com^ 等過濾規則。`,formatHosts:`相容標準 hosts 文件 (例如 0.0.0.0 domain.com)。`,noListsTitle:`尚未添加清單`,noListsDesc:`您還沒有訂閱任何外部攔截清單。`,tableUrl:`清單 URL`,tableLastSync:`上次同步`,tableStatus:`狀態`,tableOps:`操作`,neverSynced:`從未`,enabled:`正常`,disabled:`同步失敗`,statusNormal:`正常`,statusDisabled:`已停用`,statusOutdated:`過時`,statusMissing:`缺失`,presetOisdBig:`OISD Big (廣告/惡意軟體等攔截)`,presetOisdNsfw:`OISD NSFW (色情/震撼/成人內容攔截)`,presetAdGuard:`AdGuard AdServers (廣告伺服器)`,presetStevenBlack:`StevenBlack Hosts (綜合攔截)`,syncTaskStarted:`同步任務已啟動`,syncCheckComplete:`同步檢查已完成`,syncTaskFailed:`同步任務失敗`,syncing:`正在同步...`,syncSuccess:`清單同步成功`,syncError:`清單同步失敗`,syncErrorDesc:`無法下載或解析此攔截列表。請檢查連結是否正確,並確保該連結可以正常存取。`,deleteConfirm:`確定要刪除此清單訂閱嗎?`,deleteSuccess:`清單刪除成功`,deleteError:`清單刪除失敗`,addSuccess:`清單新增成功`,addError:`清單新增失敗`,listEnabled:`清單已啟用`,listEnabledHint:`停用後將停止使用此清單進行過濾,但不會刪除該清單,其訂閱與同步紀錄會保留。`,listEnabledToast:`已啟用清單 - 正在重建過濾器`,listDisabledToast:`已停用清單 - 正在重建過濾器`,checkDomain:`檢查網域`,checkDomainHint:`清單以精簡過濾器的形式儲存,因此無法瀏覽其中的項目。您可以立即針對此清單測試任意網域。`,check:`檢查`,checkBlocked:`已被此清單封鎖`,checkNotBlocked:`未被此清單封鎖`,checkViaParent:`(比對到上層網域)`,checkNotSynced:`此清單尚未完成同步,因此暫無可供檢查的內容。`,checkListDisabled:`此清單目前已停用,因此現在不會過濾任何內容。`,checkProbabilisticRate:`過濾器屬於機率性:大約每 {{odds}} 次比對中有 1 次為誤判。新增例外規則也會涵蓋其所有子網域。`,checkProbabilistic:`過濾器屬於機率性,因此少部分比對屬於誤判。新增例外規則也會涵蓋其所有子網域。`,checkAllowAction:`仍然允許`,checkAllowed:`已新增例外 - 該網域現在可以解析`,allowRuleAdded:`已為 {{domain}} 新增例外`},l={title:`配置設定`,subtitle:`管理您的 DNS 解析策略和進階選項。`,saveChanges:`儲存所有更改`,saveSuccess:`設定已成功儲存`,saveError:`儲存設定失敗,請稍後再試`,upstreamTitle:`上游服務`,dohUrl:`DoH URL`,dnsIP:`DNS IP`,classicDns:`經典 DNS`,httpsOnly:`僅支援 HTTPS`,upstreamDesc:`所有未被攔截的查詢將由本應用轉發至此伺服器。支援 DoH (HTTPS)、DoT (tls://)、DNS Stamp (sdns://) 或經典 DNS。經典 DNS 透過 TCP 轉發。`,defaultPolicyTitle:`默認過濾行為`,onNoMatch:`未匹配規則時`,allowAll:`允許所有查詢`,blockAll:`攔截所有查詢`,logRetentionTitle:`日誌留存`,retentionDuration:`留存時長`,retentionDesc:`日誌將自動清除。`,skipLogOnPass:`不記錄放行紀錄`,skipLogOnPassDesc:`啟用後不記錄正常允許的 DNS 查詢,僅記錄被攔截、重新導向或解析失敗的紀錄。可大幅減少儲存空間與寫入操作。`,ecsTitle:`EDNS 客戶端子網 (ECS)`,ecsUpstreamHint:`並非所有上游 DNS 都支援 ECS。對於 ControlD 等遞迴解析器,ECS 僅影響其內部路由,不會傳遞給上游權威伺服器。`,sendEcs:`呈遞 ECS`,customSubnet:`自訂子網`,customIpv4:`自訂 IPv4 子網`,customIpv6:`自訂 IPv6 子网`,ipv4Hint:`(例如 1.2.3.0/24)`,ipv6Hint:`(例如 2001:db8::/32)`,testToolTitle:`即時解析測試工具`,testDomain:`測試域名`,recordType:`記錄類型`,runTest:`執行測試`,domainPlaceholder:`例如 google.com`,hitRule:`命中規則 / 原因`,defaultAllow:`默認放行策略`,parseLatency:`解析耗時`,sourceIp:`源 IP 地址`,answerSection:`解析結果回顯 (Answer Section)`,noRecordsReturned:`本次查詢未返回任何記錄。`,diagnostics:`診斷資訊`,errorDetail:`錯誤詳情`,upstreamResponse:`上游回應內容`,presetCloudflareSecurity:`Cloudflare Security (快速/去惡意域名/去釣魚域名)`,presetCloudflareFamilies:`Cloudflare Families (快速/去惡意域名/去成人內容)`,presetQuad9:`Quad9 (去惡意域名/無日誌/不呈遞 ECS)`,presetQuad9Ecs:`Quad9 ECS (去惡意域名/無日誌/呈遞 ECS)`,presetControlDFree:`ControlD Free (去廣告/去跟蹤/去惡意域名/去釣魚域名)`,presetControlDUncensored:`ControlD Uncensored (抗審查)`,presetAdGuard:`AdGuard (去廣告/去跟蹤)`,presetAdGuardFamily:`AdGuard Family protection (去廣告/去跟蹤/去成人內容/安全搜尋)`,retention10m:`10 分鐘`,retention1h:`1 小時`,retention24h:`24 小時`,retention7d:`7 天`,retention30d:`30 天`,retention90d:`90 天 (最長)`,blockModeTitle:`攔截響應模式`,blockModeDesc:`當域名被攔截時返回的内容`,default:`默認`,NXDOMAIN:`域名不存在`,NODATA:`空回答`,customIP:`自訂 IP`,export:`匯出配置`,exportSuccess:`配置成功匯出`,exportError:`配置匯出失敗,請稍後再試`,nameUpdateSuccess:`配置名稱已更新`,saving:`正在儲存...`,echTitle:`重寫 ECH`,enableEch:`啟用重寫 ECH`,echDesc:`針對由 Cloudflare 代理的網域名稱,當查詢 HTTPS (Type 65) 或 SVCB (Type 64) 記錄時,自動重寫注入 ECH 參數與表層 SNI 以保護存取隱私。`,echFrontingTitle:`表層 SNI (ECH Fronting)`,echFrontingDesc:`TLS 握手外層可見的偽裝網域`,echFrontingCustomPlaceholder:`輸入自訂表層網域,例如 crypto.cloudflare.com`,echPreferred:`首選`,whatIsEch:`何為 ECH (Encrypted Client Hello)?`,echHelpDesc:`ECH (加密客戶端問候) 是 TLS 1.3 的重要隱私擴充,它將 TLS 握手中的真實目標網域名稱 (Inner SNI) 全程加密,僅向網路中間人暴露表層偽裝網域名稱 (Outer SNI / ECH Fronting)。`,echHelpBenefit1:`防止中間人及 ISP 窺探您正在存取的具體網頁與子網域名稱`,echHelpBenefit2:`配合 DoH 與自訂表層 SNI,消除明文 SNI 阻斷與識別風險`,retentionDisabled:`關閉 (隱私需要)`,retentionDisabledDesc:`已關閉日誌記錄。系統將不會記錄任何 DNS 查詢日誌並立即清空歷史日誌。`},u={title:`帳號設定`,subtitle:`管理您的安全憑據和系統用戶。`,jwtSecretWarningTitle:`安全提示:JWT 金鑰強度較弱`,jwtSecretWarningDesc:`目前 JWT_SECRET 長度小於 32 位元字元,存在潛在安全隱患。請先設定環境變數 KEK_v1 完成憑證信封加密遷移,然後再輪換 JWT_SECRET,以防止既有加密的 TOTP 或復原金鑰無法解密。`,roleAdmin:`系統管理員`,roleUser:`用戶`,personalInfo:`個人資訊`,username:`用戶名`,userId:`用戶 ID`,changePassword:`修改密碼`,currentPassword:`當前密碼`,newPassword:`新密碼`,updatePassword:`更新密碼`,userManagement:`用戶管理 (管理員)`,createUser:`創建用戶`,role:`角色`,createdAt:`創建時間`,lastActive:`最後活動時間`,lastResolve:`最後解析時間`,actions:`操作`,dangerZone:`危險區域`,clearLogs:`清空所有日誌`,clearLogsDesc:`這將刪除您名下所有 DNS 配置生成的查詢日誌。此操作不可恢復。`,clearLogsBtn:`立即清空日誌`,deleteAccount:`註銷帳號`,deleteAccountDesc:`永久刪除您的帳號及所有關聯數據。此操作將導致您失去所有解析配置。`,deleteAccountBtn:`註銷並刪除帳號`,createNewUser:`創建新用戶`,initialPassword:`初始密碼`,userRole:`用戶角色`,cancel:`取消`,createNow:`立即創建`,formatTipUsername:`用戶名格式提示:僅限 5 至 32 位 Unix 用戶名格式`,formatTipPassword:`密碼格式提示:12-100位字元`,passwordSuccess:`密碼修改成功`,updateFailed:`修改失敗`,confirmDeleteUser:`確定要刪除此用戶嗎?其擁有的所有配置也將被移除。`,confirmClearLogs:`確定要清空您名下所有配置的查詢日誌嗎?此操作不可撤銷。`,clearLogsSuccess:`日誌已成功清空`,confirmDeleteAccount:`警告:確定要註銷並刪除本帳號嗎?
2
+
3
+ 閣下所有 DNS 配置、自訂規則和查詢日誌將被永久刪除。此操作不可逆!`,inactivityPolicy:`活躍度政策`,inactivityDesc:`為保護用戶隱私並節省資源,超過 30 天無解析記錄的帳戶,其所有關聯查詢日誌及 DNS 配置將被自動清除。帳戶本身在 90 天無登錄後將予移除。`,systemSettings:`系統設定 (管理員)`,adminOnlyView:`僅管理員可見`,featureToggle:`功能開關`,enableTurnstileSignup:`註冊頁面啟用人機驗證`,enableTurnstileLogin:`登入頁面啟用人機驗證`,totp:{title:`數位驗證器 (TOTP)`,enabled:`啟用`,disabled:`停用`,setupDesc:`為帳號新增額外的安全層。支持 Google Authenticator、Authy 或任何 TOTP 相容應用。`,setupBtn:`設定數位驗證器`,scanQR:`使用驗證器應用掃描此二維碼:`,orEnterManually:`或手動輸入密鑰:`,enterCode:`請輸入驗證器代碼進行確認:`,enterCodeHint:`輸入 6 位驗證碼以確認密鑰已正確錄入。`,activate:`啟用數位驗證器`,skipPassword:`無密碼登入 — 登入時只顯示 TOTP 輸入框(隐藏密碼)`,disable:`停用數位驗證器`,disableTitle:`停用數位驗證器`,disableWarning:`停用數位驗證器後,若未設定通行金鑰,帳號將僅受密碼保護。確定要停用嗎?`,confirmDisable:`確認停用`,recoveryKeysTitle:`請保存您的恢復密鑰`,recoveryKeysWarning:`請將恢復金鑰妥善保存(如密碼管理器)。每個金鑰只能使用一次。`,copyKeys:`複製全部密鑰`,copied:`已複製!`,done:`完成,我已保存密鑰`,activeDesc:`數位驗證器已啟用,正在為您的帳號提供 6 位動態驗證碼保護。`},sessions:{session:`會話`,title:`活躍會話`,device:`裝置`,ip:`IP 位址`,loginTime:`登入時間`,expires:`過期時間`,action:`操作`,current:`目前會話`,revoke:`撤銷`,revokeFailed:`撤銷會話失敗。`,empty:`未找到活躍會話。`,unknownDevice:`未知裝置`,revokeOthers:`撤銷其他會話`,confirmRevokeOthers:`撤銷其他會話`,revokeOthersConfirmText:`確定要撤銷所有其他活躍會話嗎?除當前設備外,其他已登錄設備將立即退出。`},activity:{title:`帳號活動記錄`,action:`事件`,time:`時間`,session:`會話`,ip:`IP 位址`,empty:`暫無活動記錄。`,loadMore:`載入更多`,signup:`註冊`,loginSuccess:`登入成功`,loginFail:`登入失敗`,logout:`登出`,pwChangeSuccess:`密碼已修改`,pwChangeFail:`密碼修改失敗`,totpVerifySuccess:`TOTP 驗證通過`,totpVerifyFail:`TOTP 驗證失敗`,totpSetup:`設定數位驗證器`,totpRemoved:`停用數位驗證器`,recoveryKeyUsed:`使用了恢復密鑰`,sessionRevoked:`會話已撤銷`,reasons:{user_active:`主動登出`,user_revoke:`撤銷會話`,expired:`會話已過期`,geolocation_mismatch:`異地存取限制`,geolocation_missing:`缺少地理位置資訊`,token_reuse:`憑證重複使用(安全警告)`},passkeyRegistered:`新增通行密鑰`,passkeyDeleted:`刪除通行密鑰`,passkeyVerifySuccess:`通行密鑰驗證通過`,passkeyVerifyFail:`通行密鑰驗證失敗`,recoveryKeyRotated:`應急恢復金鑰已輪換`},passkey:{title:`通行密鑰 (Passkey)`,addBtn:`新增通行密鑰`,desc:`使用生物識別(Touch ID / Face ID / Windows Hello)或硬體安全金鑰(YubiKey)進行快捷且防釣魚的多因素認證。`,empty:`尚未新增任何通行密鑰。`,addTitle:`新增通行密鑰`,nameLabel:`通行密鑰名稱`,namePlaceholder:`例如:my_passkey`,promptNotice:`點擊繼續後,瀏覽器將彈出系統提示,引導您完成生物識別或硬體安全金鑰註冊。`,continue:`繼續`,renameTitle:`重命名通行密鑰`,deleteTitle:`刪除通行密鑰`,deleteConfirm:`確定要刪除通行密鑰 "{{name}}" 嗎?刪除後將無法使用該通行密鑰進行多因素認證。`,defaultName:`通行密鑰`,notSupported:`您的瀏覽器或目前環境不支援通行密鑰 (WebAuthn)。`,regFailed:`通行密鑰註冊失敗`,count:`{{count}} 個已設定`,none:`未設定`,created:`新增時間`,lastUsed:`最後使用`,neverUsed:`從未在登入中使用`,updated:`通行密鑰更新成功`,registered:`通行密鑰新增成功`,deleted:`通行密鑰已刪除`,appNameLabel:`網域名稱`,appNameHelper:`通行密鑰將綁定至此網域`,formatTip:`通行密鑰名稱提示:1-30 位字元,只允許字母、數字、下劃線和中劃線`,verifyPrompt:`請使用裝置的生物辨識(人臉、指紋、Windows Hello)或安全金鑰進行身分驗證。`,changePwNotice:`提交修改時將調用通行金鑰 (Passkey) 生物辨識或硬體金鑰核驗身分。`,submitNotice:`提交時將調用通行金鑰 (Passkey) 生物辨識或硬體金鑰核驗身分。`},mfaNone:`無`,resetUserPassword:`重設密碼`,resetPasswordTitle:`重設使用者密碼`,resetPasswordWarning:`重設後,該使用者的所有現有工作階段將立即登出,使用者需使用新密碼重新登入。`,resetPasswordSuccess:`密碼已成功重設,使用者舊登入工作階段已登出。`,confirmReset:`確認重設`,mfa:{title:`多因素驗證 (MFA)`,enabled:`已設定`,notConfigured:`未設定`,desc:`通行金鑰 (Passkey) 與數位驗證器 (TOTP) 均可作為多因素驗證方式,設定任選其一即可保障帳號安全並支援無密碼登入與密碼重設。`,passwordlessTitle:`無密碼登入 (Passwordless Login)`,passwordlessDesc:`啟用後,登入時無需輸入密碼,直接透過通行金鑰 (Passkey) 或數位驗證碼 (TOTP) 完成身分核驗。`,unconfiguredHint:`目前帳號尚未設定任何多因素驗證。設定通行金鑰或數位驗證器後,可啟用無密碼快速登入並在忘記密碼時安全找回帳號。`},recoveryKey:{title:`應急恢復金鑰`,desc:`應急恢復金鑰用於在遺失所有通行金鑰或數字驗證器時重新登入帳戶或重設密碼。恢復金鑰受 KEK 信封加密保護。`,configured:`已設定`,notConfigured:`未設定`,kekProtected:`KEK 加密保護`,kekTooltip:`該恢復金鑰在資料庫中受根金鑰 (KEK) 與資料金鑰 (DEK) 雙層信封加密保護。`,viewBtn:`檢視恢復金鑰`,rotateBtn:`輪換金鑰`,yourKey:`您的 30 位應急恢復金鑰`,securityTip:`請妥善保管此恢復金鑰。擁有此金鑰者可以重新取得您的帳戶存取權限。`,rotateConfirm:`輪換恢復金鑰將使舊金鑰立即失效。確定要繼續嗎?`,confirmRotateBtn:`確認輪換`,viewVerifyTitle:`驗證身分以檢視恢復金鑰`,rotateVerifyTitle:`驗證身分以輪換恢復金鑰`,rotateSuccess:`恢復金鑰輪換成功!請立即妥善備份並儲存新金鑰。`,legacyNotice:`您的恢復金鑰以舊版單向雜湊格式儲存,無法直接解密明文展示。請點擊「輪換金鑰」重新產生。`},verifyIdentity:`安全身分核驗`,verifyIdentityDesc:`為了保護您的帳戶安全,執行此敏感操作前請先驗證您的身分。`,usePasskeyInstead:`使用通行金鑰驗證`,changePasswordWithPasskey:`使用通行金鑰核驗並修改密碼`,enableRegistration:`開放新使用者註冊`},d={item1Title:`Obex 保護性 DNS`,item1Desc:`基於 Cloudflare Workers & D1 的 DNS 解析器,盡力提高速度與安全。`,item2Title:`DoH 隱私保護`,item2Desc:`透過 DNS over HTTPS (RFC 8484) 加密隧道防止劫持並增強隱私。`,item3Title:`全球邊緣網路`,item3Desc:`依托 Cloudflare 龐大的邊缘網路,獲得極速解析與極低延遲體驗。`,item4Title:`精細化過濾`,item4Desc:`全面支援黑白名單、AdGuard 規則以及自訂 DNS 記錄重新導向。`,item5Title:`即時統計分析`,item5Desc:`透過詳細的查詢日誌和綜合統計儀表盤,直观展現網路健康狀況。`,item6Title:`現代 UI 與暗黑模式`,item6Desc:`為工程師和家庭用戶設計的高密度管理面板,基於由 Palantir 開發的 Blueprint UI。`,item7Title:`雲原生基礎架構`,item7Desc:`無伺服器架構確保零維護和私人 DNS 的無限擴充性。`,item8Title:`多配置管理`,item8Desc:`為不同裝置或網路環境創建並管理多個獨立配置。`,item9Title:`多存取點管理`,item9Desc:`為不同裝置配置專屬的 DNS 存取點,實現日誌和統計數據的精细化隔離與分析。`},f={title:`DNS Worker 部署與配置指南`,subtitle:`您的系統實例尚未完全配置。請按照以下步驟完成部署以啟用 DNS Worker。`,dbStatus:`D1 資料庫綁定 (env.DB)`,jwtStatus:`JWT 金鑰 Secrets (env.JWT_SECRET)`,configured:`已配置`,missing:`缺失 / 未配置`,refresh:`重新檢測並重新整理`,methodCli:`CLI 命令行部署`,methodDash:`Cloudflare 控制台部署`,copy:`複製`,copied:`已複製!`,stepDbTitle:`1. 建立與綁定 D1 資料庫`,stepDbDesc:`在 Cloudflare 中建立 D1 資料庫實例,在終端機執行以下命令:`,stepDbCommand1:`wrangler d1 create dns_worker_db`,stepDbDesc2:`複製終端機輸出的配置資訊,並貼到專案根目錄的 wrangler.toml 裡的 [[d1_databases]] 中:`,stepDbCommand2:`[[d1_databases]]
4
+ binding = "DB"
5
+ database_name = "dns_worker_db"
6
+ database_id = "<您的_D1_DATABASE_ID>"
7
+ migrations_dir = "migrations"`,stepDbDashDesc:`1. 登入 Cloudflare 網頁控制台 -> Workers & Pages -> D1 -> 建立資料庫 -> 命名為 'dns_worker_db'。
8
+ 2. 進入您的 Worker -> 設定 -> 變數 -> D1 資料庫綁定 -> 新增綁定。
9
+ 3. 將綁定名稱設定為 'DB',D1 資料庫選擇 'dns_worker_db',並儲存。
10
+ 4. 進入您的 D1 資料庫 -> 控制台,複製並執行 migrations 目錄下的 SQL 遷移腳本以初始化資料庫資料表結構。`,stepJwtTitle:`2. 設定 JWT 金鑰 Secrets`,stepJwtDesc:`系統使用 JWT 金鑰簽署工作階段權杖,請將其設定為 Cloudflare Secrets 金鑰:`,stepJwtCommand1:`wrangler secret put JWT_SECRET`,stepJwtDashDesc:`1. 進入您的 Worker -> 設定 -> 變數 -> 環境變數 -> 新增變數。
11
+ 2. 設定名稱為 'JWT_SECRET',選擇類型為 '機密 (Secret)',並在值中輸入一個隨機安全字串(例如 64 位十六位元字元)。
12
+ 3. 點擊儲存並部署。`,stepJwtDesc2:`Cloudflare 網頁控制台`,stepJwtCommand2:`https://dash.cloudflare.com/`,stepDeployTitle:`3. 部署並套用遷移`,stepDeployDesc:`執行專案部署命令。該命令會自動編譯前端靜態資源,執行 D1 資料庫遷移結構,並發布至 Cloudflare 遠端:`,stepDeployCommand:`npm run deploy`,stepDeployDashDesc:`如果您已透過 Cloudflare 網頁控制台完成了所有綁定配置,請進入您的 Worker 控制面板的 Deployments (部署) 索引標籤下,點擊“部署”按鈕進行發布上線。`,jwtGeneratorTitle:`安全 JWT_SECRET 產生器`,jwtGeneratorDesc:`使用此加密安全的隨機數產生器產生 64 位元字元的隨機字母數字組合,用於 env.JWT_SECRET。`,regenerate:`重新產生`};var p={common:e,nav:t,theme:n,auth:r,setup:i,rules:a,analytics:o,logs:s,filtering:c,settings:l,account:u,intro:d,deploymentGuide:f};export{u as account,o as analytics,r as auth,e as common,p as default,f as deploymentGuide,c as filtering,d as intro,s as logs,t as nav,a as rules,l as settings,i as setup,n as theme};
Binary file
@@ -0,0 +1,27 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+
4
+ <head>
5
+ <meta charset="UTF-8" />
6
+ <link rel="icon" href="/favicon.webp" type="image/webp">
7
+ <link rel="icon" href="/favicon.png" type="image/png" />
8
+ <link rel="shortcut icon" href="/favicon.ico">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
10
+ <title>DNS Worker</title>
11
+ <script type="module" crossorigin src="/assets/index-7FKlsF79.js"></script>
12
+ <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-C4Xdq4VV.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/vendor-icons-16-BgwRBCeU.js">
14
+ <link rel="modulepreload" crossorigin href="/assets/vendor-icons-20-X5NPN60g.js">
15
+ <link rel="modulepreload" crossorigin href="/assets/vendor-icons-other-Bme3ywH9.js">
16
+ <link rel="modulepreload" crossorigin href="/assets/vendor-react-Kt98jRfM.js">
17
+ <link rel="modulepreload" crossorigin href="/assets/vendor-ui-core-BpucEp_q.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/vendor-utils-CfYGGC23.js">
19
+ <link rel="modulepreload" crossorigin href="/assets/vendor-i18next-cO7FDf_e.js">
20
+ <link rel="stylesheet" crossorigin href="/assets/index-DdQuGqR5.css">
21
+ <link rel="manifest" href="/manifest.webmanifest"><script id="vite-plugin-pwa:register-sw" src="/registerSW.js"></script></head>
22
+
23
+ <body>
24
+ <div id="root"></div>
25
+ </body>
26
+
27
+ </html>
@@ -0,0 +1 @@
1
+ {"name":"DNS Worker","short_name":"DNS Worker","start_url":"/","display":"standalone","background_color":"#ffffff","theme_color":"#1a1b26","lang":"en","scope":"/","icons":[]}
@@ -0,0 +1 @@
1
+ if('serviceWorker' in navigator) {window.addEventListener('load', () => {navigator.serviceWorker.register('/sw.js', { scope: '/' })})}
package/static/sw.js ADDED
@@ -0,0 +1 @@
1
+ const e=`dns-worker-icons-v2`,t=`/api/icon/`,n=1440*60*1e3;15*n,30*n;function r(){return new Response(`<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="#9ca3af" stroke-width="2.5" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="10"/><path d="M12 2a14.5 14.5 0 0 0 0 20 14.5 14.5 0 0 0 0-20"/><path d="M2 12h20"/></svg>`,{headers:{"Content-Type":`image/svg+xml`,"Cache-Control":`public, max-age=86400`}})}async function i(e){try{return await fetch(e,{mode:`cors`})}catch{return fetch(e,{mode:`no-cors`})}}function a(e){return e.startsWith(t)}async function o(e,t,n){let r=typeof t==`string`?t:t.url,i=new Request(r+`?sw-cached-at`),a=new Response(Date.now().toString());await e.put(t,n),await e.put(i,a)}async function s(e,t){try{let n=new Request(t.url+`?sw-cached-at`),r=await e.match(n);if(!r)return 1/0;let i=await r.text(),a=parseInt(i,10);return isNaN(a)?1/0:Date.now()-a}catch{return 1/0}}async function c(t){let n=await caches.open(e),a=await n.match(t.request);if(a){let e=await s(n,t.request);if(e<1296e6)return a;if(e<2592e6)return i(t.request.url).then(e=>{e&&(e.ok||e.status===0)&&o(n,t.request,e)}).catch(()=>{}),a}try{let e=await i(t.request.url);return e&&(e.ok||e.status===0)?(await o(n,t.request,e.clone()),e):a??r()}catch{return a??r()}}function l(n=[]){caches.open(e).then(e=>{n.forEach(n=>{let r=`${t}${n.replace(/^\*\./,``)}.ico`,a=new Request(r);e.match(a).then(t=>{t||i(r).then(t=>{t&&(t.ok||t.status===0)&&o(e,a,t)}).catch(()=>{})})})})}async function u(){try{let t=await caches.open(e),n=await t.keys(),r=Date.now(),i=n.filter(e=>e.url.includes(`?sw-cached-at`));for(let e of i){let n=await t.match(e);if(n){let i=await n.text(),a=parseInt(i,10);if(!isNaN(a)&&r-a>2592e6){let n=e.url.split(`?`)[0];await t.delete(new Request(n)),await t.delete(e)}}}}catch(e){console.error(`Failed to execute service worker cache cleanup:`,e)}}async function d(){try{let e=await caches.keys();for(let t of e)t.startsWith(`dns-worker-icons-`)&&t!==`dns-worker-icons-v2`&&await caches.delete(t)}catch(e){console.error(`Failed to clean up old caches:`,e)}}const f=`dns-worker-logs-v1`;function p(e){try{let t=new URL(e);return/^\/api\/profiles\/[^/]+\/logs\/\d+$/.test(t.pathname)}catch{return!1}}async function m(e){let t=await caches.open(f),n=await t.match(e.request);if(n)return n;try{let n=await fetch(e.request);return n.ok&&await o(t,e.request,n.clone()),n}catch{return new Response(JSON.stringify({error:`Network error fetching log details`}),{status:503,headers:{"Content-Type":`application/json`}})}}async function h(){try{let e=await caches.open(f),t=await e.keys(),n=Date.now(),r=t.filter(e=>e.url.includes(`?sw-cached-at`));for(let t of r){let r=await e.match(t);if(r){let i=await r.text(),a=parseInt(i,10);if(!isNaN(a)&&n-a>864e5){let n=t.url.split(`?`)[0];await e.delete(new Request(n)),await e.delete(t)}}}}catch(e){console.error(`Failed to execute service worker log cache cleanup:`,e)}}[{"revision":"1872c500de691dce40960bb85481de07","url":"registerSW.js"},{"revision":"5c1468ec46f6afea863d9ab629d287a4","url":"index.html"},{"revision":null,"url":"assets/zh-TW-C2_-uaZk.js"},{"revision":null,"url":"assets/zh-CN-D8YK7j27.js"},{"revision":null,"url":"assets/vi-VN-BcXfqmzH.js"},{"revision":null,"url":"assets/vendor-utils-CfYGGC23.js"},{"revision":null,"url":"assets/vendor-ui-core-BpucEp_q.js"},{"revision":null,"url":"assets/vendor-react-Kt98jRfM.js"},{"revision":null,"url":"assets/vendor-icons-other-Bme3ywH9.js"},{"revision":null,"url":"assets/vendor-icons-20-X5NPN60g.js"},{"revision":null,"url":"assets/vendor-icons-16-BgwRBCeU.js"},{"revision":null,"url":"assets/vendor-i18next-cO7FDf_e.js"},{"revision":null,"url":"assets/splitPathsBySizeLoader-BgBwSA38.js"},{"revision":null,"url":"assets/services-fIMx5oSx.js"},{"revision":null,"url":"assets/ru-RU-DeRsms_o.js"},{"revision":null,"url":"assets/rolldown-runtime-C4Xdq4VV.js"},{"revision":null,"url":"assets/paths-cc-gUzxh.js"},{"revision":null,"url":"assets/paths-CfqdBnl8.js"},{"revision":null,"url":"assets/ko-KR-bQ1okpC2.js"},{"revision":null,"url":"assets/ja-JP-CCVeJXwX.js"},{"revision":null,"url":"assets/index-DdQuGqR5.css"},{"revision":null,"url":"assets/index-7FKlsF79.js"},{"revision":null,"url":"assets/getFlagEmoji-_Wxhq0lT.js"},{"revision":null,"url":"assets/fr-FR-1qQHEpoW.js"},{"revision":null,"url":"assets/formatCountryName-CSBD8pP8.js"},{"revision":null,"url":"assets/es-ES-B2e3ea35.js"},{"revision":null,"url":"assets/de-DE-CXKS_pep.js"},{"revision":null,"url":"assets/date-C4b8kvr-.js"},{"revision":null,"url":"assets/browser-icErLjuM.js"},{"revision":null,"url":"assets/allPathsLoader-DM2JAMeC.js"},{"revision":null,"url":"assets/allPaths-BEI3QvIM.js"},{"revision":null,"url":"assets/TrendChart-B20w7SzD.js"},{"revision":null,"url":"assets/SwipeableDrawer-B-MfxTWM.js"},{"revision":null,"url":"assets/SetupView-D7d-Gsdr.js"},{"revision":null,"url":"assets/SettingsView-B9D0kPUF.js"},{"revision":null,"url":"assets/RulesView-3d5hga0L.js"},{"revision":null,"url":"assets/QRCodeCanvas-X07w5x_G.js"},{"revision":null,"url":"assets/LogsView-kQy7qTGd.js"},{"revision":null,"url":"assets/FilteringView-BWD3e-DS.js"},{"revision":null,"url":"assets/DestinationMap-BEQNbcb-.js"},{"revision":null,"url":"assets/AuthView-Bwv6hbdi.js"},{"revision":null,"url":"assets/AnalyticsView-DQ7hDChh.js"},{"revision":null,"url":"assets/AccountView-BvRvODjN.js"},{"revision":"edbf27fdbbc78a5a7269553eed5447b1","url":"manifest.webmanifest"}],self.addEventListener(`install`,()=>{self.skipWaiting()}),self.addEventListener(`activate`,e=>{e.waitUntil(Promise.all([self.clients.claim(),u(),d(),h()]))}),self.addEventListener(`fetch`,e=>{let t=e.request.url;a(t)&&e.respondWith(c(e)),p(t)&&e.respondWith(m(e))}),self.addEventListener(`message`,e=>{e.data&&e.data.type===`PREFETCH_ICONS`&&l(e.data.domains)});