From d920ddb69cd673c532fe772dacc2a948e555f156 Mon Sep 17 00:00:00 2001 From: Victor Solano Date: Mon, 24 Aug 2026 12:40:03 +0200 Subject: [PATCH 01/17] fix(header): keep the standalone header inside a 320px viewport The standalone page header (/tools/:slug, /privacy, /r/:id) scrolled horizontally at 320px. The row is a flex line whose only shrinkable item is the breadcrumb title, so once that collapsed to zero the row still needed brand (132.3px) + separator + three gaps + px-4 + the back button, which is 148.2px in en and 178.5px in pt-BR. Making the back button icon-only below sm frees that budget: overflow goes to zero in every locale, and the breadcrumb gets 91.2px at 320px, so it renders text there for the first time instead of a dangling "/". sr-only rather than hidden keeps the button's accessible name in every locale at every width, and being out of flow it costs no gap-2. The sm and wider layout is unchanged. Closes #445. --- frontend/components/StandalonePageHeader.vue | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/frontend/components/StandalonePageHeader.vue b/frontend/components/StandalonePageHeader.vue index 7b0d0a76c..f34a065be 100644 --- a/frontend/components/StandalonePageHeader.vue +++ b/frontend/components/StandalonePageHeader.vue @@ -24,10 +24,17 @@ {{ title }} - From 70f9b84648b720e4815dd5e4ce5200f0d0eae42c Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Mon, 24 Aug 2026 19:59:53 +0800 Subject: [PATCH 02/17] Improvements --- frontend/data/changelog.json | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/frontend/data/changelog.json b/frontend/data/changelog.json index f2e438ce6..fe16fb935 100644 --- a/frontend/data/changelog.json +++ b/frontend/data/changelog.json @@ -1686,6 +1686,15 @@ "ru": "IPilot теперь может запускать часть тестов за вас" } }, + { + "type": "improve", + "change": { + "en": "DNS Resolver now groups results by country", + "zh": "DNS 解析器现在按国家分组显示结果", + "fr": "Le DNS Resolver affiche désormais les résultats par pays", + "ru": "DNS Resolver теперь группирует результаты по странам" + } + }, { "type": "fix", "change": { From abe608f98ee31be07366fd3960d6308f886ccc9b Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Mon, 24 Aug 2026 22:06:46 +0800 Subject: [PATCH 03/17] Improvements --- frontend/data/speedtest-colos.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/frontend/data/speedtest-colos.js b/frontend/data/speedtest-colos.js index d2f345269..711a21dec 100644 --- a/frontend/data/speedtest-colos.js +++ b/frontend/data/speedtest-colos.js @@ -40,6 +40,10 @@ const coloList = { "country": "IN", "city": "Agra" }, + "AIP": { + "country": "IN", + "city": "Jalandhar" + }, "AKL": { "country": "NZ", "city": "Auckland" From 0208d2302551272c84e430bf889acdaaeccaed50 Mon Sep 17 00:00:00 2001 From: Seven Yu Date: Mon, 24 Aug 2026 22:59:32 +0800 Subject: [PATCH 04/17] Feat(i18n): add Traditional Chinese beta locale Add the zh-TW locale registry entry and translate the core navigation, preferences, metadata, and utility copy as a partial beta pack. Co-authored-by: Codex --- common/locale-registry.js | 1 + frontend/locales/zh-TW.json | 1476 +++++++++++++++++++++++++++++++++++ 2 files changed, 1477 insertions(+) create mode 100644 frontend/locales/zh-TW.json diff --git a/common/locale-registry.js b/common/locale-registry.js index 6153ca6f2..bf8309eb1 100644 --- a/common/locale-registry.js +++ b/common/locale-registry.js @@ -15,6 +15,7 @@ export const LOCALES = [ { code: 'fr', nativeName: 'Français', flag: 'fr', apiTag: 'fr', htmlLang: 'fr', status: 'full' }, { code: 'ru', nativeName: 'Русский', flag: 'ru', apiTag: 'ru', htmlLang: 'ru', status: 'full' }, { code: 'pt-BR', nativeName: 'Português (Brasil)', flag: 'br', apiTag: 'pt-BR', htmlLang: 'pt-BR', status: 'beta' }, + { code: 'zh-TW', nativeName: '繁體中文(台灣)', flag: 'tw', apiTag: 'zh-CN', htmlLang: 'zh-TW', status: 'beta' }, ]; // Registry order — also the order the language picker renders. diff --git a/frontend/locales/zh-TW.json b/frontend/locales/zh-TW.json new file mode 100644 index 000000000..2209fc159 --- /dev/null +++ b/frontend/locales/zh-TW.json @@ -0,0 +1,1476 @@ +{ + "user": { + "SignIn": "", + "SignInWithGoogle": "", + "SignInWithGithub": "", + "SignOut": "", + "SignInToView": "", + "SignInToUse": "", + "InvalidUserToken": "", + "QuotaExceeded": "", + "QuotaSponsorCta": "", + "ViewUsage": "", + "Usage": { + "Title": "", + "Note": "", + "IpinfoFeature": "", + "SponsorNote": "" + }, + "MyAchievements": "", + "Fields": { + "User": "", + "CreatedAt": "", + "LastLogin": "", + "Level": "", + "Fetching": "", + "SignInMethods": "" + }, + "Level": { + "Standard": "", + "Premium": "", + "Owner": "", + "Developer": "", + "HonoraryMember": "" + }, + "Benefits": { + "Title": "", + "Benefit": "", + "Note1": "", + "Note2": "", + "Current": "", + "Tiers": { + "Visitor": { + "Name": "", + "Item1": "", + "Item2": "", + "Item3": "", + "Item4": "", + "Item5": "", + "Item6": "" + }, + "SignedIn": { + "Name": "", + "Item1": "", + "Item2": "", + "Item3": "", + "Item4": "", + "Item5": "", + "Item6": "", + "Item7": "" + }, + "Sponsor": { + "Name": "", + "Item1": "", + "Item2": "", + "Item3": "" + } + } + }, + "Achievements": { + "Title": "", + "Note": "", + "Get": "", + "GetCount": "", + "NotGet": "", + "NotGetCount": "", + "FooterNote": "", + "Congrats": "", + "CongratsMessage": "", + "NewAchievementIs": "", + "Type": { + "IAmHuman": { + "Title": "", + "Meet": "" + }, + "BarelyEnough": { + "Title": "", + "Meet": "" + }, + "RapidPace": { + "Title": "", + "Meet": "" + }, + "TorrentFlow": { + "Title": "", + "Meet": "" + }, + "SteadyGoing": { + "Title": "", + "Meet": "" + }, + "TooFastTooSimple": { + "Title": "", + "Meet": "" + }, + "SwiftAscent": { + "Title": "", + "Meet": "" + }, + "SurfaceCheck": { + "Title": "", + "Meet": "" + }, + "HalfwayThere": { + "Title": "", + "Meet": "" + }, + "FullySecured": { + "Title": "", + "Meet": "" + }, + "JustInCase": { + "Title": "", + "Meet": "" + }, + "HiddenWell": { + "Title": "", + "Meet": "" + }, + "SlipUp": { + "Title": "", + "Meet": "" + }, + "CleverTrickery": { + "Title": "", + "Meet": "" + }, + "EnergySaver": { + "Title": "", + "Meet": "" + }, + "ResourceHog": { + "Title": "", + "Meet": "" + }, + "MakingBigNews": { + "Title": "", + "Meet": "" + }, + "GenerousDonor": { + "Title": "", + "Meet": "" + }, + "ItIsOpen": { + "Title": "", + "Meet": "" + }, + "CuriousCat": { + "Title": "", + "Meet": "" + }, + "CrossingTheWall": { + "Title": "", + "Meet": "" + }, + "GlobeTrotter": { + "Title": "", + "Meet": "" + }, + "HelloWorld": { + "Title": "", + "Meet": "" + }, + "AddSweetAdd": { + "Title": "", + "Meet": "" + }, + "PrettyDirty": { + "Title": "", + "Meet": "" + }, + "SqueakyClean": { + "Title": "", + "Meet": "" + }, + "WalkWithPenguins": { + "Title": "", + "Meet": "" + } + } + } + }, + "nav": { + "id": "nav", + "Title": "IPCheck.ing", + "Navigation": "導覽", + "IPInfo": "IP 資訊", + "Connectivity": "網路連線", + "ServiceStatus": "服務狀態", + "WebRTC": "WebRTC 洩漏測試", + "DNSLeakTest": "DNS 洩漏測試", + "SpeedTest": "網速測試", + "PingTest": "全球延遲", + "MTRTest": "MTR 測試", + "RuleTest": "分流測試", + "AdvancedTools": "進階工具", + "SearchDocs": "搜尋文件…", + "DocsToolConfirm": "要讓助手查看目前的測試結果嗎?", + "DocsToolSummary": "已讀取頁面上的測試結果", + "DocsToolRunConfirm": "要在你的頁面上執行測試嗎?", + "DocsToolRunSummary": "已執行你的網路測試", + "AskIPilot": "詢問 IPilot", + "OpenDocs": "開啟文件", + "DocsGreetingTitle": "有什麼可以幫你?", + "DocsGreetingSubtitle": "關於 MyIP 的工具、測試結果或自行部署,都可以問我。", + "DocsQuestions": [ + "我的 VPN 洩漏真實 IP 了嗎?", + "為什麼我的 IP 位置不正確?", + "比較我的 WebRTC 測試與 DNS 洩漏測試結果,並給我一些建議", + "要如何閱讀 MTR 結果?", + "要如何部署自己的 MyIP?", + "我想贊助 MyIP 專案" + ], + "pulse": { + "title": "", + "tooltip": "", + "others": "", + "shareStatus": "", + "liveMap": "", + "noVisitors": "", + "quiet": "", + "loadError": "", + "share": "", + "latest": "", + "sent": "", + "alreadySent": "", + "rateLimited": "", + "limitedTitle": "", + "outages": { + "title": "", + "outage": "", + "anomaly": "", + "ongoing": "", + "ended": "", + "started": "", + "lasted": "", + "quiet": "", + "loadMore": "", + "cause": { + "GOVERNMENT_DIRECTED": "", + "POWER_OUTAGE": "", + "CABLE_CUT": "", + "TECHNICAL_PROBLEM": "", + "MECHANICAL": "", + "UNKNOWN": "", + "WEATHER": "", + "FIRE": "", + "CYBERATTACK": "", + "NATURAL_DISASTER": "", + "MAINTENANCE": "", + "MILITARY_ACTION": "" + }, + "level": { + "NATIONWIDE": "", + "REGIONAL": "", + "NETWORK": "" + } + }, + "statuses": { + "fast": "", + "ok": "", + "slow": "", + "flaky": "", + "blocked": "", + "good": "", + "bad": "", + "passing": "", + "lag": "", + "newip": "", + "vpn": "", + "night": "", + "vibing": "", + "fixing": "", + "tuning": "", + "prgday": "", + "internetday": "", + "halloween": "", + "diwali": "", + "christmas": "", + "newyear": "", + "privacyday": "", + "lunar": "", + "valentine": "", + "jobs": "", + "eid": "", + "aprilfools": "", + "earthday": "", + "turing": "", + "emojiday": "", + "birthday": "" + }, + "festivalDesc": { + "prgday": "", + "internetday": "", + "halloween": "", + "diwali": "", + "christmas": "", + "newyear": "", + "privacyday": "", + "lunar": "", + "valentine": "", + "jobs": "", + "eid": "", + "aprilfools": "", + "earthday": "", + "turing": "", + "emojiday": "", + "birthday": "" + } + }, + "preferences": { + "title": "偏好設定", + "preferenceTips": "這些設定會儲存在瀏覽器中,方便之後使用。部分選項需要重新整理頁面才會生效。", + "colorScheme": "色彩模式", + "systemAuto": "自動", + "colorLight": "日間", + "colorDark": "夜間", + "ipSourcesToCheck": "IP 檢測伺服器數量", + "ipSourcesToCheckTips": "選擇要用來檢測 IP 位址的伺服器數量。選擇越多伺服器,完成檢測所需的時間越長。", + "appSettings": "程式設定", + "autoRun": "自動執行", + "autoRunTips": "頁面載入時一定會檢查 IP 資訊。你可以選擇其他模組是否在啟動時自動執行。", + "simpleMode": "簡潔模式", + "simpleModeTips": "隱藏每個模組的說明文字,適合已熟悉本應用程式的使用者。", + "connectivityMultipleTests": "多次重新整理連線測試", + "connectivityMultipleTestsTips": "啟用後,應用程式會在啟動時執行多次檢查,並顯示最低延遲。", + "popupConnectivityNotifications": "彈出連線通知", + "popupConnectivityNotificationsTips": "啟用後,初次檢查的結果會以彈出通知顯示。", + "ipHistory": "IP 歷史記錄", + "ipHistoryEnabled": "記錄 IP 歷史", + "ipHistoryDays": "保留天數", + "ipHistoryTips": "啟用後,偵測到的 IP 只會記錄在此瀏覽器中,並保留所選天數。關閉後會停止記錄;現有記錄會保留,直到你在 IP 歷史面板中清除。", + "ipDB": "IP 地理位置資料庫", + "ipDBTips": "你可以選擇預設使用的 IP 地理位置資料來源。如果選定的來源無法使用,系統會依序使用後續來源。", + "language": "語言設定", + "languageTips": "重新整理瀏覽器後生效。Beta 語言可能包含不完整的翻譯。" + }, + "DocsPrompt": "輸入你想詢問的問題…", + "DocsSignInTitle": "需要登入", + "DocsSignInMessage": "登入後即可詢問 IPilot" + }, + "securitychecklist": { + "Title": "", + "Note": "", + "Note2": "", + "Progress": "", + "Item": "", + "Items": "", + "Priority": "", + "Ignore": "", + "alert-total": "", + "alert-checked": "", + "alert-ignored": "", + "alert-unchecked": "", + "Checked": "", + "Ignored": "", + "Unchecked": "", + "Basic": "", + "Optional": "", + "Essential": "", + "Advanced": "", + "Reset": "", + "ShowAll": "", + "ShowUnchecked": "", + "ShowIgnored": "", + "ShowChecked": "" + }, + "curl": { + "Title": "", + "Note1": "", + "Note2_1": "", + "Note2_2": "", + "Note3": "", + "Note4": "", + "getIPv4": "", + "getIPv6": "", + "get6and4": "", + "notAvailable": "" + }, + "browserinfo": { + "Title": "", + "Note": "", + "Note2": "", + "browser": { + "Infos": "", + "browserName": "", + "engineName": "", + "osName": "", + "deviceVendor": "", + "cpuArchitecture": "", + "gpu": "", + "cpuCores": "", + "languages": "", + "timezone": "", + "display": "", + "connection": "", + "touchPoints": "", + "doNotTrack": "", + "doNotTrackOn": "", + "doNotTrackOff": "", + "doNotTrackUnset": "", + "pdfViewer": "", + "pdfViewerYes": "", + "pdfViewerNo": "", + "cookieEnabled": "", + "cookieEnabledTrue": "", + "cookieEnabledFalse": "" + }, + "fingerprint": { + "Infos": "", + "fingerprint": "", + "changeOption": "", + "browserTips": "" + }, + "options": { + "audio": "", + "canvas": "", + "fonts": "", + "hardware": "", + "locales": "", + "permissions": "", + "plugins": "", + "screen": "", + "system": "", + "webgl": "", + "math": "", + "intl": "", + "mediaDevices": "", + "speech": "", + "mathml": "", + "webrtc": "" + }, + "components": { + "title": "", + "note": "" + }, + "calError": "", + "calculating": "" + }, + "censorshipcheck": { + "Title": "", + "Note": "", + "Note2": "", + "Placeholder": "", + "Country": "", + "Status": "", + "City": "", + "Network": "", + "invalidURL": "", + "fetchError": "", + "HistoryTitle": "", + "SummaryFlagged": "", + "SummaryClean": "", + "SummarySparseFlagged": "", + "SummarySparseClean": "", + "NoData": "", + "OoniError": "", + "TierConfirmed": "", + "TierLikely": "", + "TierSigns": "", + "Measurements": "", + "AnomalyShare": "", + "MethodDns": "", + "MethodTcpIp": "", + "MethodHttpFailure": "", + "MethodHttpDiff": "", + "RealtimeTitle": "", + "ResultsHint": "", + "SectionFlagged": "", + "PresetHighRisk": "", + "PresetOpen": "", + "RunVerify": "", + "RealtimeNote": "", + "RealtimeFooterNote": "" + }, + "invisibilitytest": { + "Title": "", + "Note": "", + "Note2": "", + "fetchError": "", + "scriptLoadError": "", + "yourIP": "", + "proxyScore": "", + "VPNScore": "", + "isProxy": "", + "notProxy": "", + "isVPN": "", + "notVPN": "", + "itemName": "", + "itemProxyResult": "", + "itemComment": "", + "agreement": "", + "blocklist": { + "proxy": { + "title": "", + "positive": "", + "negative": "" + }, + "vpn": { + "title": "", + "positive": "", + "negative": "" + }, + "vpnExitNode": { + "title": "", + "positive": "", + "negative": "" + } + }, + "tor": { + "title": "", + "positive": "", + "negative": "" + }, + "headers": { + "title": "", + "positive": "", + "negative": "" + }, + "datacenter": { + "title": "", + "positive": "", + "negative": "" + }, + "tcp": { + "title": "", + "positive": "", + "computer": "", + "server": "", + "negative": "" + }, + "timezone": { + "title": "", + "positive": "", + "computer": "", + "server": "", + "negative": "" + }, + "net": { + "title": "", + "positive": "", + "negative": "" + }, + "webrtc": { + "title": "", + "positive": "", + "ipsAre": "", + "negative": "" + }, + "flow": { + "title": "", + "positive": "", + "negative": "" + }, + "latencyVSWS": { + "title": "", + "positive": "", + "fromTCP": "", + "fromWS": "", + "negative": "" + }, + "latencyVSPing": { + "title": "", + "positive": "", + "fromTCP": "", + "fromPing": "", + "negative": "" + }, + "highlatency": { + "title": "", + "positive": "", + "negative": "" + } + }, + "personacheck": { + "Title": "", + "Note": "", + "NoteVs": "", + "Note2": "", + "axis": { + "match": "", + "coherence": "", + "leak": "" + }, + "zone": { + "expected": "", + "optional": "", + "run": "" + }, + "selectCountry": "", + "noCountryMatch": "", + "noProfile": "", + "languageSingle": "", + "languageMulti": "", + "timezoneMulti": "", + "hourCycle": { + "h11": "", + "h12": "", + "h23": "", + "h24": "" + }, + "profile": { + "timezone": "" + }, + "runCompare": "", + "runError": "", + "source": { + "ipinfo": "", + "webrtc": "", + "dnsleak": "" + }, + "report": { + "grade": { + "A": "", + "B": "", + "C": "", + "D": "", + "unknown": "" + }, + "gradeNote": { + "A": "", + "B": "", + "C": "", + "D": "", + "unknown": "" + }, + "counts": { + "leak": "", + "warning": "", + "match": "", + "unknown": "", + "notApplicable": "" + }, + "nothingActionable": "", + "howToFix": "", + "verdict": { + "match": "", + "mismatch": "", + "leak": "", + "unnatural": "", + "unknown": "", + "not-applicable": "" + }, + "visibility": { + "public": "", + "probed": "", + "risk-engine": "" + }, + "profileTitle": "", + "state": { + "match": "", + "mismatch": "", + "unnatural": "", + "leak": "", + "unknown": "", + "not-applicable": "" + } + }, + "detail": { + "expected": "", + "actual": "", + "disputed": "", + "v4": "", + "v6": "", + "candidateCount": "", + "matching": "", + "ipType": "", + "expectedOffset": "", + "actualOffset": "", + "sameOffset": "", + "primary": "", + "primaryExpected": "", + "demoted": "", + "timeZone": "", + "reportedOffset": "", + "zoneOffset": "", + "samples": "", + "expectedScripts": "", + "installedScripts": "", + "expectedLanguages": "", + "voiceLanguages": "", + "voiceCount": "", + "expectedLayout": "", + "actualLayout": "", + "headerPrimary": "", + "scriptPrimary": "", + "headerLanguages": "", + "ipZone": "", + "browserZone": "", + "ipOffset": "", + "browserOffset": "", + "colo": "", + "gpsTimezone": "", + "accuracyMetres": "", + "cardIssuer": "", + "cardNetwork": "", + "cardTier": "", + "cardType": "" + }, + "checks": { + "ip-country": { + "title": "", + "fix": "", + "what": "" + }, + "webrtc-leak": { + "title": "", + "fix": "", + "what": "" + }, + "dns-resolver-country": { + "title": "", + "fix": "", + "what": "" + }, + "asn-type": { + "title": "", + "fix": "", + "what": "" + }, + "timezone-vs-persona": { + "title": "", + "fix": "", + "what": "" + }, + "language-match": { + "title": "", + "fix": "", + "what": "" + }, + "script-fonts": { + "title": "", + "fix": "", + "what": "" + }, + "speech-voices": { + "title": "", + "fix": "", + "what": "" + }, + "keyboard-layout": { + "title": "", + "fix": "", + "what": "" + }, + "edge-geo-consensus": { + "title": "", + "fix": "", + "what": "" + }, + "accept-language-header": { + "title": "", + "fix": "", + "what": "" + }, + "ip-timezone-vs-browser": { + "title": "", + "fix": "", + "what": "" + }, + "gps-location": { + "title": "", + "fix": "", + "what": "" + }, + "payment-region": { + "title": "", + "fix": "", + "what": "" + }, + "intl-number-format": { + "title": "", + "what": "", + "fix": "" + }, + "intl-date-format": { + "title": "", + "what": "", + "fix": "" + }, + "intl-hour-cycle": { + "title": "", + "what": "", + "fix": "" + }, + "timezone-authenticity": { + "title": "", + "what": "", + "fix": "" + } + }, + "reason": { + "no-marker-script": "", + "bin-lookup-failed": "", + "bin-not-recognized": "", + "font-probe-unavailable": "", + "no-voice-packs": "", + "keyboard-api-unavailable": "", + "no-layout-expectation": "", + "no-persona-languages": "", + "geolocation-unsupported": "", + "ip-no-country": "", + "ip-no-type": "", + "ip-no-timezone": "", + "webrtc-no-candidates": "", + "dns-no-country": "" + }, + "optional": { + "gpsNote": "", + "gpsButton": "", + "gpsGranted": "", + "gpsFailed": { + "denied": "", + "timeout": "", + "unavailable": "", + "unsupported": "" + }, + "cardNote": "", + "cardError": "", + "cardReady": "" + }, + "dependencies": { + "note": "", + "runButton": "", + "runButtonRunning": "", + "measured": "", + "allReady": "" + }, + "step": { + "country": "", + "language": "", + "location": "", + "card": "", + "awaitingCountry": "", + "otherTests": "" + }, + "emptyHint": "", + "readyHint": "", + "value": { + "yes": "", + "no": "" + } + }, + "advancedtools": { + "OpenInNewTab": "", + "BackToHome": "", + "Title": "", + "Note": "", + "PingTestNote": "", + "MTRTestNote": "", + "DNSResolverNote": "", + "EnhancedDnsLeakTest": "", + "RuleTestNote": "", + "CensorshipCheck": "", + "ServiceStatus": "", + "Whois": "", + "InvisibilityTest": "", + "MacChecker": "", + "BrowserInfo": "", + "SecurityChecklist": "", + "PersonaCheck": "" + }, + "macchecker": { + "Title": "", + "Note": "", + "Note2": "", + "Placeholder": "", + "invalidMAC": "", + "fetchError": "", + "company": "", + "macPrefix": "", + "address": "", + "country": "", + "blockStart": "", + "blockEnd": "", + "blockSize": "", + "blockType": "", + "blockRange": "", + "isRand": "", + "isPrivate": "", + "isMulticast": "", + "isUnicast": "", + "isGlobal": "", + "isLocal": "", + "property": "", + "value": "", + "manufacturer": "" + }, + "whois": { + "Title": "", + "Note": "", + "Note2": "", + "Note3": "", + "Placeholder": "", + "invalidURL": "", + "reservedIP": "", + "noData": "", + "fetchError": "", + "Provider": "" + }, + "enhanceddnsleaktest": { + "Title": "", + "Note": "", + "Note2": "", + "Note3": "", + "Run": "", + "RunAgain": "", + "RunningProbes": "", + "PollingResult": "", + "FetchError": "", + "Empty": "", + "TableTitle": "", + "DedupeToggle": "", + "Flow": { + "Probing": "", + "Waiting": "", + "Fetching": "", + "Done": "" + }, + "DnssecChip": { + "Signed": "", + "Unsigned": "", + "Validated": "", + "CdSet": "" + }, + "Summary": { + "ResolverCount": "", + "RawCount": "", + "DnssecPosture": "", + "DnssecGood": "", + "DnssecNoDo": "", + "DnssecCdSet": "", + "DnssecNone": "" + }, + "Fields": { + "ResolverIP": "", + "Location": "", + "ASN": "", + "QueryType": "", + "Transport": "", + "ECS": "" + }, + "Legend": { + "Title": "", + "ResolverIP": "", + "QueryType": "", + "Transport": "", + "ECS": "", + "DO": "", + "CD": "" + } + }, + "dnsresolver": { + "Title": "", + "Note": "", + "Note2": "", + "Placeholder": "", + "invalidURL": "", + "fetchError": "", + "Provider": "", + "Result": "", + "Record": "", + "AllRegions": "" + }, + "ruletest": { + "Title": "", + "Name": "", + "Note": "", + "StatusWait": "", + "StatusError": "", + "Country": "", + "RefreshAll": "" + }, + "Tooltips": { + "RefreshIPCard": "", + "SaveAsImage": "", + "RefreshConnectivityTests": "", + "RefreshWebRTC": "", + "RefreshDNSLeakTest": "", + "SpeedTestButton": "", + "ShowASNInfo": "", + "ShowASNHistory": "", + "ShowASNConnectivity": "", + "CopyIP": "", + "CopySdpLog": "", + "ViewOnMap": "", + "InfoMask": "", + "IPHistory": "", + "ShareReport": "", + "QueryIP": "", + "GithubLink": "" + }, + "report": { + "Title": "", + "Note": "", + "SectionsLabel": "", + "NotTested": "", + "MaskTail": "", + "TtlLabel": "", + "Ttl1": "", + "Ttl3": "", + "Ttl7": "", + "Preview": "", + "CreateLink": "", + "CopyAI": "", + "DownloadJson": "", + "CopyLink": "", + "NoSelection": "", + "CreateFailed": "", + "LinkOnce": "", + "ExpiresAt": "", + "CopiedTitle": "", + "CopiedMessage": "", + "ai": { + "Heading": "", + "Intro": "", + "Masked": "", + "Instruction": "", + "Sections": { + "ipinfo": "", + "connectivity": "", + "webrtc": "", + "dnsleak": "", + "speedtest": "", + "pingtest": "", + "mtrtest": "", + "ruletest": "", + "browserinfo": "", + "invisibility": "", + "enhanceddnsleak": "", + "persona": "" + } + } + }, + "reportPage": { + "Loading": "", + "NotFound": "", + "NotFoundNote": "", + "LoadFailed": "", + "Unsupported": "", + "GeneratedBy": "", + "Stale": "", + "TestMine": "", + "Col": { + "Source": "", + "Name": "", + "IP": "", + "Location": "", + "ISP": "", + "Status": "", + "Server": "", + "Provider": "", + "Target": "", + "UniqueIPs": "", + "Resolvers": "" + }, + "Dnssec": { + "ok": "", + "partial": "", + "none": "" + } + }, + "ipHistory": { + "Title": "", + "Notes": "", + "Empty": "", + "FilterByType": "", + "FilterByCountry": "", + "UnknownCountry": "", + "NoMatch": "", + "ClearAll": "", + "ClearConfirm": "" + }, + "ipInfos": { + "Title": "", + "Notes": "", + "Source": "", + "Country": "", + "Region": "", + "City": "", + "TimeZone": "", + "ISP": "", + "ASN": "", + "Coordinates": "", + "IPv4Error": "", + "IPv6Error": "", + "type": "", + "isProxy": "", + "qualityScore": "", + "qualityScoreUnknown": "", + "advancedUnlockCta": "", + "advancedQuotaCta": "", + "ASNInfo": { + "trafficPercentage": "", + "note": "", + "asnName": "", + "asnOrgName": "", + "asnCountryCode": "", + "estimatedUsers": "", + "IPv4_Pct": "", + "IPv6_Pct": "", + "HTTP_Pct": "", + "HTTPS_Pct": "", + "Desktop_Pct": "", + "Mobile_Pct": "", + "Bot_Pct": "", + "Human_Pct": "", + "moreData": "" + }, + "ASNHistory": { + "announcedPrefixes": "", + "note": "", + "empty": "", + "error": "", + "seenBy": "" + }, + "ASNConnectivity": { + "note": "", + "empty": "", + "error": "", + "expand": "", + "dialogTitle": "", + "legendOrigin": "", + "legendTier1": "", + "legendIntermediate": "", + "zoomIn": "", + "zoomOut": "", + "zoomReset": "" + }, + "advancedData": { + "proxyYes": "", + "proxyMaybe": "", + "proxyNo": "", + "proxyUnknown": "", + "type": { + "Residential": "", + "Wireless": "", + "Business": "", + "Hosting": "", + "unknownType": "" + }, + "Nativeness": "", + "NativeIPYes": "", + "NativeIPNo": "", + "nativenessTooltip": "" + } + }, + "serviceStatus": { + "Title": "", + "Note": "", + "Refresh": "", + "LastChecked": "", + "AllOperational": "", + "ComponentsTitle": "", + "IncidentsTitle": "", + "NoComponents": "", + "NoRecentIncidents": "", + "Loading": "", + "Checking": "", + "IncidentsError": "", + "ComponentsError": "", + "indicator": { + "minor": "", + "major": "", + "critical": "", + "maintenance": "", + "unknown": "" + }, + "component": { + "operational": "", + "degraded_performance": "", + "partial_outage": "", + "major_outage": "", + "under_maintenance": "" + }, + "incidentStatus": { + "investigating": "", + "identified": "", + "monitoring": "", + "resolved": "", + "postmortem": "", + "scheduled": "", + "in_progress": "", + "verifying": "", + "completed": "" + } + }, + "connectivity": { + "Title": "", + "Note": "", + "StatusWait": "", + "StatusAvailable": "", + "StatusUnavailable": "", + "StatusTimeout": "", + "checking": "", + "minTestTime": "", + "RefreshThisTest": "", + "RoundCount": "", + "addCustom": { + "AddCard": "", + "Title": "", + "Hint": "", + "NameLabel": "", + "NamePlaceholder": "", + "UrlLabel": "", + "UrlPlaceholder": "", + "Add": "", + "Remove": "", + "NameRequired": "", + "UrlRequired": "", + "InvalidUrl": "", + "LimitReached": "", + "LastTargetTitle": "", + "LastTargetMessage": "" + }, + "importDialog": { + "Title": "", + "CustomOption": "", + "ImportOption": "", + "SiteCount": "", + "Import": "", + "Capacity": "", + "NotEnoughCapacity": "" + }, + "importLists": { + "defaults": "", + "iran": "", + "russia": "", + "china": "", + "brazil": "", + "ai": "", + "social": "", + "streaming": "", + "gaming": "", + "developer": "", + "cloud": "", + "crypto": "", + "ecommerce": "", + "news": "" + } + }, + "webrtc": { + "id": "", + "Title": "", + "Name": "", + "Note": "", + "StatusWait": "", + "StatusError": "", + "StatusUnavailable": "", + "SdpLog": "", + "NATType": { + "srflx": "", + "prflx": "", + "relay": "", + "host": "", + "unknown": "" + } + }, + "dnsleaktest": { + "Name": "", + "Title": "", + "Note": "", + "Note2": "", + "EndpointCountry": "", + "StatusWait": "", + "StatusError": "" + }, + "speedtest": { + "Title": "", + "Note": "", + "Download": "", + "Upload": "", + "Latency": "", + "Jitter": "", + "loadedLatency": "", + "videoStreaming": "", + "gaming": "", + "rtc": "", + "score": "", + "connectionFrom": "", + "connectionTo": "", + "connectionEnd": "", + "testFailed": "", + "quality": { + "bad": "", + "poor": "", + "average": "", + "good": "", + "great": "" + } + }, + "globalping": { + "Selected": "", + "Suggested": "", + "NoProbe": "", + "GroupFull": "", + "UnreachableTarget": "", + "ResultsHint": "", + "Asia": "", + "Europe": "", + "Africa": "", + "Americas": "", + "Oceania": "" + }, + "pingtest": { + "EnterIPLabel": "", + "EnterIPPlaceholder": "", + "UseStored": "", + "id": "", + "Title": "", + "Note": "", + "Note2": "", + "Note3": "", + "SelectIP": "", + "Region": "", + "MinDelay": "", + "MaxDelay": "", + "AvgDelay": "", + "TotalPackets": "", + "PacketLoss": "", + "ReceivedPackets": "", + "DroppedPackets": "", + "Error": "" + }, + "mtrtest": { + "EnterIPLabel": "", + "EnterIPPlaceholder": "", + "UseStored": "", + "Title": "", + "Note": "", + "Note2": "", + "Note3": "", + "SelectIP": "", + "Region": "", + "Error": "", + "ColHost": "", + "ColIP": "", + "ColASN": "", + "ColLoss": "", + "ColSent": "", + "ColDrop": "", + "ColRecv": "", + "ColLast": "", + "ColAvg": "", + "ColBest": "", + "ColWorst": "", + "ColStDev": "", + "ColJitter": "", + "NoReply": "" + }, + "ipcheck": { + "Title": "", + "Placeholder": "", + "Error": "", + "reservedIP": "", + "NoData": "" + }, + "alert": { + "refreshEverythingMessage": "", + "refreshEverythingTitle": "", + "OhNo": "", + "Congrats": "", + "OhNo_Message": "", + "Congrats_Message": "", + "maskedInfoTitle": "", + "maskedInfoMessage": "", + "unmaskedInfoTitle": "", + "unmaskedInfoMessage": "", + "SignInFailed": "", + "SignInFailedReason": "", + "IpGeoSourceFallbackTitle": "", + "IpGeoSourceFallbackMessage": "", + "SignInEmailTakenTitle": "", + "SignInEmailTakenMessage": "" + }, + "shortcutKeys": { + "GoToTop": "", + "GoToBottom": "", + "ToggleDarkMode": "", + "RefreshEverything": "", + "RefreshIPCard": "", + "RefreshConnectivityTests": "", + "RefreshWebRTC": "", + "RefreshDNSLeakTest": "", + "SpeedTestButton": "", + "PingTest": "", + "MTRTest": "", + "RuleTest": "", + "DNSResolver": "", + "IPCheck": "", + "ToggleInfoMask": "", + "IPHistory": "", + "ShareReport": "", + "Help": "", + "HelpNote": "", + "GoNext": "", + "GoPrevious": "", + "OpenHighlightedTool": "", + "RefreshRuleTests": "", + "CensorshipCheck": "", + "Pulse": "", + "Whois": "", + "ServiceStatus": "", + "InvisibilityTest": "", + "EnhancedDnsLeakTest": "", + "MacChecker": "", + "BrowserInfo": "", + "SecurityChecklist": "", + "PersonaCheck": "" + }, + "page": { + "title": "IPCheck.ing - 查詢我的 IP 位址與地理位置 - IP 洩漏測試 - DNS 洩漏測試 - IP 品質檢查 - 網路速度測試 - 全方位 IP 工具箱", + "description": "更完善的開源 IP 工具箱:查詢 IP 位址與地理位置、測試 WebRTC 與 DNS IP 洩漏、執行 IP 品質檢查、瀏覽器指紋檢查,還有網速測試、全球延遲測試、MTR 測試、Whois 查詢等。", + "keywords": "MyIP, IP 工具, IP 檢查, IP 洩漏檢查, IP 品質檢查, IP 查詢, DNS 洩漏測試, WebRTC 洩漏測試, 瀏覽器指紋檢查, 網速測試, 全球延遲測試, MTR 測試, DNS 查詢, Whois 查詢", + "footerLink": "https://github.com/jason5ng32/MyIP", + "copyRightName": "原始來源:", + "copyRightLink": "https://ipcheck.ing", + "copyRightLinkName": "IPCheck.ing" + }, + "helpModal": { + "Title": "鍵盤快速鍵" + }, + "about": { + "Title": "", + "project": [ + "", + "", + "", + "" + ], + "founderTitle": "", + "founder": [ + "", + "", + "" + ], + "contactTitle": "", + "contact": [ + "", + "", + "" + ], + "personal": "", + "blog": "", + "linkedIn": "", + "twitter": "", + "Sponsor": "", + "Privacy": "", + "HelpCenter": "", + "Contribute": "", + "Close": "" + }, + "acknowledgement": { + "Title": "致謝", + "Note1": "這個專案之所以能夠完成,少不了一些熱心人士與組織的支持和協助,以及提供靈感或開放原始碼的貢獻者。非常感謝大家:" + }, + "changelog": { + "Title": "更新日誌", + "add": "新增", + "improve": "優化", + "fix": "修復" + }, + "pwa": { + "appDescription": "一站式 IP 工具箱", + "installDescription": "這已經是你第 {count} 次使用 IPCheck.ing 了,將它安裝為應用程式,可以獲得更好的使用體驗,開啟也更方便。" + } +} From 0828f0bb44ab3dbfc05e170b7f5742fb5411df5e Mon Sep 17 00:00:00 2001 From: Seven Yu Date: Mon, 24 Aug 2026 23:20:04 +0800 Subject: [PATCH 05/17] Feat(i18n): complete Traditional Chinese main locale Co-authored-by: Codex --- frontend/locales/zh-TW.json | 2152 ++++++++++++++++----------------- tests/locale-registry.test.js | 5 + 2 files changed, 1081 insertions(+), 1076 deletions(-) diff --git a/frontend/locales/zh-TW.json b/frontend/locales/zh-TW.json index 2209fc159..2e712d865 100644 --- a/frontend/locales/zh-TW.json +++ b/frontend/locales/zh-TW.json @@ -1,190 +1,190 @@ { "user": { - "SignIn": "", - "SignInWithGoogle": "", - "SignInWithGithub": "", - "SignOut": "", - "SignInToView": "", - "SignInToUse": "", - "InvalidUserToken": "", - "QuotaExceeded": "", - "QuotaSponsorCta": "", - "ViewUsage": "", + "SignIn": "登入", + "SignInWithGoogle": "使用 Google 登入", + "SignInWithGithub": "使用 GitHub 登入", + "SignOut": "登出", + "SignInToView": "登入後檢視", + "SignInToUse": "請登入後使用", + "InvalidUserToken": "無效的使用者 Token", + "QuotaExceeded": "本功能本月的免費額度已用完,下個月會自動重置。", + "QuotaSponsorCta": "贊助我們", + "ViewUsage": "檢視用量", "Usage": { - "Title": "", - "Note": "", - "IpinfoFeature": "", - "SponsorNote": "" + "Title": "用量統計", + "Note": "進階功能設有每月免費額度,每月(UTC)自動重置。IP 進階資料僅按獨立 IP 計數——本月已查詢過的 IP 再次查詢不消耗額度。", + "IpinfoFeature": "IP 進階資料(按獨立 IP 計)", + "SponsorNote": "在 GitHub 贊助本專案可獲得更高額度。" }, - "MyAchievements": "", + "MyAchievements": "我的成就", "Fields": { - "User": "", - "CreatedAt": "", - "LastLogin": "", - "Level": "", - "Fetching": "", - "SignInMethods": "" + "User": "使用者", + "CreatedAt": "建立於", + "LastLogin": "最後登入", + "Level": "使用者等級", + "Fetching": "取得中...", + "SignInMethods": "登入方式" }, "Level": { - "Standard": "", - "Premium": "", - "Owner": "", - "Developer": "", - "HonoraryMember": "" + "Standard": "標準使用者", + "Premium": "進階使用者", + "Owner": "管理員", + "Developer": "開發者", + "HonoraryMember": "榮譽使用者" }, "Benefits": { - "Title": "", - "Benefit": "", - "Note1": "", - "Note2": "", - "Current": "", + "Title": "權益與用量", + "Benefit": "權益", + "Note1": "作為一個開源產品,你使用 IPCheck.ing 的過程是免費的。我們維護這個開源產品付出大量的精力和成本。", + "Note2": "為了讓這個專案可以長期穩定地執行,避免濫用,部分進階功能需要登入才能使用。我們對每個登入使用者設定了足夠使用的每月額度,如果你覺得額度不夠,可以考慮贊助我們,贊助後可以獲得更高的額度。", + "Current": "目前", "Tiers": { "Visitor": { - "Name": "", - "Item1": "", - "Item2": "", - "Item3": "", - "Item4": "", - "Item5": "", - "Item6": "" + "Name": "未登入使用者", + "Item1": "查詢 IP 資訊,多資料來源對比", + "Item2": "網路連通性與服務可用性檢測", + "Item3": "WebRTC / DNS 洩露檢測", + "Item4": "網速、全球延遲與 MTR 測試", + "Item5": "Whois、DNS 解析等更多進階工具", + "Item6": "無需註冊,開源可自部署" }, "SignedIn": { - "Name": "", - "Item1": "", - "Item2": "", - "Item3": "", - "Item4": "", - "Item5": "", - "Item6": "", - "Item7": "" + "Name": "登入使用者", + "Item1": "包含未登入使用者的所有權益", + "Item2": "可以檢視 IP 的品質分、代理判斷、型別、原生性等進階資訊", + "Item3": "可以使用隱身測試", + "Item4": "可以使用深度 DNS 洩露測試", + "Item5": "可以看到自己獲得的成就勳章", + "Item6": "可以使用 AI 助手 IPilot 提問", + "Item7": "進階功能享有每月免費額度,每月自動重置" }, "Sponsor": { - "Name": "", - "Item1": "", - "Item2": "", - "Item3": "" + "Name": "贊助使用者", + "Item1": "包含登入使用者的所有權益", + "Item2": "進階功能獲得更高的每月額度", + "Item3": "支援這個開源專案的持續開發與營運" } } }, "Achievements": { - "Title": "", - "Note": "", - "Get": "", - "GetCount": "", - "NotGet": "", - "NotGetCount": "", - "FooterNote": "", - "Congrats": "", - "CongratsMessage": "", - "NewAchievementIs": "", + "Title": "成就", + "Note": "在使用 IPCheck.ing 的過程中,你可能會觸發一些成就,在這裡,你可以看到你所有的成就。", + "Get": "已獲得", + "GetCount": "已獲得的成就數量", + "NotGet": "未獲得", + "NotGetCount": "未獲得的成就數量", + "FooterNote": "有時候,可能會有一些限時成就。", + "Congrats": "🎉 恭喜", + "CongratsMessage": "你獲得了一個新成就!", + "NewAchievementIs": "新成就是:", "Type": { "IAmHuman": { - "Title": "", - "Meet": "" + "Title": "有頭有臉", + "Meet": "登入後使用 IPCheck.ing" }, "BarelyEnough": { - "Title": "", - "Meet": "" + "Title": "湊湊合合", + "Meet": "下載速度超過 100Mb/s" }, "RapidPace": { - "Title": "", - "Meet": "" + "Title": "快馬加鞭", + "Meet": "下載速度超過 500Mb/s" }, "TorrentFlow": { - "Title": "", - "Meet": "" + "Title": "一瀉千里", + "Meet": "下載速度超過 1000Mb/s" }, "SteadyGoing": { - "Title": "", - "Meet": "" + "Title": "普普通通", + "Meet": "上傳速度超過 50Mb/s" }, "TooFastTooSimple": { - "Title": "", - "Meet": "" + "Title": "港記難追", + "Meet": "上傳速度超過 200Mb/s" }, "SwiftAscent": { - "Title": "", - "Meet": "" + "Title": "日行千里", + "Meet": "上傳速度超過 1000Mb/s" }, "SurfaceCheck": { - "Title": "", - "Meet": "" + "Title": "蜻蜓點水", + "Meet": "完成一項安全檢查清單" }, "HalfwayThere": { - "Title": "", - "Meet": "" + "Title": "半半拉拉", + "Meet": "完成 50% 安全檢查清單" }, "FullySecured": { - "Title": "", - "Meet": "" + "Title": "滴水不漏", + "Meet": "完成全部安全檢查清單" }, "JustInCase": { - "Title": "", - "Meet": "" + "Title": "以防萬一", + "Meet": "完成一次隱身測試" }, "HiddenWell": { - "Title": "", - "Meet": "" + "Title": "不露聲色", + "Meet": "隱身測試中代理和 VPN 機率都是 0" }, "SlipUp": { - "Title": "", - "Meet": "" + "Title": "露出馬腳", + "Meet": "隱身測試中代理或 VPN 機率大於 50%" }, "CleverTrickery": { - "Title": "", - "Meet": "" + "Title": "奇技淫巧", + "Meet": "查看了所有快捷鍵" }, "EnergySaver": { - "Title": "", - "Meet": "" + "Title": "省油的燈", + "Meet": "設定程式不自動執行" }, "ResourceHog": { - "Title": "", - "Meet": "" + "Title": "費油的車", + "Meet": "設定多次重新整理網路連通性" }, "MakingBigNews": { - "Title": "", - "Meet": "" + "Title": "搞大新聞", + "Meet": "進階功能呼叫超過 1000 次" }, "GenerousDonor": { - "Title": "", - "Meet": "" + "Title": "慷慨解囊", + "Meet": "給 IPCheck.ing 專案捐贈過" }, "ItIsOpen": { - "Title": "", - "Meet": "" + "Title": "是開放的", + "Meet": "在封鎖測試中,查詢到了一個被封鎖的網站" }, "CuriousCat": { - "Title": "", - "Meet": "" + "Title": "好奇的貓", + "Meet": "在 Whois 查詢中,查詢了 IPCheck.ing 的資訊" }, "CrossingTheWall": { - "Title": "", - "Meet": "" + "Title": "八仙過牆", + "Meet": "在規則測試中,8 個測試的 IP 全部不相同" }, "GlobeTrotter": { - "Title": "", - "Meet": "" + "Title": "包羅萬有", + "Meet": "IP 歷史記錄中的國家或地區達到 10 個" }, "HelloWorld": { - "Title": "", - "Meet": "" + "Title": "你好世界", + "Meet": "在地球線上中釋出一條狀態" }, "AddSweetAdd": { - "Title": "", - "Meet": "" + "Title": "我愛我加", + "Meet": "在網路連通性中新增一個自訂測試" }, "PrettyDirty": { - "Title": "", - "Meet": "" + "Title": "你挺髒的", + "Meet": "任意一張 IP 卡片的 IP 品質分為 1" }, "SqueakyClean": { - "Title": "", - "Meet": "" + "Title": "清清白白", + "Meet": "任意一張 IP 卡片的 IP 品質分為 100" }, "WalkWithPenguins": { - "Title": "", - "Meet": "" + "Title": "與鵝同行", + "Meet": "任意一張 IP 卡片的歸屬地是南極洲" } } } @@ -221,100 +221,100 @@ "我想贊助 MyIP 專案" ], "pulse": { - "title": "", - "tooltip": "", - "others": "", - "shareStatus": "", - "liveMap": "", - "noVisitors": "", - "quiet": "", - "loadError": "", - "share": "", - "latest": "", - "sent": "", - "alreadySent": "", - "rateLimited": "", - "limitedTitle": "", + "title": "地球線上", + "tooltip": "來自世界各地的訪客", + "others": "其它地區", + "shareStatus": "分享你的狀態", + "liveMap": "即時訪客熱力圖", + "noVisitors": "暫無訪客", + "quiet": "此刻還很安靜,來當第一個發聲的人吧", + "loadError": "暫時無法載入最新動態,稍後再試", + "share": "訪客佔比", + "latest": "最新動態", + "sent": "已傳送", + "alreadySent": "狀態已經發送過了", + "rateLimited": "短期內只能發一次狀態", + "limitedTitle": "限時狀態", "outages": { - "title": "", - "outage": "", - "anomaly": "", - "ongoing": "", - "ended": "", - "started": "", - "lasted": "", - "quiet": "", - "loadMore": "", + "title": "全球斷網事件", + "outage": "網際網路中斷", + "anomaly": "流量異常", + "ongoing": "故障中", + "ended": "已恢復", + "started": "{time}發生", + "lasted": "持續 {duration}", + "quiet": "一切平靜——過去 30 天沒有斷網事件", + "loadMore": "載入更多", "cause": { - "GOVERNMENT_DIRECTED": "", - "POWER_OUTAGE": "", - "CABLE_CUT": "", - "TECHNICAL_PROBLEM": "", - "MECHANICAL": "", - "UNKNOWN": "", - "WEATHER": "", - "FIRE": "", - "CYBERATTACK": "", - "NATURAL_DISASTER": "", - "MAINTENANCE": "", - "MILITARY_ACTION": "" + "GOVERNMENT_DIRECTED": "政府主導斷網", + "POWER_OUTAGE": "電力中斷", + "CABLE_CUT": "光纜中斷", + "TECHNICAL_PROBLEM": "技術故障", + "MECHANICAL": "機械故障", + "UNKNOWN": "原因未知", + "WEATHER": "惡劣天氣", + "FIRE": "火災", + "CYBERATTACK": "網路攻擊", + "NATURAL_DISASTER": "自然災害", + "MAINTENANCE": "計劃維護", + "MILITARY_ACTION": "軍事行動" }, "level": { - "NATIONWIDE": "", - "REGIONAL": "", - "NETWORK": "" + "NATIONWIDE": "全國範圍", + "REGIONAL": "區域範圍", + "NETWORK": "單一網路" } }, "statuses": { - "fast": "", - "ok": "", - "slow": "", - "flaky": "", - "blocked": "", - "good": "", - "bad": "", - "passing": "", - "lag": "", - "newip": "", - "vpn": "", - "night": "", - "vibing": "", - "fixing": "", - "tuning": "", - "prgday": "", - "internetday": "", - "halloween": "", - "diwali": "", - "christmas": "", - "newyear": "", - "privacyday": "", - "lunar": "", - "valentine": "", - "jobs": "", - "eid": "", - "aprilfools": "", - "earthday": "", - "turing": "", - "emojiday": "", - "birthday": "" + "fast": "網速快得飛起", + "ok": "一切正常", + "slow": "網速有點慢", + "flaky": "網路時斷時續", + "blocked": "有網站打不開", + "good": "今天心情不錯", + "bad": "今天有點喪", + "passing": "路過看看", + "lag": "遊戲延遲爆炸", + "newip": "剛換了新 IP", + "vpn": "正掛著 VPN", + "night": "熬夜中", + "vibing": "正在 Vibe Coding", + "fixing": "又在給家裡修網", + "tuning": "又減少了 10ms", + "prgday": "0x100 天快樂!", + "internetday": "網際網路生日快樂,從 LO 說起", + "halloween": "不給糖就 Ping 你", + "diwali": "排燈節快樂,光纖也在發光", + "christmas": "聖誕老人走的是專線", + "newyear": "新的一年,新的 IP", + "privacyday": "本狀態已端到端加密", + "lunar": "恭喜發財,紅包一個不丟", + "valentine": "想要一段穩定的連線", + "jobs": "Stay hungry, stay foolish.", + "eid": "開齋節快樂", + "aprilfools": "我的 IP 是 127.0.0.1", + "earthday": "臨時下線,摸草去了", + "turing": "本狀態由人類傳送(大概)", + "emojiday": "📶🌍🎉✨", + "birthday": "IPCheck.ing 生日快樂" }, "festivalDesc": { - "prgday": "", - "internetday": "", - "halloween": "", - "diwali": "", - "christmas": "", - "newyear": "", - "privacyday": "", - "lunar": "", - "valentine": "", - "jobs": "", - "eid": "", - "aprilfools": "", - "earthday": "", - "turing": "", - "emojiday": "", - "birthday": "" + "prgday": "程式設計師節 · 一年的第 256 天,十六進位制寫作 0x100", + "internetday": "1969 年 10 月 29 日,ARPANET 想發出 LOGIN,傳到 LO 就崩了", + "halloween": "萬聖節(10 月 31 日)· 最嚇人的還是丟包", + "diwali": "排燈節 · 願燈火與光纖同樣明亮", + "christmas": "聖誕節 · 雪橇專線,零抖動", + "newyear": "新年限定 · 煙花已包含,不額外佔用頻寬", + "privacyday": "資料隱私日(1 月 28 日)· 公開廣播這句話的反差感,是故意的", + "lunar": "農曆新年 · 紅包(packet)零丟包", + "valentine": "情人節 · TCP 和愛情都始於握手", + "jobs": "史蒂夫·喬布斯誕辰(1955 年 2 月 24 日)· 出自 2005 年斯坦福演講", + "eid": "開齋節 · 來自地球線上的祝福", + "aprilfools": "愚人節 · 金窩銀窩不如自己的 localhost", + "earthday": "世界地球日(4 月 22 日)· 地球線上也建議你偶爾地球離線", + "turing": "艾倫·圖靈誕辰(1912 年 6 月 23 日)· 圖靈測試之父", + "emojiday": "世界 Emoji 日(7 月 17 日)· 文字是上個世紀的事了", + "birthday": "IPCheck.ing 生日 · v1.0 釋出於 2020 年 11 月 6 日" } }, "preferences": { @@ -349,1073 +349,1073 @@ "DocsSignInMessage": "登入後即可詢問 IPilot" }, "securitychecklist": { - "Title": "", - "Note": "", - "Note2": "", - "Progress": "", - "Item": "", - "Items": "", - "Priority": "", - "Ignore": "", - "alert-total": "", - "alert-checked": "", - "alert-ignored": "", - "alert-unchecked": "", - "Checked": "", - "Ignored": "", - "Unchecked": "", - "Basic": "", - "Optional": "", - "Essential": "", - "Advanced": "", - "Reset": "", - "ShowAll": "", - "ShowUnchecked": "", - "ShowIgnored": "", - "ShowChecked": "" + "Title": "安全檢查清單", + "Note": "這是一份非常全面的網路安全檢查清單,涵蓋密碼安全、瀏覽安全、行動裝置安全等方面的內容。在目前環境下,資訊洩露可能會導致重大的損失,因此,確保我們在連線網際網路的時候,我們儘可能地保護自己的隱私、提高訪問的安全性是很有必要的。", + "Note2": "這個清單羅列的內容非常多,你不一定要一次性檢查完,進度會在瀏覽器裡儲存,你可以隨時回來繼續檢查。", + "Progress": "檢查進度", + "Item": "專案", + "Items": "個專案", + "Priority": "級別", + "Ignore": "忽略", + "alert-total": "安全檢查一共有", + "alert-checked": "你已經完成了", + "alert-ignored": "被忽略", + "alert-unchecked": "個未進行檢查。", + "Checked": "已檢查", + "Ignored": "已忽略", + "Unchecked": "未檢查", + "Basic": "基礎", + "Optional": "可選", + "Essential": "必要", + "Advanced": "進階", + "Reset": "重置", + "ShowAll": "顯示所有", + "ShowUnchecked": "顯示未檢查", + "ShowIgnored": "顯示已忽略", + "ShowChecked": "顯示已檢查" }, "curl": { - "Title": "", - "Note1": "", - "Note2_1": "", - "Note2_2": "", - "Note3": "", - "Note4": "", - "getIPv4": "", - "getIPv6": "", - "get6and4": "", - "notAvailable": "" + "Title": "命令列 API", + "Note1": "喲,原來你也喜歡用終端?", + "Note2_1": "你可以在終端裡,透過", + "Note2_2": "命令取得本機的 IP 位址", + "Note3": "是可選路徑,新增後可取得到 IP 的地理資訊", + "Note4": "請使用你申請的 IPCheck.ing API 金鑰", + "getIPv4": "取得本機 IPv4 位址", + "getIPv6": "取得本機 IPv6 位址", + "get6and4": "取得本機優先網路出口的 IP 位址", + "notAvailable": "此功能暫未開放,敬請期待" }, "browserinfo": { - "Title": "", - "Note": "", - "Note2": "", + "Title": "瀏覽器資訊", + "Note": "本頁面展示兩類瀏覽器資訊:瀏覽器 User Agent 解析出來的基本資訊,以及透過多項資料計算出來的瀏覽器指紋。瀏覽器指紋就像手掌的掌紋,當瀏覽器的資訊暴露越多,你被網站識別的唯一性越高,也就是說,你越容易被網站追蹤到。有些時候,即使你切換到隱私模式,甚至更換瀏覽器,指紋可能也不會發生變化。", + "Note2": "瀏覽器指紋的計算的方法是多種多樣的,不同的技術方案演算法和結果不完全一致,我們在這裡採用一種相對簡單的方法進行計算。", "browser": { - "Infos": "", - "browserName": "", - "engineName": "", - "osName": "", - "deviceVendor": "", - "cpuArchitecture": "", - "gpu": "", - "cpuCores": "", - "languages": "", - "timezone": "", - "display": "", - "connection": "", - "touchPoints": "", - "doNotTrack": "", - "doNotTrackOn": "", - "doNotTrackOff": "", - "doNotTrackUnset": "", - "pdfViewer": "", - "pdfViewerYes": "", - "pdfViewerNo": "", - "cookieEnabled": "", - "cookieEnabledTrue": "", - "cookieEnabledFalse": "" + "Infos": "瀏覽器資訊", + "browserName": "瀏覽器名稱", + "engineName": "引擎", + "osName": "系統", + "deviceVendor": "製造商", + "cpuArchitecture": "CPU 架構", + "gpu": "GPU", + "cpuCores": "CPU 核心數", + "languages": "語言偏好", + "timezone": "時區", + "display": "顯示規格", + "connection": "網路連線", + "touchPoints": "觸控點數", + "doNotTrack": "請勿追蹤", + "doNotTrackOn": "已開啟", + "doNotTrackOff": "已關閉", + "doNotTrackUnset": "未設定", + "pdfViewer": "PDF 閱讀器", + "pdfViewerYes": "支援", + "pdfViewerNo": "不支援", + "cookieEnabled": "是否啟用 Cookie", + "cookieEnabledTrue": "是", + "cookieEnabledFalse": "否" }, "fingerprint": { - "Infos": "", - "fingerprint": "", - "changeOption": "", - "browserTips": "" + "Infos": "指紋資訊", + "fingerprint": "指紋編碼", + "changeOption": "你可以嘗試變更用於計算瀏覽器指紋的資料,觀察指紋的變化(記得開啟隱私模式對照檢視)。", + "browserTips": "有些瀏覽器(比如 Safari)為了保護使用者不被追蹤,即使勾選相同的資料,每次計算都可能會得到不同的指紋值。" }, "options": { - "audio": "", - "canvas": "", - "fonts": "", - "hardware": "", - "locales": "", - "permissions": "", - "plugins": "", - "screen": "", - "system": "", - "webgl": "", - "math": "", - "intl": "", - "mediaDevices": "", - "speech": "", - "mathml": "", - "webrtc": "" + "audio": "音訊", + "canvas": "畫布", + "fonts": "字型", + "hardware": "硬體", + "locales": "語言", + "permissions": "許可權", + "plugins": "外掛", + "screen": "螢幕", + "system": "瀏覽器版本", + "webgl": "WebGL", + "math": "運算", + "intl": "國際化格式", + "mediaDevices": "媒體裝置", + "speech": "語音合成", + "mathml": "MathML", + "webrtc": "WebRTC" }, "components": { - "title": "", - "note": "" + "title": "指紋元件明細", + "note": "下方每一項都參與了上方雜湊的計算。在上方 Fingerprint 區域裡關掉對應開關即可將其從指紋中排除。" }, - "calError": "", - "calculating": "" + "calError": "瀏覽器資訊計算失敗,請重新整理重試。", + "calculating": "計算中..." }, "censorshipcheck": { - "Title": "", - "Note": "", - "Note2": "", - "Placeholder": "", - "Country": "", - "Status": "", - "City": "", - "Network": "", - "invalidURL": "", - "fetchError": "", - "HistoryTitle": "", - "SummaryFlagged": "", - "SummaryClean": "", - "SummarySparseFlagged": "", - "SummarySparseClean": "", - "NoData": "", - "OoniError": "", - "TierConfirmed": "", - "TierLikely": "", - "TierSigns": "", - "Measurements": "", - "AnomalyShare": "", - "MethodDns": "", - "MethodTcpIp": "", - "MethodHttpFailure": "", - "MethodHttpDiff": "", - "RealtimeTitle": "", - "ResultsHint": "", - "SectionFlagged": "", - "PresetHighRisk": "", - "PresetOpen": "", - "RunVerify": "", - "RealtimeNote": "", - "RealtimeFooterNote": "" + "Title": "封鎖測試", + "Note": "基於 OONI(開放網路干預觀測站)全球志願者的開放資料,查詢一個網站過去 30 天在哪些國家/地區被遮蔽或干擾、以及採用的遮蔽手段。對可疑地區,還可以用 Globalping 全球探針進行即時連通性驗證。在一些地區,網際網路審查有較為明確的法律條文,有些則相對含糊。", + "Note2": "請輸入 URL 或網域名稱,開始查詢:", + "Placeholder": "URL 或網域名稱", + "Country": "地區", + "Status": "狀態", + "City": "城市", + "Network": "網路", + "invalidURL": "無效的 URL 或網域名稱", + "fetchError": "無法取得測試結果", + "HistoryTitle": "過去 30 天的全球觀測", + "SummaryFlagged": "過去 30 天,共在 {n} 個國家/地區觀測到遮蔽或干擾跡象。", + "SummaryClean": "過去 30 天,在 {n} 個國家/地區均未觀測到明顯遮蔽跡象。", + "SummarySparseFlagged": "過去 30 天,僅在 {total} 個國家/地區觀測過這個網站,其中 {n} 個出現遮蔽或干擾跡象。", + "SummarySparseClean": "過去 30 天,僅在 {total} 個國家/地區觀測過這個網站(共 {m} 次測量),資料量較少,不足以判斷是否被遮蔽。", + "NoData": "在過去 30 天沒有關於這個網站的觀測資料——這並不代表它沒有被遮蔽。你可以在下方勾選「審查嚴重國家」,進行一次即時測試。", + "OoniError": "歷史觀測資料暫時無法取得,可能是上游介面不穩定。你仍然可以在下方勾選國家,進行即時測試。", + "TierConfirmed": "確認遮蔽", + "TierLikely": "疑似遮蔽", + "TierSigns": "部分干擾", + "Measurements": "{n} 次測量", + "AnomalyShare": "{pct}% 異常", + "MethodDns": "DNS 干擾", + "MethodTcpIp": "TCP 阻斷", + "MethodHttpFailure": "連線失敗", + "MethodHttpDiff": "內容篡改", + "RealtimeTitle": "即時測試", + "ResultsHint": "選擇探針並點選「開始即時測試」後,結果將顯示在這裡。", + "SectionFlagged": "命中封鎖國家", + "PresetHighRisk": "審查嚴重國家", + "PresetOpen": "通常開放國家", + "RunVerify": "開始即時測試", + "RealtimeNote": "你可以選擇多個探針進行即時的連通性測試,以綜合判斷網站的封鎖情況。當執行測試時,每個國家將執行 2 個探針進行測試,當 2 個探針的結果相同時,可信性較高。", + "RealtimeFooterNote": "即時探針大多位於資料中心網路,結果可能與實際來自居民網路的歷史觀測不一致,因為有些網站可能會遮蔽資料中心網路的訪問。請將實際情況綜合判斷。" }, "invisibilitytest": { - "Title": "", - "Note": "", - "Note2": "", - "fetchError": "", - "scriptLoadError": "", - "yourIP": "", - "proxyScore": "", - "VPNScore": "", - "isProxy": "", - "notProxy": "", - "isVPN": "", - "notVPN": "", - "itemName": "", - "itemProxyResult": "", - "itemComment": "", - "agreement": "", + "Title": "隱身測試", + "Note": "當你掛上代理或 VPN 之後,你訪問的網站真的不知道你掛著代理嗎?你真的隱身了麼?我們會透過多種手段,嘗試計算出你偽裝後的漏洞,找到你正在使用代理的證據。儘管可能部分測試結果不完全準確,但本測試依然有較高的參考意義。", + "Note2": "點選執行後,系統將會執行一個指令碼,通常在 10s 內將會完成所有的測試,在這個過程中,你的 IP 資訊、瀏覽器資訊等將會被收集並在後臺進行分析。", + "fetchError": "無法取得測試結果", + "scriptLoadError": "測試指令碼載入失敗,無法繼續測試。請檢查網路後重試。", + "yourIP": "你的主測 IP 是", + "proxyScore": "代理機率", + "VPNScore": "VPN 機率", + "isProxy": "你可能使用了代理。", + "notProxy": "未發現你使用了代理。", + "isVPN": "你可能使用了 VPN。", + "notVPN": "未發現你使用了 VPN。", + "itemName": "測試專案", + "itemProxyResult": "測試結果", + "itemComment": "分析", + "agreement": "同意資訊收集", "blocklist": { "proxy": { - "title": "", - "positive": "", - "negative": "" + "title": "代理名單", + "positive": "你的 IP 在代理名單中。", + "negative": "你的 IP 不在代理名單中。" }, "vpn": { - "title": "", - "positive": "", - "negative": "" + "title": "VPN 名單", + "positive": "你的 IP 在 VPN 名單中。", + "negative": "你的 IP 不在 VPN 名單中。" }, "vpnExitNode": { - "title": "", - "positive": "", - "negative": "" + "title": "VPN 出口節點", + "positive": "你的 IP 在 VPN 出口節點名單中。", + "negative": "你的 IP 不在 VPN 出口節點名單中。" } }, "tor": { - "title": "", - "positive": "", - "negative": "" + "title": "TOR 出口節點", + "positive": "你的 IP 在 TOR 出口節點中。", + "negative": "你的 IP 不在 TOR 出口名單中。" }, "headers": { - "title": "", - "positive": "", - "negative": "" + "title": "HTTP 頭資訊", + "positive": "你的 HTTP 頭資訊中包含了代理資訊,你可能正在使用代理。", + "negative": "你的 HTTP 頭資訊中沒有代理資訊。" }, "datacenter": { - "title": "", - "positive": "", - "negative": "" + "title": "資料中心 IP", + "positive": "你的 IP 是資料中心 IP,普通使用者的 IP 通常不會是資料中心。", + "negative": "你的 IP 不是資料中心 IP。" }, "tcp": { - "title": "", - "positive": "", - "computer": "", - "server": "", - "negative": "" + "title": "TCP 指紋", + "positive": "你發起連線的系統與你的電腦系統不同,你可能正在使用代理。儘管系統判斷不一定準確,但可以肯定兩個系統並不相同。", + "computer": "你的電腦系統是:", + "server": "你發起連線的系統可能是:", + "negative": "你發起連線的系統與你的電腦系統相同。" }, "timezone": { - "title": "", - "positive": "", - "computer": "", - "server": "", - "negative": "" + "title": "時區差異", + "positive": "你的時區與你的 IP 地理位置不匹配,你可能正在使用代理。", + "computer": "你的時區是:", + "server": "你的 IP 地理位置時區是:", + "negative": "你的時區與你的 IP 地理位置匹配。" }, "net": { - "title": "", - "positive": "", - "negative": "" + "title": "網路行為", + "positive": "從客戶端網路行為上發現你可能使用了代理或 VPN", + "negative": "從客戶端網路行為上未發現你使用代理或 VPN 的證據。" }, "webrtc": { - "title": "", - "positive": "", - "ipsAre": "", - "negative": "" + "title": "WebRTC 檢測", + "positive": "WebRTC 發現你存在多個不同地區的 IP,你可能使用了代理或 VPN。", + "ipsAre": "IP 分別是:", + "negative": "WebRTC 檢測未發現存在多個不同地區的 IP。" }, "flow": { - "title": "", - "positive": "", - "negative": "" + "title": "流量特徵", + "positive": "TCP/IP 流量特徵發現你可能使用了代理或 VPN。", + "negative": "TCP/IP 流量特徵未發現你使用代理或 VPN 的證據。" }, "latencyVSWS": { - "title": "", - "positive": "", - "fromTCP": "", - "fromWS": "", - "negative": "" + "title": "TCP vs WebSocket 延遲", + "positive": "TCP 延遲與 WebSocket 延遲差值較大,看起來你使用了代理或 VPN。", + "fromTCP": "TCP 延遲值:", + "fromWS": "WebSocket 延遲值:", + "negative": "TCP 延遲與 WebSocket 延遲差值不大,沒有明顯的使用了代理或 VPN 的證據。" }, "latencyVSPing": { - "title": "", - "positive": "", - "fromTCP": "", - "fromPing": "", - "negative": "" + "title": "TCP vs Ping 延遲", + "positive": "TCP 延遲與 Ping 差值較大,看起來你使用了 VPN。", + "fromTCP": "TCP 延遲值:", + "fromPing": "Ping 延遲值:", + "negative": "TCP 延遲與 Ping 差值不大,沒有明顯的使用了 VPN 的證據。" }, "highlatency": { - "title": "", - "positive": "", - "negative": "" + "title": "高延遲分析", + "positive": "高延遲分析發現你可能使用了代理或 VPN。", + "negative": "高延遲分析未發現你使用代理或 VPN 的證據。" } }, "personacheck": { - "Title": "", - "Note": "", - "NoteVs": "", - "Note2": "", + "Title": "深度畫像檢測", + "Note": "有一個經典的判斷法:如果它長得像鴨子、遊起來像鴨子、叫起來也像鴨子,那它多半就是鴨子。網站也是這樣看你的——IP 可以聲稱你在 A 國,但時區、語言、已安裝字型、鍵盤佈局等十幾個訊號各自都在講述自己的故事,它們合在一起才是網站真正看到的那個「你」。本工具測量這個真實呈現的身份畫像,與你希望被看作的那個本地人做對照,並告訴你兩者的差距具體在哪裡。", + "NoteVs": "它和隱身測試(Invisibility Test)回答的是不同的問題:隱身測試判斷你的代理本身是否會被識別出來;本工具判斷的是——在網站眼裡你是一個什麼樣的人,以及這個畫像和你預期呈現的差了多少。", + "Note2": "先選擇你希望被看作哪個國家的本地人。", "axis": { - "match": "", - "coherence": "", - "leak": "" + "match": "與目標匹配", + "coherence": "自洽性", + "leak": "身份洩露" }, "zone": { - "expected": "", - "optional": "", - "run": "" + "expected": "預期身份", + "optional": "更精準的定位(可選)", + "run": "開始檢測" }, - "selectCountry": "", - "noCountryMatch": "", - "noProfile": "", - "languageSingle": "", - "languageMulti": "", - "timezoneMulti": "", + "selectCountry": "搜尋國家", + "noCountryMatch": "沒有匹配的國家", + "noProfile": "該地區沒有可用於比較的本地畫像。", + "languageSingle": "該國只有一種主要語言。", + "languageMulti": "該國有多種語言,請選擇你想呈現的那一種。", + "timezoneMulti": "該國橫跨多個時區,請選擇你想呈現的那一個。", "hourCycle": { - "h11": "", - "h12": "", - "h23": "", - "h24": "" + "h11": "12 小時制(0–11 時)", + "h12": "12 小時制", + "h23": "24 小時制", + "h24": "24 小時制(1–24 時)" }, "profile": { - "timezone": "" + "timezone": "時區" }, - "runCompare": "", - "runError": "", + "runCompare": "開始檢測", + "runError": "檢測未能完成。", "source": { - "ipinfo": "", - "webrtc": "", - "dnsleak": "" + "ipinfo": "IP 查詢", + "webrtc": "WebRTC", + "dnsleak": "DNS 洩露" }, "report": { "grade": { - "A": "", - "B": "", - "C": "", - "D": "", - "unknown": "" + "A": "🎉 你看起來就是一個{country}本地人", + "B": "😊 你看起來有點像{country}本地人", + "C": "🤔 你看起來不太像{country}本地人", + "D": "😅 你看起來不像{country}本地人", + "unknown": "🤷 訊號不足,無法評級" }, "gradeNote": { - "A": "", - "B": "", - "C": "", - "D": "", - "unknown": "" + "A": "所有能讀到的特徵都與你選擇的畫像一致。", + "B": "畫像基本成立,但有少數特徵指向別處。", + "C": "有幾項特徵與畫像不符,或彼此矛盾——下面的結果會告訴你是哪些。", + "D": "多數特徵指向的並不是這個畫像。", + "unknown": "請先執行底層檢測——目前可用的資訊太少。" }, "counts": { - "leak": "", - "warning": "", - "match": "", - "unknown": "", - "notApplicable": "" + "leak": "{n} 項暴露", + "warning": "{n} 項不一致", + "match": "{n} 項通過", + "unknown": "{n} 項未測量", + "notApplicable": "{n} 項不適用" }, - "nothingActionable": "", - "howToFix": "", + "nothingActionable": "沒有需要修復的——所有可測量的特徵都符合該畫像。", + "howToFix": "怎麼修", "verdict": { - "match": "", - "mismatch": "", - "leak": "", - "unnatural": "", - "unknown": "", - "not-applicable": "" + "match": "符合角色設定。", + "mismatch": "與角色設定矛盾。", + "leak": "暴露了你的真實環境。", + "unnatural": "內部自相矛盾——本該一致的兩個訊號各說各話,比單純的不一致更引人注目。", + "unknown": "目前無法測量。", + "not-applicable": "此項無法給出結論。" }, "visibility": { - "public": "", - "probed": "", - "risk-engine": "" + "public": "任何網站都看得到", + "probed": "會主動探測的網站", + "risk-engine": "反欺詐系統" }, - "profileTitle": "", + "profileTitle": "特徵詳解", "state": { - "match": "", - "mismatch": "", - "unnatural": "", - "leak": "", - "unknown": "", - "not-applicable": "" + "match": "通過", + "mismatch": "不像本地", + "unnatural": "自相矛盾", + "leak": "已暴露", + "unknown": "未測量", + "not-applicable": "不適用" } }, "detail": { - "expected": "", - "actual": "", - "disputed": "", - "v4": "", - "v6": "", - "candidateCount": "", - "matching": "", - "ipType": "", - "expectedOffset": "", - "actualOffset": "", - "sameOffset": "", - "primary": "", - "primaryExpected": "", - "demoted": "", - "timeZone": "", - "reportedOffset": "", - "zoneOffset": "", - "samples": "", - "expectedScripts": "", - "installedScripts": "", - "expectedLanguages": "", - "voiceLanguages": "", - "voiceCount": "", - "expectedLayout": "", - "actualLayout": "", - "headerPrimary": "", - "scriptPrimary": "", - "headerLanguages": "", - "ipZone": "", - "browserZone": "", - "ipOffset": "", - "browserOffset": "", - "colo": "", - "gpsTimezone": "", - "accuracyMetres": "", - "cardIssuer": "", - "cardNetwork": "", - "cardTier": "", - "cardType": "" + "expected": "預期", + "actual": "實際", + "disputed": "資料來源有分歧", + "v4": "IPv4", + "v6": "IPv6", + "candidateCount": "候選位址數", + "matching": "與預期相符", + "ipType": "位址型別", + "expectedOffset": "預期偏移", + "actualOffset": "實際偏移", + "sameOffset": "偏移相同", + "primary": "首選語言", + "primaryExpected": "預期首選", + "demoted": "在清單中但非首位", + "timeZone": "時區", + "reportedOffset": "Date 報告的偏移", + "zoneOffset": "時區應有的偏移", + "samples": "取樣數", + "expectedScripts": "預期書寫系統", + "installedScripts": "已安裝書寫系統", + "expectedLanguages": "預期語言", + "voiceLanguages": "語音包語言", + "voiceCount": "語音包數量", + "expectedLayout": "預期佈局", + "actualLayout": "實際佈局", + "headerPrimary": "請求頭首選語言", + "scriptPrimary": "指令碼首選語言", + "headerLanguages": "請求頭語言清單", + "ipZone": "IP 時區", + "browserZone": "瀏覽器時區", + "ipOffset": "IP 偏移", + "browserOffset": "瀏覽器偏移", + "colo": "Cloudflare 接入點", + "gpsTimezone": "你所在位置的時區", + "accuracyMetres": "定位精度(米)", + "cardIssuer": "發卡行", + "cardNetwork": "卡組織", + "cardTier": "卡片等級", + "cardType": "卡型別" }, "checks": { "ip-country": { - "title": "", - "fix": "", - "what": "" + "title": "IP 歸屬國家", + "fix": "你有部分出口落在目標國家之外——有多個代理出口時,不同卡片顯示不同國家是真實情況,而任何一個出口都會被某些網站看到。上方分數顯示有多少出口符合條件。將所有流量導向目標國家的節點;如果只是單一資料來源對某個 IP 有異議,可能只是該節點在資料庫中被誤標,這不是你這端能修正的。", + "what": "首頁各張 IP 檢測卡片把你的出口位址判定在哪個國家——每個資料來源都會讀取,且每個出口都必須落在目標國家。" }, "webrtc-leak": { - "title": "", - "fix": "", - "what": "" + "title": "WebRTC 暴露", + "fix": "遮蔽 WebRTC,或者改用只能看到代理位址的方案。代價是實打實的:視訊通話和語音會議會失效。用外掛過濾 WebRTC 比徹底停用溫和,但外掛本身也會留下自己的痕跡。", + "what": "WebRTC 是否暴露了與目標國家不符的位址。" }, "dns-resolver-country": { - "title": "", - "fix": "", - "what": "" + "title": "DNS 解析器國家", + "fix": "改用目標國家的解析器,或者讓代理接管 DNS 解析。注意:1.1.1.1 這類公共解析器不會暴露你的位置,但也不會支撐你的角色——它對每個國家都同樣中性。", + "what": "為你解析網域名稱的 DNS 伺服器位於哪個國家。" }, "asn-type": { - "title": "", - "fix": "", - "what": "" + "title": "位址型別", + "fix": "資料中心位址段是一個位址能攜帶的最響亮的「這是代理」訊號。換住宅出口能直接解決,但成本高得多,而且品質參差不齊。", + "what": "你的位址屬於住宅寬頻還是資料中心網段。" }, "timezone-vs-persona": { - "title": "", - "fix": "", - "what": "" + "title": "時區與角色", + "fix": "在作業系統層面改時區——這樣所有瀏覽器 API 才會自洽。用外掛覆蓋時區往往只改了一部分,會製造出「內部一致性」那幾項標記的矛盾,比不改更糟。", + "what": "你瀏覽器的時區是不是當地人應有的那個。" }, "language-match": { - "title": "", - "fix": "", - "what": "" + "title": "瀏覽器語言", + "fix": "改系統或瀏覽器的語言設定,而不是隻改寫一個 HTTP 頭。順序同樣重要:網站讀的是整個清單,而當地人很少把外語排在第一位。", + "what": "你瀏覽器排在首位的語言是不是當地人會用的。" }, "script-fonts": { - "title": "", - "fix": "", - "what": "" + "title": "書寫系統字型", + "fix": "為該地區配置的機器會自帶對應書寫系統的字型。手動安裝字型可行,但通常不值得:它只改了一個訊號,系統其餘部分仍是原來的語言,往往製造出比解決掉的更多的矛盾。如果真要讓這一項站得住,該改的是系統語言本身。", + "what": "這臺機器有沒有安裝該國書寫系統的字型。" }, "speech-voices": { - "title": "", - "fix": "", - "what": "" + "title": "語音合成語音包", + "fix": "語音合成包跟隨系統安裝時的語言,基本沒有任何代理或換區外掛會去動它。為目標語言裝一個語音包是真正有效的修復,但和字型一樣有個前提:在其餘部分都沒變的系統裡只改一個訊號,反而顯得刻意。", + "what": "你係統裡的語音合成包覆蓋了哪些語言。" }, "keyboard-layout": { - "title": "", - "fix": "", - "what": "" + "title": "鍵盤佈局", + "fix": "你的物理鍵盤佈局和目標國家的常見佈局不符。只有 Chromium 系瀏覽器會暴露這一項,所以它的覆蓋面比其他項窄——但凡是讀得到的地方,不換真實鍵盤就很難偽造。", + "what": "你的機器報告的物理鍵盤佈局是哪一種。" }, "edge-geo-consensus": { - "title": "", - "fix": "", - "what": "" + "title": "邊緣地理判定", + "fix": "Cloudflare 對你出口位址的判定和目標國家不符。當這一項和 IP 查詢互相矛盾時,多半是某個資料庫標錯了,而不是位址真的換了位置——但所有走 Cloudflare 的網站看到的是這個判定,不是那個。", + "what": "Cloudflare 對你出口位址的獨立判定,與上面那些資料庫彼此無關。" }, "accept-language-header": { - "title": "", - "fix": "", - "what": "" + "title": "語言請求頭與指令碼", + "fix": "你的瀏覽器在網路請求裡發出的 Accept-Language 頭,和 navigator.languages 向指令碼報告的不一致。除了「外掛只改了其中一個」,幾乎沒有別的原因會造成這種情況。改用瀏覽器或系統的語言設定——那樣兩者會一起變。", + "what": "網路請求裡發出的語言頭,和告訴指令碼的是否一致。這一項刻意與目標國家無關:通過只說明你的兩個語言通道沒有互相矛盾,語言本身合不合適由「瀏覽器語言」那一項判定——只改了一半的語言偽裝工具正是在這裡露餡。" }, "ip-timezone-vs-browser": { - "title": "", - "fix": "", - "what": "" + "title": "IP 時區與瀏覽器時區", + "fix": "你出口 IP 所在的時區,和瀏覽器報告的時區是兩個地方。這一項和你想扮演哪個國家無關:真實機器總在某一個地方,兩者本就該說同一個地方。通常意味著代理換了你的位址,卻沒換系統時區。", + "what": "你 IP 所在的時區和瀏覽器報告的時區是否一致。" }, "gps-location": { - "title": "", - "fix": "", - "what": "" + "title": "裝置定位(GPS)", + "fix": "你的裝置報告的物理位置和你想扮演的國家不是一個地方。代理完全碰不到這一項:任何向你索取定位的網站拿到的都是真實答案,而偽造定位的瀏覽器外掛通常會留下精度和時序上的破綻。現實的選擇只有兩個:對索取定位的網站一律拒絕授權,或者接受這一項撐不住。", + "what": "你的裝置報告自己實際位於哪個國家。" }, "payment-region": { - "title": "", - "fix": "", - "what": "" + "title": "信用卡發卡國", + "fix": "你的卡是在另一個國家發行的,和你所呈現的國家不符。商家幾乎在了解你的其他一切之前就先看到了發卡國,而付款風險控管系統會把它和帳單地址、IP 放在一起重點比對。這一項沒有瀏覽器端的解法——它是卡本身的屬性。", + "what": "你輸入的卡號段對應的發卡國是哪裡。" }, "intl-number-format": { - "title": "", - "what": "", - "fix": "" + "title": "數字格式", + "what": "你的瀏覽器如何分組數字、如何標記小數點。", + "fix": "你的瀏覽器按自己的區域習慣給數字分組,而不是按目標國家的習慣。這和語言是兩回事:一臺機器完全可能帶著正確的語言標籤,區域卻仍指向別處。請在系統設定裡改**區域**而不只是語言——Windows 在「區域」,macOS 在「語言與地區」。" }, "intl-date-format": { - "title": "", - "what": "", - "fix": "" + "title": "日期格式", + "what": "你的瀏覽器書寫日期時用的順序和分隔符。", + "fix": "你的瀏覽器書寫日期的順序或分隔符與當地人不同。和數字格式一樣,它跟隨的是系統區域而非語言,改區域才會跟著變。" }, "intl-hour-cycle": { - "title": "", - "what": "", - "fix": "" + "title": "時間制", + "what": "你的瀏覽器呈現 12 小時制還是 24 小時制——網站格式化時間時看到的就是這個慣例。", + "fix": "時間制跟隨瀏覽器語言,而不是系統的「24 小時制」開關——多數瀏覽器完全忽略那個開關(Safari 是主要例外)。想呈現目標國家的習慣,需要把瀏覽器的語言或區域切換成該國的。" }, "timezone-authenticity": { - "title": "", - "what": "", - "fix": "" + "title": "時區可信度", + "what": "瀏覽器報告的時區是不是這臺機器真實的時區。", + "fix": "瀏覽器報告的時區不是機器真正執行的那個:要麼 Intl 和 Date 說法不一致,要麼歷史日期不符合該時區的夏令時規則。這一點之所以重要,是因為它意味著上面那項時區檢測是在一個不真實的值上通過的——網站只要直接讀時鐘就能看穿。請在作業系統裡設定時區而不是靠外掛,這樣目前偏移和歷史規則會一起變。" } }, "reason": { - "no-marker-script": "", - "bin-lookup-failed": "", - "bin-not-recognized": "", - "font-probe-unavailable": "", - "no-voice-packs": "", - "keyboard-api-unavailable": "", - "no-layout-expectation": "", - "no-persona-languages": "", - "geolocation-unsupported": "", - "ip-no-country": "", - "ip-no-type": "", - "ip-no-timezone": "", - "webrtc-no-candidates": "", - "dns-no-country": "" + "no-marker-script": "無特徵書寫系統", + "bin-lookup-failed": "號段查詢服務暫時不可用——號碼本身可能沒有問題,請稍後重試。", + "bin-not-recognized": "卡片資料庫沒有識別出這個號段——最常見的原因是輸錯了,請核對後重新檢測。", + "font-probe-unavailable": "Canvas 不可用", + "no-voice-packs": "未安裝語音包", + "keyboard-api-unavailable": "本瀏覽器不暴露", + "no-layout-expectation": "該國無對應佈局預期", + "no-persona-languages": "角色未設定語言", + "geolocation-unsupported": "不支援地理定位", + "ip-no-country": "IP 查詢沒有回傳國家", + "ip-no-type": "沒有來源給出網路型別", + "ip-no-timezone": "沒有來源給出時區", + "webrtc-no-candidates": "WebRTC 沒有產生任何候選位址", + "dns-no-country": "沒有解析器能被定位" }, "optional": { - "gpsNote": "", - "gpsButton": "", - "gpsGranted": "", + "gpsNote": "GPS 位置是檢測的維度之一——願意的話可以共享,讓它一併參與對照。", + "gpsButton": "共享定位", + "gpsGranted": "已取得定位。", "gpsFailed": { - "denied": "", - "timeout": "", - "unavailable": "", - "unsupported": "" + "denied": "已拒絕授權——該項將顯示為未測量。", + "timeout": "定位請求超時。", + "unavailable": "你的裝置無法確定位置。", + "unsupported": "此瀏覽器不支援地理定位。" }, - "cardNote": "", - "cardError": "", - "cardReady": "" + "cardNote": "有時你也希望以該國身份完成支付——填入卡號前 6-8 位,檢測會判斷這張卡是否會被視為該國發行。", + "cardError": "需要 6-8 位數字——至少輸入 6 位才能查詢發卡行。", + "cardReady": "號段已填好——發卡國會在檢測時查詢。" }, "dependencies": { - "note": "", - "runButton": "", - "runButtonRunning": "", - "measured": "", - "allReady": "" + "note": "檢測需要以下所有基礎測試的結果——開始前請先補跑缺失的:", + "runButton": "一鍵補跑缺失的測試", + "runButtonRunning": "補跑中", + "measured": "已測量 {n} / {total}", + "allReady": "所有測試已執行" }, "step": { - "country": "", - "language": "", - "location": "", - "card": "", - "awaitingCountry": "", - "otherTests": "" + "country": "目標國家", + "language": "主要語言", + "location": "定位", + "card": "卡號段", + "awaitingCountry": "請先選擇國家", + "otherTests": "基礎測試" }, - "emptyHint": "", - "readyHint": "", + "emptyHint": "先選擇你希望看起來像哪國本地人,然後開始檢測。", + "readyHint": "已就緒。開始檢測,看看你有多像本地人。", "value": { - "yes": "", - "no": "" + "yes": "是", + "no": "否" } }, "advancedtools": { - "OpenInNewTab": "", - "BackToHome": "", - "Title": "", - "Note": "", - "PingTestNote": "", - "MTRTestNote": "", - "DNSResolverNote": "", - "EnhancedDnsLeakTest": "", - "RuleTestNote": "", - "CensorshipCheck": "", - "ServiceStatus": "", - "Whois": "", - "InvisibilityTest": "", - "MacChecker": "", - "BrowserInfo": "", - "SecurityChecklist": "", - "PersonaCheck": "" + "OpenInNewTab": "在新標籤頁開啟", + "BackToHome": "回到首頁", + "Title": "進階工具", + "Note": "一些使用頻率相對較低,但在進行網路測試時,非常有用的工具。", + "PingTestNote": "全球的 Ping 值測試", + "MTRTestNote": "全球的 MTR 路由測試", + "DNSResolverNote": "即時多渠道 DNS 解析", + "EnhancedDnsLeakTest": "捕獲所有遞迴解析器,並分析 ECS 與 DNSSEC", + "RuleTestNote": "檢查代理軟體的規則設定", + "CensorshipCheck": "檢查一個網站在全球哪些國家被封鎖", + "ServiceStatus": "檢視知名 AI 與開發者服務的即時可用性,確認你遇到的中斷是不是對方的故障", + "Whois": "對網域名稱或 IP 進行 Whois 查詢", + "InvisibilityTest": "猜猜看我是否知道你掛了代理", + "MacChecker": "查詢實體位址的歸屬資訊", + "BrowserInfo": "檢閱瀏覽器資訊和指紋", + "SecurityChecklist": "全面的數字生活安全檢查清單", + "PersonaCheck": "把網站看到的你,和你想扮成的本地人做對照" }, "macchecker": { - "Title": "", - "Note": "", - "Note2": "", - "Placeholder": "", - "invalidMAC": "", - "fetchError": "", - "company": "", - "macPrefix": "", - "address": "", - "country": "", - "blockStart": "", - "blockEnd": "", - "blockSize": "", - "blockType": "", - "blockRange": "", - "isRand": "", - "isPrivate": "", - "isMulticast": "", - "isUnicast": "", - "isGlobal": "", - "isLocal": "", - "property": "", - "value": "", - "manufacturer": "" + "Title": "MAC 位址查詢", + "Note": "查詢一個實體位址(MAC 位址)所屬的製造商、是否單播/多播、是否廣域/區域等資訊。支援使用完整的 12 位進行查詢,也支援字首查詢。當然,你也可以用本查詢工具來驗證你產生的實體位址是否符合自己的需求。", + "Note2": "請輸入一個實體位址,開始查詢:", + "Placeholder": "F0:2F:4B:01:0A:AA", + "invalidMAC": "無效的實體位址", + "fetchError": "無法取得查詢結果", + "company": "製造商", + "macPrefix": "實體位址字首", + "address": "登記地址", + "country": "註冊國家/地區", + "blockStart": "起始區塊", + "blockEnd": "結束區塊", + "blockSize": "區塊大小", + "blockType": "區塊型別", + "blockRange": "區塊範圍", + "isRand": "隨機位址", + "isPrivate": "私有資料", + "isMulticast": "多播位址", + "isUnicast": "單播位址", + "isGlobal": "全球位址", + "isLocal": "本地位址", + "property": "位址屬性", + "value": "值", + "manufacturer": "製造商資訊" }, "whois": { - "Title": "", - "Note": "", - "Note2": "", - "Note3": "", - "Placeholder": "", - "invalidURL": "", - "reservedIP": "", - "noData": "", - "fetchError": "", - "Provider": "" + "Title": "Whois 查詢", + "Note": "Whois 查詢是一種用於查詢網域名稱註冊資訊的服務。透過輸入網域名稱或 IP 位址,可以查詢到網域名稱的註冊資訊、註冊商、註冊日期、過期日期等資訊。IP 與網域名稱的 Whois 資訊欄位不完全一致。同時,部分比較小眾的網域名稱(TLD)可能無法查詢到相關資訊。", + "Note2": "請輸入網域名稱或 IP,開始進行查詢:", + "Note3": "Whois 資訊包含多種型別的欄位,以下為原始文字內容", + "Placeholder": "網域名稱或 IP", + "invalidURL": "無效的網域名稱或 IP", + "reservedIP": "內網或保留位址沒有公開的註冊資訊,無法查詢。", + "noData": "該查詢沒有公開的 Whois / RDAP 資料。部分頂級網域名稱不提供公開查詢服務。", + "fetchError": "無法取得查詢結果或查詢結果為空", + "Provider": "資訊服務商" }, "enhanceddnsleaktest": { - "Title": "", - "Note": "", - "Note2": "", - "Note3": "", - "Run": "", - "RunAgain": "", - "RunningProbes": "", - "PollingResult": "", - "FetchError": "", - "Empty": "", - "TableTitle": "", - "DedupeToggle": "", + "Title": "深度 DNS 洩露測試", + "Note": "你已經在首頁的 DNS 洩露測試中大致了解了目前是否存在 DNS 洩露,以及 DNS 請求的出口地理歸屬。在這個深度測試裡,我們會從更多維度進行檢測:捕獲更多 DNS 解析器出口 IP、檢查這些解析器是否透過 ECS 把你真實 IP 段的字首轉發給了權威伺服器、以及它們是否支援 DNSSEC,從而協助你對自己的 DNS 鏈路安全性形成更完整的認識。", + "Note2": "點選「開始測試」即可開始,通常幾秒內就能得到結果。我們會在後臺發起多次 DNS 探測,由我們的權威 DNS 伺服器捕獲你所使用的遞迴解析器出口 IP,一次測試通常可以捕獲 20–40 條記錄。若完全沒有捕獲到解析器,可能是瀏覽器的 DNS 快取吃掉了請求,稍等片刻再試一次即可。", + "Note3": "由於這是深度測試,頁面裡會出現一些較為專業的概念(例如 ECS、DNSSEC 等)。不用擔心,執行測試後你可以參考下方的「欄位說明」來了解每個欄位的具體含義。", + "Run": "開始測試", + "RunAgain": "再測一次", + "RunningProbes": "正在發起 DNS 探測...", + "PollingResult": "正在收集結果...", + "FetchError": "取得 DNS 洩露測試結果失敗,請稍後重試。", + "Empty": "本次會話沒有捕獲到任何 DNS 解析器,可能是瀏覽器的 DNS 快取吃掉了請求,請稍後重試。", + "TableTitle": "捕獲到的 DNS 查詢記錄", + "DedupeToggle": "隱藏重複項", "Flow": { - "Probing": "", - "Waiting": "", - "Fetching": "", - "Done": "" + "Probing": "正在發起第 {current} / {total} 次探測...", + "Waiting": "等待遞迴 DNS 訪問我們的權威伺服器(通常 1–3 秒)。", + "Fetching": "正在取得捕獲到的 DNS 查詢記錄...", + "Done": "測試已完成。" }, "DnssecChip": { - "Signed": "", - "Unsigned": "", - "Validated": "", - "CdSet": "" + "Signed": "已請求 DNSSEC 簽名", + "Unsigned": "未請求 DNSSEC 簽名", + "Validated": "DNSSEC 校驗正常", + "CdSet": "DNSSEC 校驗被停用" }, "Summary": { - "ResolverCount": "", - "RawCount": "", - "DnssecPosture": "", - "DnssecGood": "", - "DnssecNoDo": "", - "DnssecCdSet": "", - "DnssecNone": "" + "ResolverCount": "去重後的解析器數量", + "RawCount": "原始捕獲記錄數", + "DnssecPosture": "DNSSEC 狀態", + "DnssecGood": "支援 DNSSEC —— 所有解析器都請求了簽名,並且沒有跳過校驗。", + "DnssecNoDo": "較弱 —— 至少有一個解析器沒有請求 DNSSEC 簽名。", + "DnssecCdSet": "可疑 —— 至少有一個解析器要求跳過 DNSSEC 校驗。", + "DnssecNone": "暫無資料。" }, "Fields": { - "ResolverIP": "", - "Location": "", - "ASN": "", - "QueryType": "", - "Transport": "", - "ECS": "" + "ResolverIP": "解析器 IP", + "Location": "歸屬地", + "ASN": "組織 / ASN", + "QueryType": "請求記錄型別", + "Transport": "請求傳輸協議", + "ECS": "ECS" }, "Legend": { - "Title": "", - "ResolverIP": "", - "QueryType": "", - "Transport": "", - "ECS": "", - "DO": "", - "CD": "" + "Title": "欄位說明", + "ResolverIP": "實際與我們權威 DNS 伺服器通訊的遞迴解析器出口 IP。如果你使用 VPN,把它的 ASN 與你目前 VPN 出口的 ASN 做對比,就能看出 DNS 請求是否繞過了 VPN 通道(即發生了洩露)。", + "QueryType": "解析器向權威伺服器請求的記錄型別(A、AAAA、HTTPS 等)。瀏覽器通常會同時發起 A 與 AAAA 查詢。", + "Transport": "DNS 預設走 UDP;出現 TCP 通常意味著響應過大,而響應過大往往是因為帶上了 DNSSEC 相關記錄。", + "ECS": "EDNS Client Subnet —— 部分遞迴 DNS 會在向上遊轉發查詢時附帶你真實 IP 的一段字首(通常是 IPv4 的 /24 或 IPv6 的 /48)。這意味著你的 IP 段會被 DNS 鏈路上的權威伺服器獲知,可能用於 CDN 的就近排程,也可能在一定程度上削弱匿名性。", + "DO": "DNSSEC OK —— 標記為對勾時,表示遞迴解析器在查詢時主動請求了 DNSSEC 簽名,代表鏈路具備密碼學校驗能力;標記為叉時,表示本次查詢未請求籤名,響應在鏈路上被偽造或篡改時可能無法被察覺。", + "CD": "Checking Disabled —— 標記為對勾時,表示呼叫方沒有要求跳過 DNSSEC 校驗,遞迴解析器會進行正常的簽名驗證;標記為叉時,表示呼叫方顯式要求跳過校驗,即使簽名對不上也會接受結果。正常情況下應該為對勾;如果出現叉,大多是由特定的除錯工具或客戶端的安全降級造成的,在極少數情況下也可能是鏈路上存在中間人篡改的徵兆。" } }, "dnsresolver": { - "Title": "", - "Note": "", - "Note2": "", - "Placeholder": "", - "invalidURL": "", - "fetchError": "", - "Provider": "", - "Result": "", - "Record": "", - "AllRegions": "" + "Title": "DNS 解析", + "Note": "同時向全球知名的公共 DNS 服務商解析同一個網域名稱,覆蓋傳統 DNS 與 DNS over HTTPS 兩種方式,並對比各家回傳的結果。不同服務商或不同地區的結果出現差異,通常意味著 CDN 在做就近排程、某處的快取尚未更新,或者這條記錄在鏈路上被過濾或重新導向了。使用時先選擇記錄型別,再填入網域名稱或網址並執行:每一行都會標註該解析伺服器所在的國家,表格也可以按地區篩選。", + "Note2": "請輸入 URL 或網域名稱,開始進行解析:", + "Placeholder": "URL 或網域名稱", + "invalidURL": "無效的 URL 或網域名稱", + "fetchError": "無法取得解析結果", + "Provider": "DNS 服務商", + "Result": "解析結果", + "Record": "記錄", + "AllRegions": "全部地區" }, "ruletest": { - "Title": "", - "Name": "", - "Note": "", - "StatusWait": "", - "StatusError": "", - "Country": "", - "RefreshAll": "" + "Title": "分流測試", + "Name": "檢測", + "Note": "分流測試用於判斷代理軟體基於網域名稱的規則設定是否正確。在進行測試之前,你需要先參考下方的卡片,在你的代理軟體裡對 IPCheck.ing 的 8 個不同的 URL 設定不同的網域名稱分流規則。通常,設定規則可能會使用類似於:DOMAIN, ptest-3.ipcheck.ing, POLICY 這樣的寫法,具體寫法不同的代理軟體可能會有所不同。", + "StatusWait": "待檢測", + "StatusError": "檢測出錯", + "Country": "代理地區", + "RefreshAll": "重新整理所有" }, "Tooltips": { - "RefreshIPCard": "", - "SaveAsImage": "", - "RefreshConnectivityTests": "", - "RefreshWebRTC": "", - "RefreshDNSLeakTest": "", - "SpeedTestButton": "", - "ShowASNInfo": "", - "ShowASNHistory": "", - "ShowASNConnectivity": "", - "CopyIP": "", - "CopySdpLog": "", - "ViewOnMap": "", - "InfoMask": "", - "IPHistory": "", - "ShareReport": "", - "QueryIP": "", - "GithubLink": "" + "RefreshIPCard": "重新整理 IP 資訊", + "SaveAsImage": "儲存為圖片", + "RefreshConnectivityTests": "重新整理連通性測試", + "RefreshWebRTC": "重新整理 WebRTC 洩露測試", + "RefreshDNSLeakTest": "重新整理 DNS 洩露測試", + "SpeedTestButton": "開始/暫停網速測試", + "ShowASNInfo": "顯示 AS 詳細資訊", + "ShowASNHistory": "顯示 ASN 歷史", + "ShowASNConnectivity": "顯示 ASN 連線圖", + "CopyIP": "複製 IP 位址", + "CopySdpLog": "複製 SDP 日誌", + "ViewOnMap": "在地圖上檢視位置", + "InfoMask": "隱藏資訊", + "IPHistory": "檢視 IP 歷史記錄", + "ShareReport": "產生診斷報告", + "QueryIP": "查詢 IP 資訊", + "GithubLink": "檢視原始碼" }, "report": { - "Title": "", - "Note": "", - "SectionsLabel": "", - "NotTested": "", - "MaskTail": "", - "TtlLabel": "", - "Ttl1": "", - "Ttl3": "", - "Ttl7": "", - "Preview": "", - "CreateLink": "", - "CopyAI": "", - "DownloadJson": "", - "CopyLink": "", - "NoSelection": "", - "CreateFailed": "", - "LinkOnce": "", - "ExpiresAt": "", - "CopiedTitle": "", - "CopiedMessage": "", + "Title": "診斷報告", + "Note": "把已完成的測試結果打包成一份報告,分享給朋友或 AI 協助診斷網路問題。在你複製、下載或產生連結之前,資料不會離開本機。", + "SectionsLabel": "選擇要包含的測試", + "NotTested": "未測試", + "MaskTail": "遮蓋 IP 尾段", + "TtlLabel": "自動刪除", + "Ttl1": "1 天", + "Ttl3": "3 天", + "Ttl7": "7 天", + "Preview": "預覽分享內容", + "CreateLink": "產生分享連結", + "CopyAI": "複製給 AI 診斷", + "DownloadJson": "下載 JSON", + "CopyLink": "複製連結", + "NoSelection": "請先選擇至少一項測試。", + "CreateFailed": "產生分享連結失敗,請稍後再試。", + "LinkOnce": "連結僅顯示這一次,請立即複製。任何拿到連結的人都能在過期前檢視這份報告。", + "ExpiresAt": "報告將於 {time} 自動刪除。", + "CopiedTitle": "已複製", + "CopiedMessage": "報告已複製,可直接貼上給任意 AI 助手。", "ai": { - "Heading": "", - "Intro": "", - "Masked": "", - "Instruction": "", + "Heading": "MyIP 網路診斷報告", + "Intro": "本報告由 MyIP({origin})於 {time} 產生,資料來自在使用者瀏覽器中執行的網路測試。欄位名為穩定的 schema 識別符號;所有延遲數值單位為毫秒。", + "Masked": "注意:出於隱私考慮,報告中的 IP 位址已遮蓋尾段(IPv4 末段、IPv6 介面位,以 \"x\" 表示)。", + "Instruction": "請基於以上資料分析該網路的健康狀況,指出異常項(DNS 洩露、WebRTC 暴露、代理/VPN 特徵、丟包、高延遲、路由問題等),並給出具體的排查建議。", "Sections": { - "ipinfo": "", - "connectivity": "", - "webrtc": "", - "dnsleak": "", - "speedtest": "", - "pingtest": "", - "mtrtest": "", - "ruletest": "", - "browserinfo": "", - "invisibility": "", - "enhanceddnsleak": "", - "persona": "" + "ipinfo": "多個獨立來源看到的公網 IP(存在代理或分流時不同來源可能不一致)。", + "connectivity": "瀏覽器對知名網站的可達性探測;timeMs 為展示的往返耗時,minTimeMs 為多輪中的最佳值。", + "webrtc": "透過 WebRTC STUN 暴露的 IP——若與主公網 IP 不同,真實位址可能繞過代理/VPN 洩露。", + "dnsleak": "實際應答瀏覽器查詢的 DNS 解析器出口 IP——解析器不屬於使用者的 ISP/VPN 供應商即為 DNS 洩露跡象。", + "speedtest": "對 Cloudflare 測得的頻寬、延遲與負載延遲(bufferbloat);分數衡量流媒體/遊戲/即時通話體驗,越高越好。", + "pingtest": "全球 Globalping 探針對使用者 IP 的 ICMP ping 統計。", + "mtrtest": "全球探針到使用者 IP 的逐跳 MTR 路由追蹤;中間跳的丟包可能只是 ICMP 限速,從某一跳起持續丟包才代表真實問題。", + "ruletest": "訪問 8 個測試端點時觀測到的出口 IP——出現多個不同 IP 說明流量被分流到不同線路(如代理規則)。", + "browserinfo": "被測裝置的瀏覽器、作業系統與顯示環境。", + "invisibility": "代理/VPN 檢測得分(0-100,越高越可能被識別)及各項命中的檢測訊號。", + "enhanceddnsleak": "解析器級 DNS 捕獲:向測試網域名稱發起查詢的每個解析器 IP,含傳輸協議、ECS 暴露與 DNSSEC 標誌(do/cd)。", + "persona": "瀏覽器與所選國家本地居民的相符程度:一個總體評級,加上每項檢查的結論。只有結論——各項檢查依據的具體數值刻意不寫入可分享的報告。" } } }, "reportPage": { - "Loading": "", - "NotFound": "", - "NotFoundNote": "", - "LoadFailed": "", - "Unsupported": "", - "GeneratedBy": "", - "Stale": "", - "TestMine": "", + "Loading": "報告載入中…", + "NotFound": "報告不存在或已過期", + "NotFoundNote": "分享報告到期後會自動刪除。", + "LoadFailed": "報告載入失敗,請稍後重試。", + "Unsupported": "此報告由更新版本產生,無法顯示。", + "GeneratedBy": "由 {origin} 於 {time} 產生的診斷報告", + "Stale": "此報告已超過 3 天,網路狀況可能已發生變化。", + "TestMine": "測一測我自己的網路", "Col": { - "Source": "", - "Name": "", - "IP": "", - "Location": "", - "ISP": "", - "Status": "", - "Server": "", - "Provider": "", - "Target": "", - "UniqueIPs": "", - "Resolvers": "" + "Source": "來源", + "Name": "名稱", + "IP": "IP", + "Location": "位置", + "ISP": "網路服務供應商", + "Status": "狀態", + "Server": "伺服器", + "Provider": "提供商", + "Target": "目標", + "UniqueIPs": "不同出口 IP 數", + "Resolvers": "解析器數量" }, "Dnssec": { - "ok": "", - "partial": "", - "none": "" + "ok": "DNSSEC 已啟用", + "partial": "DNSSEC 部分啟用", + "none": "DNSSEC 未啟用" } }, "ipHistory": { - "Title": "", - "Notes": "", - "Empty": "", - "FilterByType": "", - "FilterByCountry": "", - "UnknownCountry": "", - "NoMatch": "", - "ClearAll": "", - "ClearConfirm": "" + "Title": "IP 歷史記錄", + "Notes": "這裡記錄你使用本站時被偵測到的 IP。資料僅儲存在目前瀏覽器本地,不會同步到帳號,也不會離開你的裝置。你可以在「偏好設定」中調整記錄保留時間。", + "Empty": "暫無記錄。首頁檢測到 IP 後會自動記錄在這裡。", + "FilterByType": "按 IP 型別篩選", + "FilterByCountry": "按國家或地區篩選", + "UnknownCountry": "未知", + "NoMatch": "沒有符合篩選條件的記錄。", + "ClearAll": "清空記錄", + "ClearConfirm": "再次點選確認清空" }, "ipInfos": { - "Title": "", - "Notes": "", - "Source": "", - "Country": "", - "Region": "", - "City": "", - "TimeZone": "", - "ISP": "", - "ASN": "", - "Coordinates": "", - "IPv4Error": "", - "IPv6Error": "", - "type": "", - "isProxy": "", - "qualityScore": "", - "qualityScoreUnknown": "", - "advancedUnlockCta": "", - "advancedQuotaCta": "", + "Title": "IP 資訊", + "Notes": "程式會先從多個不同的來源(包含 IPv4 和 IPv6)檢查你的 IP 位址,然後透過你選擇的 IP 地理位置資訊源查詢對應的地理資料。如果目前 IP 堆疊只有 1 個,則沒有資料的來源會顯示為空。", + "Source": "IP 來源", + "Country": "地區", + "Region": "省份", + "City": "城市", + "TimeZone": "時區", + "ISP": "網路", + "ASN": "ASN", + "Coordinates": "經緯度", + "IPv4Error": "取得失敗或不存在 IPv4 位址", + "IPv6Error": "取得失敗或不存在 IPv6 位址", + "type": "型別", + "isProxy": "代理", + "qualityScore": "IP 品質分", + "qualityScoreUnknown": "未知分數", + "advancedUnlockCta": "為避免濫用,登入後可檢視以下資訊", + "advancedQuotaCta": "本月新 IP 查詢額度已用完", "ASNInfo": { - "trafficPercentage": "", - "note": "", - "asnName": "", - "asnOrgName": "", - "asnCountryCode": "", - "estimatedUsers": "", - "IPv4_Pct": "", - "IPv6_Pct": "", - "HTTP_Pct": "", - "HTTPS_Pct": "", - "Desktop_Pct": "", - "Mobile_Pct": "", - "Bot_Pct": "", - "Human_Pct": "", - "moreData": "" + "trafficPercentage": "流量比例:", + "note": "此 AS 的相關資料:", + "asnName": "AS 名稱:", + "asnOrgName": "AS 組織名稱:", + "asnCountryCode": "AS 地區:", + "estimatedUsers": "估計使用者數:", + "IPv4_Pct": "IPv4", + "IPv6_Pct": "IPv6", + "HTTP_Pct": "HTTP", + "HTTPS_Pct": "HTTPS", + "Desktop_Pct": "桌面裝置", + "Mobile_Pct": "行動裝置", + "Bot_Pct": "機器人", + "Human_Pct": "人類", + "moreData": "更多資料:" }, "ASNHistory": { - "announcedPrefixes": "", - "note": "", - "empty": "", - "error": "", - "seenBy": "" + "announcedPrefixes": "公告字首:", + "note": "該 IP 的歷史 ASN 公告:", + "empty": "未找到該 IP 的歷史路由資料。", + "error": "載入 ASN 歷史失敗。", + "seenBy": "RIPE RIS 可見度:{pct}% — 峰值 {peers} 個全表 peer" }, "ASNConnectivity": { - "note": "", - "empty": "", - "error": "", - "expand": "", - "dialogTitle": "", - "legendOrigin": "", - "legendTier1": "", - "legendIntermediate": "", - "zoomIn": "", - "zoomOut": "", - "zoomReset": "" + "note": "該 AS 到全球 Tier 1 骨幹網的上游路徑:", + "empty": "未找到該 AS 的上游連線資料。", + "error": "載入 ASN 連線圖失敗。", + "expand": "放大", + "dialogTitle": "AS{asn} 的網路連線圖", + "legendOrigin": "起源", + "legendTier1": "Tier 1 骨幹", + "legendIntermediate": "中間 AS", + "zoomIn": "放大", + "zoomOut": "縮小", + "zoomReset": "重置縮放" }, "advancedData": { - "proxyYes": "", - "proxyMaybe": "", - "proxyNo": "", - "proxyUnknown": "", + "proxyYes": "已識別為代理 / VPN", + "proxyMaybe": "疑似代理 / VPN", + "proxyNo": "未識別為代理", + "proxyUnknown": "未知型別", "type": { - "Residential": "", - "Wireless": "", - "Business": "", - "Hosting": "", - "unknownType": "" + "Residential": "住宅線路", + "Wireless": "無線網路", + "Business": "商業線路", + "Hosting": "資料中心", + "unknownType": "未知型別" }, - "Nativeness": "", - "NativeIPYes": "", - "NativeIPNo": "", - "nativenessTooltip": "" + "Nativeness": "原生性", + "NativeIPYes": "原生", + "NativeIPNo": "非原生", + "nativenessTooltip": "判斷 ASN 的註冊國家是否與 IP 的歸屬國家一致" } }, "serviceStatus": { - "Title": "", - "Note": "", - "Refresh": "", - "LastChecked": "", - "AllOperational": "", - "ComponentsTitle": "", - "IncidentsTitle": "", - "NoComponents": "", - "NoRecentIncidents": "", - "Loading": "", - "Checking": "", - "IncidentsError": "", - "ComponentsError": "", + "Title": "服務可用性", + "Note": "當你打不開某些服務的時候,可能並不是你的問題,而是這些服務出故障了。目前,人們大量使用 AI 產品,並在 AI 產品沒有回覆的時候,不確定是自己的問題還是服務的問題。本板塊展示一些知名 AI 服務的即時可用狀態,展開卡片可檢視各子服務的狀態與最近的事故。", + "Refresh": "重新整理服務狀態", + "LastChecked": "最後檢查", + "AllOperational": "所有系統正常", + "ComponentsTitle": "服務項", + "IncidentsTitle": "最近事故", + "NoComponents": "暫無服務詳情。", + "NoRecentIncidents": "近期無事故。", + "Loading": "載入中…", + "Checking": "查詢中…", + "IncidentsError": "無法載入事故資訊。", + "ComponentsError": "無法載入服務項。", "indicator": { - "minor": "", - "major": "", - "critical": "", - "maintenance": "", - "unknown": "" + "minor": "部分異常", + "major": "重大故障", + "critical": "嚴重故障", + "maintenance": "維護中", + "unknown": "狀態取得失敗" }, "component": { - "operational": "", - "degraded_performance": "", - "partial_outage": "", - "major_outage": "", - "under_maintenance": "" + "operational": "正常", + "degraded_performance": "效能下降", + "partial_outage": "部分中斷", + "major_outage": "重大中斷", + "under_maintenance": "維護中" }, "incidentStatus": { - "investigating": "", - "identified": "", - "monitoring": "", - "resolved": "", - "postmortem": "", - "scheduled": "", - "in_progress": "", - "verifying": "", - "completed": "" + "investigating": "調查中", + "identified": "已定位", + "monitoring": "監控中", + "resolved": "已解決", + "postmortem": "復盤", + "scheduled": "已計劃", + "in_progress": "進行中", + "verifying": "驗證中", + "completed": "已完成" } }, "connectivity": { - "Title": "", - "Note": "", - "StatusWait": "", - "StatusAvailable": "", - "StatusUnavailable": "", - "StatusTimeout": "", - "checking": "", - "minTestTime": "", - "RefreshThisTest": "", - "RoundCount": "", + "Title": "網路連通性", + "Note": "本測試用於測試你是否能夠連通到某個網站。測試方法是透過載入對應網站上的小圖片進行的。延遲值僅供參考,實際會更小。你可以新增其它你常用的網站到測試清單中,方便快速測試。", + "StatusWait": "待檢測", + "StatusAvailable": "可用", + "StatusUnavailable": "不可用", + "StatusTimeout": "超時或不可用", + "checking": "檢查中...", + "minTestTime": "最小測試時間:", + "RefreshThisTest": "重新整理此測試", + "RoundCount": "第 {n} 次:", "addCustom": { - "AddCard": "", - "Title": "", - "Hint": "", - "NameLabel": "", - "NamePlaceholder": "", - "UrlLabel": "", - "UrlPlaceholder": "", - "Add": "", - "Remove": "", - "NameRequired": "", - "UrlRequired": "", - "InvalidUrl": "", - "LimitReached": "", - "LastTargetTitle": "", - "LastTargetMessage": "" + "AddCard": "新增測試", + "Title": "新增自訂測試", + "Hint": "透過 HTTPS 載入站點 favicon 進行測試,部分站點可能無法以這種方式測試。自訂測試會儲存在瀏覽器本地。", + "NameLabel": "名稱", + "NamePlaceholder": "例如:維基百科", + "UrlLabel": "URL", + "UrlPlaceholder": "例如:wikipedia.org", + "Add": "新增", + "Remove": "移除測試", + "NameRequired": "請輸入名稱", + "UrlRequired": "請輸入 URL", + "InvalidUrl": "這看起來不是一個有效的 URL", + "LimitReached": "測試數量已達到 60 個上限", + "LastTargetTitle": "無法刪除", + "LastTargetMessage": "至少需要保留一個測試網站。" }, "importDialog": { - "Title": "", - "CustomOption": "", - "ImportOption": "", - "SiteCount": "", - "Import": "", - "Capacity": "", - "NotEnoughCapacity": "" + "Title": "新增 / 匯入測試", + "CustomOption": "新增自訂", + "ImportOption": "匯入清單", + "SiteCount": "{n} 個網站", + "Import": "匯入", + "Capacity": "已用 {used}/{limit}", + "NotEnoughCapacity": "容量不足——該清單需要 {need} 個空位,僅剩 {free} 個" }, "importLists": { - "defaults": "", - "iran": "", - "russia": "", - "china": "", - "brazil": "", - "ai": "", - "social": "", - "streaming": "", - "gaming": "", - "developer": "", - "cloud": "", - "crypto": "", - "ecommerce": "", - "news": "" + "defaults": "系統預設", + "iran": "伊朗常用", + "russia": "俄羅斯常用", + "china": "中國常用", + "brazil": "巴西常用", + "ai": "AI 服務", + "social": "社交通訊", + "streaming": "流媒體", + "gaming": "遊戲平臺", + "developer": "開發者", + "cloud": "雲與 CDN", + "crypto": "加密交易所", + "ecommerce": "國際電商平臺", + "news": "新聞與百科" } }, "webrtc": { - "id": "", - "Title": "", - "Name": "", - "Note": "", - "StatusWait": "", - "StatusError": "", - "StatusUnavailable": "", - "SdpLog": "", + "id": "webrtc", + "Title": "WebRTC 洩露測試", + "Name": "WebRTC 連線", + "Note": "WebRTC 往往透過 UDP 直連進行建立,如果測試回傳了真實 IP,則意味著你的代理設定沒有覆蓋這些連線。除了檢測你連線 WebRTC 時所使用的 IP,我們還會檢測你的 NAT 型別。然而,NAT 型別的檢測並不是 100% 準確的,僅供參考。", + "StatusWait": "待檢測", + "StatusError": "連線錯誤", + "StatusUnavailable": "WebRTC 不可用", + "SdpLog": "SDP 日誌", "NATType": { - "srflx": "", - "prflx": "", - "relay": "", - "host": "", - "unknown": "" + "srflx": "埠限制型或對稱型", + "prflx": "埠限制型", + "relay": "對稱型", + "host": "全錐型", + "unknown": "未知型別" } }, "dnsleaktest": { - "Name": "", - "Title": "", - "Note": "", - "Note2": "", - "EndpointCountry": "", - "StatusWait": "", - "StatusError": "" + "Name": "DNS 出口檢測", + "Title": "DNS 洩露測試", + "Note": "DNS 洩露(DNS Leaks)的意思是,當你掛上 VPN/代理後,你解析網域名稱時,依然透過當地的網路服務供應商進行解析,這時就有 DNS 洩露的風險。", + "Note2": "洩露測試的方法是透過訪問新產生的網域名稱,檢測你是透過哪個地區的 DNS 出口進行解析,如果回傳的出口區域和你當地的網路服務供應商區域相同,則有 DNS 洩露風險,你可能需要修改 VPN/代理設定。", + "EndpointCountry": "出口地區", + "StatusWait": "待檢測", + "StatusError": "測試出錯" }, "speedtest": { - "Title": "", - "Note": "", - "Download": "", - "Upload": "", - "Latency": "", - "Jitter": "", - "loadedLatency": "", - "videoStreaming": "", - "gaming": "", - "rtc": "", - "score": "", - "connectionFrom": "", - "connectionTo": "", - "connectionEnd": "", - "testFailed": "", + "Title": "網速測試", + "Note": "將從 Cloudflare 使用邊緣網路進行速度測試。你可以根據需要,選擇測速時下載和上傳的封包大小。測速過程中,會進行 4 次封包上傳與下載,請注意流量消耗。考慮到 Cloudflare 並非在全球每一個國家都部署邊緣節點,測速結果僅供參考,實際速度可能更快。", + "Download": "下載", + "Upload": "上傳", + "Latency": "延遲", + "Jitter": "抖動", + "loadedLatency": "滿載延遲:", + "videoStreaming": "線上影片", + "gaming": " 線上遊戲", + "rtc": " 視訊會議", + "score": "根據網速測試,得出以下品質分數:", + "connectionFrom": "已完成從你的機器,IP:", + "connectionTo": "與測速伺服器:", + "connectionEnd": " 的測試。", + "testFailed": "無法連線測速伺服器,請檢查網路後重試。", "quality": { - "bad": "", - "poor": "", - "average": "", - "good": "", - "great": "" + "bad": "差", + "poor": "較差", + "average": "一般", + "good": "良好", + "great": "優秀" } }, "globalping": { - "Selected": "", - "Suggested": "", - "NoProbe": "", - "GroupFull": "", - "UnreachableTarget": "", - "ResultsHint": "", - "Asia": "", - "Europe": "", - "Africa": "", - "Americas": "", - "Oceania": "" + "Selected": "已選地區:", + "Suggested": "推薦地區", + "NoProbe": "該國家/地區暫無可用探針", + "GroupFull": "最多 {max} 個國家/地區,請先取消部分勾選", + "UnreachableTarget": "探針執行在公網上,內網及保留位址在任何國家/地區都無法抵達。", + "ResultsHint": "選擇探針並執行測試後,結果將顯示在這裡。", + "Asia": "亞洲", + "Europe": "歐洲", + "Africa": "非洲", + "Americas": "美洲", + "Oceania": "大洋洲" }, "pingtest": { - "EnterIPLabel": "", - "EnterIPPlaceholder": "", - "UseStored": "", - "id": "", - "Title": "", - "Note": "", - "Note2": "", - "Note3": "", - "SelectIP": "", - "Region": "", - "MinDelay": "", - "MaxDelay": "", - "AvgDelay": "", - "TotalPackets": "", - "PacketLoss": "", - "ReceivedPackets": "", - "DroppedPackets": "", - "Error": "" + "EnterIPLabel": "輸入要測試的 IP", + "EnterIPPlaceholder": "例如 1.1.1.1", + "UseStored": "使用已知 IP", + "id": "pingtest", + "Title": "全球延遲測試", + "Note": "Ping 測試是一種網路工具,用於測量封包從兩個目標(伺服器)之間的往返時間。是評估網路效能的關鍵指標。", + "Note2": "在下面的測試過程中,IPCheck.ing 會利用 Globalping 全球探針從世界各地的伺服器傳送小型封包到你的 IP 位址,然後測量這些封包從伺服器傳送到你的裝置,再傳回伺服器所需的時間。透過這些不同地理位置的 Ping 測試,你可以獲得一個全面的檢視,了解你的裝置與全球網路連線的速度和穩定性。", + "Note3": "請選取你的 IP 位址進行測試:", + "SelectIP": "選擇一個 IP 位址", + "Region": "地區", + "MinDelay": "最小延遲(ms)", + "MaxDelay": "最大延遲(ms)", + "AvgDelay": "平均延遲(ms)", + "TotalPackets": "總包數", + "PacketLoss": "丟包率", + "ReceivedPackets": "收到", + "DroppedPackets": "丟失", + "Error": "測試失敗,看起來你的 IP 不允許進行 Ping 測試。" }, "mtrtest": { - "EnterIPLabel": "", - "EnterIPPlaceholder": "", - "UseStored": "", - "Title": "", - "Note": "", - "Note2": "", - "Note3": "", - "SelectIP": "", - "Region": "", - "Error": "", - "ColHost": "", - "ColIP": "", - "ColASN": "", - "ColLoss": "", - "ColSent": "", - "ColDrop": "", - "ColRecv": "", - "ColLast": "", - "ColAvg": "", - "ColBest": "", - "ColWorst": "", - "ColStDev": "", - "ColJitter": "", - "NoReply": "" + "EnterIPLabel": "輸入要測試的 IP", + "EnterIPPlaceholder": "例如 1.1.1.1", + "UseStored": "使用已知 IP", + "Title": "MTR 測試", + "Note": "MTR (My Traceroute) 測試會利用 Globalping 全球探針從遍佈全球不同大洲和地區的伺服器出發,對你的 IP 位址進行詳細的路由追蹤。MTR 結合了傳統 traceroute 和 ping 命令的功能,能夠即時地診斷網路連線的品質和效能。", + "Note2": "這個過程涵蓋了從各個地理位置到你的網路環境的完整路徑,提供關於每一跳的延遲和封包丟失資訊。無論是路由路徑的擁堵、某個特定節點的延遲問題,還是封包在傳輸過程中的丟失,MTR 測試都能提供關鍵的診斷資訊。", + "Note3": "請選取你的 IP 位址進行測試:", + "SelectIP": "選擇一個 IP 位址", + "Region": "地區", + "Error": "測試失敗,看起來你的 IP 不允許進行 MTR 測試。", + "ColHost": "主機", + "ColIP": "IP", + "ColASN": "ASN", + "ColLoss": "丟包", + "ColSent": "傳送", + "ColDrop": "丟棄", + "ColRecv": "接收", + "ColLast": "最近", + "ColAvg": "平均", + "ColBest": "最佳", + "ColWorst": "最差", + "ColStDev": "標準差", + "ColJitter": "抖動", + "NoReply": "無響應" }, "ipcheck": { - "Title": "", - "Placeholder": "", - "Error": "", - "reservedIP": "", - "NoData": "" + "Title": "IP 查詢", + "Placeholder": "例如 1.1.1.1", + "Error": "請輸入有效的 IPv4 或 IPv6 位址。", + "reservedIP": "內網、迴環等保留位址沒有地理位置資訊,無法查詢。", + "NoData": "無法查詢到該 IP 的資訊。可能是不可路由位址(如 0.0.0.0、私有位址)或資料來源沒有該 IP 的記錄。" }, "alert": { - "refreshEverythingMessage": "", - "refreshEverythingTitle": "", - "OhNo": "", - "Congrats": "", - "OhNo_Message": "", - "Congrats_Message": "", - "maskedInfoTitle": "", - "maskedInfoMessage": "", - "unmaskedInfoTitle": "", - "unmaskedInfoMessage": "", - "SignInFailed": "", - "SignInFailedReason": "", - "IpGeoSourceFallbackTitle": "", - "IpGeoSourceFallbackMessage": "", - "SignInEmailTakenTitle": "", - "SignInEmailTakenMessage": "" + "refreshEverythingMessage": "正在重新整理所有資料,請等待...", + "refreshEverythingTitle": "正在重新整理", + "OhNo": "糟糕!", + "Congrats": "恭喜呀!", + "OhNo_Message": "連通性檢測沒有通過,部分網站無法訪問。", + "Congrats_Message": "所有的連通性檢測均通過,你可以訪問所有網站。", + "maskedInfoTitle": "IP 資訊已隱藏", + "maskedInfoMessage": "分享截圖不會洩露你的 IP 資訊。", + "unmaskedInfoTitle": "IP 資訊已顯示", + "unmaskedInfoMessage": "分享截圖時請注意隱私。", + "SignInFailed": "登入失敗", + "SignInFailedReason": "原因", + "IpGeoSourceFallbackTitle": "IP 解析資料來源已切換", + "IpGeoSourceFallbackMessage": "解析源 {from} 暫時不可用,本次結果臨時改由 {to} 提供。", + "SignInEmailTakenTitle": "該電子郵件信箱已被使用", + "SignInEmailTakenMessage": "該電子郵件信箱已經註冊過帳號,請改用 {other} 登入。" }, "shortcutKeys": { - "GoToTop": "", - "GoToBottom": "", - "ToggleDarkMode": "", - "RefreshEverything": "", - "RefreshIPCard": "", - "RefreshConnectivityTests": "", - "RefreshWebRTC": "", - "RefreshDNSLeakTest": "", - "SpeedTestButton": "", - "PingTest": "", - "MTRTest": "", - "RuleTest": "", - "DNSResolver": "", - "IPCheck": "", - "ToggleInfoMask": "", - "IPHistory": "", - "ShareReport": "", - "Help": "", - "HelpNote": "", - "GoNext": "", - "GoPrevious": "", - "OpenHighlightedTool": "", - "RefreshRuleTests": "", - "CensorshipCheck": "", - "Pulse": "", - "Whois": "", - "ServiceStatus": "", - "InvisibilityTest": "", - "EnhancedDnsLeakTest": "", - "MacChecker": "", - "BrowserInfo": "", - "SecurityChecklist": "", - "PersonaCheck": "" + "GoToTop": "回到頂部", + "GoToBottom": "回到底部", + "ToggleDarkMode": "切換深色模式", + "RefreshEverything": "重新整理所有資料", + "RefreshIPCard": "重新整理某張 IP 卡片", + "RefreshConnectivityTests": "重新整理連通性測試", + "RefreshWebRTC": "重新整理 WebRTC 洩露測試", + "RefreshDNSLeakTest": "重新整理 DNS 洩露測試", + "SpeedTestButton": "開始/暫停網速測試", + "PingTest": "開啟全球延遲測試面板", + "MTRTest": "開啟 MTR 測試面板", + "RuleTest": "開啟規則測試面板", + "DNSResolver": "開啟 DNS 解析器面板", + "IPCheck": "IP 查詢", + "ToggleInfoMask": "切換資訊隱藏", + "IPHistory": "開啟 IP 歷史記錄面板", + "ShareReport": "開啟分享報告面板", + "Help": "顯示快捷鍵", + "HelpNote": "使用快捷鍵的人,是喜歡效率的人,你真棒!", + "GoNext": "下一張卡片", + "GoPrevious": "上一張卡片", + "OpenHighlightedTool": "開啟選中的進階工具", + "RefreshRuleTests": "重新整理規則測試", + "CensorshipCheck": "開啟封鎖測試面板", + "Pulse": "開啟地球線上面板", + "Whois": "開啟 Whois 查詢面板", + "ServiceStatus": "開啟服務可用性面板", + "InvisibilityTest": "開啟隱身測試面板", + "EnhancedDnsLeakTest": "開啟深度 DNS 洩露測試面板", + "MacChecker": "開啟實體位址查詢面板", + "BrowserInfo": "開啟瀏覽器資訊面板", + "SecurityChecklist": "開啟安全檢查清單", + "PersonaCheck": "開啟深度畫像檢測面板" }, "page": { "title": "IPCheck.ing - 查詢我的 IP 位址與地理位置 - IP 洩漏測試 - DNS 洩漏測試 - IP 品質檢查 - 網路速度測試 - 全方位 IP 工具箱", @@ -1430,34 +1430,34 @@ "Title": "鍵盤快速鍵" }, "about": { - "Title": "", + "Title": "關於", "project": [ - "", - "", - "", - "" + "IPCheck.ing 是一個免費的多合一 IP 工具箱,可以協助你檢視自己的 IP 資訊,檢測網站的可用性,檢視 DNS 出口資訊,進行網速測試,全球延遲測試,MTR 測試等。", + "這是一個開源專案,你可以點選頁面底部的 GitHub 圖示檢視原始碼。", + "如果你對於產品中功能使用不理解,可以透過底部的「說明中心」取得協助,我們已經寫了非常詳細的協助文件,除了功能介紹,也能協助你理解各種網路概念和如何排查網路問題。", + "如果你有興趣參與到開源專案中,可以點選頁面底部的「貢獻程式碼」按鈕,檢視如何貢獻程式碼。" ], - "founderTitle": "", + "founderTitle": "關於專案發起人", "founder": [ - "", - "", - "" + "最早的時候,這是阿禪(Jason Ng)的一個用來學習 Vue.js 和學習如何使用 AI 寫程式碼的練手專案,後來在 GitHub 上獲得的星星數量越來越多,於是他進行了大量的重構和新增了許多非常有用的功能,希望你會喜歡。", + "他並不是一個專業的程式設計師,在大多數時候,他是一名產品經理、一名部落格作者、一個摩托車騎士以及一名極客。但他喜歡程式設計、喜歡開源,喜歡分享。", + "你可以在下面的連結裡找到他更詳細的介紹:" ], - "contactTitle": "", + "contactTitle": "聯絡我們", "contact": [ - "", - "", - "" + "如果你在使用 IPCheck.ing 或者部署 MyIP 專案的時候,遇到問題,可以先前往「說明中心」尋找答案。如果找不到答案,而你無法解決,可以在 Github 上給我們提 issue 或透過郵件和我們聯絡。", + "當然了,如果你遇到了一個 bug,而你又喜歡程式設計(或者使用 AI 程式設計),非常歡迎你將你的最佳化方案直接提交 PR 給我們。", + "我們的電子郵件信箱: i[AT]ipcheck.ing。" ], - "personal": "", - "blog": "", - "linkedIn": "", - "twitter": "", - "Sponsor": "", - "Privacy": "", - "HelpCenter": "", - "Contribute": "", - "Close": "" + "personal": "個人網站", + "blog": "可能吧部落格", + "linkedIn": "LinkedIn", + "twitter": "Twitter", + "Sponsor": "贊助我們", + "Privacy": "隱私政策", + "HelpCenter": "說明中心", + "Contribute": "貢獻程式碼", + "Close": "關閉" }, "acknowledgement": { "Title": "致謝", diff --git a/tests/locale-registry.test.js b/tests/locale-registry.test.js index c9333c32b..b73882535 100644 --- a/tests/locale-registry.test.js +++ b/tests/locale-registry.test.js @@ -60,6 +60,11 @@ describe('toApiTag / toHtmlLang', () => { } }); + it('maps zh-TW to the supported upstream tag and preserves its document language', () => { + assert.equal(toApiTag('zh-TW'), 'zh-CN'); + assert.equal(toHtmlLang('zh-TW'), 'zh-TW'); + }); + it('passes an unregistered code through untouched', () => { assert.equal(toApiTag('tr'), 'tr'); assert.equal(toHtmlLang('tr'), 'tr'); From 7a3989fbb2485c117fcb94b73c3be3f501d83270 Mon Sep 17 00:00:00 2001 From: Seven Yu Date: Mon, 24 Aug 2026 23:37:28 +0800 Subject: [PATCH 06/17] Feat(i18n): complete Traditional Chinese locale packs Co-authored-by: Codex --- frontend/locales/privacy/zh-TW.json | 111 ++ .../locales/security-checklist/zh-TW.json | 1646 +++++++++++++++++ frontend/locales/zh-TW.json | 74 +- 3 files changed, 1794 insertions(+), 37 deletions(-) create mode 100644 frontend/locales/privacy/zh-TW.json create mode 100644 frontend/locales/security-checklist/zh-TW.json diff --git a/frontend/locales/privacy/zh-TW.json b/frontend/locales/privacy/zh-TW.json new file mode 100644 index 000000000..da2eb7c9a --- /dev/null +++ b/frontend/locales/privacy/zh-TW.json @@ -0,0 +1,111 @@ +{ + "privacy": { + "Title": "隱私政策", + "UpdatedLabel": "最後更新", + "Intro": "IPCheck.ing 是一個免費、開源的 IP 工具箱。我們做它,是為了協助你看清自己的網路和瀏覽器會暴露哪些資訊——正因如此,尊重你的隱私對我們很重要。本頁說明你使用本站時,資料會被如何處理。", + "sections": { + "tools": { + "title": "工具如何運作", + "paragraphs": [ + "工具展示給你的大部分內容——IP 詳情、瀏覽器指紋、DNS、連通性與測速結果——都是在你的瀏覽器裡計算,或即時查詢後只展示給你本人。這些結果我們不會儲存在伺服器上並供他人存取——除非你主動產生分享報告連結。", + "查詢 IP 地理位置時,被查詢的 IP 會發送給第三方服務供應商(如 ipinfo.io、ip-api.com 等)。這些查詢受各服務供應商自己的隱私政策約束。" + ] + }, + "pulse": { + "title": "地球線上", + "paragraphs": [ + "當你造訪本站時,我們會在邊緣網路記錄一次匿名造訪計數,附帶由 IP 推導出的國家/地區。IP 本身只被瞬時使用,完整位址不會被儲存。", + "如果你主動分享預設狀態,我們會記錄狀態編號、國家/地區和脫敏 IP 字首,並在數天內自動刪除。狀態只能從固定清單中選擇,不存在自由文字輸入。" + ] + }, + "sharedReports": { + "title": "診斷報告分享", + "paragraphs": [ + "你可以把測試結果打包成診斷報告進行分享。產生分享連結始終是你的主動操作——不會有任何自動上傳。你可以選擇包含哪些測試,並在產生前遮蓋 IP 位址尾段。", + "產生連結時,所選結果會儲存在我們的伺服器設施(Cloudflare Workers KV)上,以便取得連結的人開啟檢視。報告會在你選擇的保留期(1、3 或 7 天)結束後自動刪除。連結使用不可列舉的隨機 ID,我們不儲存任何報告目錄;在過期前,任何取得連結的人都可以檢視該報告。", + "「複製給 AI」和「下載 JSON」完全在你的瀏覽器本機完成,不會向伺服器儲存任何內容。" + ] + }, + "personaCheck": { + "title": "深度畫像檢測", + "paragraphs": [ + "深度畫像檢測會將你的資料發往我們的評分服務,由其對照你選擇的國家進行評分,並把評級報告回傳給你。你傳送的內容和收到的報告都不會被儲存——除非你主動把結果打包成可分享的報告連結;即便如此,進入連結的也只有評級和每項檢查的結論,而不包含它們背後的具體數值。", + "一次檢測會隨請求傳送的內容:" + ], + "bullets": [ + "你的時區與語言設定,以及你的瀏覽器對一個固定示例日期和數字的格式化方式。", + "你已安裝的字型和語音合成套件涵蓋了哪些書寫系統,以及你的鍵盤配置——也就是報告裡展示給你看的那些結果。讀取這些資訊本身會讓你的瀏覽器稍微更容易被識別,這是測量它們無法避免的代價。", + "頁面上 IP 查詢、WebRTC 和 DNS 檢測已經得出的結果。", + "僅在你主動提供時:你的位置(離開裝置前已四捨五入到約一公里,且只用於換算成國家),以及銀行卡號的前 6-8 位。這幾位數字識別的是發卡行而非你的帳戶,無法用於任何付款——它們會被送到第三方發卡行資料庫查詢。" + ] + }, + "docsAssistant": { + "title": "說明文件助手", + "paragraphs": [ + "說明文件助手基於我們的說明文件網站回答問題。它只在你使用時才啟動:助手按需載入,你輸入的問題會發送給 GitBook(我們的說明文件網站託管方,也是助手的提供方)以產生回答。", + "助手還可以讀取你頁面上目前的檢測結果 —— 你的 IP 位址及其歸屬地與網路、以及你已經執行過的各項測試結果。這絕不會靜默發生:助手必須先詢問,由你點選對話中的確認按鈕同意。即使拒絕,它依然可以基於文件回答你。", + "對話發生在你的瀏覽器與 GitBook 之間,不經過我們的伺服器,我們也不會儲存對話內容。你傳送的訊息適用 GitBook 自己的隱私條款。" + ] + }, + "analytics": { + "title": "我們透過統計收集什麼", + "paragraphs": [ + "我們使用 Google Analytics 來了解網站的使用情況。透過 GA 會收集以下資訊:" + ], + "bullets": [ + "根據你的 IP 位址推斷出的大致位置(國家 / 地區 / 城市)。Google 不會把你的完整 IP 位址提供給我們。", + "你的瀏覽器語言(例如 en 或 zh)。", + "標準統計資料:存取的頁面、裝置與瀏覽器型別、來源網站,以及存放在 cookie 裡的一個隨機產生的訪客 ID。" + ] + }, + "account": { + "title": "你登入後我們收集什麼", + "paragraphs": [ + "登入是可選的——無需帳戶也能使用本站的大部分工具。登入並不是我們的現在或未來的收費手段,而是我們防止服務被濫用的必要措施。我們使用 Google Firebase 身分認證來管理你的登入,並同步你的成就。當你登入後,這些資料將會被收集:" + ], + "bullets": [ + "你的登入用電子郵件信箱,用於識別使用者身分,以便提供需要登入方可使用的功能。", + "你對進階功能的使用量,用於監控惡意濫用。", + "每個統計週期結束時,每個登入使用者的濫用分析日誌(如有),會被自動清除,只會記錄使用量總數。" + ] + }, + "telemetry": { + "title": "錯誤與效能遙測", + "paragraphs": [ + "本網站使用錯誤監控服務 Sentry,以便網站出錯時我們能及時發現並修復。遙測資料經由我們自己的伺服器轉送後傳送給 Sentry,不會與其他任何方共享。其中包括:" + ], + "bullets": [ + "技術性錯誤報告:程式碼中發生了什麼錯誤、發生在哪個頁面,以及你的瀏覽器與作業系統型別。", + "效能指標,例如頁面載入耗時。", + "發生錯誤時,出錯前片刻的介面操作回放,用於協助我們重現問題。", + "你的 IP 位址,會在錯誤報告經過我們的轉送伺服器時附加。與網路環境相關的問題往往必須藉助 IP 才能定位,它也協助我們估算一個錯誤影響了多少訪客。IP 不會與任何方共享,並隨其他遙測資料一同自動刪除。", + "所有的遙測資料在留存 30 天後,將會自動刪除。" + ] + }, + "why": { + "title": "為什麼收集這些", + "analytics": "我們透過 Google Analytics 收集的匿名資料用於了解網站的使用情況和改善產品使用體驗。這些統計資料不會用於識別你的個人身分,我們也絕不出售。", + "account": "帳戶相關的資料(電子郵件信箱、進階功能使用量)僅用於識別你的帳戶、提供需登入才能使用的功能。我們不會用它做廣告,也絕不出售。", + "telemetry": "錯誤與效能遙測僅用於發現和修復缺陷,絕不用於廣告或跨站追蹤,並會在短暫的保留期後自動刪除。" + }, + "cookies": { + "title": "Cookie 與本機儲存", + "analytics": "Google Analytics 會存放一個 cookie 以識別回訪的訪客。", + "local": "你自己的設定(主題、語言、工具偏好)儲存在瀏覽器的本機儲存空間,不會離開你的裝置。" + }, + "eu": { + "title": "如果你在歐盟 / 歐洲經濟區或英國", + "paragraphs": [ + "我們目前沒有提供 Cookie 同意橫幅。如果你不希望被統計追蹤,可以隨時透過下列方式選擇退出——遮蔽統計 cookie 不會影響本站任何工具的使用。", + "退出方式:使用內容攔截器(如 uBlock Origin)或 Google 官方的退出瀏覽器擴充功能、遮蔽第三方 cookie,或清除本站的 cookie。IPCheck.ing 的自部署版本只有在營運者自行設定時才會啟用統計。" + ] + }, + "retention": { + "title": "資料保留", + "paragraphs": [ + "統計資料按 Google Analytics 的保留設定儲存(最長 14 個月),到期後自動刪除。帳戶資料在你的帳戶存續期間保留。" + ] + } + } + } +} diff --git a/frontend/locales/security-checklist/zh-TW.json b/frontend/locales/security-checklist/zh-TW.json new file mode 100644 index 000000000..72f33a9ac --- /dev/null +++ b/frontend/locales/security-checklist/zh-TW.json @@ -0,0 +1,1646 @@ +[ + { + "title": "身分驗證", + "slug": "authentication", + "description": "保護您的線上帳戶登入憑證", + "intro": "根據 [Verizon 的這份報告](http://www.verizonenterprise.com/resources/reports/rp_dbir-2016-executive-summary_xg_en.pdf),大多數已報告的資料外洩是由於使用弱、預設或被盜密碼造成的。請使用長而強且唯一的密碼,將它們儲存在安全的密碼管理器中,啟用雙因素身分驗證,關注資料外洩情況,並在登入帳戶時小心謹慎。", + "checklist": [ + { + "point": "使用強密碼", + "priority": "Essential", + "details": "如果您的密碼太短,或包含字典單字、地點或名字,那麼它很容易被暴力破解或被人猜中。建立強密碼的最簡單方法是使其足夠長(12 個字元以上)——可以考慮使用由多個單字組成的“密碼片語”。或者,使用密碼產生器產生長且隨機的強密碼。可以試用 [HowSecureIsMyPassword.net](https://howsecureismypassword.net),了解常見密碼被破解的速度。閱讀更多關於建立強密碼的資訊:[securityinabox.org](https://securityinabox.org/en/passwords/passwords-and-2fa/)", + "slug": "authentication-use-a-strong-password" + }, + { + "point": "不要重複使用密碼", + "priority": "Essential", + "details": "如果有人重複使用密碼,並且他們擁有帳戶的某個網站遭遇外洩,那麼犯罪分子可以輕鬆地非法存取他們的其他帳戶。這通常透過大規模自動登入請求實現,這被稱為憑證填充。不幸的是,這種情況非常普遍,但防範起來很簡單——為您的每個線上帳戶使用不同的密碼。", + "slug": "authentication-don-t-reuse-passwords" + }, + { + "point": "使用安全的密碼管理器", + "priority": "Essential", + "details": "對大多數人來說,記住數百個強且唯一的密碼幾乎是不可能的。密碼管理器是一種產生、儲存和自動填寫登入憑證的應用程式。您所有的密碼都將加密並透過一個主密碼保護(您必須記住這個主密碼,而且它需要非常強)。大多數密碼管理器都有瀏覽器擴充功能和行動應用程式,因此無論您使用何種裝置,都可以自動填寫密碼。一個全面的選擇是 [Bitwarden](https://awesome-privacy.xyz/essentials/password-managers/bitwarden),或者檢視 [推薦的密碼管理器](https://awesome-privacy.xyz/essentials/password-managers)。", + "slug": "authentication-use-a-secure-password-manager" + }, + { + "point": "避免分享密碼", + "priority": "Essential", + "details": "儘管有時您可能需要與他人共享帳戶存取權限,但通常應避免這樣做,因為這會增加帳戶被入侵的風險。如果確實需要共享密碼,例如在團隊中共享帳戶的情況下,應該透過密碼管理器內建的功能來完成共享。", + "slug": "authentication-avoid-sharing-passwords" + }, + { + "point": "啟用雙因素身分驗證", + "priority": "Essential", + "details": "雙因素身分驗證(2FA)要求您提供您知道的東西(密碼)和您擁有的東西(如手機上的程式碼)才能登入。這意味著即使有人取得了您的密碼(例如透過網路釣魚、惡意軟體或資料外洩),他們仍然無法登入您的帳戶。啟用非常簡單,下載 [驗證器應用](https://github.com/Lissy93/awesome-privacy#2-factor-authentication) 到您的手機,然後進入帳戶安全設定並按照步驟啟用 2FA。下次您在新裝置上登入時,將需要輸入手機應用中顯示的程式碼(無需聯網,程式碼通常每 30 秒更換一次)。", + "slug": "authentication-enable-2-factor-authentication" + }, + { + "point": "安全儲存備份程式碼", + "priority": "Essential", + "details": "啟用多因素身分驗證時,通常會提供一些程式碼供您在 2FA 方法丟失、損壞或不可用時使用。將這些程式碼儲存在安全的地方以防丟失或未經授權的存取。可以將其儲存在紙上或磁碟上的安全位置(例如離線儲存或加密檔案/磁碟機中)。不要將這些儲存在密碼管理器中,因為 2FA 來源和密碼應分開保管。", + "slug": "authentication-keep-backup-codes-safe" + }, + { + "point": "訂閱資料外洩提醒", + "priority": "Optional", + "details": "當網站發生重大資料外洩時,外洩的資料通常會在網際網路上傳播。一些網站會收集這些外洩的記錄,並允許您透過電子郵件位址搜尋是否出現在它們的清單中。[Firefox Monitor](https://monitor.firefox.com)、[Have I been pwned](https://haveibeenpwned.com) 和 [DeHashed](https://dehashed.com) 提供監控功能,如果您的電子郵件位址出現在新資料集中,他們會通知您。儘早知道這類情況非常有用,您可以及時更改受影響帳戶的密碼。[Have I been pwned](https://awesome-privacy.xyz/security-tools/online-tools/have-i-been-pwned) 還提供網域範圍通知,如果您使用別名進行[匿名轉發](https://github.com/Lissy93/awesome-privacy#anonymous-mail-forwarding),可以接收與整個網域下的電子郵件位址相關的提醒。", + "slug": "authentication-sign-up-for-breach-alerts" + }, + { + "point": "保護您的密碼/ PIN", + "priority": "Optional", + "details": "在公共場所輸入密碼時,請確保不在監視攝影機的直視範圍內,並確保沒有人能夠看到您的螢幕。輸入時遮擋您的密碼或 PIN 碼,並避免在螢幕上顯示任何明文密碼。", + "slug": "authentication-shield-your-password-pin" + }, + { + "point": "定期更新關鍵密碼", + "priority": "Optional", + "details": "資料庫外洩和漏洞是常見現象,可能有多個密碼已線上外洩。偶爾更新關鍵帳戶的密碼有助於減少風險。但是,只要您的所有密碼都足夠長、強且唯一,就無需頻繁更改——每年更新一次即可。強制組織內部定期更改密碼已被[不再推薦](https://duo.com/decipher/microsoft-will-no-longer-recommend-forcing-periodic-password-changes),因為這會導致員工選擇較弱的密碼。", + "slug": "authentication-update-critical-passwords-periodically" + }, + { + "point": "不要在瀏覽器中儲存密碼", + "priority": "Optional", + "details": "大多數現代瀏覽器會在您登入網站時提示儲存您的憑證。不要允許這樣做,因為這些資料並不總是加密的,這可能導致其他人獲得對您帳戶的存取權限。相反,使用專用密碼管理器儲存(和自動填寫)您的密碼。", + "slug": "authentication-dont-save-your-password-in-browsers" + }, + { + "point": "避免在他人裝置上登入", + "priority": "Optional", + "details": "儘量避免在他人的電腦上登入,因為您無法保證其系統是安全的。尤其要小心使用公共裝置,因為這些裝置更容易感染惡意軟體和被追蹤。在他人裝置上登入尤其危險,尤其是涉及關鍵帳戶(如線上銀行帳戶)時。如果必須使用他人的裝置,請確保您使用的是私人/無痕瀏覽會話(使用 Ctrl+Shift+N 或 Cmd+Shift+N)。這樣可以請求瀏覽器不儲存您的憑證、Cookie 和瀏覽歷史記錄。", + "slug": "authentication-avoid-logging-in-on-someone-elses-device" + }, + { + "point": "避免設定密碼提示", + "priority": "Optional", + "details": "某些網站允許您設定密碼提示。提示答案往往容易被猜到。如果密碼提示是強制性的,請使用隨機答案並記錄在密碼管理器中(例如 `第一所學校的名字: 6D-02-8B-!a-E8-8F-81`)。", + "slug": "authentication-avoid-password-hints" + }, + { + "point": "不要真實回答線上安全問題", + "priority": "Optional", + "details": "如果網站要求回答安全問題(如出生地、母親的孃家姓或第一輛車等),不要提供真實答案。駭客可以透過網路或社會工程輕鬆取得這些資訊。相反,請建立虛構的答案,並將其儲存在密碼管理器中。使用真實單字比隨機字元更好,[詳見此處](https://news.ycombinator.com/item?id=29244870)。", + "slug": "authentication-never-answer-online-security-questions-truthfully" + }, + { + "point": "不要使用 4 位數 PIN", + "priority": "Optional", + "details": "不要使用短 PIN 解鎖智慧型手機或電腦。相反,使用文字密碼或更長的 PIN。純數字密碼容易被破解(4 位數 PIN 只有 10,000 種組合,而 4 位字元的英數字元密碼則有 740 萬種組合)。", + "slug": "authentication-dont-use-a-4-digit-pin" + }, + { + "point": "避免使用簡訊進行雙因素認證", + "priority": "Optional", + "details": "啟用多因素認證時,如果支援,選擇基於應用程式的程式碼或硬體權杖。簡訊容易受到許多常見威脅,如 [SIM 卡交換](https://www.maketecheasier.com/sim-card-hijacking) 和 [攔截](https://secure-voice.com/ss7_attacks)。此外,您的電話號碼的儲存安全性及其他用途沒有保障。從實際角度來看,簡訊僅在您有訊號時有效,並且可能會很慢。如果網站或服務要求使用簡訊進行恢復,請考慮購買一個僅用於帳戶恢復的預付費電話號碼。", + "slug": "authentication-avoid-using-sms-for-2fa" + }, + { + "point": "避免使用密碼管理器產生 OTP", + "priority": "Advanced", + "details": "許多密碼管理器可以產生雙因素認證(2FA)程式碼。但最好不要使用您的主要密碼管理器作為 2FA 驗證器,因為如果被入侵,它將成為單點故障。相反,請在手機或筆記型電腦上使用專用[驗證器應用](https://github.com/Lissy93/awesome-privacy#2-factor-authentication)。", + "slug": "authentication-avoid-using-your-pm-to-generate-otps" + }, + { + "point": "避免使用人臉解鎖", + "priority": "Advanced", + "details": "大多數手機和筆記型電腦提供臉部識別身分驗證功能,使用相機將您的臉部快照與儲存的雜湊值進行比較。儘管非常方便,但有許多方式可以[欺騙它](https://www.forbes.com/sites/jvchamary/2017/09/18/security-apple-face-id-iphone-x/)並取得裝置存取權限,如透過數位照片和監控影片重建。與密碼不同,您的臉部照片很可能已經存在於網際網路上,並被監視攝影機記錄。", + "slug": "authentication-avoid-face-unlock" + }, + { + "point": "警惕鍵盤記錄器", + "priority": "Advanced", + "details": "硬體[鍵盤記錄器](https://en.wikipedia.org/wiki/Hardware_keylogger)是一種實體裝置,插在鍵盤與 USB 介面之間,攔截所有按鍵操作,有時會將資料傳輸到遠端伺服器。這使駭客可以存取所有輸入的資訊,包括密碼。最好的保護方法是,當您的電腦無人值守後,檢查 USB 連線。此外,鍵盤記錄器可能被植入鍵盤內部,因此要注意鍵盤外殼是否有被篡改的跡象,並考慮自帶鍵盤工作。在虛擬鍵盤上輸入、從剪貼簿貼上或透過密碼管理器自動填寫的資料無法被硬體鍵盤記錄器攔截。", + "slug": "authentication-watch-out-for-keyloggers" + }, + { + "point": "考慮使用硬體權杖", + "priority": "Advanced", + "details": "U2F/FIDO2 安全金鑰是一種 USB(或 NFC)裝置,在登入線上服務時插入以驗證您的身分,而無需輸入來自驗證器的 OTP。[SoloKey](https://solokeys.com) 和 [NitroKey](https://www.nitrokey.com) 是此類金鑰的例子。它們帶來了許多安全優勢,因為瀏覽器直接與裝置通訊,不會被欺騙關於哪個主機請求身分驗證,因為會檢查 TLS 憑證。[這篇文章](https://security.stackexchange.com/a/71704)很好地解釋了使用 FIDO U2F 權杖的安全性。當然,將實體金鑰存放在安全的地方或隨身攜帶非常重要。一些線上帳戶允許啟用多種 2FA 方法。", + "slug": "authentication-consider-a-hardware-token" + }, + { + "point": "考慮使用離線密碼管理器", + "priority": "Advanced", + "details": "為了增強安全性,加密的離線密碼管理器可以讓您完全控制您的資料。[KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass) 是一個受歡迎的選擇,擁有許多[擴充功能](https://keepass.info/plugins.html)和社群分支,提供額外的相容性和功能。流行的用戶端包括:[KeePassXC](https://keepassxc.org)(桌面)、[KeePassDX](https://www.keepassdx.com)(Android)和 [StrongBox](https://apps.apple.com/us/app/strongbox-password-safe/id897283731)(iOS)。缺點是對於某些人可能稍微不那麼方便,並且需要您自行備份並安全儲存。", + "slug": "authentication-consider-offline-password-manager" + }, + { + "point": "考慮不同的使用者名稱", + "priority": "Advanced", + "details": "為每個帳戶設定不同的密碼是一個良好的開端,但如果您還使用唯一的使用者名稱、電子郵件或電話號碼登入,那麼對於試圖未經授權存取的人來說將更加困難。多個電子郵件的最簡單方法是使用自動產生的匿名郵件轉發別名。這意味著 [任何內容]@yourdomain.com 都會到達您的收件箱,從而允許您為每個帳戶使用不同的電子郵件(參見 [郵件別名供應商](https://github.com/Lissy93/awesome-privacy#anonymous-mail-forwarding))。使用者名稱更簡單,因為您可以使用密碼管理器產生、儲存並自動填寫這些資訊。虛擬電話號碼可以透過您的 VOIP 供應商產生。", + "slug": "authentication-consider-different-usernames" + } + ] + }, + { + "title": "網頁瀏覽", + "slug": "web-browsing", + "description": "避免線上追蹤、審查和資料收集", + "intro": "網際網路上的大多數網站都會使用某種形式的追蹤,通常是為了深入了解使用者的行為和偏好。這些資料可能非常詳細,因此對企業、政府和智慧財產權竊賊來說非常有價值。資料外洩很常見,而對使用者的網路活動進行去匿名化通常是一項微不足道的任務。\n\n有兩種主要的追蹤方法:有狀態(基於 cookie)和無狀態(基於指紋)。Cookie 是儲存在瀏覽器中的一小段資訊,具有用於識別您的唯一 ID。瀏覽器指紋是一種高度準確的方法,可以識別和追蹤使用者在網路上的任何地方的行蹤。收集的資訊非常全面,通常包括瀏覽器詳細資訊、作業系統、螢幕解析度、支援的字型、擴充功能、時區、語言和字型偏好,甚至硬體設定。\n\n本節概述了您可以採取的步驟,以更好地保護自己免受威脅,最大程度地減少線上追蹤並提高隱私。", + "checklist": [ + { + "point": "確保網站合法", + "priority": "Basic", + "details": "這聽起來可能很明顯,但是當您登入任何線上帳戶時,請仔細檢查 URL 是否正確。將常用網站儲存在書籤中是確保 URL 易於查詢的好方法。造訪新網站時,請留意可能不安全的常見跡象:瀏覽器警告、重新導向、網站垃圾郵件和彈出式視窗。如果您不確定,您還可以使用以下工具檢查網站:[Virus Total](https://awesome-privacy.xyz/security-tools/online-tools/virus-total)、[IsLegitSite](https://www.islegitsite.com)、[Google 安全瀏覽狀態](https://transparencyreport.google.com/safe-browsing/search)。", + "slug": "web-browsing-ensure-website-is-legitimate" + }, + { + "point": "提防瀏覽器惡意軟體", + "priority": "Basic", + "details": "您的系統或瀏覽器可能會受到間諜軟體、挖礦程式、瀏覽器劫持程式、惡意重新導向、廣告軟體等的侵害。通常情況下,您只需忽略彈出式視窗、警惕您點選的內容,如果瀏覽器警告您網站可能是惡意的,則不要繼續存取該網站,這樣就可以保持安全。瀏覽器惡意軟體的常見跡象包括:預設搜尋引擎或首頁已被修改、工具欄、陌生的擴充功能或圖示、廣告明顯增多、錯誤和頁面載入速度比平時慢得多。Heimdal 的這些文章解釋了[瀏覽器惡意軟體的跡象](https://heimdalsecurity.com/blog/warning-signs-operating-system-infected-malware),[瀏覽器如何被感染](https://heimdalsecurity.com/blog/practical-online-protection-where-malware-hides)以及[如何刪除瀏覽器惡意軟體](https://heimdalsecurity.com/blog/malware-removal)。", + "slug": "web-browsing-watch-out-for-browser-malware" + }, + { + "point": "遮蔽廣告", + "priority": "Essential", + "details": "使用廣告攔截器可以透過阻止廣告實施的追蹤器來協助提高您的隱私。[uBlock Origin](https://awesome-privacy.xyz/networking/ad-blockers/ublock-origin) 是由 Raymond Hill 開發的一個非常高效的開源瀏覽器擴充功能。當第三方廣告顯示在網頁上時,它們有能力追蹤您,收集有關您和您的習慣的個人資訊,然後可以將其出售或用於向您展示更有針對性的廣告,並且某些廣告純粹是惡意的或虛假的。遮蔽廣告還可以使頁面載入更快,使用更少的資料並提供更整潔的體驗。", + "slug": "web-browsing-block-ads" + }, + { + "point": "使用尊重隱私的瀏覽器", + "priority": "Essential", + "details": "[Firefox](https://awesome-privacy.xyz/essentials/browsers/firefox)(進行一些調整)和 [Brave](https://awesome-privacy.xyz/essentials/browsers/brave-browser) 是安全、尊重隱私的瀏覽器。兩者都是快速、開源、對使用者友善且可在所有主要作業系統上使用的。您的瀏覽器可以存取您在網路上執行的所有操作,因此如果可能,請避免使用 Google Chrome、Edge 和 Safari,因為(如果沒有正確的設定)所有這三個瀏覽器都會收集使用資料、回傳資訊並允許侵入式追蹤。Firefox 需要進行一些更改才能實現最佳安全性,例如 - [arkenfox](https://github.com/arkenfox/user.js/wiki) 或 [12byte](https://12bytes.org/firefox-configuration-guide-for-privacy-freaks-and-performance-buffs/) 的 user.js 設定。檢視更多:[隱私瀏覽器](https://github.com/Lissy93/awesome-privacy#browsers)。", + "slug": "web-browsing-use-a-privacy-respecting-browser" + }, + { + "point": "使用私密搜尋引擎", + "priority": "Essential", + "details": "使用保護隱私、非追蹤的搜尋引擎,將降低您的搜尋詞被記錄或被用來對付您的風險。考慮使用 [DuckDuckGo](https://awesome-privacy.xyz/essentials/search-engines/duckduckgo) 或 [Qwant](https://awesome-privacy.xyz/essentials/search-engines/qwant)。Google 實施了一些[極其侵入性的](https://hackernoon.com/data-privacy-concerns-with-google-b946f2b7afea)追蹤政策,並且有顯示[有偏見的搜尋結果](https://www.businessinsider.com/evidence-that-google-search-results-are-biased-2014-10)的歷史。因此,Google 以及 Bing、百度、Yahoo 和 Yandex 與任何希望保護其隱私的人都不相容。建議將您的[瀏覽器預設搜尋](https://duckduckgo.com/install)更新為尊重隱私的搜尋引擎。", + "slug": "web-browsing-use-a-private-search-engine" + }, + { + "point": "刪除不必要的瀏覽器擴充功能", + "priority": "Essential", + "details": "擴充功能能夠檢視、記錄或修改您在瀏覽器中執行的任何操作,並且某些看似無害的瀏覽器應用程式具有惡意意圖。網站可以看到您安裝了哪些擴充功能,並可能使用它來增強您的指紋,以更準確地識別/追蹤您。在安裝之前,[Firefox](https://awesome-privacy.xyz/essentials/browsers/firefox) 和 Chrome 線上應用程式商店都允許您檢視擴充功能需要哪些權限/存取權限。檢視評論。僅安裝您真正需要的擴充功能,並刪除您已有一段時間未使用的擴充功能。", + "slug": "web-browsing-remove-unnecessary-browser-addons" + }, + { + "point": "保持瀏覽器最新", + "priority": "Essential", + "details": "瀏覽器漏洞不斷被[發現](https://cve.mitre.org/cgi-bin/cvekey.cgi?keyword=browser)和修補,因此保持最新狀態以避免零日漏洞利用非常重要。您可以在[此處檢視您正在使用的瀏覽器版本](https://www.whatismybrowser.com/),或按照[本指南](https://www.whatismybrowser.com/guides/how-to-update-your-browser/)取得有關如何更新的說明。某些瀏覽器會自動更新到最新的穩定版本。", + "slug": "web-browsing-keep-browser-up-to-date" + }, + { + "point": "檢查 HTTPS", + "priority": "Essential", + "details": "如果您在非 HTTPS 網站上輸入資訊,則這些資料將以未加密的形式傳輸,因此可以被任何攔截它的人讀取。不要在非 HTTPS 網站上輸入任何資料,但也不要讓綠色掛鎖給您帶來虛假的安全感,僅僅因為網站具有 SSL 憑證並不意味著它是合法或值得信賴的。[HTTPS-Everywhere](https://www.eff.org/https-everywhere)(由 [EFF](https://www.eff.org/) 開發)曾經是一個瀏覽器擴充功能,可在網站上自動啟用 HTTPS,但截至 2022 年,它已被棄用。在他們的[公告文章](https://www.eff.org/)中,EFF 解釋說,大多數瀏覽器現在都整合了此類保護。此外,它還提供了有關如何啟用其 HTTPS 安全保護的 [Firefox](https://awesome-privacy.xyz/essentials/browsers/firefox)、Chrome、Edge 和 Safari 瀏覽器的說明。", + "slug": "web-browsing-check-for-https" + }, + { + "point": "使用 DNS-over-HTTPS", + "priority": "Essential", + "details": "傳統的 DNS 以明文形式發出請求,每個人都可以看到。它允許透過中間人攻擊竊聽和操縱 DNS 資料。而 DNS-over-HTTPS 透過 HTTPS 協議執行 DNS 解析,這意味著您和您的 DNS 解析器之間的資料是加密的。一個流行的選擇是 [CloudFlare](https://awesome-privacy.xyz/networking/dns-providers/cloudflare) 的 [1.1.1.1](https://awesome-privacy.xyz/security-tools/mobile-apps/1.1.1.1),或比較供應商 - 在瀏覽器中啟用很簡單。請注意,DoH 也有其自身的問題,主要是阻止網路過濾。", + "slug": "web-browsing-use-dns-over-https" + }, + { + "point": "多會話容器", + "priority": "Essential", + "details": "隔離對於保持瀏覽的不同方面分開非常重要。例如,對工作、常規瀏覽、社群媒體、線上購物等使用不同的設定檔案將減少資料代理可以連結回您的關聯數量。一種選擇是使用專為此目的設計的 [Firefox 容器](https://awesome-privacy.xyz/security-tools/browser-extensions/firefox-multi-account-containers)。或者,您可以對不同的任務使用不同的瀏覽器([Brave](https://awesome-privacy.xyz/essentials/browsers/brave-browser)、[Firefox](https://awesome-privacy.xyz/essentials/browsers/firefox)、[Tor](https://awesome-privacy.xyz/networking/mix-networks/tor) 等)。", + "slug": "web-browsing-multi-session-containers" + }, + { + "point": "使用隱身模式", + "priority": "Essential", + "details": "使用他人的機器時,請確保您處於隱私/隱身會話中。這將防止儲存瀏覽器歷史記錄、Cookie 和某些資料,但這並非萬無一失 - 您仍然可以被追蹤。", + "slug": "web-browsing-use-incognito" + }, + { + "point": "了解您的瀏覽器指紋", + "priority": "Essential", + "details": "瀏覽器指紋是一種非常準確的追蹤方法,網站會根據您的裝置資訊識別您的身分。您可以在 amiunique.org 上檢視您的指紋 - 目的是儘可能地不唯一。", + "slug": "web-browsing-understand-your-browser-fingerprint" + }, + { + "point": "管理 Cookie", + "priority": "Essential", + "details": "定期清除 Cookie 是您可以採取的一項措施,可以協助減少網站追蹤您。Cookie 還可能儲存您的會話權杖,如果該權杖被捕獲,將允許某人無需憑證即可存取您的帳戶。為了減輕這種情況,您應該經常清除 Cookie。", + "slug": "web-browsing-manage-cookies" + }, + { + "point": "阻止第三方 Cookie", + "priority": "Essential", + "details": "第三方 Cookie 是由您正在存取的網站以外的網站放置在您的裝置上的。這會帶來隱私風險,因為第三方實體可以從您目前的會話中收集資料。本指南介紹瞭如何停用第三方 Cookie,您可以在此處檢視以確保其有效。", + "slug": "web-browsing-block-third-party-cookies" + }, + { + "point": "阻止第三方追蹤器", + "priority": "Essential", + "details": "阻止追蹤器將有助於阻止網站、廣告商、分析等在後臺追蹤您。[Privacy Badger](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-badger)、[DuckDuckGo Privacy Essentials](https://awesome-privacy.xyz/security-tools/browser-extensions/privacy-essentials)、[uBlock Origin](https://awesome-privacy.xyz/networking/ad-blockers/ublock-origin) 和 uMatrix(Advanced)都是非常有效的開源追蹤器攔截器,可用於所有主流瀏覽器。", + "slug": "web-browsing-block-third-party-trackers" + }, + { + "point": "注意重新導向", + "priority": "Optional", + "details": "雖然某些重新導向是無害的,但其他重新導向(例如未經驗證的重新導向)被用於網路釣魚攻擊,它可以使惡意連結看起來合法。如果您不確定重新導向 URL,您可以使用 RedirectDetective 等工具檢查它轉發到的位置。", + "slug": "web-browsing-beware-of-redirects" + }, + { + "point": "不要登入您的瀏覽器", + "priority": "Optional", + "details": "許多瀏覽器允許您登入,以便在裝置之間同步歷史記錄、書籤和其他瀏覽資料。然而,這不僅允許進一步的資料收集,而且還透過提供另一種途徑讓惡意行為者取得個人資訊來增加攻擊面。", + "slug": "web-browsing-do-not-sign-into-your-browser" + }, + { + "point": "禁止預測服務", + "priority": "Optional", + "details": "某些瀏覽器允許預測服務,您可以在其中接收即時搜尋結果或 URL 自動填充。如果啟用了此功能,則每次按鍵時都會將資料傳送到 Google(或您的預設搜尋引擎),而不是在您按 Enter 鍵時。", + "slug": "web-browsing-disallow-prediction-services" + }, + { + "point": "避免使用Google網頁翻譯", + "priority": "Optional", + "details": "當您造訪以外語撰寫的網頁時,系統可能會提示您安裝 Google 翻譯擴充功能。請注意,Google 會收集所有資料(包括輸入欄位)以及目前使用者的詳細資訊。請改用與瀏覽器無關的翻譯服務。", + "slug": "web-browsing-avoid-g-translate-for-webpages" + }, + { + "point": "停用網頁通知", + "priority": "Optional", + "details": "瀏覽器推送通知是犯罪分子鼓勵您點選其連結的常用方法,因為欺騙來源很容易。請注意這一點,有關停用瀏覽器通知的說明,請參閱這篇文章。", + "slug": "web-browsing-disable-web-notifications" + }, + { + "point": "停用自動下載", + "priority": "Optional", + "details": "路過式下載是將有害檔案放到使用者裝置上的常用方法。可以透過停用自動檔案下載來緩解這種情況,並警惕提示您意外下載檔案的網站。", + "slug": "web-browsing-disable-automatic-downloads" + }, + { + "point": "禁止存取感測器", + "priority": "Optional", + "details": "移動網站可以在不詢問的情況下利用您的裝置感測器。如果您曾經向瀏覽器授予這些權限,則所有網站都能夠使用這些功能,而無需許可或通知。", + "slug": "web-browsing-disallow-access-to-sensors" + }, + { + "point": "禁止定位", + "priority": "Optional", + "details": "定位服務允許網站請求您的實體位置以改善您的體驗。這應該在設定中停用。請注意,還有其他方法可以確定您的大致位置。", + "slug": "web-browsing-disallow-location" + }, + { + "point": "禁止存取攝影機/麥克風", + "priority": "Optional", + "details": "檢查瀏覽器設定以確保沒有網站被授予存取網路攝影機或麥克風的權限。使用實體保護措施(例如網路攝影機蓋和麥克風阻斷器)也可能是有益的。", + "slug": "web-browsing-disallow-camera-microphone-access" + }, + { + "point": "停用瀏覽器密碼儲存", + "priority": "Optional", + "details": "不要允許您的瀏覽器儲存使用者名稱和密碼。這些可以很容易地被檢視或存取。而是使用密碼管理器。", + "slug": "web-browsing-disable-browser-password-saves" + }, + { + "point": "停用瀏覽器自動填充", + "priority": "Optional", + "details": "對任何機密或個人詳細資訊關閉自動填充功能。如果您的瀏覽器以任何方式受到損害,此功能可能有害。相反,請考慮使用密碼管理器的“備註”功能。", + "slug": "web-browsing-disable-browser-autofill" + }, + { + "point": "防止資料外洩攻擊", + "priority": "Optional", + "details": "CSS Exfiltrate 攻擊是一種僅使用純 CSS 就可以取得憑證和其他敏感詳細資訊的方法。您可以使用 [CSS Exfil Protection](https://awesome-privacy.xyz/security-tools/browser-extensions/css-exfil-protection) 擴充功能保持安全。", + "slug": "web-browsing-protect-from-exfil-attack" + }, + { + "point": "停用 ActiveX", + "priority": "Optional", + "details": "ActiveX 是一個內建於 Microsoft IE 並預設啟用的瀏覽器擴充功能 API。它現在不常用,但由於它賦予擴充功能密切的存取權限,並且可能很危險,因此您應該停用它。", + "slug": "web-browsing-deactivate-activex" + }, + { + "point": "停用 WebRTC", + "priority": "Optional", + "details": "WebRTC 允許直接從瀏覽器進行高品質的音訊/影片通訊和點對點檔案共享。但是它可能會造成隱私外洩。要了解更多資訊,請檢視本指南。", + "slug": "web-browsing-disable-webrtc" + }, + { + "point": "欺騙 HTML5 Canvas 簽名", + "priority": "Optional", + "details": "Canvas 指紋識別允許網站非常準確地識別和追蹤使用者。您可以使用 Canvas-Fingerprint-Blocker 擴充功能來欺騙您的指紋或使用 [Tor](https://awesome-privacy.xyz/networking/mix-networks/tor)。", + "slug": "web-browsing-spoof-html5-canvas-sig" + }, + { + "point": "欺騙使用者代理", + "priority": "Optional", + "details": "使用者代理告訴網站您正在使用的裝置、瀏覽器和版本。定期切換使用者代理是您可以採取的一小步,以變得不那麼獨特。", + "slug": "web-browsing-spoof-user-agent" + }, + { + "point": "忽略 DNT", + "priority": "Optional", + "details": "啟用“請勿追蹤”的影響非常有限,因為許多網站不尊重或遵循此功能。由於它很少被使用,它也可能會新增到您的簽名中,使您更加獨特。", + "slug": "web-browsing-disregard-dnt" + }, + { + "point": "防止 HSTS 追蹤", + "priority": "Optional", + "details": "HSTS 旨在協助保護網站安全,但由於它允許網站營運者植入超級 Cookie,因此引發了隱私問題。可以透過在基於 Chromium 的瀏覽器中存取 chrome://net-internals/#hsts 來停用它。", + "slug": "web-browsing-prevent-hsts-tracking" + }, + { + "point": "防止自動瀏覽器連線", + "priority": "Optional", + "details": "即使您不使用瀏覽器,它也可能會回傳資訊以報告使用活動、分析和診斷。您可能希望停用其中的一些功能,這可以透過設定來完成。", + "slug": "web-browsing-prevent-automatic-browser-connections" + }, + { + "point": "啟用第一方隔離", + "priority": "Optional", + "details": "[第一方隔離](https://awesome-privacy.xyz/security-tools/browser-extensions/first-party-isolation)意味著所有識別碼來源和瀏覽器狀態都使用 URL 欄網域名稱進行限定,這可以大大減少追蹤。", + "slug": "web-browsing-enable-1st-party-isolation" + }, + { + "point": "從 URL 中剝離追蹤引數", + "priority": "Advanced", + "details": "網站通常會將額外的 GET 引數附加到您點選的 URL 上,以識別來源/引薦來源等資訊。您可以手動清理,或使用 [ClearURLs](https://awesome-privacy.xyz/security-tools/browser-extensions/clearurls) 等擴充功能自動從 URL 中剝離追蹤資料。", + "slug": "web-browsing-strip-tracking-params-from-urls" + }, + { + "point": "首次啟動安全性", + "priority": "Advanced", + "details": "安裝 Web 瀏覽器後,在您第一次啟動它(在設定其隱私設定之前)時,大多數瀏覽器都會回傳資訊。因此,在安裝瀏覽器後,您應該首先停用您的網際網路連線,然後在重新啟用您的網際網路連線之前設定隱私選項。", + "slug": "web-browsing-first-launch-security" + }, + { + "point": "使用 Tor 瀏覽器", + "priority": "Advanced", + "details": "[Tor](https://awesome-privacy.xyz/networking/mix-networks/tor) 專案提供了一個瀏覽器,該瀏覽器透過多個節點加密和路由您的流量,從而保護使用者免受攔截和追蹤。主要缺點是速度和使用者體驗。", + "slug": "web-browsing-use-the-tor-browser" + }, + { + "point": "停用 JavaScript", + "priority": "Advanced", + "details": "許多現代 Web 應用程式都是基於 JavaScript 的,因此停用它會大大降低您的瀏覽體驗。但是,如果您真的想全力以赴,那麼它確實會減少您的攻擊面。", + "slug": "web-browsing-disable-javascript" + } + ] + }, + { + "title": "電子郵件", + "slug": "email", + "description": "保護您線上帳戶的入口", + "intro": "自從第一封電子郵件傳送至今已近 50 年,它仍然是我們日常生活中非常重要的一部分,並且在不久的將來仍將如此。因此,考慮到我們對電子郵件的信任程度,這種基礎設施從根本上來說是不安全的,這令人驚訝。電子郵件相關的欺詐行為[正在上升](https://www.csoonline.com/article/3247670/email/email-security-in-2018.html),如果不採取基本措施,您可能會面臨風險。\n\n如果駭客獲得了存取您電子郵件的權限,則為您的其他帳戶(透過密碼重置)受到威脅提供了一個入口,因此電子郵件安全對於您的數位安全至關重要。\n\n提供“免費”電子郵件服務的大公司在尊重使用者隱私方面沒有良好的聲譽:Gmail 被發現給予[第三方完全存取](https://www.wsj.com/articles/techs-dirty-secret-the-app-developers-sifting-through-your-gmail-1530544442)使用者電子郵件的權限,並且還[追蹤您的所有購買行為](https://www.cnbc.com/2019/05/17/google-gmail-tracks-purchase-history-how-to-delete-it.html)。Yahoo還被發現即時掃描電子郵件[以供美國監視機構使用](http://news.trust.org/item/20161004170601-99f8c) 廣告商[被授予存取權限](https://thenextweb.com/insider/2018/08/29/both-yahoo-and-aol-are-scanning-customer-emails-to-attract-advertisers)Yahoo和 AOL 使用者郵件,以“透過取得上下文購買訊號和過去的購買來識別和細分潛在客戶”。", + "checklist": [ + { + "point": "擁有多個電子郵件位址", + "priority": "Essential", + "details": "考慮將不同的電子郵件位址用於安全關鍵通訊和諸如新聞通訊之類的普通郵件。這種隔離可以減少資料外洩造成的損害,還可以更容易地恢復被盜帳戶。", + "slug": "email-have-more-than-one-email-address" + }, + { + "point": "保持電子郵件位址私密", + "priority": "Essential", + "details": "不要公開分享您的主要電子郵件位址,因為郵件位址通常是大多數網路釣魚攻擊的起點。", + "slug": "email-keep-email-address-private" + }, + { + "point": "確保您的帳戶安全", + "priority": "Essential", + "details": "使用一個長而獨特的密碼,啟用雙因素認證並在登入時小心謹慎。您的電子郵件帳戶為攻擊者提供了一個進入您所有其他線上帳戶的簡單入口。", + "slug": "email-keep-your-account-secure" + }, + { + "point": "停用遠端內容的自動載入", + "priority": "Essential", + "details": "電子郵件可以包含遠端內容,例如影像或樣式表,通常是從伺服器自動載入的。您應該停用此功能,因為它會暴露您的 IP 位址和裝置資訊,並且通常用於追蹤。有關更多資訊,請參閱[這篇文章](https://www.theverge.com/2019/7/3/20680903/email-pixel-trackers-how-to-stop-images-automatic-download)。", + "slug": "email-disable-automatic-loading-of-remote-content" + }, + { + "point": "使用純文字", + "priority": "Optional", + "details": "網際網路上有兩種主要型別的電子郵件:純文字和 HTML。出於隱私和安全考慮,強烈建議使用前者,因為 HTML 郵件通常在連結和內嵌影像中包含識別符號,這些識別符號可以收集使用情況和個人資料。還存在許多針對您的郵件用戶端的 HTML 解析器的遠端程式碼執行風險,如果您使用純文字,則無法利用這些風險。有關更多資訊以及您的郵件供應商的設定說明,請參閱 [UsePlaintext.email](https://useplaintext.email/)。", + "slug": "email-use-plaintext" + }, + { + "point": "不要將第三方應用程式連線到您的電子郵件帳戶", + "priority": "Optional", + "details": "如果您授予第三方應用程式或擴充功能對您的收件箱的完全存取權限,它們實際上可以不受限制地存取您的所有電子郵件及其內容,這將帶來重大的安全和隱私風險。", + "slug": "email-dont-connect-third-party-apps-to-your-email-account" + }, + { + "point": "不要透過電子郵件共享敏感資料", + "priority": "Optional", + "details": "電子郵件很容易被攔截。此外,您無法確定收件人的環境有多安全。因此,除非加密,否則電子郵件不能被認為是安全的,不能用於交換機密資訊。", + "slug": "email-don-t-share-sensitive-data-via-email" + }, + { + "point": "考慮切換到安全的郵件供應商", + "priority": "Optional", + "details": "安全且信譽良好的電子郵件供應商,例如 [Forward Email](https://awesome-privacy.xyz/communication/encrypted-email/forward-email)、[ProtonMail](https://awesome-privacy.xyz/communication/mail-forwarding/protonmail) 和 [Tutanota](https://awesome-privacy.xyz/communication/encrypted-email/tuta) 允許端到端加密、完全隱私以及更多以安全為中心的功能。與典型的電子郵件供應商不同,除了您之外,任何人都無法讀取您的電子郵件信箱,因為所有郵件都是加密的。", + "slug": "email-consider-switching-to-a-secure-mail-provider" + }, + { + "point": "子位址", + "priority": "Optional", + "details": "別名的一種替代方法是子位址,其中在郵件傳遞期間省略 `+` 符號之後的任何內容。這使您能夠追蹤誰共享/外洩了您的電子郵件位址,但與別名不同,它無法防止您的真實位址被外洩。", + "slug": "email-subaddressing" + }, + { + "point": "使用自訂網域名稱", + "priority": "Advanced", + "details": "使用自訂網域名稱意味著您不依賴於您的郵件供應商分配的位址。因此,您將來可以輕鬆切換供應商,並且無需擔心服務被終止。", + "slug": "email-use-a-custom-domain" + }, + { + "point": "與用戶端同步以進行備份", + "priority": "Advanced", + "details": "為了避免在計劃外事件(例如中斷或帳戶鎖定)期間暫時或永久無法存取您的電子郵件,Thunderbird 可以透過 IMAP 同步/備份來自多個帳戶的郵件並將其儲存在您的主裝置上。", + "slug": "email-sync-with-a-client-for-backup" + }, + { + "point": "小心郵件簽名", + "priority": "Advanced", + "details": "您不知道您的郵件收件人的電子郵件環境有多安全。有幾個擴充功能會自動抓取郵件,並根據電子郵件簽名建立詳細的聯絡資訊資料庫。", + "slug": "email-be-careful-with-mail-signatures" + }, + { + "point": "小心自動回覆", + "priority": "Advanced", + "details": "外出自動回覆對於通知人們回覆會有延遲非常有用,但人們經常透露太多資訊 - 這些資訊可用於社會工程和有針對性的攻擊。", + "slug": "email-be-careful-with-auto-replies" + }, + { + "point": "選擇正確的郵件協議", + "priority": "Advanced", + "details": "不要使用過時的協議(低於 IMAPv4 或 POPv3),兩者都有已知的漏洞和過時的安全性。", + "slug": "email-choose-the-right-mail-protocol" + }, + { + "point": "自託管", + "priority": "Advanced", + "details": "不建議非Advanced使用者自行託管郵件伺服器,因為正確保護它至關重要,但需要強大的網路知識。", + "slug": "email-self-hosting" + }, + { + "point": "始終使用 TLS 埠", + "priority": "Advanced", + "details": "POP3、IMAP 和 SMTP 的 SSL 選項作為標準 TCP/IP 埠。它們易於使用且得到廣泛支援,因此應始終使用它們而不是純文字電子郵件埠。", + "slug": "email-always-use-tls-ports" + }, + { + "point": "DNS 可用性", + "priority": "Advanced", + "details": "對於自託管郵件伺服器,為了防止 DNS 問題影響可用性 - 使用至少 2 個 MX 記錄,並在主 MX 記錄失敗時使用輔助和第三個 MX 記錄進行冗餘。", + "slug": "email-dns-availability" + }, + { + "point": "防止 DDoS 和暴力破解攻擊", + "priority": "Advanced", + "details": "對於自託管郵件伺服器(特別是 SMTP),限制您的同時連線總數和最大連線速率,以減少嘗試的機器人攻擊的影響。", + "slug": "email-prevent-ddos-and-brute-force-attacks" + }, + { + "point": "使用智慧金鑰", + "priority": "Advanced", + "details": "OpenPGP 不支援前向保密,這意味著如果您或收件人的私鑰被盜,則以前使用該私鑰加密的所有郵件都將被外洩。因此,您應該非常小心地保護您的私鑰。一種方法是使用 USB 智慧金鑰對郵件進行簽名或解密,這樣您就可以在私鑰不離開 USB 裝置的情況下執行此操作。", + "slug": "email-use-smart-key" + }, + { + "point": "使用別名/匿名轉發", + "priority": "Advanced", + "details": "電子郵件別名允許將郵件傳送到 [anything]@my-domain.com 並且仍然進入您的主收件箱。實際上允許您為您註冊的每個服務使用不同的唯一電子郵件位址。這意味著如果您開始收到垃圾郵件,您可以阻止該別名並確定哪個公司外洩了您的電子郵件位址。", + "slug": "email-use-aliasing--anonymous-forwarding" + }, + { + "point": "維護 IP 黑名單", + "priority": "Advanced", + "details": "對於自託管郵件伺服器,您可以透過維護最新的區域網路 IP 黑名單和垃圾郵件 URI 即時阻止清單來過濾掉惡意超連結,從而改進垃圾郵件過濾器並加強安全性。", + "slug": "email-maintain-ip-blacklist" + } + ] + }, + { + "title": "即時通訊", + "slug": "messaging", + "description": "確保您的通訊私密和安全", + "intro": "", + "checklist": [ + { + "point": "僅使用完全端到端加密的訊息傳遞工具", + "priority": "Essential", + "details": "端到端加密是一種通訊系統,訊息在您的裝置上加密,直到到達預期接收者才解密。這確保了任何攔截流量的行為者都無法讀取訊息內容,也無法存取儲存資料的中央伺服器的任何人讀取訊息內容。", + "slug": "messaging-only-use-fully-end-to-end-encrypted-messengers" + }, + { + "point": "僅使用開源訊息傳遞平臺", + "priority": "Essential", + "details": "如果程式碼是開源的,那麼任何有資格的人都可以獨立檢查和稽核程式碼,以確保沒有後門、漏洞或其他安全問題。", + "slug": "messaging-use-only-open-source-messaging-platforms" + }, + { + "point": "使用“值得信賴”的訊息傳遞平臺", + "priority": "Essential", + "details": "在選擇加密訊息應用程式時,請確保它是完全開源的、穩定的、積極維護的,並且最好由信譽良好的開發人員支援。", + "slug": "messaging-use-a--trustworthy--messaging-platform" + }, + { + "point": "檢查安全設定", + "priority": "Essential", + "details": "啟用安全設定,包括聯絡人驗證、安全通知和加密。停用可選的非安全功能,例如已讀回執、上次線上時間和正在輸入通知。", + "slug": "messaging-check-security-settings" + }, + { + "point": "確保您的收件人環境安全", + "priority": "Essential", + "details": "您的對話的安全性只能與最薄弱的環節一樣安全。通常,滲透通訊渠道的最簡單方法是針對保護最少的個人或節點。", + "slug": "messaging-ensure-your-recipients-environment-is-secure" + }, + { + "point": "停用雲服務", + "priority": "Essential", + "details": "一些移動訊息應用程式提供網路或桌面配套。這不僅增加了攻擊面,而且還與幾個關鍵的安全問題有關,因此應儘可能避免。", + "slug": "messaging-disable-cloud-services" + }, + { + "point": "安全群聊", + "priority": "Essential", + "details": "隨著群組中參與者的增加,攻擊面也會增加,被入侵的風險呈指數級增長。定期檢查所有參與者是否合法。", + "slug": "messaging-secure-group-chats" + }, + { + "point": "為通訊創造安全的環境", + "priority": "Essential", + "details": "您的數位通訊可能會在多個階段被監控或攔截。這包括:您或您參與者的裝置、您的 ISP、國家閘道器或政府紀錄、訊息傳遞供應商、伺服器。", + "slug": "messaging-create-a-safe-environment-for-communication" + }, + { + "point": "商定溝通計劃", + "priority": "Optional", + "details": "在某些情況下,制定溝通計劃可能是值得的。這應該包括安全地相互聯絡的主要和備用方法。", + "slug": "messaging-agree-on-a-communication-plan" + }, + { + "point": "從媒體中剝離後設資料", + "priority": "Optional", + "details": "後設資料是“關於資料的資料”或附加到檔案或事務的其他資訊。當您傳送照片、錄音、影片或文件時,您可能會外洩比您預期更多的資訊。", + "slug": "messaging-strip-meta-data-from-media" + }, + { + "point": "去除 URL 的危險性", + "priority": "Optional", + "details": "透過各種服務傳送連結可能會無意中暴露您的個人資訊。這是因為,當產生縮圖或預覽時,它發生在用戶端。", + "slug": "messaging-defang-urls" + }, + { + "point": "驗證您的收件人", + "priority": "Optional", + "details": "始終確保您正在與預期的收件人交談,並且他們沒有受到損害。一種方法是使用支援聯絡人驗證的應用程式。", + "slug": "messaging-verify-your-recipient" + }, + { + "point": "啟用臨時訊息", + "priority": "Optional", + "details": "自毀訊息是一項功能,可讓您的訊息在設定的時間後自動刪除。這意味著如果您的裝置丟失、被盜或被沒收,對手將只能存取最近的通訊。", + "slug": "messaging-enable-ephemeral-messages" + }, + { + "point": "避免簡訊", + "priority": "Optional", + "details": "簡訊可能很方便,但它不安全。它容易受到攔截、SIM 卡交換、操縱和惡意軟體等威脅。", + "slug": "messaging-avoid-sms" + }, + { + "point": "注意追蹤器", + "priority": "Optional", + "details": "警惕帶有追蹤器的訊息傳遞應用程式,因為它們收集的詳細使用統計資料通常非常具有侵入性,有時會外洩您的身分以及您原本不打算共享的個人資訊。", + "slug": "messaging-watch-out-for-trackers" + }, + { + "point": "考慮管轄權", + "priority": "Advanced", + "details": "還應考慮組織所在地和資料託管地的管轄權。", + "slug": "messaging-consider-jurisdiction" + }, + { + "point": "使用匿名平臺", + "priority": "Advanced", + "details": "如果您認為自己可能成為目標,則應選擇一個不需要電話號碼或任何其他個人身分資訊即可註冊或使用的匿名訊息傳遞平臺。", + "slug": "messaging-use-an-anonymous-platform" + }, + { + "point": "確保支援前向保密", + "priority": "Advanced", + "details": "選擇一個實現前向保密的平臺。這是您的應用程式為每條訊息產生新加密金鑰的地方。", + "slug": "messaging-ensure-forward-secrecy-is-supported" + }, + { + "point": "考慮去中心化平臺", + "priority": "Advanced", + "details": "如果所有資料都透過中央供應商流動,您必須信任他們處理您的資料和後設資料。您無法驗證正在執行的系統是否沒有後門。", + "slug": "messaging-consider-a-decentralized-platform" + } + ] + }, + { + "title": "社群媒體", + "slug": "social-media", + "description": "最小化使用線上社群的風險", + "intro": "自網際網路發明以來,線上社群就已存在,它為世界各地的人們提供了聯絡、交流和分享的機會。雖然這些網路是促進社交互動和將人們聚集在一起的好方法,但它們也有黑暗的一面 - 存在一些嚴重的[社群網路服務隱私問題](https://en.wikipedia.org/wiki/Privacy_concerns_with_social_networking_services),而且這些社群網站歸私營公司所有,它們透過收集個人資料並將這些資料出售(通常是出售給第三方廣告商)來賺錢。\n保護您的帳戶,鎖定您的隱私設定,但要知道,即使這樣做之後,所有有意和無意上傳的資料實際上都是公開的。如果可能,請避免使用傳統的社群媒體網路。\n", + "checklist": [ + { + "point": "保護您的帳戶", + "priority": "Essential", + "details": "社群媒體個人資料經常被盜或被接管。為了保護您的帳戶:請使用唯一且強度高的密碼,並啟用雙重身分驗證。", + "slug": "social-media-secure-your-account" + }, + { + "point": "檢查隱私設定", + "priority": "Essential", + "details": "大多數社群網路都允許您控制您的隱私設定。確保您對目前公開的資料以及向誰公開感到滿意。", + "slug": "social-media-check-privacy-settings" + }, + { + "point": "將所有互動視為公開", + "priority": "Essential", + "details": "在許多社群網路中,仍然有多種方法可以檢視使用者的“私人”內容。因此,在上傳、釋出或評論任何內容之前,請考慮“如果這是完全公開的,我會介意嗎?”", + "slug": "social-media-think-of-all-interactions-as-public" + }, + { + "point": "將所有互動視為永久性的", + "priority": "Essential", + "details": "幾乎每個帖子、評論、照片等都不斷地被無數第三方服務備份,這些服務存檔這些資料並使其可索引且幾乎永久公開。", + "slug": "social-media-think-of-all-interactions-as-permanent" + }, + { + "point": "不要透露太多", + "priority": "Essential", + "details": "個人資料資訊為駭客創造了一個資訊金礦,這種資料可以協助他們個性化網路釣魚詐騙。避免分享太多細節(出生日期、家鄉、學校等)。", + "slug": "social-media-don-t-reveal-too-much" + }, + { + "point": "小心您上傳的內容", + "priority": "Essential", + "details": "狀態更新、評論、簽到和媒體可能會無意中外洩比您預期更多的資訊。這與照片和影片尤其相關,因為它們可能會顯示背景中的內容。", + "slug": "social-media-be-careful-what-you-upload" + }, + { + "point": "不要分享電子郵件或電話號碼", + "priority": "Essential", + "details": "釋出您的真實電子郵件位址或手機號碼,會讓駭客、網路噴子和垃圾郵件傳送者有更多彈藥來對付您,還可能允許將單獨的別名、個人資料或資料點連線起來。", + "slug": "social-media-don-t-share-email-or-phone-number" + }, + { + "point": "不要授予不必要的權限", + "priority": "Essential", + "details": "預設情況下,許多流行的社群網路應用程式會請求存取您的聯絡人、通話記錄、位置、訊息歷史記錄等的權限。如果它們不需要此存取權限,請不要授予它。", + "slug": "social-media-don-t-grant-unnecessary-permissions" + }, + { + "point": "小心第三方整合", + "priority": "Essential", + "details": "避免使用社群網路登入來註冊帳戶,撤銷對您不再使用的社交應用的存取權限。", + "slug": "social-media-be-careful-of-3rd-party-integrations" + }, + { + "point": "避免在現場釋出地理資料", + "priority": "Essential", + "details": "如果您計劃共享任何顯示位置的內容,請等到您離開該位置後再分享。當您在旅行、在餐廳、校園、酒店/度假村、公共建築或機場時,這一點尤其重要。", + "slug": "social-media-avoid-publishing-geo-data-while-still-onsite" + }, + { + "point": "上傳媒體前刪除後設資料", + "priority": "Optional", + "details": "大多數智慧型手機和某些相機會自動將一組全面的附加資料(稱為 EXIF 資料)附加到每張照片上。上傳前刪除此資料。", + "slug": "social-media-remove-metadata-before-uploading-media" + }, + { + "point": "實施影像隱藏", + "priority": "Advanced", + "details": "像 Fawkes 這樣的工具可以非常巧妙地、輕微地改變照片中臉部的結構,這種方式是人類無法察覺的,但會阻止臉部識別系統識別給定的臉部。", + "slug": "social-media-implement-image-cloaking" + }, + { + "point": "考慮在家庭附近欺騙 GPS", + "priority": "Advanced", + "details": "即使您自己從不使用社群媒體,總會有其他人不如您謹慎,並且可能會外洩您的位置。", + "slug": "social-media-consider-spoofing-gps-in-home-vicinity" + }, + { + "point": "考慮虛假資訊", + "priority": "Advanced", + "details": "如果您只想閱讀,並且不打算釋出太多內容 - 請考慮使用別名和虛假的聯絡方式。", + "slug": "social-media-consider-false-information" + }, + { + "point": "沒有任何社群媒體帳戶", + "priority": "Advanced", + "details": "社群媒體從根本上來說是不私密的,因此為了最大程度地保護線上安全和隱私,請避免使用任何主流社群網路。", + "slug": "social-media-dont-have-any-social-media-accounts" + } + ] + }, + { + "title": "網路裝置", + "slug": "networks", + "description": "保護您的網路流量", + "intro": "本節介紹如何將您的裝置安全地連線到網際網路,包括設定您的路由器和設定 VPN。\n", + "checklist": [ + { + "point": "使用 VPN", + "priority": "Essential", + "details": "使用信譽良好的付費 VPN。這可以協助保護您存取的網站免受記錄您的真實 IP 的侵害,減少您的 ISP 可以收集的資料量,並增強公共 WiFi 的保護。", + "slug": "networks-use-a-vpn" + }, + { + "point": "更改您的路由器密碼", + "priority": "Essential", + "details": "獲得新路由器後,請更改密碼。預設的路由器密碼是公開的,這意味著附近的任何人都可以連線。", + "slug": "networks-change-your-router-password" + }, + { + "point": "使用 WPA2 和強密碼", + "priority": "Essential", + "details": "有不同的身分驗證協議用於連線 WiFi。目前,最安全的選項是 WPA2 和 WPA3(在較新的路由器上)。", + "slug": "networks-use-wpa2-and-a-strong-password" + }, + { + "point": "保持路由器韌體最新", + "priority": "Essential", + "details": "製造商釋出韌體更新來修復安全漏洞、實施新標準,有時還會新增功能或提高路由器的效能。", + "slug": "networks-keep-router-firmware-up-to-date" + }, + { + "point": "實施網路範圍的 VPN", + "priority": "Optional", + "details": "如果您在路由器、防火牆或家庭伺服器上設定 VPN,則所有裝置的流量都將透過它進行加密和路由,而無需單獨的 VPN 應用程式。", + "slug": "networks-implement-a-network-wide-vpn" + }, + { + "point": "防止 DNS 洩漏", + "priority": "Optional", + "details": "使用 VPN 時,僅使用 VPN 供應商或安全服務的 DNS 伺服器非常重要。", + "slug": "networks-protect-against-dns-leaks" + }, + { + "point": "使用安全的 VPN 協議", + "priority": "Optional", + "details": "OpenVPN 和 WireGuard 是開源、輕量級且安全的隧道協議。避免使用 PPTP 或 SSTP。", + "slug": "networks-use-a-secure-vpn-protocol" + }, + { + "point": "安全 DNS", + "priority": "Optional", + "details": "使用 DNS-over-HTTPS,它透過 HTTPS 協議執行 DNS 解析,從而加密您和 DNS 解析器之間的資料。", + "slug": "networks-secure-dns" + }, + { + "point": "避免使用 ISP 提供的免費路由器", + "priority": "Optional", + "details": "通常,它們是在中國廉價批次生產的,具有不安全的專有韌體,這些韌體不會定期接收安全更新。", + "slug": "networks-avoid-the-free-router-from-your-isp" + }, + { + "point": "白名單 MAC 位址", + "priority": "Optional", + "details": "您可以在路由器設定中將 MAC 位址列入白名單,從而禁止任何未知裝置立即連線到您的網路,即使它們知道您的憑證。", + "slug": "networks-whitelist-mac-addresses" + }, + { + "point": "更改路由器的區域網路 IP 位址", + "priority": "Optional", + "details": "Web 瀏覽器中的惡意指令碼有可能利用跨網站指令碼漏洞,存取位於已知區域網路 IP 位址的易受攻擊路由器並加以篡改。", + "slug": "networks-change-the-routers-local-ip-address" + }, + { + "point": "不要在 SSID 中外洩個人資訊", + "priority": "Optional", + "details": "您應該更新您的網路名稱,選擇一個不會識別您的 SSID,不包括您的公寓號碼/位址,並且不指定裝置品牌/型號。", + "slug": "networks-don-t-reveal-personal-info-in-ssid" + }, + { + "point": "選擇退出路由器清單", + "priority": "Optional", + "details": "WiFi SSID 被掃描、記錄,然後在各種網站上釋出,這對某些人來說是一個嚴重的隱私問題。", + "slug": "networks-opt-out-router-listings" + }, + { + "point": "隱藏您的 SSID", + "priority": "Optional", + "details": "您的路由器的服務集識別符號只是網路名稱。如果它不可見,它可能會受到較少的濫用。", + "slug": "networks-hide-your-ssid" + }, + { + "point": "停用 WPS", + "priority": "Optional", + "details": "Wi-Fi 保護設定提供了一種更簡單的連線方法,無需輸入冗長的 WiFi 密碼,但 WPS 引入了一系列重大的安全問題。", + "slug": "networks-disable-wps" + }, + { + "point": "停用 UPnP", + "priority": "Optional", + "details": "通用即插即用允許應用程式在您的路由器上自動轉發埠,但它有很長的嚴重安全問題歷史。", + "slug": "networks-disable-upnp" + }, + { + "point": "為訪客使用訪客網路", + "priority": "Optional", + "details": "不要授予存取者存取您的主 WiFi 網路的權限,因為這使他們能夠與網路上的其他裝置進行互動。", + "slug": "networks-use-a-guest-network-for-guests" + }, + { + "point": "更改您的路由器的預設 IP", + "priority": "Optional", + "details": "修改路由器管理面板的預設 IP 位址將使針對區域網路 IP 位址的惡意指令碼更加困難。", + "slug": "networks-change-your-router-s-default-ip" + }, + { + "point": "終止路由器上未使用的處理程序和服務", + "priority": "Optional", + "details": "諸如 Telnet 和 SSH 之類的提供對裝置的命令列存取的服務永遠不應該暴露在網際網路上,並且還應該在區域網路上停用,除非它們確實需要。", + "slug": "networks-kill-unused-processes-and-services-on-your-router" + }, + { + "point": "不要有開啟的埠", + "priority": "Optional", + "details": "關閉路由器上不需要的任何開啟的埠。開啟的埠為駭客提供了一個簡單的入口。", + "slug": "networks-don-t-have-open-ports" + }, + { + "point": "停用未使用的遠端存取協議", + "priority": "Optional", + "details": "當啟用 PING、Telnet、SSH、UPnP 和 HNAP 等協議時,它們允許從世界任何地方探測您的路由器。", + "slug": "networks-disable-unused-remote-access-protocols" + }, + { + "point": "停用基於雲的管理", + "priority": "Optional", + "details": "您應該極其小心地對待路由器的管理面板,因為如果攻擊者能夠獲得存取權限,則可能會造成相當大的損害。", + "slug": "networks-disable-cloud-based-management" + }, + { + "point": "正確管理範圍", + "priority": "Optional", + "details": "通常希望將路由器的範圍推到最大,但如果您居住在較小的公寓中,當您的 WiFi 網路可以在街道對面被接收時,您的攻擊面就會增加。", + "slug": "networks-manage-range-correctly" + }, + { + "point": "透過 Tor 路由所有流量", + "priority": "Advanced", + "details": "VPN 有其弱點。為了提高安全性,請透過 [Tor](https://awesome-privacy.xyz/networking/mix-networks/tor) 網路路由您的所有網際網路流量。", + "slug": "networks-route-all-traffic-through-tor" + }, + { + "point": "在所有裝置上停用 WiFi", + "priority": "Advanced", + "details": "即使連線到安全的 WiFi 網路也會增加您的攻擊面。停用您的家庭 WiFi 並透過乙太網路連線每個裝置。", + "slug": "networks-disable-wifi-on-all-devices" + } + ] + }, + { + "title": "行動裝置", + "slug": "mobile-devices", + "description": "減少對手機、智慧型手機和平板電腦的侵入性追蹤", + "intro": "智慧型手機徹底改變了生活的許多方面,並將世界帶到我們的指尖。對於我們許多人來說,智慧型手機是我們溝通、娛樂和取得知識的主要手段。但是,雖然它們將便利性提升到了一個全新的水平,但在螢幕背後卻發生了一些醜陋的事情。\n地理追蹤被用來追蹤我們的一舉一動,我們幾乎無法控制誰擁有這些資料 - 您的手機甚至能夠[在沒有 GPS 的情況下追蹤您的位置](https://gizmodo.com/how-to-track-a-cellphone-without-gps-or-consent-1821125371)。多年來,出現了許多報告,概述了您的手機[麥克風可以竊聽](https://www.independent.co.uk/life-style/gadgets-and-tech/news/smartphone-apps-listening-privacy-alphonso-shazam-advertising-pool-3d-honey-quest-a8139451.html)的方式,以及[攝影機可以監視您](https://www.businessinsider.com/hackers-governments-smartphone-iphone-camera-wikileaks-cybersecurity-hack-privacy-webcam-2017-6) - 所有這些都無需您的知情或同意。然後是惡意應用程式、缺乏安全補丁以及潛在/可能的後門。\n使用智慧型手機會產生大量關於您的資料 - 從您有意共享的資訊到從您的行為中默默產生的資料。看到 Google、Microsoft、Apple 和 Facebook 對我們的了解程度,這可能很可怕 - 有時他們比我們最親密的家人了解得更多。很難理解您的資料將揭示什麼,尤其是與其他資料結合使用時。\n這些資料被用於[不僅僅是廣告](https://internethealthreport.org/2018/the-good-the-bad-and-the-ugly-sides-of-data-tracking/) - 更多時候,它被用來為人們的財務、保險和就業進行評級。目標式廣告甚至可以用於細緻監控(參見 [ADINT](https://adint.cs.washington.edu))\n更多人開始擔心[政府如何收集和使用我們的智慧型手機資料](https://www.statista.com/statistics/373916/global-opinion-online-monitoring-government/),這是理所當然的。聯邦機構經常[向 Google](https://www.statista.com/statistics/273501/global-data-requests-from-google-by-federal-agencies-and-governments/)、[Facebook](https://www.statista.com/statistics/287845/global-data-requests-from-facebook-by-federal-agencies-and-governments/)、Apple、Microsoft、Amazon 和其他科技公司索取我們的資料。有時會批次提出請求,回傳某個地理圍欄內每個人的詳細資訊,[通常是針對無辜的人](https://www.nytimes.com/interactive/2019/04/13/us/google-location-tracking-police.html)。這還不包括世界各地的情報機構可以不受阻礙地存取的所有網際網路流量。\n", + "checklist": [ + { + "point": "加密您的裝置", + "priority": "Essential", + "details": "為了保護您的資料免受實體存取,請使用檔案加密。這意味著如果您的裝置丟失或被盜,任何人都無法存取您的資料。", + "slug": "mobile-devices-encrypt-your-device" + }, + { + "point": "關閉未使用的連線功能", + "priority": "Essential", + "details": "當您不使用 WiFi、藍牙、NFC 等時,請關閉這些功能。有幾種常見的威脅會利用這些功能。", + "slug": "mobile-devices-turn-off-connectivity-features-that-arent-being-used" + }, + { + "point": "將應用程式數量保持在最低限度", + "priority": "Essential", + "details": "解除安裝您不需要或不經常使用的應用程式。由於應用程式經常在後臺執行,會降低您的裝置速度,還會收集資料。", + "slug": "mobile-devices-keep-app-count-to-a-minimum" + }, + { + "point": "應用程式權限", + "priority": "Essential", + "details": "不要授予應用程式不需要的權限。對於 Android,[Bouncer](https://awesome-privacy.xyz/security-tools/mobile-apps/bouncer) 是一款允許您授予臨時/一次性權限的應用程式。", + "slug": "mobile-devices-app-permissions" + }, + { + "point": "僅從官方來源安裝應用程式", + "priority": "Essential", + "details": "Apple App Store 和 Google Play Store 上的應用程式經過掃描和加密簽名,因此不太可能是惡意的。", + "slug": "mobile-devices-only-install-apps-from-official-source" + }, + { + "point": "設定行動電信業者 PIN", + "priority": "Essential", + "details": "SIM 卡劫持是指駭客能夠將您的手機號碼轉移到他們的 SIM 卡上。防止這種情況發生的最簡單方法是透過您的行動電信業者設定 PIN。", + "slug": "mobile-devices-set-up-a-mobile-carrier-pin" + }, + { + "point": "小心手機充電威脅", + "priority": "Optional", + "details": "Juice Jacking 是指駭客使用公共充電站透過受感染的 USB 埠在您的智慧型手機或平板電腦上安裝惡意軟體。", + "slug": "mobile-devices-be-careful-of-phone-charging-threats" + }, + { + "point": "選擇退出來電顯示清單", + "priority": "Optional", + "details": "為了保護您的詳細資訊隱私,您可以從 TrueCaller、CallApp、SyncMe 和 Hiya 等來電顯示應用程式中取消列出您的號碼。", + "slug": "mobile-devices-opt-out-of-caller-id-listings" + }, + { + "point": "使用離線地圖", + "priority": "Optional", + "details": "考慮使用離線地圖應用程式,例如 OsmAnd 或 Organic Maps,以減少地圖應用程式的資料外洩。", + "slug": "mobile-devices-use-offline-maps" + }, + { + "point": "選擇退出個性化廣告", + "priority": "Optional", + "details": "您可以透過選擇不檢視個性化廣告來稍微減少收集的資料量。", + "slug": "mobile-devices-opt-out-of-personalized-ads" + }, + { + "point": "在太多次登入嘗試後擦除", + "priority": "Optional", + "details": "為了防止攻擊者暴力破解您的 PIN,請將您的裝置設定為在太多次失敗的登入嘗試後擦除。", + "slug": "mobile-devices-erase-after-too-many-login-attempts" + }, + { + "point": "監控追蹤器", + "priority": "Optional", + "details": "[εxodus](https://awesome-privacy.xyz/security-tools/online-tools/εxodus) 是一項很棒的服務,可讓您搜尋任何應用程式並檢視其中嵌入了哪些追蹤器。", + "slug": "mobile-devices-monitor-trackers" + }, + { + "point": "使用移動防火牆", + "priority": "Optional", + "details": "為了防止應用程式外洩隱私敏感資料,您可以安裝防火牆應用程式。", + "slug": "mobile-devices-use-a-mobile-firewall" + }, + { + "point": "減少後臺活動", + "priority": "Optional", + "details": "對於 Android,SuperFreeze 可以完全凍結每個應用程式的所有後臺活動。", + "slug": "mobile-devices-reduce-background-activity" + }, + { + "point": "沙盒行動應用程式", + "priority": "Optional", + "details": "使用沙盒環境 [Island](https://awesome-privacy.xyz/security-tools/mobile-apps/island) 防止需要大量權限的應用程式存取您的私人資料。", + "slug": "mobile-devices-sandbox-mobile-apps" + }, + { + "point": "避免自訂虛擬鍵盤", + "priority": "Optional", + "details": "建議堅持使用裝置的庫存鍵盤。如果您選擇使用第三方鍵盤應用程式,請確保它是信譽良好的。", + "slug": "mobile-devices-avoid-custom-virtual-keyboards" + }, + { + "point": "定期重啟裝置", + "priority": "Optional", + "details": "每週至少重啟一次手機將清除記憶體中快取的應用程式狀態,並且重啟後可能會執行得更流暢。", + "slug": "mobile-devices-restart-device-regularly" + }, + { + "point": "避免簡訊", + "priority": "Optional", + "details": "簡訊不應用於接收雙重身分驗證程式碼或進行通訊,而應使用加密的訊息傳遞應用程式,例如 [Signal](https://awesome-privacy.xyz/communication/encrypted-messaging/signal)。", + "slug": "mobile-devices-avoid-sms" + }, + { + "point": "將您的號碼保密", + "priority": "Optional", + "details": "[MySudo](https://awesome-privacy.xyz/finance/virtual-credit-cards/mysudo) 允許您為不同的人或群組建立和使用虛擬電話號碼。這非常適合隔離。", + "slug": "mobile-devices-keep-your-number-private" + }, + { + "point": "注意追蹤軟體", + "priority": "Optional", + "details": "追蹤軟體是由您認識的人直接安裝到您的裝置上的惡意軟體。擺脫它的最佳方法是透過恢復出廠設定。", + "slug": "mobile-devices-watch-out-for-stalkerware" + }, + { + "point": "優先使用瀏覽器,而不是專用應用程式", + "priority": "Optional", + "details": "如果可能,請考慮使用安全瀏覽器存取網站,而不是安裝專用應用程式。", + "slug": "mobile-devices-favor-the-browser-over-dedicated-app" + }, + { + "point": "Tor 流量", + "priority": "Advanced", + "details": "[Orbot](https://awesome-privacy.xyz/security-tools/mobile-apps/orbot) 提供系統範圍的 Tor 連線,這將有助於保護您免受監視和公共 WiFi 威脅。", + "slug": "mobile-devices-tor-traffic" + }, + { + "point": "考慮執行自訂 ROM (Android)", + "priority": "Advanced", + "details": "如果您擔心您的裝置製造商收集了太多個人資訊,請考慮使用注重隱私的自訂 ROM。", + "slug": "mobile-devices-consider-running-a-custom-rom-android" + } + ] + }, + { + "title": "個人電腦", + "slug": "personal-computers", + "description": "保護您的 PC 作業系統、資料和活動", + "intro": "儘管 Windows 和 OS X 易於使用且方便,但它們都遠非安全。您的作業系統提供了硬體和應用程式之間的介面,因此如果受到威脅,可能會產生不利影響。\n", + "checklist": [ + { + "point": "保持您的系統最新", + "priority": "Essential", + "details": "系統更新包含針對安全問題的修復/補丁,提高效能,有時還會新增新功能。在出現提示時安裝新更新。", + "slug": "personal-computers-keep-your-system-up-to-date" + }, + { + "point": "加密您的裝置", + "priority": "Essential", + "details": "在 Windows 上使用 BitLocker,在 MacOS 上使用 FileVault,或在 Linux 上使用 LUKS 來啟用全盤加密。如果您的計算機丟失或被盜,這將防止未經授權的存取。", + "slug": "personal-computers-encrypt-your-device" + }, + { + "point": "備份重要資料", + "priority": "Essential", + "details": "維護加密備份可防止因勒索軟體、盜竊或損壞而造成損失。考慮將 [Cryptomator](https://awesome-privacy.xyz/security-tools/mobile-apps/cryptomator) 用於雲檔案,或將 [VeraCrypt](https://awesome-privacy.xyz/essentials/file-encryption/veracrypt) 用於 USB 磁碟機。", + "slug": "personal-computers-backup-important-data" + }, + { + "point": "小心將 USB 裝置插入您的計算機", + "priority": "Essential", + "details": "USB 裝置可能構成嚴重威脅。考慮使用 CIRCLean 製作 USB 清理器以安全地檢查 USB 裝置。", + "slug": "personal-computers-be-careful-plugging-usb-devices-into-your-computer" + }, + { + "point": "在空閒時啟用螢幕鎖定", + "priority": "Essential", + "details": "離開時鎖定您的計算機,並將其設定為在從螢幕保護程式或睡眠狀態恢復時需要密碼,以防止未經授權的存取。", + "slug": "personal-computers-activate-screen-lock-when-idle" + }, + { + "point": "停用 Cortana 或 Siri", + "priority": "Essential", + "details": "語音控制助手可能會由於傳送回的資料進行處理而產生隱私問題。停用或限制它們的偵聽功能。", + "slug": "personal-computers-disable-cortana-or-siri" + }, + { + "point": "檢視您已安裝的應用程式", + "priority": "Essential", + "details": "將已安裝的應用程式保持在最低限度,以減少暴露於漏洞的風險,並定期清除應用程式快取。", + "slug": "personal-computers-review-your-installed-apps" + }, + { + "point": "管理權限", + "priority": "Essential", + "details": "控制哪些應用程式有權存取您的位置、攝影機、麥克風、聯絡人和其他敏感資訊。", + "slug": "personal-computers-manage-permissions" + }, + { + "point": "禁止將使用資料傳送到雲端", + "priority": "Essential", + "details": "限制傳送到雲端的使用資訊或反饋量,以保護您的隱私。", + "slug": "personal-computers-disallow-usage-data-from-being-sent-to-the-cloud" + }, + { + "point": "避免快速解鎖", + "priority": "Essential", + "details": "使用強密碼而不是生物識別或短 PIN 來解鎖您的計算機,以增強安全性。", + "slug": "personal-computers-avoid-quick-unlock" + }, + { + "point": "關閉計算機,而不是待機", + "priority": "Essential", + "details": "在不使用裝置時將其關閉,尤其是在您的磁碟已加密的情況下,以確保資料安全。", + "slug": "personal-computers-power-off-computer-instead-of-standby" + }, + { + "point": "不要將您的 PC 與您的 Microsoft 或 Apple 帳戶關聯", + "priority": "Optional", + "details": "僅使用本機帳戶來防止資料同步和外洩。避免使用會損害隱私的同步服務。", + "slug": "personal-computers-don-t-link-your-pc-with-your-microsoft-or-apple-account" + }, + { + "point": "檢查啟用了哪些共享服務", + "priority": "Optional", + "details": "停用您不使用的網路共享功能,以關閉通往常見威脅的閘道器。", + "slug": "personal-computers-check-which-sharing-services-are-enabled" + }, + { + "point": "不要將 Root/管理員帳戶用於非管理任務", + "priority": "Optional", + "details": "使用非特權使用者帳戶執行日常任務,並且僅提升權限以進行管理更改,以減輕漏洞。", + "slug": "personal-computers-don-t-use-rootadmin-account-for-non-admin-tasks" + }, + { + "point": "遮擋網路攝影機 + 麥克風", + "priority": "Optional", + "details": "在不使用時蓋住您的網路攝影機,並考慮阻止未經授權的錄音以保護隱私。", + "slug": "personal-computers-block-webcam--microphone" + }, + { + "point": "使用隱私過濾器", + "priority": "Optional", + "details": "在公共場所使用螢幕隱私過濾器以防止肩窺並保護敏感資訊。", + "slug": "personal-computers-use-a-privacy-filter" + }, + { + "point": "實體保護裝置", + "priority": "Optional", + "details": "在公共場所使用 Kensington 鎖來保護您的筆記型電腦,並考慮使用埠鎖來防止未經授權的實體存取。", + "slug": "personal-computers-physically-secure-device" + }, + { + "point": "不要從您的 PC 為裝置充電", + "priority": "Optional", + "details": "使用移動電源或交流牆壁充電器而不是您的 PC,以避免與 USB 連線相關的安全風險。", + "slug": "personal-computers-don-t-charge-devices-from-your-pc" + }, + { + "point": "在 Wi-Fi 上隨機化您的硬體位址", + "priority": "Optional", + "details": "修改或隨機化您的 MAC 位址,以防止跨不同 WiFi 網路進行追蹤。", + "slug": "personal-computers-randomize-your-hardware-address-on-wi-fi" + }, + { + "point": "使用防火牆", + "priority": "Optional", + "details": "安裝防火牆應用程式以監控和阻止某些應用程式進行不必要的網際網路存取,從而防止遠端存取攻擊和隱私外洩。", + "slug": "personal-computers-use-a-firewall" + }, + { + "point": "防止軟體鍵盤記錄器", + "priority": "Optional", + "details": "使用擊鍵加密工具來防止軟體鍵盤記錄器記錄您的擊鍵。", + "slug": "personal-computers-protect-against-software-keyloggers" + }, + { + "point": "檢查鍵盤連線", + "priority": "Optional", + "details": "使用公共或不熟悉的計算機時,透過檢查鍵盤連線來警惕硬體鍵盤記錄器。", + "slug": "personal-computers-check-keyboard-connection" + }, + { + "point": "防止擊鍵注入攻擊", + "priority": "Optional", + "details": "離開時鎖定您的 PC,並考慮使用 USBGuard 或類似工具來防止擊鍵注入攻擊。", + "slug": "personal-computers-prevent-keystroke-injection-attacks" + }, + { + "point": "不要使用商業“免費”防毒軟體", + "priority": "Optional", + "details": "依靠內建的安全工具,並避免使用免費的防毒軟體應用程式,因為它們可能會侵犯隱私和收集資料。", + "slug": "personal-computers-don-t-use-commercial--free--anti-virus" + }, + { + "point": "定期檢查 Rootkit", + "priority": "Advanced", + "details": "定期檢查 rootkit 以檢測和減輕完全系統控制威脅,使用 [chkrootkit](https://awesome-privacy.xyz/operating-systems/linux-defenses/chkrootkit) 等工具。", + "slug": "personal-computers-periodically-check-for-rootkits" + }, + { + "point": "BIOS 啟動密碼", + "priority": "Advanced", + "details": "啟用 BIOS 或 UEFI 密碼以在啟動期間新增額外的安全層,但要注意其侷限性。", + "slug": "personal-computers-bios-boot-password" + }, + { + "point": "使用注重安全的作業系統", + "priority": "Advanced", + "details": "考慮切換到 Linux 或注重安全的發行版,如 QubeOS 或 [Tails](https://awesome-privacy.xyz/operating-systems/desktop-operating-systems/tails),以增強隱私和安全性。", + "slug": "personal-computers-use-a-security-focused-operating-system" + }, + { + "point": "利用虛擬機器", + "priority": "Advanced", + "details": "對有風險的活動或測試可疑軟體使用虛擬機器,以將潛在威脅與您的主系統隔離開來。", + "slug": "personal-computers-make-use-of-vms" + }, + { + "point": "隔離", + "priority": "Advanced", + "details": "儘可能將不同的程式和資料來源彼此隔離,以限制潛在的外洩範圍。", + "slug": "personal-computers-compartmentalize" + }, + { + "point": "停用不需要的功能 (Windows)", + "priority": "Advanced", + "details": "停用在後臺執行的不必要的 Windows“功能”和服務,以減少資料收集和資源使用。", + "slug": "personal-computers-disable-undesired-features-windows" + }, + { + "point": "安全啟動", + "priority": "Advanced", + "details": "確保啟用安全啟動以防止惡意軟體替換您的引導載入程式和其他關鍵軟體。", + "slug": "personal-computers-secure-boot" + }, + { + "point": "安全的 SSH 存取", + "priority": "Advanced", + "details": "採取措施保護 SSH 存取免受攻擊,方法是更改預設埠、使用 SSH 金鑰和設定防火牆。", + "slug": "personal-computers-secure-ssh-access" + }, + { + "point": "關閉未使用的開啟埠", + "priority": "Advanced", + "details": "關閉不需要的偵聽外部埠的服務,以防止遠端利用並提高安全性。", + "slug": "personal-computers-close-un-used-open-ports" + }, + { + "point": "實施強制存取控制", + "priority": "Advanced", + "details": "限制特權存取,以限制在系統受到威脅時可能造成的損害。", + "slug": "personal-computers-implement-mandatory-access-control" + }, + { + "point": "使用金絲雀權杖", + "priority": "Advanced", + "details": "部署金絲雀權杖以更快地檢測對您的檔案或電子郵件的未經授權的存取,並收集有關入侵者的資訊。", + "slug": "personal-computers-use-canary-tokens" + } + ] + }, + { + "title": "智慧家庭", + "slug": "smart-home", + "description": "使用物聯網裝置而不損害您的隱私", + "intro": "家庭助手(例如 Google Home、Alexa 和 Siri)和其他網際網路連線裝置收集大量個人資料(包括語音樣本、位置資料、家庭詳細資訊和所有互動的日誌)。由於您對收集的內容、儲存方式以及用途的控制有限,因此很難向任何關心隱私和安全的人推薦任何消費者智慧家庭產品。\n安全與隱私:市場上有許多智慧裝置聲稱可以提高您家庭的安全性,同時使用起來簡單方便(例如智慧防盜警報器、網際網路安全攝影機、智慧鎖和遠端存取門鈴等等)。這些裝置可能看起來使安全性更容易,但在隱私方面需要權衡:因為它們收集大量個人資料,並且讓您無法控制如何儲存或使用這些資料。這些裝置的安全性也值得懷疑,因為其中許多裝置可以(並且正在)被駭客入侵,從而使入侵者能夠以最小的努力繞過檢測。\n最尊重隱私的選擇是不在您的家中使用“智慧”網際網路連線裝置,並且不依賴需要網際網路連線的安全裝置。但如果您這樣做,在購買之前充分了解任何給定產品的風險非常重要。然後調整設定以提高隱私和安全性。以下清單將協助您減輕與網際網路連線的家庭裝置相關的風險。", + "checklist": [ + { + "point": "重新命名裝置以不指定品牌/型號", + "priority": "Essential", + "details": "將預設裝置名稱更改為通用名稱,以透過模糊品牌或型號資訊來防止有針對性的攻擊。", + "slug": "smart-home-rename-devices-to-not-specify-brandmodel" + }, + { + "point": "在不使用時停用麥克風和攝影機", + "priority": "Essential", + "details": "使用硬體開關關閉智慧裝置上的麥克風和攝影機,以防止意外錄音或有針對性的存取。", + "slug": "smart-home-disable-microphone-and-camera-when-not-in-use" + }, + { + "point": "了解收集、儲存和傳輸哪些資料", + "priority": "Essential", + "details": "在購買前研究並確保對智慧家庭裝置的資料處理做法感到滿意,避免使用與第三方共享資料的裝置。", + "slug": "smart-home-understand-what-data-is-collected-stored-and-transmitted" + }, + { + "point": "設定隱私設定,並選擇不與第三方共享資料", + "priority": "Essential", + "details": "調整應用程式設定以實現最嚴格的隱私控制,並在可能的情況下選擇不與第三方共享資料。", + "slug": "smart-home-set-privacy-settings-and-opt-out-of-sharing-data-with-third-parties" + }, + { + "point": "不要將您的智慧家庭裝置連結到您的真實身分", + "priority": "Essential", + "details": "使用匿名使用者名稱和密碼,避免透過社群媒體或其他第三方服務註冊/登入以維護隱私。", + "slug": "smart-home-don-t-link-your-smart-home-devices-to-your-real-identity" + }, + { + "point": "保持韌體最新", + "priority": "Essential", + "details": "定期更新智慧裝置韌體以應用安全補丁和增強功能。", + "slug": "smart-home-keep-firmware-up-to-date" + }, + { + "point": "保護您的網路", + "priority": "Essential", + "details": "保護您的家庭 WiFi 和網路以防止未經授權存取智慧裝置。", + "slug": "smart-home-protect-your-network" + }, + { + "point": "警惕可穿戴裝置", + "priority": "Optional", + "details": "考慮可穿戴裝置廣泛的資料收集能力及其對隱私的影響。", + "slug": "smart-home-be-wary-of-wearables" + }, + { + "point": "不要將您家的關鍵基礎設施連線到網際網路", + "priority": "Optional", + "details": "由於駭客可能會進行遠端存取,因此評估網際網路連線的恆溫器、警報器和探測器的風險。", + "slug": "smart-home-don-t-connect-your-home-s-critical-infrastructure-to-the-internet" + }, + { + "point": "減輕 Alexa/Google Home 風險", + "priority": "Optional", + "details": "考慮以隱私為中心的替代方案,例如 [Mycroft](https://awesome-privacy.xyz/smart-home-and-iot/voice-assistants/mycroft) 或使用 Project Alias 來防止語音啟用助手進行空閒偵聽。", + "slug": "smart-home-mitigate-alexa-google-home-risks" + }, + { + "point": "密切監控您的家庭網路", + "priority": "Optional", + "details": "使用 FingBox 等工具或路由器功能來監控異常網路活動。", + "slug": "smart-home-monitor-your-home-network-closely" + }, + { + "point": "在可能的情況下拒絕網際網路存取", + "priority": "Advanced", + "details": "使用防火牆阻止不需要網際網路存取的裝置的網際網路存取,將操作限制在區域網路使用。", + "slug": "smart-home-deny-internet-access-where-possible" + }, + { + "point": "評估風險", + "priority": "Advanced", + "details": "考慮對所有家庭成員的隱私影響,並調整裝置設定以確保安全和隱私,例如在特定時間停用裝置。", + "slug": "smart-home-assess-risks" + } + ] + }, + { + "title": "個人財務", + "slug": "personal-finance", + "description": "保護您的資金、金融帳戶和交易", + "intro": "信用卡欺詐是最常見的身分盜竊形式([僅在 2017 年美國就有 133,015 起報告](https://www.experian.com/blogs/ask-experian/identity-theft-statistics/)),總損失達 9.05 億美元,比上一年增加了 26%。每人損失的中位數為 429 美元(2017 年)。採取基本步驟保護自己免受侵害比以往任何時候都更重要。\n關於信用卡的注意事項:信用卡採用技術手段來檢測和阻止某些欺詐性交易。主要的付款處理商透過挖掘其持卡人的大量資料來實現這一點,以便深入了解每個人的消費習慣。這些資料用於識別欺詐,但也出售給其他資料代理商。因此,信用卡有利於安全性,但不利於資料隱私。", + "checklist": [ + { + "point": "註冊欺詐警報和信用監控", + "priority": "Essential", + "details": "透過 Experian、TransUnion 或 Equifax 啟用欺詐警報和信用監控,以便在出現可疑活動時收到警報。", + "slug": "personal-finance-sign-up-for-fraud-alerts-and-credit-monitoring" + }, + { + "point": "申請信用凍結", + "priority": "Essential", + "details": "透過 Experian、TransUnion 和 Equifax 凍結您的信用,以防止未經授權的信用查詢。", + "slug": "personal-finance-apply-a-credit-freeze" + }, + { + "point": "使用虛擬卡", + "priority": "Optional", + "details": "利用虛擬卡號進行線上交易以保護您的真實銀行詳細資訊。[Privacy.com](https://awesome-privacy.xyz/finance/virtual-credit-cards/privacy.com) 和 [MySudo](https://awesome-privacy.xyz/finance/virtual-credit-cards/mysudo) 等服務提供此類功能。", + "slug": "personal-finance-use-virtual-cards" + }, + { + "point": "使用現金進行當地交易", + "priority": "Optional", + "details": "使用[現金](https://awesome-privacy.xyz/finance/other-payment-methods/cash)支付當地及日常消費,以避免機構進行財務分析。", + "slug": "personal-finance-use-cash-for-local-transactions" + }, + { + "point": "使用加密貨幣進行線上交易", + "priority": "Optional", + "details": "選擇注重隱私的加密貨幣(如 [Monero](https://awesome-privacy.xyz/finance/cryptocurrencies/monero))進行線上交易以保持匿名性。明智地使用加密貨幣以確保隱私。", + "slug": "personal-finance-use-cryptocurrency-for-online-transactions" + }, + { + "point": "安全地儲存加密貨幣", + "priority": "Advanced", + "details": "使用離線錢包產生、[Trezor](https://awesome-privacy.xyz/finance/crypto-wallets/trezor) 或 [ColdCard](https://awesome-privacy.xyz/finance/crypto-wallets/coldcard) 等硬體錢包安全地儲存加密貨幣,或考慮使用 [CryptoSteel](https://awesome-privacy.xyz/finance/crypto-wallets/cryptosteel) 等長期儲存解決方案。", + "slug": "personal-finance-store-crypto-securely" + }, + { + "point": "匿名購買加密貨幣", + "priority": "Advanced", + "details": "透過 [LocalBitcoins](https://awesome-privacy.xyz/finance/crypto-exchanges/localbitcoins)、[Bisq](https://awesome-privacy.xyz/finance/crypto-exchanges/bisq) 或比特幣 ATM 等服務購買加密貨幣,而無需連結到您的身分。", + "slug": "personal-finance-buy-crypto-anonymously" + }, + { + "point": "混淆/混合幣", + "priority": "Advanced", + "details": "在將比特幣轉換為貨幣之前,使用比特幣混合器或 CoinJoin 來模糊交易軌跡。", + "slug": "personal-finance-tumble-mix-coins" + }, + { + "point": "線上購物時使用別名詳細資訊", + "priority": "Advanced", + "details": "對於線上購買,請考慮使用別名詳細資訊、轉發電子郵件位址、VOIP 號碼和安全的送貨方式來保護您的身分。", + "slug": "personal-finance-use-an-alias-details-for-online-shopping" + }, + { + "point": "使用備用送貨位址", + "priority": "Advanced", + "details": "選擇送貨到非個人位址,例如郵政信箱、轉寄位址或當地取貨地點,以避免將購買直接連結到您。", + "slug": "personal-finance-use-alternate-delivery-address" + } + ] + }, + { + "title": "人為因素", + "slug": "human-aspect", + "description": "避免社會工程學安全風險", + "intro": "許多資料外洩、駭客攻擊和攻擊都是由人為錯誤引起的。以下清單包含您應該採取的步驟,以減少發生在您身上的風險。其中許多是常識,但值得注意。", + "checklist": [ + { + "point": "驗證收件人", + "priority": "Essential", + "details": "電子郵件很容易被偽造。驗證寄件者的真實性,特別是對於敏感操作,並優先手動輸入 URL,而不是點選電子郵件中的連結。", + "slug": "human-aspect-verify-recipients" + }, + { + "point": "不要相信您的彈出通知", + "priority": "Essential", + "details": "惡意行為者可以部署虛假的彈出式視窗。在彈出式視窗上輸入任何資訊之前,請務必檢查 URL。", + "slug": "human-aspect-don-t-trust-your-popup-notifications" + }, + { + "point": "切勿讓裝置無人看管", + "priority": "Essential", + "details": "即使使用強密碼,無人看管的裝置也可能被盜用。對丟失的裝置使用加密和遠端擦除功能,如“查詢我的手機”。", + "slug": "human-aspect-never-leave-device-unattended" + }, + { + "point": "防止攝影機劫持", + "priority": "Essential", + "details": "使用攝影機蓋和麥克風阻斷器來防止攝影機劫持。在不使用或討論敏感問題時,將家庭助理靜音。", + "slug": "human-aspect-prevent-camfecting" + }, + { + "point": "防止肩窺", + "priority": "Essential", + "details": "在筆記型電腦和手機上使用隱私螢幕,以防止他人在公共場所閱讀您的螢幕。", + "slug": "human-aspect-stay-protected-from-shoulder-surfers" + }, + { + "point": "了解網路釣魚攻擊", + "priority": "Essential", + "details": "警惕網路釣魚攻擊。驗證 URL、收到的訊息的上下文,並採用良好的安全做法,例如使用 2FA 且不重複使用密碼。", + "slug": "human-aspect-educate-yourself-about-phishing-attacks" + }, + { + "point": "注意追蹤軟體", + "priority": "Essential", + "details": "請注意熟人安裝的用於監視的追蹤軟體。注意異常的電池使用情況等跡象,如果懷疑,請執行恢復出廠設定。", + "slug": "human-aspect-watch-out-for-stalkerware" + }, + { + "point": "從可信來源安裝信譽良好的軟體", + "priority": "Essential", + "details": "僅從合法來源下載軟體,並在安裝前使用 [Virus Total](https://awesome-privacy.xyz/security-tools/online-tools/virus-total) 等工具檢查檔案。", + "slug": "human-aspect-install-reputable-software-from-trusted-sources" + }, + { + "point": "安全地儲存個人資料", + "priority": "Essential", + "details": "確保裝置上或雲中的所有個人資料都已加密,以防止未經授權的存取。", + "slug": "human-aspect-store-personal-data-securely" + }, + { + "point": "對檔案中的個人詳細資訊進行模糊處理", + "priority": "Essential", + "details": "共享文件時,使用不透明矩形對個人詳細資訊進行模糊處理,以防止資訊外洩。", + "slug": "human-aspect-obscure-personal-details-from-documents" + }, + { + "point": "不要僅僅因為網站是“HTTPS”就認為它是安全的", + "priority": "Essential", + "details": "HTTPS 並不保證網站的合法性。驗證 URL 並謹慎處理個人資料。", + "slug": "human-aspect-do-not-assume-a-site-is-secure-just-because-it-is-https" + }, + { + "point": "線上付款時使用虛擬卡", + "priority": "Optional", + "details": "使用虛擬卡進行線上付款,以保護您的銀行詳細資訊並限制交易風險。", + "slug": "human-aspect-use-virtual-cards-when-paying-online" + }, + { + "point": "審查應用程式權限", + "priority": "Optional", + "details": "定期審查和管理應用程式權限,以確保沒有不必要的對敏感裝置功能的存取。", + "slug": "human-aspect-review-application-permissions" + }, + { + "point": "選擇退出公開清單", + "priority": "Optional", + "details": "將您自己從公共資料庫和行銷清單中刪除,以減少不必要的聯絡和潛在風險。", + "slug": "human-aspect-opt-out-of-public-lists" + }, + { + "point": "選擇退出資料服務時,切勿提供額外的個人身分資訊", + "priority": "Optional", + "details": "選擇退出資料服務時,請勿提供額外的個人資訊,以避免進一步的資料收集。", + "slug": "human-aspect-never-provide-additional-pii-when-opting-out" + }, + { + "point": "選擇退出資料共享", + "priority": "Optional", + "details": "許多應用程式和服務預設為資料共享設定。選擇退出以保護您的資料不被與第三方共享。", + "slug": "human-aspect-opt-out-of-data-sharing" + }, + { + "point": "審查和更新社群媒體隱私", + "priority": "Optional", + "details": "定期檢查和更新您的社群媒體設定,因為頻繁的條款更新可能會影響您的隱私設定。", + "slug": "human-aspect-review-and-update-social-media-privacy" + }, + { + "point": "隔離", + "priority": "Advanced", + "details": "將數位活動的不同區域分開,以限制發生外洩時的資料暴露。", + "slug": "human-aspect-compartmentalize" + }, + { + "point": "WhoIs 隱私保護", + "priority": "Advanced", + "details": "對網域名稱註冊使用 WhoIs 隱私保護,以保護您的個人資訊免遭公開搜尋。", + "slug": "human-aspect-whois-privacy-guard" + }, + { + "point": "使用轉寄位址", + "priority": "Advanced", + "details": "對郵件使用郵政信箱或轉寄位址,以防止公司知道您的真實位址,從而增加一層隱私保護。", + "slug": "human-aspect-use-a-forwarding-address" + }, + { + "point": "使用匿名付款方式", + "priority": "Advanced", + "details": "選擇匿名付款方式(如加密貨幣),以避免線上輸入可識別資訊。", + "slug": "human-aspect-use-anonymous-payment-methods" + } + ] + }, + { + "title": "實體安全", + "slug": "physical-security", + "description": "採取措施防止現實生活中的安全事件", + "intro": "公共記錄通常包括敏感的個人資料(全名、出生日期、電話號碼、電子郵件、位址、種族等),並且是從各種來源收集的(人口普查記錄、出生/死亡/結婚憑證、選民登記、行銷資訊、客戶資料庫、機動車輛記錄、專業/商業執照以及所有法庭檔案的完整詳細資訊)。這些敏感的個人資訊[易於合法存取](https://www.consumerreports.org/consumerist/its-creepy-but-not-illegal-for-this-website-to-provide-all-your-public-info-to-anyone/),這引發了一些[嚴重的隱私問題](https://privacyrights.org/resources/public-records-internet-privacy-dilemma)(身分盜竊、人身安全風險/追蹤者、名譽損害、個人檔案遭濫用)\n\n閉路電視是公司、個人和政府追蹤您行蹤的主要方式之一。在英國倫敦,平均每人每天被攝影機拍到約 500 次。這個網路正在不斷發展,在世界許多城市,臉部識別技術正在推廣,這意味著國家可以即時了解鏡頭中居民的身分。\n如果有人能夠實際損害您、您的裝置和您的資料,那麼強大的身分驗證、加密裝置、修補軟體和匿名網頁瀏覽可能沒什麼用。本節概述了一些實體安全的基本方法。", + "checklist": [ + { + "point": "銷燬敏感檔案", + "priority": "Essential", + "details": "在處置敏感檔案之前將其粉碎或塗黑,以防止身分盜竊並維護機密性。\n", + "slug": "physical-security-destroy-sensitive-documents" + }, + { + "point": "選擇退出公共記錄", + "priority": "Essential", + "details": "使用 Michael Bazzell 的個人資料刪除工作簿等指南,聯絡人員搜尋網站以選擇退出顯示個人資訊的清單。\n", + "slug": "physical-security-opt-out-of-public-records" + }, + { + "point": "給檔案加水印", + "priority": "Essential", + "details": "在個人檔案的數位副本上新增帶有收件人姓名和日期的水印,以追蹤外洩源。\n", + "slug": "physical-security-watermark-documents" + }, + { + "point": "不要在來電中透露資訊", + "priority": "Essential", + "details": "僅在您發起的通話中共享個人資料,並驗證收件人的電話號碼。\n", + "slug": "physical-security-don-t-reveal-info-on-inbound-calls" + }, + { + "point": "保持警惕", + "priority": "Essential", + "details": "注意您的周圍環境並在新環境中評估潛在風險。", + "slug": "physical-security-stay-alert" + }, + { + "point": "保護周邊", + "priority": "Essential", + "details": "確保儲存個人資訊裝置的場所的實體安全,最大限度地減少外部存取並使用入侵檢測系統。", + "slug": "physical-security-secure-perimeter" + }, + { + "point": "實體保護裝置", + "priority": "Essential", + "details": "對裝置使用 Kensington 鎖、網路攝影機蓋和隱私螢幕等實體安全措施。", + "slug": "physical-security-physically-secure-devices" + }, + { + "point": "將裝置放在視線之外", + "priority": "Essential", + "details": "防止從外部看到裝置,以減輕雷射和盜竊帶來的風險。", + "slug": "physical-security-keep-devices-out-of-direct-sight" + }, + { + "point": "保護您的 PIN", + "priority": "Essential", + "details": "在輸入 PIN 時遮擋,防止旁觀者和攝影機看到,並在使用後清潔觸控式螢幕。", + "slug": "physical-security-protect-your-pin" + }, + { + "point": "檢查提款機讀卡器", + "priority": "Essential", + "details": "在使用前檢查 ATM 和公共裝置是否存在盜刷裝置和篡改跡象。", + "slug": "physical-security-check-for-skimmers" + }, + { + "point": "保護您的家庭住址", + "priority": "Optional", + "details": "使用備用地點、轉寄位址和匿名付款方式來保護您的家庭住址。", + "slug": "physical-security-protect-your-home-address" + }, + { + "point": "使用 PIN,而不是生物識別", + "priority": "Advanced", + "details": "在可能發生強制解鎖裝置的法律情況下,優先使用 PIN 而不是生物識別技術來保護裝置安全。", + "slug": "physical-security-use-a-pin-not-biometrics" + }, + { + "point": "減少閉路電視曝光", + "priority": "Advanced", + "details": "佩戴偽裝並選擇攝影機較少的路線以避免監視。", + "slug": "physical-security-reduce-exposure-to-cctv" + }, + { + "point": "防臉部識別服裝", + "priority": "Advanced", + "details": "穿著帶有可欺騙臉部識別技術的圖案的服裝。", + "slug": "physical-security-anti-facial-recognition-clothing" + }, + { + "point": "減少夜視曝光", + "priority": "Advanced", + "details": "使用紅外光源或反光眼鏡來阻擋夜視攝影機。", + "slug": "physical-security-reduce-night-vision-exposure" + }, + { + "point": "保護您的 DNA", + "priority": "Advanced", + "details": "避免與基因檢測網站共享 DNA,並注意不要留下 DNA 痕跡。", + "slug": "physical-security-protect-your-dna" + } + ] + } +] diff --git a/frontend/locales/zh-TW.json b/frontend/locales/zh-TW.json index 2e712d865..39b29073d 100644 --- a/frontend/locales/zh-TW.json +++ b/frontend/locales/zh-TW.json @@ -43,7 +43,7 @@ "Name": "未登入使用者", "Item1": "查詢 IP 資訊,多資料來源對比", "Item2": "網路連通性與服務可用性檢測", - "Item3": "WebRTC / DNS 洩露檢測", + "Item3": "WebRTC / DNS 洩漏檢測", "Item4": "網速、全球延遲與 MTR 測試", "Item5": "Whois、DNS 解析等更多進階工具", "Item6": "無需註冊,開源可自部署" @@ -53,7 +53,7 @@ "Item1": "包含未登入使用者的所有權益", "Item2": "可以檢視 IP 的品質分、代理判斷、型別、原生性等進階資訊", "Item3": "可以使用隱身測試", - "Item4": "可以使用深度 DNS 洩露測試", + "Item4": "可以使用深度 DNS 洩漏測試", "Item5": "可以看到自己獲得的成就勳章", "Item6": "可以使用 AI 助手 IPilot 提問", "Item7": "進階功能享有每月免費額度,每月自動重置" @@ -223,7 +223,7 @@ "pulse": { "title": "地球線上", "tooltip": "來自世界各地的訪客", - "others": "其它地區", + "others": "其他地區", "shareStatus": "分享你的狀態", "liveMap": "即時訪客熱力圖", "noVisitors": "暫無訪客", @@ -350,7 +350,7 @@ }, "securitychecklist": { "Title": "安全檢查清單", - "Note": "這是一份非常全面的網路安全檢查清單,涵蓋密碼安全、瀏覽安全、行動裝置安全等方面的內容。在目前環境下,資訊洩露可能會導致重大的損失,因此,確保我們在連線網際網路的時候,我們儘可能地保護自己的隱私、提高訪問的安全性是很有必要的。", + "Note": "這是一份非常全面的網路安全檢查清單,涵蓋密碼安全、瀏覽安全、行動裝置安全等方面的內容。在目前環境下,資訊外洩可能會導致重大的損失,因此,確保我們在連線網際網路的時候,我們儘可能地保護自己的隱私、提高存取的安全性是很有必要的。", "Note2": "這個清單羅列的內容非常多,你不一定要一次性檢查完,進度會在瀏覽器裡儲存,你可以隨時回來繼續檢查。", "Progress": "檢查進度", "Item": "專案", @@ -427,7 +427,7 @@ "fonts": "字型", "hardware": "硬體", "locales": "語言", - "permissions": "許可權", + "permissions": "權限", "plugins": "外掛", "screen": "螢幕", "system": "瀏覽器版本", @@ -480,11 +480,11 @@ "PresetOpen": "通常開放國家", "RunVerify": "開始即時測試", "RealtimeNote": "你可以選擇多個探針進行即時的連通性測試,以綜合判斷網站的封鎖情況。當執行測試時,每個國家將執行 2 個探針進行測試,當 2 個探針的結果相同時,可信性較高。", - "RealtimeFooterNote": "即時探針大多位於資料中心網路,結果可能與實際來自居民網路的歷史觀測不一致,因為有些網站可能會遮蔽資料中心網路的訪問。請將實際情況綜合判斷。" + "RealtimeFooterNote": "即時探針大多位於資料中心網路,結果可能與實際來自居民網路的歷史觀測不一致,因為有些網站可能會封鎖資料中心網路的存取。請將實際情況綜合判斷。" }, "invisibilitytest": { "Title": "隱身測試", - "Note": "當你掛上代理或 VPN 之後,你訪問的網站真的不知道你掛著代理嗎?你真的隱身了麼?我們會透過多種手段,嘗試計算出你偽裝後的漏洞,找到你正在使用代理的證據。儘管可能部分測試結果不完全準確,但本測試依然有較高的參考意義。", + "Note": "當你掛上代理或 VPN 之後,你造訪的網站真的不知道你掛著代理嗎?你真的隱身了嗎?我們會透過多種手段,嘗試找出偽裝後的漏洞,以及你正在使用代理的證據。儘管部分測試結果可能不完全準確,本測試依然有較高的參考價值。", "Note2": "點選執行後,系統將會執行一個指令碼,通常在 10s 內將會完成所有的測試,在這個過程中,你的 IP 資訊、瀏覽器資訊等將會被收集並在後臺進行分析。", "fetchError": "無法取得測試結果", "scriptLoadError": "測試指令碼載入失敗,無法繼續測試。請檢查網路後重試。", @@ -547,8 +547,8 @@ }, "net": { "title": "網路行為", - "positive": "從客戶端網路行為上發現你可能使用了代理或 VPN", - "negative": "從客戶端網路行為上未發現你使用代理或 VPN 的證據。" + "positive": "從用戶端網路行為發現你可能使用了代理或 VPN", + "negative": "從用戶端網路行為未發現你使用代理或 VPN 的證據。" }, "webrtc": { "title": "WebRTC 檢測", @@ -589,7 +589,7 @@ "axis": { "match": "與目標匹配", "coherence": "自洽性", - "leak": "身份洩露" + "leak": "身分外洩" }, "zone": { "expected": "預期身份", @@ -616,7 +616,7 @@ "source": { "ipinfo": "IP 查詢", "webrtc": "WebRTC", - "dnsleak": "DNS 洩露" + "dnsleak": "DNS 洩漏" }, "report": { "grade": { @@ -739,13 +739,13 @@ }, "script-fonts": { "title": "書寫系統字型", - "fix": "為該地區配置的機器會自帶對應書寫系統的字型。手動安裝字型可行,但通常不值得:它只改了一個訊號,系統其餘部分仍是原來的語言,往往製造出比解決掉的更多的矛盾。如果真要讓這一項站得住,該改的是系統語言本身。", + "fix": "針對該地區設定的裝置會自帶對應書寫系統的字型。手動安裝字型可行,但通常不值得:它只改了一個訊號,系統其餘部分仍是原來的語言,往往製造出比解決掉的更多矛盾。如果真要讓這一項站得住腳,該改的是系統語言本身。", "what": "這臺機器有沒有安裝該國書寫系統的字型。" }, "speech-voices": { "title": "語音合成語音包", "fix": "語音合成包跟隨系統安裝時的語言,基本沒有任何代理或換區外掛會去動它。為目標語言裝一個語音包是真正有效的修復,但和字型一樣有個前提:在其餘部分都沒變的系統裡只改一個訊號,反而顯得刻意。", - "what": "你係統裡的語音合成包覆蓋了哪些語言。" + "what": "你的系統裡有哪些語音合成套件,以及它們涵蓋哪些語言。" }, "keyboard-layout": { "title": "鍵盤佈局", @@ -866,7 +866,7 @@ "InvisibilityTest": "猜猜看我是否知道你掛了代理", "MacChecker": "查詢實體位址的歸屬資訊", "BrowserInfo": "檢閱瀏覽器資訊和指紋", - "SecurityChecklist": "全面的數字生活安全檢查清單", + "SecurityChecklist": "全面的數位生活安全檢查清單", "PersonaCheck": "把網站看到的你,和你想扮成的本地人做對照" }, "macchecker": { @@ -908,21 +908,21 @@ "Provider": "資訊服務商" }, "enhanceddnsleaktest": { - "Title": "深度 DNS 洩露測試", - "Note": "你已經在首頁的 DNS 洩露測試中大致了解了目前是否存在 DNS 洩露,以及 DNS 請求的出口地理歸屬。在這個深度測試裡,我們會從更多維度進行檢測:捕獲更多 DNS 解析器出口 IP、檢查這些解析器是否透過 ECS 把你真實 IP 段的字首轉發給了權威伺服器、以及它們是否支援 DNSSEC,從而協助你對自己的 DNS 鏈路安全性形成更完整的認識。", + "Title": "深度 DNS 洩漏測試", + "Note": "你已經在首頁的 DNS 洩漏測試中大致了解了目前是否存在 DNS 洩漏,以及 DNS 請求的出口地理歸屬。在這個深度測試裡,我們會從更多維度進行檢測:捕獲更多 DNS 解析器出口 IP、檢查這些解析器是否透過 ECS 把你真實 IP 段的字首轉發給權威伺服器,以及它們是否支援 DNSSEC,從而協助你對自己的 DNS 鏈路安全性形成更完整的認識。", "Note2": "點選「開始測試」即可開始,通常幾秒內就能得到結果。我們會在後臺發起多次 DNS 探測,由我們的權威 DNS 伺服器捕獲你所使用的遞迴解析器出口 IP,一次測試通常可以捕獲 20–40 條記錄。若完全沒有捕獲到解析器,可能是瀏覽器的 DNS 快取吃掉了請求,稍等片刻再試一次即可。", "Note3": "由於這是深度測試,頁面裡會出現一些較為專業的概念(例如 ECS、DNSSEC 等)。不用擔心,執行測試後你可以參考下方的「欄位說明」來了解每個欄位的具體含義。", "Run": "開始測試", "RunAgain": "再測一次", "RunningProbes": "正在發起 DNS 探測...", "PollingResult": "正在收集結果...", - "FetchError": "取得 DNS 洩露測試結果失敗,請稍後重試。", + "FetchError": "取得 DNS 洩漏測試結果失敗,請稍後重試。", "Empty": "本次會話沒有捕獲到任何 DNS 解析器,可能是瀏覽器的 DNS 快取吃掉了請求,請稍後重試。", "TableTitle": "捕獲到的 DNS 查詢記錄", "DedupeToggle": "隱藏重複項", "Flow": { "Probing": "正在發起第 {current} / {total} 次探測...", - "Waiting": "等待遞迴 DNS 訪問我們的權威伺服器(通常 1–3 秒)。", + "Waiting": "等待遞迴 DNS 存取我們的權威伺服器(通常 1–3 秒)。", "Fetching": "正在取得捕獲到的 DNS 查詢記錄...", "Done": "測試已完成。" }, @@ -951,12 +951,12 @@ }, "Legend": { "Title": "欄位說明", - "ResolverIP": "實際與我們權威 DNS 伺服器通訊的遞迴解析器出口 IP。如果你使用 VPN,把它的 ASN 與你目前 VPN 出口的 ASN 做對比,就能看出 DNS 請求是否繞過了 VPN 通道(即發生了洩露)。", + "ResolverIP": "實際與我們權威 DNS 伺服器通訊的遞迴解析器出口 IP。如果你使用 VPN,把它的 ASN 與你目前 VPN 出口的 ASN 做對比,就能看出 DNS 請求是否繞過了 VPN 通道(即發生洩漏)。", "QueryType": "解析器向權威伺服器請求的記錄型別(A、AAAA、HTTPS 等)。瀏覽器通常會同時發起 A 與 AAAA 查詢。", "Transport": "DNS 預設走 UDP;出現 TCP 通常意味著響應過大,而響應過大往往是因為帶上了 DNSSEC 相關記錄。", "ECS": "EDNS Client Subnet —— 部分遞迴 DNS 會在向上遊轉發查詢時附帶你真實 IP 的一段字首(通常是 IPv4 的 /24 或 IPv6 的 /48)。這意味著你的 IP 段會被 DNS 鏈路上的權威伺服器獲知,可能用於 CDN 的就近排程,也可能在一定程度上削弱匿名性。", "DO": "DNSSEC OK —— 標記為對勾時,表示遞迴解析器在查詢時主動請求了 DNSSEC 簽名,代表鏈路具備密碼學校驗能力;標記為叉時,表示本次查詢未請求籤名,響應在鏈路上被偽造或篡改時可能無法被察覺。", - "CD": "Checking Disabled —— 標記為對勾時,表示呼叫方沒有要求跳過 DNSSEC 校驗,遞迴解析器會進行正常的簽名驗證;標記為叉時,表示呼叫方顯式要求跳過校驗,即使簽名對不上也會接受結果。正常情況下應該為對勾;如果出現叉,大多是由特定的除錯工具或客戶端的安全降級造成的,在極少數情況下也可能是鏈路上存在中間人篡改的徵兆。" + "CD": "Checking Disabled —— 標記為勾選時,表示呼叫方沒有要求跳過 DNSSEC 驗證,遞迴解析器會進行正常的簽章驗證;標記為叉號時,表示呼叫方明確要求跳過驗證,即使簽章不符也會接受結果。正常情況下應該為勾選;如果出現叉號,大多是由特定除錯工具或用戶端的安全降級造成的,在極少數情況下也可能是連線上存在中間人竄改的徵兆。" } }, "dnsresolver": { @@ -984,8 +984,8 @@ "RefreshIPCard": "重新整理 IP 資訊", "SaveAsImage": "儲存為圖片", "RefreshConnectivityTests": "重新整理連通性測試", - "RefreshWebRTC": "重新整理 WebRTC 洩露測試", - "RefreshDNSLeakTest": "重新整理 DNS 洩露測試", + "RefreshWebRTC": "重新整理 WebRTC 洩漏測試", + "RefreshDNSLeakTest": "重新整理 DNS 洩漏測試", "SpeedTestButton": "開始/暫停網速測試", "ShowASNInfo": "顯示 AS 詳細資訊", "ShowASNHistory": "顯示 ASN 歷史", @@ -1024,16 +1024,16 @@ "Heading": "MyIP 網路診斷報告", "Intro": "本報告由 MyIP({origin})於 {time} 產生,資料來自在使用者瀏覽器中執行的網路測試。欄位名為穩定的 schema 識別符號;所有延遲數值單位為毫秒。", "Masked": "注意:出於隱私考慮,報告中的 IP 位址已遮蓋尾段(IPv4 末段、IPv6 介面位,以 \"x\" 表示)。", - "Instruction": "請基於以上資料分析該網路的健康狀況,指出異常項(DNS 洩露、WebRTC 暴露、代理/VPN 特徵、丟包、高延遲、路由問題等),並給出具體的排查建議。", + "Instruction": "請基於以上資料分析該網路的健康狀況,指出異常項(DNS 洩漏、WebRTC 暴露、代理/VPN 特徵、封包遺失、高延遲、路由問題等),並給出具體的疑難排解建議。", "Sections": { "ipinfo": "多個獨立來源看到的公網 IP(存在代理或分流時不同來源可能不一致)。", "connectivity": "瀏覽器對知名網站的可達性探測;timeMs 為展示的往返耗時,minTimeMs 為多輪中的最佳值。", - "webrtc": "透過 WebRTC STUN 暴露的 IP——若與主公網 IP 不同,真實位址可能繞過代理/VPN 洩露。", - "dnsleak": "實際應答瀏覽器查詢的 DNS 解析器出口 IP——解析器不屬於使用者的 ISP/VPN 供應商即為 DNS 洩露跡象。", + "webrtc": "透過 WebRTC STUN 暴露的 IP——若與主要公網 IP 不同,真實位址可能繞過代理/VPN 而洩漏。", + "dnsleak": "實際回應瀏覽器查詢的 DNS 解析器出口 IP——解析器不屬於使用者的 ISP/VPN 供應商即為 DNS 洩漏跡象。", "speedtest": "對 Cloudflare 測得的頻寬、延遲與負載延遲(bufferbloat);分數衡量流媒體/遊戲/即時通話體驗,越高越好。", "pingtest": "全球 Globalping 探針對使用者 IP 的 ICMP ping 統計。", "mtrtest": "全球探針到使用者 IP 的逐跳 MTR 路由追蹤;中間跳的丟包可能只是 ICMP 限速,從某一跳起持續丟包才代表真實問題。", - "ruletest": "訪問 8 個測試端點時觀測到的出口 IP——出現多個不同 IP 說明流量被分流到不同線路(如代理規則)。", + "ruletest": "存取 8 個測試端點時觀測到的出口 IP——出現多個不同 IP 表示流量被分流到不同線路(如代理規則)。", "browserinfo": "被測裝置的瀏覽器、作業系統與顯示環境。", "invisibility": "代理/VPN 檢測得分(0-100,越高越可能被識別)及各項命中的檢測訊號。", "enhanceddnsleak": "解析器級 DNS 捕獲:向測試網域名稱發起查詢的每個解析器 IP,含傳輸協議、ECS 暴露與 DNSSEC 標誌(do/cd)。", @@ -1196,7 +1196,7 @@ }, "connectivity": { "Title": "網路連通性", - "Note": "本測試用於測試你是否能夠連通到某個網站。測試方法是透過載入對應網站上的小圖片進行的。延遲值僅供參考,實際會更小。你可以新增其它你常用的網站到測試清單中,方便快速測試。", + "Note": "本測試用於測試你是否能夠連線到某個網站。測試方法是透過載入對應網站上的小圖片進行。延遲值僅供參考,實際會更小。你可以將其他常用網站新增到測試清單中,方便快速測試。", "StatusWait": "待檢測", "StatusAvailable": "可用", "StatusUnavailable": "不可用", @@ -1250,7 +1250,7 @@ }, "webrtc": { "id": "webrtc", - "Title": "WebRTC 洩露測試", + "Title": "WebRTC 洩漏測試", "Name": "WebRTC 連線", "Note": "WebRTC 往往透過 UDP 直連進行建立,如果測試回傳了真實 IP,則意味著你的代理設定沒有覆蓋這些連線。除了檢測你連線 WebRTC 時所使用的 IP,我們還會檢測你的 NAT 型別。然而,NAT 型別的檢測並不是 100% 準確的,僅供參考。", "StatusWait": "待檢測", @@ -1267,9 +1267,9 @@ }, "dnsleaktest": { "Name": "DNS 出口檢測", - "Title": "DNS 洩露測試", - "Note": "DNS 洩露(DNS Leaks)的意思是,當你掛上 VPN/代理後,你解析網域名稱時,依然透過當地的網路服務供應商進行解析,這時就有 DNS 洩露的風險。", - "Note2": "洩露測試的方法是透過訪問新產生的網域名稱,檢測你是透過哪個地區的 DNS 出口進行解析,如果回傳的出口區域和你當地的網路服務供應商區域相同,則有 DNS 洩露風險,你可能需要修改 VPN/代理設定。", + "Title": "DNS 洩漏測試", + "Note": "DNS 洩漏(DNS Leak)是指當你連上 VPN/代理後,解析網域名稱時依然透過當地的網路服務供應商進行解析,此時就有 DNS 洩漏的風險。", + "Note2": "洩漏測試會透過造訪新產生的網域名稱,檢測你是經由哪個地區的 DNS 出口進行解析。如果回傳的出口區域和你當地的網路服務供應商區域相同,則有 DNS 洩漏風險,你可能需要修改 VPN/代理設定。", "EndpointCountry": "出口地區", "StatusWait": "待檢測", "StatusError": "測試出錯" @@ -1369,10 +1369,10 @@ "refreshEverythingTitle": "正在重新整理", "OhNo": "糟糕!", "Congrats": "恭喜呀!", - "OhNo_Message": "連通性檢測沒有通過,部分網站無法訪問。", - "Congrats_Message": "所有的連通性檢測均通過,你可以訪問所有網站。", + "OhNo_Message": "連線能力檢測未通過,部分網站無法存取。", + "Congrats_Message": "所有連線能力檢測均已通過,你可以存取所有網站。", "maskedInfoTitle": "IP 資訊已隱藏", - "maskedInfoMessage": "分享截圖不會洩露你的 IP 資訊。", + "maskedInfoMessage": "分享截圖不會外洩你的 IP 資訊。", "unmaskedInfoTitle": "IP 資訊已顯示", "unmaskedInfoMessage": "分享截圖時請注意隱私。", "SignInFailed": "登入失敗", @@ -1389,8 +1389,8 @@ "RefreshEverything": "重新整理所有資料", "RefreshIPCard": "重新整理某張 IP 卡片", "RefreshConnectivityTests": "重新整理連通性測試", - "RefreshWebRTC": "重新整理 WebRTC 洩露測試", - "RefreshDNSLeakTest": "重新整理 DNS 洩露測試", + "RefreshWebRTC": "重新整理 WebRTC 洩漏測試", + "RefreshDNSLeakTest": "重新整理 DNS 洩漏測試", "SpeedTestButton": "開始/暫停網速測試", "PingTest": "開啟全球延遲測試面板", "MTRTest": "開啟 MTR 測試面板", @@ -1411,7 +1411,7 @@ "Whois": "開啟 Whois 查詢面板", "ServiceStatus": "開啟服務可用性面板", "InvisibilityTest": "開啟隱身測試面板", - "EnhancedDnsLeakTest": "開啟深度 DNS 洩露測試面板", + "EnhancedDnsLeakTest": "開啟深度 DNS 洩漏測試面板", "MacChecker": "開啟實體位址查詢面板", "BrowserInfo": "開啟瀏覽器資訊面板", "SecurityChecklist": "開啟安全檢查清單", From 050be6ecdaa5da064e84cc05a39c3afccfd5cc7d Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Tue, 25 Aug 2026 00:15:02 +0800 Subject: [PATCH 07/17] Fix(checklist): repair the corrupted KeePass plugins link The en source carried a nested-markdown corruption pointing the plugins link at a nonexistent host; fr and ru inherited it verbatim. Restore https://keepass.info/plugins.html (zh and zh-TW already had it right) and localize the ru link text while there. Co-Authored-By: Claude Fable 5 --- frontend/locales/security-checklist/en.json | 2 +- frontend/locales/security-checklist/fr.json | 2 +- frontend/locales/security-checklist/ru.json | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/locales/security-checklist/en.json b/frontend/locales/security-checklist/en.json index d2ae49966..79dbbe1d4 100644 --- a/frontend/locales/security-checklist/en.json +++ b/frontend/locales/security-checklist/en.json @@ -122,7 +122,7 @@ { "point": "Consider Offline Password Manager", "priority": "Advanced", - "details": "For increased security, an encrypted offline password manager will give you full control over your data. [KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass) is a popular choice, with lots of [plugins](https://[KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass).info/plugins.html) and community forks with additional compatibility and functionality. Popular clients include: [KeePassXC](https://keepassxc.org) (desktop), [KeePassDX](https://www.keepassdx.com) (Android) and [StrongBox](https://apps.apple.com/us/app/strongbox-password-safe/id897283731) (iOS). The drawback being that it may be slightly less convenient for some, and it will be up to you to back it up, and store it securely", + "details": "For increased security, an encrypted offline password manager will give you full control over your data. [KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass) is a popular choice, with lots of [plugins](https://keepass.info/plugins.html) and community forks with additional compatibility and functionality. Popular clients include: [KeePassXC](https://keepassxc.org) (desktop), [KeePassDX](https://www.keepassdx.com) (Android) and [StrongBox](https://apps.apple.com/us/app/strongbox-password-safe/id897283731) (iOS). The drawback being that it may be slightly less convenient for some, and it will be up to you to back it up, and store it securely", "slug": "authentication-consider-offline-password-manager" }, { diff --git a/frontend/locales/security-checklist/fr.json b/frontend/locales/security-checklist/fr.json index a3d1d9078..06d03e7ec 100644 --- a/frontend/locales/security-checklist/fr.json +++ b/frontend/locales/security-checklist/fr.json @@ -122,7 +122,7 @@ { "point": "Envisager un gestionnaire de mots de passe hors ligne", "priority": "Advanced", - "details": "Pour une sécurité accrue, un gestionnaire de mots de passe hors ligne crypté vous donnera un contrôle total sur vos données. [KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass) est un choix populaire, avec de nombreux [plugins](https://[KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass).info/plugins.html) et des forks communautaires avec une compatibilité et des fonctionnalités supplémentaires. Les clients populaires incluent : [KeePassXC](https://keepassxc.org) (bureau), [KeePassDX](https://www.keepassdx.com) (Android) et [StrongBox](https://apps.apple.com/us/app/strongbox-password-safe/id897283731) (iOS). L'inconvénient est que cela peut être légèrement moins pratique pour certains, et il vous appartiendra de le sauvegarder et de le stocker en toute sécurité.", + "details": "Pour une sécurité accrue, un gestionnaire de mots de passe hors ligne crypté vous donnera un contrôle total sur vos données. [KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass) est un choix populaire, avec de nombreux [plugins](https://keepass.info/plugins.html) et des forks communautaires avec une compatibilité et des fonctionnalités supplémentaires. Les clients populaires incluent : [KeePassXC](https://keepassxc.org) (bureau), [KeePassDX](https://www.keepassdx.com) (Android) et [StrongBox](https://apps.apple.com/us/app/strongbox-password-safe/id897283731) (iOS). L'inconvénient est que cela peut être légèrement moins pratique pour certains, et il vous appartiendra de le sauvegarder et de le stocker en toute sécurité.", "slug": "authentication-consider-offline-password-manager" }, { diff --git a/frontend/locales/security-checklist/ru.json b/frontend/locales/security-checklist/ru.json index 2d4572f84..83fc7bb4c 100644 --- a/frontend/locales/security-checklist/ru.json +++ b/frontend/locales/security-checklist/ru.json @@ -24,7 +24,7 @@ {"point":"Не используйте разблокировку по лицу","priority":"Advanced","details":"Большинство телефонов и ноутбуков поддерживают распознавание лица: камера сравнивает снимок с сохранённым хешем. Это удобно, но систему можно [обмануть](https://www.forbes.com/sites/jvchamary/2017/09/18/security-apple-face-id-iphone-x/) цифровыми фотографиями или реконструкциями по записям камер видеонаблюдения и получить доступ к устройству. В отличие от пароля, фотографии вашего лица наверняка есть в интернете, а видео — в системах наблюдения.","slug":"authentication-avoid-face-unlock"}, {"point":"Остерегайтесь клавиатурных шпионов","priority":"Advanced","details":"Аппаратный [кейлоггер](https://en.wikipedia.org/wiki/Hardware_keylogger) — физическое устройство, установленное между клавиатурой и портом USB. Оно перехватывает все нажатия клавиш и иногда передаёт данные на удалённый сервер, открывая злоумышленнику всё введённое, включая пароли. Проверяйте подключение USB после того, как компьютер оставался без присмотра. Кейлоггер могут спрятать и внутри корпуса клавиатуры, поэтому ищите следы вскрытия и при необходимости приносите на работу свою клавиатуру. Аппаратный кейлоггер не перехватит данные, введённые с экранной клавиатуры, вставленные из буфера обмена или автоматически подставленные менеджером паролей.","slug":"authentication-watch-out-for-keyloggers"}, {"point":"Рассмотрите аппаратный токен","priority":"Advanced","details":"Ключ безопасности U2F/ FIDO2 — устройство USB (или NFC), которое подключают при входе в онлайн-сервис для подтверждения личности вместо OTP из приложения-аутентификатора. Примеры таких ключей — [SoloKey](https://solokeys.com) и [NitroKey](https://www.nitrokey.com). Браузер связывается с устройством напрямую и проверяет сертификат TLS, поэтому ключ нельзя обмануть относительно узла, запросившего аутентификацию. [В этой публикации](https://security.stackexchange.com/a/71704) хорошо объяснена безопасность токенов FIDO U2F. Физический ключ важно хранить в безопасном месте или носить с собой. Некоторые аккаунты позволяют включить несколько способов 2FA.","slug":"authentication-consider-a-hardware-token"}, - {"point":"Рассмотрите автономный менеджер паролей","priority":"Advanced","details":"Зашифрованный автономный менеджер паролей даёт полный контроль над данными и повышает безопасность. Популярный вариант — [KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass), для которого доступны многочисленные [plugins](https://[KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass).info/plugins.html) и форки сообщества с дополнительной совместимостью и функциями. Популярные клиенты: [KeePassXC](https://keepassxc.org) для компьютеров, [KeePassDX](https://www.keepassdx.com) для Android и [StrongBox](https://apps.apple.com/us/app/strongbox-password-safe/id897283731) для iOS. Недостаток — несколько меньшее удобство; резервное копирование и безопасное хранение также становятся вашей ответственностью.","slug":"authentication-consider-offline-password-manager"}, + {"point":"Рассмотрите автономный менеджер паролей","priority":"Advanced","details":"Зашифрованный автономный менеджер паролей даёт полный контроль над данными и повышает безопасность. Популярный вариант — [KeePass](https://awesome-privacy.xyz/essentials/password-managers/keepass), для которого доступны многочисленные [плагины](https://keepass.info/plugins.html) и форки сообщества с дополнительной совместимостью и функциями. Популярные клиенты: [KeePassXC](https://keepassxc.org) для компьютеров, [KeePassDX](https://www.keepassdx.com) для Android и [StrongBox](https://apps.apple.com/us/app/strongbox-password-safe/id897283731) для iOS. Недостаток — несколько меньшее удобство; резервное копирование и безопасное хранение также становятся вашей ответственностью.","slug":"authentication-consider-offline-password-manager"}, {"point":"Используйте разные имена пользователей","priority":"Advanced","details":"Разные пароли для каждого аккаунта — хороший первый шаг. Если для входа также использовать уникальные имя пользователя, адрес электронной почты или номер телефона, получить несанкционированный доступ станет значительно сложнее. Для нескольких адресов проще всего применять автоматически созданные псевдонимы с анонимной пересылкой: письма на [anything]@yourdomain.com попадают в ваш ящик, позволяя указывать отдельный адрес для каждого аккаунта (см. [поставщиков почтовых псевдонимов](https://github.com/Lissy93/awesome-privacy#anonymous-mail-forwarding)). Имена пользователей может создавать, хранить и подставлять менеджер паролей. Виртуальные номера предоставляет ваш оператор VOIP.","slug":"authentication-consider-different-usernames"} ] }, From eb16afb5394ead3cc9115fe7ab4b4dd982c75bd8 Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Tue, 25 Aug 2026 00:15:14 +0800 Subject: [PATCH 08/17] Feat(i18n): promote Traditional Chinese to full MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Backfill zh-TW across all 163 changelog entries with Taiwan terminology aligned to the UI pack, flip the registry status to full and group the locale under Simplified Chinese as plain 繁體中文, add the zh-TW boot copy index.html requires of full locales, and update the full-locale enumerations in the contributor docs (including the stale 161-entry changelog count). Co-Authored-By: Claude Fable 5 --- .github/pull_request_template.md | 2 +- CONTRIBUTING.md | 10 +- TRANSLATING.md | 14 +-- common/locale-registry.js | 2 +- frontend/data/changelog.json | 163 +++++++++++++++++++++++++++++++ index.html | 13 ++- 6 files changed, 189 insertions(+), 15 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 342a7c0f2..c1f11a3c4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -9,5 +9,5 @@ Summary of the change, and the issue it fixes if any (e.g. `Closes #123`). - [ ] Targets `dev`; one concern per PR - [ ] `pnpm check` is green locally (tests + build) - [ ] Logic changes ship with a spec in `tests/` -- [ ] User-visible copy lands in all four locales (`en` / `zh` / `fr` / `ru`) +- [ ] User-visible copy lands in all five `full` locales (`en` / `zh` / `zh-TW` / `fr` / `ru`) - [ ] I've read [CONTRIBUTING.md](../CONTRIBUTING.md) and the relevant `AGENTS.md` diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 67b38b2c6..fc70e71b4 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -57,9 +57,9 @@ Details and rationale live in the AGENTS.md files; the headlines: - **JavaScript only** — no TypeScript, no `lang="ts"`. - **New functions use `const` arrow syntax** (`const fn = async () => {}`). - **Every new file opens with a header comment** stating its purpose. -- **The `full` locales land together** — user-visible copy ships in `en` / `zh` / `fr` / - `ru` in the same PR (`frontend/locales/`; tests enforce it). `beta` locales are exempt — - they fall back to English. +- **The `full` locales land together** — user-visible copy ships in `en` / `zh` / `zh-TW` / + `fr` / `ru` in the same PR (`frontend/locales/`; tests enforce it). `beta` locales are + exempt — they fall back to English. - **Backend logging goes through the shared pino logger** (`common/logger.js`) — no `console.*` in `api/` or `common/`. @@ -88,8 +88,8 @@ note in your language, and add your language to the switcher row near the top of existing READMEs. Keep code blocks, URLs, and badges unchanged. Check open issues for requested languages before starting. -**UI translations** — improvements to the existing `en` / `zh` / `fr` / `ru` packs are -welcome, and so is a whole new language. Adding one is two files: a locale pack under +**UI translations** — improvements to the existing `en` / `zh` / `zh-TW` / `fr` / `ru` packs +are welcome, and so is a whole new language. Adding one is two files: a locale pack under `frontend/locales/` and a line in `common/locale-registry.js`. **A partial pack is a welcome first PR** — anything you don't translate falls back to English, and the language ships as `beta` until it's complete. Full walkthrough: **[TRANSLATING.md](TRANSLATING.md)**. diff --git a/TRANSLATING.md b/TRANSLATING.md index 552f75ffe..ed6d38523 100644 --- a/TRANSLATING.md +++ b/TRANSLATING.md @@ -1,9 +1,9 @@ # Translating MyIP -MyIP (demo website: [IPCheck.ing](https://ipcheck.ing)) ships its UI in English, 简体中文, Français and -Русский. Adding a fifth — or a sixth — is a two-file change, and **a partial translation is -a welcome first PR**. You do not need to translate everything, and you do not need to know -Vue. +MyIP (demo website: [IPCheck.ing](https://ipcheck.ing)) ships its UI in English, 简体中文, 繁體中文, +Français and Русский. Adding a sixth — or a seventh — is a two-file change, and **a partial +translation is a welcome first PR**. You do not need to translate everything, and you do not +need to know Vue. Anything you leave untranslated falls back to English, so a pack with a hundred strings in it is genuinely useful on day one and can grow over several PRs. Untranslated strings stay @@ -44,7 +44,7 @@ can see at a glance which strings you actually wrote. | `frontend/locales/.json` | The main pack — every string in the app UI (~1,150 keys) | **Yes** — all keys, values may be `""` | | `frontend/locales/privacy/.json` | Privacy policy copy (~50 keys) | No — but whole or not at all | | `frontend/locales/security-checklist/.json` | The Cybersecurity Checklist dataset (~1,080 keys, 258 items) | No — but whole or not at all | -| `frontend/data/changelog.json` | Release history, one string per language per entry (161 entries) | No — beta languages are exempt | +| `frontend/data/changelog.json` | Release history, one string per language per entry (163 entries) | No — beta languages are exempt | `en.json` is the reference for all of them: a translation may lag behind English, never contradict it. @@ -184,7 +184,7 @@ them would fail the gate on your behalf. Translate the new keys, or drop the fil ## Improving an existing language -Fixes and better phrasings for `en` / `zh` / `fr` / `ru` are just as welcome as new +Fixes and better phrasings for `en` / `zh` / `zh-TW` / `fr` / `ru` are just as welcome as new languages — edit the JSON and open the PR. Two things to keep in mind: - Prefer natural phrasing over literal translation; this is a networking tool, and the @@ -201,7 +201,7 @@ maintainer decision, made when the language is actually complete: - Main pack, privacy copy and security checklist all at 100% against `en` — not a single `""` left (`pnpm i18n-status` shows this). -- Changelog history back-filled — all 161 entries in `frontend/data/changelog.json`. +- Changelog history back-filled — all 163 entries in `frontend/data/changelog.json`. - Enough of a track record that copy changes will keep landing in it. Once `status` flips to `'full'`, `tests/locale-packs.test.js` and `tests/changelog.test.js` diff --git a/common/locale-registry.js b/common/locale-registry.js index bf8309eb1..c00fac374 100644 --- a/common/locale-registry.js +++ b/common/locale-registry.js @@ -12,10 +12,10 @@ export const LOCALES = [ { code: 'en', nativeName: 'English', flag: 'us', apiTag: 'en', htmlLang: 'en', status: 'full' }, { code: 'zh', nativeName: '简体中文', flag: 'cn', apiTag: 'zh-CN', htmlLang: 'zh-CN', status: 'full' }, + { code: 'zh-TW', nativeName: '繁體中文', flag: 'tw', apiTag: 'zh-CN', htmlLang: 'zh-TW', status: 'full' }, { code: 'fr', nativeName: 'Français', flag: 'fr', apiTag: 'fr', htmlLang: 'fr', status: 'full' }, { code: 'ru', nativeName: 'Русский', flag: 'ru', apiTag: 'ru', htmlLang: 'ru', status: 'full' }, { code: 'pt-BR', nativeName: 'Português (Brasil)', flag: 'br', apiTag: 'pt-BR', htmlLang: 'pt-BR', status: 'beta' }, - { code: 'zh-TW', nativeName: '繁體中文(台灣)', flag: 'tw', apiTag: 'zh-CN', htmlLang: 'zh-TW', status: 'beta' }, ]; // Registry order — also the order the language picker renders. diff --git a/frontend/data/changelog.json b/frontend/data/changelog.json index fe16fb935..46d2a42e7 100644 --- a/frontend/data/changelog.json +++ b/frontend/data/changelog.json @@ -8,6 +8,7 @@ "change": { "en": "Display user's IP information", "zh": "显示用户的 IP 信息", + "zh-TW": "顯示使用者的 IP 資訊", "fr": "Affichage des informations IP de l'utilisateur", "ru": "Добавлено отображение информации об IP-адресе пользователя" } @@ -17,6 +18,7 @@ "change": { "en": "Display IP information before and after proxy", "zh": "显示代理前后的 IP 信息", + "zh-TW": "顯示代理前後的 IP 資訊", "fr": "Affichage des informations IP avant et après le proxy", "ru": "Добавлено отображение информации об IP-адресе до и после использования прокси" } @@ -26,6 +28,7 @@ "change": { "en": "Check website availability", "zh": "检查网站可用性", + "zh-TW": "檢查網站可用性", "fr": "Vérification de la disponibilité des sites web", "ru": "Добавлена проверка доступности сайтов" } @@ -41,6 +44,7 @@ "change": { "en": "Refactored the entire project using Vue2", "zh": "使用 Vue2 重构了整个项目", + "zh-TW": "使用 Vue2 重構了整個專案", "fr": "Refonte complète du projet en utilisant Vue2", "ru": "Выполнен полный рефакторинг проекта с использованием Vue2" } @@ -50,6 +54,7 @@ "change": { "en": "Refactored UI using Bootstrap v5", "zh": "使用 Bootstrap v5 重构了 UI", + "zh-TW": "使用 Bootstrap v5 重構了 UI", "fr": "Refonte de l'interface utilisateur en utilisant Bootstrap v5", "ru": "Выполнен рефакторинг UI с использованием Bootstrap v5" } @@ -65,6 +70,7 @@ "change": { "en": "Added WebRTC test", "zh": "添加了 WebRTC 测试", + "zh-TW": "新增了 WebRTC 測試", "fr": "Ajout du test WebRTC", "ru": "Добавлен тест WebRTC" } @@ -74,6 +80,7 @@ "change": { "en": "Optimized program logic", "zh": "优化了程序的一些逻辑", + "zh-TW": "最佳化了程式的一些邏輯", "fr": "Optimisation de la logique du programme", "ru": "Оптимизирована логика программы" } @@ -89,6 +96,7 @@ "change": { "en": "Added DNS leak test", "zh": "添加了 DNS 泄露测试", + "zh-TW": "新增了 DNS 洩漏測試", "fr": "Ajout du test de fuite DNS", "ru": "Добавлен тест утечки DNS" } @@ -98,6 +106,7 @@ "change": { "en": "Support displaying Bing maps in the frontend", "zh": "支持在前端显示 Bing 地图", + "zh-TW": "支援在前端顯示 Bing 地圖", "fr": "Prise en charge de l'affichage des cartes Bing dans l'interface", "ru": "Добавлена поддержка карт Bing в клиентском интерфейсе" } @@ -107,6 +116,7 @@ "change": { "en": "Multiple logic optimizations", "zh": "多个逻辑优化", + "zh-TW": "多項邏輯最佳化", "fr": "Multiples optimisations de la logique", "ru": "Выполнено несколько оптимизаций логики" } @@ -122,6 +132,7 @@ "change": { "en": "Added dark mode", "zh": "添加了黑暗模式", + "zh-TW": "新增了深色模式", "fr": "Ajout du mode sombre", "ru": "Добавлена тёмная тема" } @@ -131,6 +142,7 @@ "change": { "en": "Added minimalist mode for mobile", "zh": "增加移动版简约模式", + "zh-TW": "新增行動版簡潔模式", "fr": "Ajout du mode minimaliste pour mobile", "ru": "Добавлен минималистичный режим для мобильных устройств" } @@ -140,6 +152,7 @@ "change": { "en": "Optimized file structure", "zh": "优化了文件结构", + "zh-TW": "最佳化了檔案結構", "fr": "Optimisation de la structure des fichiers", "ru": "Оптимизирована структура файлов" } @@ -155,6 +168,7 @@ "change": { "en": "Added support for English language", "zh": "支持英文语言", + "zh-TW": "支援英文", "fr": "Prise en charge de la langue anglaise", "ru": "Добавлена поддержка английского языка" } @@ -164,6 +178,7 @@ "change": { "en": "Added information masking feature", "zh": "添加信息遮罩功能", + "zh-TW": "新增資訊隱藏功能", "fr": "Ajout de la fonctionnalité de masquage des informations", "ru": "Добавлена функция маскировки информации" } @@ -173,6 +188,7 @@ "change": { "en": "Support PWA, can be installed on mobile and desktop", "zh": "支持 PWA,可以安装到手机和桌面上", + "zh-TW": "支援 PWA,可以安裝到手機和桌面上", "fr": "Prise en charge de PWA, peut être installé sur mobile et ordinateur de bureau", "ru": "Добавлена поддержка PWA с установкой на мобильные и настольные устройства" } @@ -188,6 +204,7 @@ "change": { "en": "Added support for keyboard shortcuts", "zh": "支持快捷键操作", + "zh-TW": "支援快捷鍵操作", "fr": "Prise en charge des raccourcis clavier", "ru": "Добавлена поддержка сочетаний клавиш" } @@ -197,6 +214,7 @@ "change": { "en": "Added website speed test feature", "zh": "添加网速测试功能", + "zh-TW": "新增網速測試功能", "fr": "Ajout de la fonctionnalité de test de vitesse des sites web", "ru": "Добавлена функция проверки скорости сайта" } @@ -206,6 +224,7 @@ "change": { "en": "Support deployment using Docker", "zh": "支持使用 Docker 部署", + "zh-TW": "支援使用 Docker 部署", "fr": "Prise en charge du déploiement à l'aide de Docker", "ru": "Добавлена поддержка развёртывания через Docker" } @@ -215,6 +234,7 @@ "change": { "en": "Support retrieving IP geolocation information from multiple sources", "zh": "支持从多个来源获取 IP 归属地等信息", + "zh-TW": "支援從多個來源取得 IP 地理位置等資訊", "fr": "Prise en charge de la récupération des informations de géolocalisation IP à partir de plusieurs sources", "ru": "Добавлено получение данных о геолокации IP из нескольких источников" } @@ -230,6 +250,7 @@ "change": { "en": "Refactored the entire project using Vite + Vue3", "zh": "使用 Vite + Vue3 重构了整个项目", + "zh-TW": "使用 Vite + Vue3 重構了整個專案", "fr": "Refonte complète du projet en utilisant Vite + Vue3", "ru": "Выполнен полный рефакторинг проекта с использованием Vite + Vue3" } @@ -239,6 +260,7 @@ "change": { "en": "Added global latency test feature", "zh": "增加全球延迟测试功能", + "zh-TW": "新增全球延遲測試功能", "fr": "Ajout de la fonctionnalité de test de latence mondiale", "ru": "Добавлена глобальная проверка задержки" } @@ -248,6 +270,7 @@ "change": { "en": "Added MTR test feature", "zh": "增加 MTR 测试功能", + "zh-TW": "新增 MTR 測試功能", "fr": "Ajout de la fonctionnalité de test MTR", "ru": "Добавлен тест MTR" } @@ -257,6 +280,7 @@ "change": { "en": "Multiple performance and user experience optimizations", "zh": "多个性能优化和体验优化", + "zh-TW": "多項效能與體驗最佳化", "fr": "Multiples optimisations de performance et d'expérience utilisateur", "ru": "Выполнено несколько оптимизаций производительности и пользовательского опыта" } @@ -272,6 +296,7 @@ "change": { "en": "Added support for a new language: French", "zh": "支持新的语言:法语", + "zh-TW": "支援新的語言:法文", "fr": "Ajout de la prise en charge d'une nouvelle langue : français", "ru": "Добавлена поддержка нового языка — французского" } @@ -281,6 +306,7 @@ "change": { "en": "Added loading animation", "zh": "添加数据加载中的动画", + "zh-TW": "新增資料載入中的動畫", "fr": "Ajout d'une animation de chargement des données", "ru": "Добавлена анимация загрузки" } @@ -290,6 +316,7 @@ "change": { "en": "Optimized caching strategy", "zh": "优化了缓存策略", + "zh-TW": "最佳化了快取策略", "fr": "Optimisation de la stratégie de cache", "ru": "Оптимизирована стратегия кэширования" } @@ -299,6 +326,7 @@ "change": { "en": "Adjusted dark mode styles", "zh": "调整黑暗模式样式", + "zh-TW": "調整深色模式樣式", "fr": "Ajustement du style du mode sombre", "ru": "Скорректированы стили тёмной темы" } @@ -308,6 +336,7 @@ "change": { "en": "Fixed some minor issues", "zh": "修复了一些小问题", + "zh-TW": "修正了一些小問題", "fr": "Correction de quelques problèmes mineurs", "ru": "Исправлены небольшие проблемы" } @@ -323,6 +352,7 @@ "change": { "en": "Added NAT type detection", "zh": "添加 NAT 类型检测", + "zh-TW": "新增 NAT 類型偵測", "fr": "Ajout de la détection du type NAT", "ru": "Добавлено определение типа NAT" } @@ -332,6 +362,7 @@ "change": { "en": "Optimized PWA application experience", "zh": "优化 PWA 应用的体验", + "zh-TW": "最佳化 PWA 應用程式的體驗", "fr": "Optimisation de l'expérience de l'application PWA", "ru": "Улучшена работа PWA-приложения" } @@ -341,6 +372,7 @@ "change": { "en": "Enhanced backend script security", "zh": "提高后端脚本安全性", + "zh-TW": "提高後端腳本安全性", "fr": "Amélioration de la sécurité du script backend", "ru": "Повышена безопасность серверных скриптов" } @@ -356,6 +388,7 @@ "change": { "en": "Added support for using different IP geolocation sources", "zh": "支持使用不同的 IP 地理位置信息源", + "zh-TW": "支援使用不同的 IP 地理位置資訊來源", "fr": "Prise en charge de l'utilisation de différentes sources d'informations de géolocalisation IP", "ru": "Добавлена поддержка разных источников геолокации IP" } @@ -365,6 +398,7 @@ "change": { "en": "Improved user experience for connection availability detection", "zh": "优化连接可用性检测的用户体验", + "zh-TW": "最佳化連線可用性偵測的使用者體驗", "fr": "Amélioration de l'expérience utilisateur de la détection de disponibilité de connexion", "ru": "Улучшен пользовательский опыт при проверке доступности соединения" } @@ -374,6 +408,7 @@ "change": { "en": "Optimized UI experience", "zh": "优化 UI 体验", + "zh-TW": "最佳化 UI 體驗", "fr": "Amélioration de l'expérience utilisateur de l'interface utilisateur", "ru": "Улучшен интерфейс" } @@ -389,6 +424,7 @@ "change": { "en": "Added ASN details viewer", "zh": "添加 ASN 详细信息查看器", + "zh-TW": "新增 ASN 詳細資訊檢視器", "fr": "Ajout d'un visualiseur de détails ASN", "ru": "Добавлен просмотр подробных сведений об ASN" } @@ -398,6 +434,7 @@ "change": { "en": "Added proxy detection feature", "zh": "添加 IP 地址是否为代理的判断", + "zh-TW": "新增 IP 位址是否為代理的判斷", "fr": "Ajout de la détection de proxy", "ru": "Добавлена функция обнаружения прокси" } @@ -407,6 +444,7 @@ "change": { "en": "Optimized UI for displaying IP information", "zh": "优化 IP 信息的展示 UI", + "zh-TW": "最佳化 IP 資訊的展示 UI", "fr": "Optimisation de l'interface utilisateur pour l'affichage des informations IP", "ru": "Улучшен UI для отображения информации об IP" } @@ -422,6 +460,7 @@ "change": { "en": "Added rule test feature", "zh": "添加规则测试", + "zh-TW": "新增分流測試", "fr": "Ajout du test de règles", "ru": "Добавлен тест правил" } @@ -431,6 +470,7 @@ "change": { "en": "Some Improvements", "zh": "优化了部分逻辑", + "zh-TW": "最佳化了部分邏輯", "fr": "Quelques améliorations", "ru": "Внесены улучшения" } @@ -446,6 +486,7 @@ "change": { "en": "Added DNS resolution feature", "zh": "添加 DNS 解析功能", + "zh-TW": "新增 DNS 解析功能", "fr": "Ajout de la fonction de résolution DNS", "ru": "Добавлена функция разрешения DNS" } @@ -455,6 +496,7 @@ "change": { "en": "Optimized home page structure, advanced features are now collapsible", "zh": "优化主页结构,高级功能折叠展示", + "zh-TW": "最佳化首頁結構,進階功能改為摺疊展示", "fr": "Optimisation de la structure de la page d'accueil, les fonctionnalités avancées sont désormais repliables", "ru": "Оптимизирована структура главной страницы, расширенные функции теперь можно сворачивать" } @@ -464,6 +506,7 @@ "change": { "en": "Optimized program logic", "zh": "优化了程序逻辑", + "zh-TW": "最佳化了程式邏輯", "fr": "Optimisation de la logique du programme", "ru": "Оптимизирована логика программы" } @@ -479,6 +522,7 @@ "change": { "en": "Added censorship test feature", "zh": "添加封锁测试功能", + "zh-TW": "新增封鎖測試功能", "fr": "Fonctionnalité de test de censure ajoutée", "ru": "Добавлена проверка интернет-цензуры" } @@ -488,6 +532,7 @@ "change": { "en": "Network speed test now allows custom packet size", "zh": "网速测试可以自定义数据包大小", + "zh-TW": "網速測試可以自訂封包大小", "fr": "Le test de vitesse réseau permet maintenant de personnaliser la taille des paquets", "ru": "В тесте скорости сети теперь можно задавать размер пакета" } @@ -497,6 +542,7 @@ "change": { "en": "Optimized some functional logic", "zh": "优化了部分功能逻辑", + "zh-TW": "最佳化了部分功能邏輯", "fr": "Optimisation de certaines logiques fonctionnelles", "ru": "Оптимизирована логика некоторых функций" } @@ -512,6 +558,7 @@ "change": { "en": "Added preferences panel to save settings locally", "zh": "增加设置面板,可以在本地保存偏好设置", + "zh-TW": "新增設定面板,可以在本機儲存偏好設定", "fr": "Ajout du panneau de préférences pour enregistrer les paramètres localement", "ru": "Добавлена панель настроек с локальным сохранением" } @@ -521,6 +568,7 @@ "change": { "en": "Allow customization of multiple default behaviors on second program launch", "zh": "可以自定义程序在第二次启动时的多个默认行为", + "zh-TW": "可以自訂程式在第二次啟動時的多個預設行為", "fr": "Permettre la personnalisation de plusieurs comportements par défaut lors du deuxième lancement du programme", "ru": "Добавлена настройка нескольких вариантов поведения по умолчанию при повторном запуске программы" } @@ -530,6 +578,7 @@ "change": { "en": "Significantly optimized program logic", "zh": "大量优化了程序的逻辑", + "zh-TW": "大量最佳化了程式的邏輯", "fr": "Optimisation significative de la logique du programme", "ru": "Значительно оптимизирована логика программы" } @@ -539,6 +588,7 @@ "change": { "en": "Fixed some minor issues", "zh": "修复了一些小问题", + "zh-TW": "修正了一些小問題", "fr": "Correction de quelques problèmes mineurs", "ru": "Исправлены небольшие проблемы" } @@ -554,6 +604,7 @@ "change": { "en": "Added Whois search feature", "zh": "增加 Whois 查询功能", + "zh-TW": "新增 Whois 查詢功能", "fr": "Ajout de la fonction de recherche Whois", "ru": "Добавлен поиск Whois" } @@ -563,6 +614,7 @@ "change": { "en": "Optimized display and animation effects for advanced tools", "zh": "优化高级功能的展示与动画效果", + "zh-TW": "最佳化進階功能的展示與動畫效果", "fr": "Optimisation de l'affichage et des effets d'animation pour les outils avancés", "ru": "Улучшены отображение и анимация расширенных инструментов" } @@ -572,6 +624,7 @@ "change": { "en": "Fixed some minor issues", "zh": "修复了一些小问题", + "zh-TW": "修正了一些小問題", "fr": "Correction de quelques problèmes mineurs", "ru": "Исправлены небольшие проблемы" } @@ -587,6 +640,7 @@ "change": { "en": "Refactored the entire project using Vue 3's Composition API", "zh": "采用 Vue 3 的 Composition API 重构了整个项目", + "zh-TW": "採用 Vue 3 的 Composition API 重構了整個專案", "fr": "Refonte complète du projet en utilisant la Composition API de Vue 3", "ru": "Выполнен полный рефакторинг проекта с использованием Composition API из Vue 3" } @@ -596,6 +650,7 @@ "change": { "en": "Split the frontend into multiple modules to improve maintainability", "zh": "拆分前端多个模块,提高了程序的可维护性", + "zh-TW": "拆分前端多個模組,提高了程式的可維護性", "fr": "Découpage du frontend en plusieurs modules pour améliorer la maintenabilité du programme", "ru": "Клиентская часть разделена на несколько модулей для упрощения сопровождения" } @@ -605,6 +660,7 @@ "change": { "en": "Added Invisibility Test feature (Beta)", "zh": "增加隐身测试功能(Beta)", + "zh-TW": "新增隱身測試功能(Beta)", "fr": "Ajout de la Test d'invisibilité (bêta)", "ru": "Добавлен «Тест невидимости» (бета)" } @@ -614,6 +670,7 @@ "change": { "en": "Optimized backend program dependencies", "zh": "优化后端程序的依赖结构", + "zh-TW": "最佳化後端程式的相依結構", "fr": "Optimisation de la structure des dépendances du backend", "ru": "Оптимизированы зависимости серверной части" } @@ -623,6 +680,7 @@ "change": { "en": "Optimized numerous details", "zh": "优化了大量细节", + "zh-TW": "最佳化了大量細節", "fr": "Optimisation de nombreux détails", "ru": "Оптимизировано множество деталей" } @@ -638,6 +696,7 @@ "change": { "en": "Added MAC address lookup feature", "zh": "添加 MAC 地址查询功能", + "zh-TW": "新增 MAC 位址查詢功能", "fr": "Ajout de la fonction de recherche MAC", "ru": "Добавлен поиск по MAC-адресу" } @@ -647,6 +706,7 @@ "change": { "en": "Optimized numerous details", "zh": "优化了部分程序细节", + "zh-TW": "最佳化了部分程式細節", "fr": "Optimisation de nombreux détails", "ru": "Оптимизировано множество деталей" } @@ -662,6 +722,7 @@ "change": { "en": "Added browser information query feature", "zh": "添加浏览器信息查询功能", + "zh-TW": "新增瀏覽器資訊查詢功能", "fr": "Ajout de la fonction de requête d'informations du navigateur", "ru": "Добавлен просмотр информации о браузере" } @@ -671,6 +732,7 @@ "change": { "en": "Added MaxMind GeoIP database", "zh": "添加 MaxMind 地理数据库", + "zh-TW": "新增 MaxMind 地理資料庫", "fr": "Ajout de la base de données géographique MaxMind", "ru": "Добавлена база данных MaxMind GeoIP" } @@ -680,6 +742,7 @@ "change": { "en": "Multiple experience enhancements", "zh": "多处体验优化", + "zh-TW": "多處體驗最佳化", "fr": "Améliorations multiples de l'expérience", "ru": "Внесено несколько улучшений пользовательского опыта" } @@ -695,6 +758,7 @@ "change": { "en": "Added command line API feature", "zh": "添加命令行 API 功能", + "zh-TW": "新增命令列 API 功能", "fr": "Ajout de la fonctionnalité API en ligne de commande", "ru": "Добавлен API командной строки" } @@ -704,6 +768,7 @@ "change": { "en": "WebRTC test can now display regional information", "zh": "WebRTC 测试可以展示地区信息", + "zh-TW": "WebRTC 測試可以顯示地區資訊", "fr": "Le test WebRTC peut maintenant afficher des informations régionales", "ru": "Тест WebRTC теперь отображает информацию о регионе" } @@ -713,6 +778,7 @@ "change": { "en": "DNS leak test can now display regional information", "zh": "DNS 泄露测试可以展示地区信息", + "zh-TW": "DNS 洩漏測試可以顯示地區資訊", "fr": "Le test de fuite DNS peut maintenant afficher des informations régionales", "ru": "Тест утечки DNS теперь отображает информацию о регионе" } @@ -728,6 +794,7 @@ "change": { "en": "Language preferences", "zh": "语言偏好设置", + "zh-TW": "語言偏好設定", "fr": "Préférences de langue", "ru": "Добавлены настройки языка" } @@ -737,6 +804,7 @@ "change": { "en": "Map provider changed to Google", "zh": "地图展示供应商变更为 Google", + "zh-TW": "地圖顯示供應商變更為 Google", "fr": "Fournisseur de carte changé en Google", "ru": "Поставщик карт изменён на Google" } @@ -746,6 +814,7 @@ "change": { "en": "Other general optimizations", "zh": "其它常规优化", + "zh-TW": "其他常規最佳化", "fr": "Autres optimisations générales", "ru": "Выполнены другие общие оптимизации" } @@ -761,6 +830,7 @@ "change": { "en": "Add Security Checklist", "zh": "添加安全检查清单", + "zh-TW": "新增安全檢查清單", "fr": "Liste de vérification de sécurité", "ru": "Добавлен контрольный список безопасности" } @@ -770,6 +840,7 @@ "change": { "en": "Other general optimizations", "zh": "其它常规优化", + "zh-TW": "其他常規最佳化", "fr": "Autres optimisations générales", "ru": "Выполнены другие общие оптимизации" } @@ -785,6 +856,7 @@ "change": { "en": "Add user system", "zh": "新增用户系统", + "zh-TW": "新增使用者系統", "fr": "Ajout de la système d'utilisateur", "ru": "Добавлена система пользователей" } @@ -794,6 +866,7 @@ "change": { "en": "Add user achievement system", "zh": "新增用户成就系统", + "zh-TW": "新增使用者成就系統", "fr": "Ajout de la système de réussite utilisateur", "ru": "Добавлена система достижений пользователей" } @@ -803,6 +876,7 @@ "change": { "en": "Add Lite version", "zh": "新增 Lite 版本", + "zh-TW": "新增 Lite 版本", "fr": "Ajout de la version Lite", "ru": "Добавлена облегчённая версия" } @@ -812,6 +886,7 @@ "change": { "en": "Speed test can now display data change charts", "zh": "网速测试可以看到数据变化图表", + "zh-TW": "網速測試可以看到資料變化圖表", "fr": "Le test de vitesse peut maintenant afficher des graphiques de données", "ru": "Тест скорости теперь отображает графики изменения данных" } @@ -821,6 +896,7 @@ "change": { "en": "Code efficiency optimization", "zh": "代码效率优化", + "zh-TW": "程式碼效率最佳化", "fr": "Optimisation de la performance du code", "ru": "Оптимизирована эффективность кода" } @@ -836,6 +912,7 @@ "change": { "en": "Added support for Turkish language", "zh": "支持土耳其语", + "zh-TW": "支援土耳其文", "fr": "Ajout de la prise en charge de la langue turque", "ru": "Добавлена поддержка турецкого языка" } @@ -845,6 +922,7 @@ "change": { "en": "Optimized code efficiency", "zh": "代码效率优化", + "zh-TW": "程式碼效率最佳化", "fr": "Optimisation de l'efficacité du code", "ru": "Повышена эффективность кода" } @@ -860,6 +938,7 @@ "change": { "en": "Enhanced ASN information richness", "zh": "提升 ASN 信息的丰富性", + "zh-TW": "提升 ASN 資訊的豐富度", "fr": "Amélioration de la richesse des informations ASN", "ru": "Расширены сведения об ASN" } @@ -869,6 +948,7 @@ "change": { "en": "Added IP quality score display", "zh": "IP 质量分数显示", + "zh-TW": "IP 品質分數顯示", "fr": "Affichage de la qualité IP", "ru": "Добавлено отображение оценки качества IP" } @@ -878,6 +958,7 @@ "change": { "en": "Optimized code efficiency", "zh": "代码效率优化", + "zh-TW": "程式碼效率最佳化", "fr": "Optimisation de l'efficacité du code", "ru": "Повышена эффективность кода" } @@ -893,6 +974,7 @@ "change": { "en": "Added MaxMind GeoIP database auto-update", "zh": "MaxMind 地理数据库自动更新", + "zh-TW": "MaxMind 地理資料庫自動更新", "fr": "Mise à jour automatique de la base de données géographique MaxMind", "ru": "Добавлено автоматическое обновление базы данных MaxMind GeoIP" } @@ -902,6 +984,7 @@ "change": { "en": "Optimized caching strategy", "zh": "优化缓存策略", + "zh-TW": "最佳化快取策略", "fr": "Optimisation de la stratégie de cache", "ru": "Оптимизирована стратегия кэширования" } @@ -911,6 +994,7 @@ "change": { "en": "Significantly improved build speed", "zh": "大大提升构建速度", + "zh-TW": "大幅提升建置速度", "fr": "Amélioration significative de la vitesse de construction", "ru": "Значительно ускорена сборка" } @@ -926,6 +1010,7 @@ "change": { "en": "Refactored the entire project with Shadcn UI + Tailwind CSS", "zh": "使用 Shadcn UI + Tailwind CSS 重构了整个项目", + "zh-TW": "使用 Shadcn UI + Tailwind CSS 重構了整個專案", "fr": "Refonte complète du projet avec Shadcn UI + Tailwind CSS", "ru": "Выполнен полный рефакторинг проекта с использованием Shadcn UI + Tailwind CSS" } @@ -935,6 +1020,7 @@ "change": { "en": "Improved AI-development friendliness via multiple Agents.md files", "zh": "通过多个 Agents.md 提升 AI 开发友好性", + "zh-TW": "透過多個 Agents.md 提升 AI 開發友善度", "fr": "Amélioration de la compatibilité avec le développement assisté par IA grâce à plusieurs fichiers Agents.md", "ru": "Проект стал удобнее для AI-разработки благодаря нескольким файлам Agents.md" } @@ -944,6 +1030,7 @@ "change": { "en": "Added automated tests to improve robustness", "zh": "增加自动测试功能,提升程序健壮性", + "zh-TW": "新增自動測試功能,提升程式穩健性", "fr": "Ajout de tests automatisés pour améliorer la robustesse", "ru": "Добавлены автоматические тесты для повышения надёжности" } @@ -953,6 +1040,7 @@ "change": { "en": "More component-oriented design, easier to maintain and extend", "zh": "更加组件化的设计,更方便维护和扩展", + "zh-TW": "更加元件化的設計,更方便維護和擴充", "fr": "Conception davantage orientée composants, plus facile à maintenir et à étendre", "ru": "Архитектура стала более компонентной, что упрощает сопровождение и развитие" } @@ -962,6 +1050,7 @@ "change": { "en": "Reorganized the project directory structure for better clarity", "zh": "重新设计程序目录结构,使其更加清晰易懂", + "zh-TW": "重新設計程式目錄結構,使其更加清晰易懂", "fr": "Réorganisation de la structure des répertoires du projet pour plus de clarté", "ru": "Структура каталогов проекта реорганизована для большей ясности" } @@ -971,6 +1060,7 @@ "change": { "en": "All pages redesigned with a more modern look and feel", "zh": "所有页面全部重新设计,更具现代化美感", + "zh-TW": "所有頁面全部重新設計,更具現代化美感", "fr": "Toutes les pages redessinées avec une esthétique plus moderne", "ru": "Все страницы получили более современный дизайн" } @@ -980,6 +1070,7 @@ "change": { "en": "Faster build times and smaller bundle size", "zh": "提升程序打包速度,减少打包体积", + "zh-TW": "提升程式打包速度,減少打包體積", "fr": "Temps de compilation plus rapides et taille de bundle réduite", "ru": "Ускорена сборка и уменьшен размер бандла" } @@ -989,6 +1080,7 @@ "change": { "en": "Significantly simplified the backend to improve performance", "zh": "后端程序大量简化,提升程序性能", + "zh-TW": "後端程式大量簡化,提升程式效能", "fr": "Backend largement simplifié pour améliorer les performances", "ru": "Серверная часть значительно упрощена для повышения производительности" } @@ -998,6 +1090,7 @@ "change": { "en": "Polished comments across the codebase for better readability", "zh": "优化程序里所有的注释,使其更加清晰易懂", + "zh-TW": "最佳化程式裡所有的註解,使其更加清晰易懂", "fr": "Commentaires affinés dans tout le code source pour une meilleure lisibilité", "ru": "Комментарии во всей кодовой базе улучшены для большей читаемости" } @@ -1007,6 +1100,7 @@ "change": { "en": "Fixed multiple bugs and improved overall stability", "zh": "修复了多个 Bug,提升了程序稳定性", + "zh-TW": "修正了多個 Bug,提升了程式穩定性", "fr": "Correction de plusieurs bugs et amélioration de la stabilité globale", "ru": "Исправлено множество ошибок и повышена общая стабильность" } @@ -1022,6 +1116,7 @@ "change": { "en": "In-depth DNS Leak Test: captures every recursive resolver you use, with ECS and DNSSEC analysis", "zh": "深度 DNS 泄露测试:捕获所有递归解析器并分析 ECS 与 DNSSEC", + "zh-TW": "深度 DNS 洩漏測試:捕獲所有遞迴解析器並分析 ECS 與 DNSSEC", "fr": "Test de fuite DNS approfondi : capture tous les résolveurs récursifs utilisés, avec analyse ECS et DNSSEC", "ru": "Углублённый тест утечки DNS: выявляет все используемые рекурсивные резолверы и анализирует ECS и DNSSEC" } @@ -1031,6 +1126,7 @@ "change": { "en": "Network Connectivity now accepts user-added test targets", "zh": "网络连通性支持添加自定义测试站点", + "zh-TW": "網路連通性支援新增自訂測試站點", "fr": "La Connectivité réseau accepte désormais des cibles de test personnalisées", "ru": "В проверку сетевого подключения теперь можно добавлять собственные цели" } @@ -1040,6 +1136,7 @@ "change": { "en": "Notifications (toasts) moved back to the bottom-right corner, clearing the floating action buttons", "zh": "通知(Toast)回归屏幕右下角,自动避让悬浮按钮组", + "zh-TW": "通知(Toast)回歸螢幕右下角,自動避開懸浮按鈕組", "fr": "Les notifications reviennent dans le coin inférieur droit, en contournant les boutons flottants", "ru": "Уведомления (тосты) возвращены в правый нижний угол и больше не перекрывают плавающие кнопки действий" } @@ -1049,6 +1146,7 @@ "change": { "en": "Whois lookup now covers more modern TLDs", "zh": "Whois 查询支持更多现代 TLD", + "zh-TW": "Whois 查詢支援更多現代 TLD", "fr": "La recherche Whois couvre désormais les TLD modernes", "ru": "Поиск Whois теперь охватывает больше современных TLD" } @@ -1058,6 +1156,7 @@ "change": { "en": "Network connectivity test upgraded — more reliable reachability detection", "zh": "改进网络连通性测试,可达性判定更可靠", + "zh-TW": "改進網路連通性測試,可達性判定更可靠", "fr": "Test de connectivité réseau amélioré — détection de disponibilité plus fiable", "ru": "Обновлена проверка сетевого подключения — определение доступности стало надёжнее" } @@ -1067,6 +1166,7 @@ "change": { "en": "DNS resolver is noticeably faster", "zh": "DNS 查询更快", + "zh-TW": "DNS 查詢更快", "fr": "Le résolveur DNS est nettement plus rapide", "ru": "DNS-резолвер стал заметно быстрее" } @@ -1076,6 +1176,7 @@ "change": { "en": "Auto theme mode now follows the OS light/dark switch instantly", "zh": "修复自动主题模式下跟随系统切换时不立即生效的问题", + "zh-TW": "修正自動主題模式下跟隨系統切換時不立即生效的問題", "fr": "Le mode thème automatique suit désormais instantanément le changement clair/sombre du système", "ru": "Автоматическая тема теперь мгновенно реагирует на переключение светлой/тёмной темы в операционной системе" } @@ -1085,6 +1186,7 @@ "change": { "en": "Removed the brief visual flicker on first page load", "zh": "修复页面首次加载时的短暂视觉抖动", + "zh-TW": "修正頁面首次載入時的短暫視覺抖動", "fr": "Suppression du bref scintillement visuel au premier chargement de la page", "ru": "Устранено краткое мерцание при первой загрузке страницы" } @@ -1100,6 +1202,7 @@ "change": { "en": "Now you can view the historical ASN records of an IP", "zh": "可以查看一个 IP 过往的所有 ASN 记录", + "zh-TW": "可以檢視一個 IP 過往的所有 ASN 記錄", "fr": "Vous pouvez maintenant voir l'historique des ASN d'une IP", "ru": "Теперь можно просматривать историю записей ASN для IP" } @@ -1109,6 +1212,7 @@ "change": { "en": "Optimized Connectivity Test to show multiple test progress", "zh": "优化网络连通性测试,显示多次测试进度", + "zh-TW": "最佳化網路連通性測試,顯示多次測試進度", "fr": "Optimisation du test de connectivité pour afficher le progrès des tests multiples", "ru": "Проверка подключения оптимизирована: теперь виден ход нескольких тестов" } @@ -1118,6 +1222,7 @@ "change": { "en": "Fixed a bug that caused the notification to fire too early when running multiple connectivity tests", "zh": "修复运行多次网络连通性测试时,通知时机错误的问题", + "zh-TW": "修正執行多次網路連通性測試時,通知時機錯誤的問題", "fr": "Correction d'un bug causant la notification à se déclencher trop tôt lors de l'exécution de plusieurs tests de connectivité", "ru": "Исправлена ошибка, из-за которой при нескольких проверках подключения уведомление появлялось слишком рано" } @@ -1133,6 +1238,7 @@ "change": { "en": "Now you can view the upstream connectivity graph of an ASN", "zh": "可以查看 ASN 上游连接图,更直观地了解 ASN 的网络拓扑结构", + "zh-TW": "可以檢視 ASN 上游連線圖,更直觀地了解 ASN 的網路拓撲結構", "fr": "Vous pouvez maintenant voir le graphique de connectivité des ASN", "ru": "Теперь можно просматривать граф связности ASN с вышестоящими сетями" } @@ -1142,6 +1248,7 @@ "change": { "en": "Added simple mode, hide the description text of each module", "zh": "添加简约模式,隐藏每个模块的说明文字", + "zh-TW": "新增簡潔模式,隱藏每個模組的說明文字", "fr": "Ajout du mode simple, masque le texte de description de chaque module", "ru": "Добавлен простой режим, скрывающий описание каждого модуля" } @@ -1151,6 +1258,7 @@ "change": { "en": "Added SDP Log to WebRTC Test tool", "zh": "WebRTC 测试工具添加了 SDP 日志功能", + "zh-TW": "WebRTC 測試工具新增了 SDP 日誌功能", "fr": "Ajout de la fonctionnalité de journalisation SDP dans l'outil de test WebRTC", "ru": "В инструмент «Тест WebRTC» добавлен журнал SDP" } @@ -1160,6 +1268,7 @@ "change": { "en": "Improved Browser Info tool for more accurate and practical information", "zh": "优化了浏览器信息工具,使其更加准确和实用", + "zh-TW": "最佳化了瀏覽器資訊工具,使其更加準確和實用", "fr": "Amélioration de l'outil d'informations sur le navigateur pour plus d'informations précises et pratiques", "ru": "Инструмент «Информация о браузере» улучшен для получения более точных и полезных сведений" } @@ -1169,6 +1278,7 @@ "change": { "en": "Fixed some small issues", "zh": "修复了一些小问题", + "zh-TW": "修正了一些小問題", "fr": "Correction de petits problèmes", "ru": "Исправлены небольшие проблемы" } @@ -1184,6 +1294,7 @@ "change": { "en": "You can now save IP card or ASN connectivity graph as image", "zh": "现在可以保存 IP 卡片或 ASN 连接图作为图片", + "zh-TW": "現在可以將 IP 卡片或 ASN 連線圖儲存為圖片", "fr": "Vous pouvez maintenant enregistrer les cartes IP ou le graphique de connectivité ASN en image", "ru": "Теперь карточку IP или граф связности ASN можно сохранить как изображение" } @@ -1193,6 +1304,7 @@ "change": { "en": "Optimized the brand icons of the Connectivity Test", "zh": "优化网络连通性测试的品牌图标", + "zh-TW": "最佳化網路連通性測試的品牌圖示", "fr": "Optimisation des icônes de marque du test de connectivité", "ru": "Обновлены значки брендов в проверке подключения" } @@ -1202,6 +1314,7 @@ "change": { "en": "Enriched the information display of WebRTC Test and Rule Test", "zh": "丰富 WebRTC 测试和规则测试的信息展示", + "zh-TW": "豐富 WebRTC 測試和分流測試的資訊展示", "fr": "Amélioration de l'affichage des informations du test WebRTC et du test de règles", "ru": "Расширено отображение сведений в тесте WebRTC и тесте правил" } @@ -1211,6 +1324,7 @@ "change": { "en": "Navbar will hide when scrolling on mobile", "zh": "导航栏在手机上会跟随滚动隐藏", + "zh-TW": "導覽列在手機上會跟隨捲動隱藏", "fr": "La barre de navigation se cache lors du défilement sur mobile", "ru": "Панель навигации теперь скрывается при прокрутке на мобильных устройствах" } @@ -1220,6 +1334,7 @@ "change": { "en": "Fixed a bug that caused the PWA status bar color to not match the theme", "zh": "修复 PWA 状态栏颜色与主题不一致的问题", + "zh-TW": "修正 PWA 狀態列顏色與主題不一致的問題", "fr": "Correction d'un bug causant la couleur de la barre de statut PWA à ne pas correspondre au thème", "ru": "Исправлена ошибка, из-за которой цвет строки состояния PWA не соответствовал теме" } @@ -1235,6 +1350,7 @@ "change": { "en": "New Advanced Tool: Service Status, showing live availability of popular AI services", "zh": "新增「服务可用性」高级工具,实时展示知名 AI 服务的可用状态", + "zh-TW": "新增「服務可用性」進階工具,即時展示知名 AI 服務的可用狀態", "fr": "Nouvel outil avancé : État des services, affichant la disponibilité en temps réel de services populaires", "ru": "Новый расширенный инструмент «Статус сервисов» показывает доступность популярных AI-сервисов в реальном времени" } @@ -1244,6 +1360,7 @@ "change": { "en": "Advanced tools can now be opened in a new page", "zh": "高级工具可以在新页面打开", + "zh-TW": "進階工具可以在新頁面開啟", "fr": "Les outils avancés peuvent maintenant être ouverts dans une nouvelle page", "ru": "Расширенные инструменты теперь можно открывать на отдельной странице" } @@ -1253,6 +1370,7 @@ "change": { "en": "Improved multiple experiences to enhance usability", "zh": "优化多处体验,提升可用性", + "zh-TW": "最佳化多處體驗,提升可用性", "fr": "Amélioration de multiples expériences pour améliorer l'utilisabilité", "ru": "Внесено несколько улучшений для повышения удобства использования" } @@ -1262,6 +1380,7 @@ "change": { "en": "Fixed some issues", "zh": "修复一些问题", + "zh-TW": "修正一些問題", "fr": "Correction de petits problèmes", "ru": "Исправлены некоторые проблемы" } @@ -1277,6 +1396,7 @@ "change": { "en": "Network Connectivity Test can now be set to multiple refreshes and display the minimum latency value", "zh": "网络连通性测试可以设置多次刷新,并显示最小延迟值", + "zh-TW": "網路連通性測試可以設定多次重新整理,並顯示最小延遲值", "fr": "Le test de connectivité réseau peut maintenant être configuré pour plusieurs rafraîchissements et afficher la valeur de latence minimale", "ru": "Для проверки сетевого подключения теперь можно задать несколько повторных проверок и отображать минимальную задержку" } @@ -1286,6 +1406,7 @@ "change": { "en": "Added Privacy Policy page", "zh": "新增隐私政策页面", + "zh-TW": "新增隱私政策頁面", "fr": "Ajout de la page Politique de confidentialité", "ru": "Добавлена страница политики конфиденциальности" } @@ -1295,6 +1416,7 @@ "change": { "en": "Navigation bar now shows all advanced tools", "zh": "导航栏展示所有高级工具的入口", + "zh-TW": "導覽列展示所有進階工具的入口", "fr": "La barre de navigation affiche désormais tous les outils avancés", "ru": "Панель навигации теперь показывает все расширенные инструменты" } @@ -1304,6 +1426,7 @@ "change": { "en": "All modules on the homepage can now be individually controlled whether to run automatically", "zh": "首页的所有模块现在可以单独控制是否自动运行", + "zh-TW": "首頁的所有模組現在可以個別控制是否自動執行", "fr": "Tous les modules de la page d'accueil peuvent maintenant être contrôlés individuellement pour déterminer s'ils doivent être exécutés automatiquement", "ru": "Для каждого модуля на главной странице теперь можно отдельно настроить автоматический запуск" } @@ -1313,6 +1436,7 @@ "change": { "en": "Fixed some issues", "zh": "修复一些问题", + "zh-TW": "修正一些問題", "fr": "Correction de petits problèmes", "ru": "Исправлены некоторые проблемы" } @@ -1328,6 +1452,7 @@ "change": { "en": "Share test results as a diagnostic report — read-only link with auto-expiry, AI-ready Markdown, or JSON", "zh": "测试结果可生成诊断报告并分享——自动过期的只读链接、AI 可读的 Markdown 或 JSON", + "zh-TW": "測試結果可產生診斷報告並分享——自動過期的唯讀連結、AI 可讀的 Markdown 或 JSON", "fr": "Partagez vos résultats de test sous forme de rapport de diagnostic — lien en lecture seule à expiration automatique, Markdown prêt pour l'IA ou JSON", "ru": "Результатами тестов теперь можно делиться в виде диагностического отчёта — по ссылке только для чтения с автоматическим истечением срока, в формате Markdown для AI или JSON" } @@ -1337,6 +1462,7 @@ "change": { "en": "Added IP History panel with type and country filters", "zh": "新增 IP 历史记录面板,并支持按类型和国家筛选", + "zh-TW": "新增 IP 歷史記錄面板,並支援依類型和國家篩選", "fr": "Ajout du panneau Historique IP avec filtres par type et par pays", "ru": "Добавлена панель истории IP с фильтрами по типу и стране" } @@ -1346,6 +1472,7 @@ "change": { "en": "Integrated error & performance monitoring, optional for developers to enable", "zh": "集成错误与性能监控,开发者可选启用", + "zh-TW": "整合錯誤與效能監控,開發者可選擇啟用", "fr": "Intégration de la surveillance des erreurs et des performances, activable en option par les développeurs", "ru": "Добавлен мониторинг ошибок и производительности, который разработчики могут включить при необходимости" } @@ -1355,6 +1482,7 @@ "change": { "en": "Added a humorous startup animation", "zh": "新增一个幽默的启动动画", + "zh-TW": "新增一個幽默的啟動動畫", "fr": "Ajout d'une animation de lancement humoristique", "ru": "Добавлена юмористическая анимация запуска" } @@ -1364,6 +1492,7 @@ "change": { "en": "Country and region names now come from the user's browser built-in data, avoiding political controversies", "zh": "使用用户浏览器内置国家地区名称,避免政治争议", + "zh-TW": "改用瀏覽器內建的國家與地區名稱,避免政治爭議", "fr": "Les noms de pays et de régions proviennent désormais des données intégrées au navigateur, évitant les controverses politiques", "ru": "Названия стран и регионов теперь берутся из встроенных данных браузера пользователя, что помогает избежать политических споров" } @@ -1373,6 +1502,7 @@ "change": { "en": "IP source chain now degrades gracefully when a source fails", "zh": "IP 信息源链路出现故障时优雅降级", + "zh-TW": "IP 資訊來源鏈路發生故障時優雅降級", "fr": "La chaîne de sources IP se dégrade désormais en douceur en cas de panne", "ru": "Цепочка источников IP теперь корректно переключается на резервные источники при сбое" } @@ -1382,6 +1512,7 @@ "change": { "en": "WebRTC test can now detect browser privacy hardening", "zh": "WebRTC 测试可检测浏览器隐私加固情况", + "zh-TW": "WebRTC 測試可偵測瀏覽器隱私強化情況", "fr": "Le test WebRTC peut désormais détecter le renforcement de la confidentialité du navigateur", "ru": "Тест WebRTC теперь выявляет усиленную защиту конфиденциальности браузера" } @@ -1391,6 +1522,7 @@ "change": { "en": "Optimized mobile FAB button experience", "zh": "手机端 FAB 按钮体验优化", + "zh-TW": "手機端 FAB 懸浮按鈕體驗最佳化", "fr": "Optimisation de l'expérience des boutons FAB sur mobile", "ru": "Улучшено использование кнопок FAB на мобильных устройствах" } @@ -1400,6 +1532,7 @@ "change": { "en": "Speed test now shows a clear error state when the connection gives up mid-run", "zh": "网速测试在连接中途失败时会显示明确的错误状态", + "zh-TW": "網速測試在連線中途失敗時會顯示明確的錯誤狀態", "fr": "Le test de vitesse affiche désormais un état d'erreur clair lorsque la connexion échoue en cours d'exécution", "ru": "Тест скорости теперь явно показывает ошибку, если соединение обрывается во время выполнения" } @@ -1409,6 +1542,7 @@ "change": { "en": "Dozens of other user experience improvements", "zh": "其它数十处用户体验优化", + "zh-TW": "其他數十處使用者體驗最佳化", "fr": "Des dizaines d'autres améliorations de l'expérience utilisateur", "ru": "Внесены десятки других улучшений пользовательского опыта" } @@ -1418,6 +1552,7 @@ "change": { "en": "Fixed 20+ issues across the tools, improving overall stability", "zh": "修复各个工具的 20 多处问题,提升整体稳定性", + "zh-TW": "修正各個工具的 20 多處問題,提升整體穩定性", "fr": "Correction de plus de 20 problèmes dans les outils, améliorant la stabilité globale", "ru": "Исправлено более 20 проблем в инструментах и повышена общая стабильность" } @@ -1433,6 +1568,7 @@ "change": { "en": "Optimized loading speed by 50%+", "zh": "使用多种方式优化加载速度,提升 50%+", + "zh-TW": "使用多種方式最佳化載入速度,提升 50%+", "fr": "Optimisation de la vitesse de chargement de 50%+", "ru": "Скорость загрузки повышена более чем на 50%" } @@ -1442,6 +1578,7 @@ "change": { "en": "Supported Russian language", "zh": "支持俄语语言", + "zh-TW": "支援俄文", "fr": "Support de la langue russe", "ru": "Добавлена поддержка русского языка" } @@ -1451,6 +1588,7 @@ "change": { "en": "Improved local Maxmind concurrent query capability", "zh": "提升本地 Maxmind 并发查询能力", + "zh-TW": "提升本機 Maxmind 並行查詢能力", "fr": "Amélioration de la capacité de requête concurrente Maxmind locale", "ru": "Улучшена поддержка параллельных запросов к локальной базе MaxMind" } @@ -1460,6 +1598,7 @@ "change": { "en": "Fixed Whois Search not being able to query some IPs", "zh": "修复 Whois 查询工具无法查询部分 IP 的错误", + "zh-TW": "修正 Whois 查詢工具無法查詢部分 IP 的錯誤", "fr": "Correction d'un bug qui empêchait la recherche de certains IP avec l'outil Whois", "ru": "Исправлен поиск Whois для некоторых IP-адресов" } @@ -1475,6 +1614,7 @@ "change": { "en": "Rebuilt the Censorship Check: see where a website is blocked worldwide and by what means", "zh": "全面重构封锁测试,可以查询一个网站在全球的封锁情况和被封锁手段", + "zh-TW": "全面重構封鎖測試,可以查詢一個網站在全球的封鎖情況和被封鎖手段", "fr": "Refonte complète du test de censure : découvrez où un site est bloqué dans le monde et par quels moyens", "ru": "Полностью переработана проверка цензуры: видно, где в мире сайт заблокирован и какими методами" } @@ -1484,6 +1624,7 @@ "change": { "en": "MTR, Global Latency and Censorship tests now let you pick countries from all available Globalping probes, grouped by continent", "zh": "MTR 测试、全球延迟测试和封锁测试支持从全球可用探针中按大洲自选国家/地区", + "zh-TW": "MTR 測試、全球延遲測試和封鎖測試支援從全球可用探針中依大洲自選國家/地區", "fr": "Les tests MTR, latence mondiale et censure permettent de choisir les pays parmi toutes les sondes Globalping disponibles, groupées par continent", "ru": "В тестах MTR, глобальной задержки и цензуры можно выбирать страны из всех доступных зондов Globalping, сгруппированных по континентам" } @@ -1493,6 +1634,7 @@ "change": { "en": "New AI assistant: IPilot answers your questions from the docs, and can read your on-page results with your permission", "zh": "新增 AI 助手 IPilot:基于文档回答你的问题,并可在你授权后读取页面上的检测结果", + "zh-TW": "新增 AI 助手 IPilot:依據文件回答你的問題,並可在你授權後讀取頁面上的測試結果", "fr": "Nouvel assistant IA : IPilot répond à vos questions à partir de la documentation et peut lire vos résultats affichés avec votre autorisation", "ru": "Новый ИИ-помощник IPilot: отвечает на вопросы по документации и может прочитать результаты на странице с вашего разрешения" } @@ -1502,6 +1644,7 @@ "change": { "en": "New documentation site for users and developers, with tool guides, network troubleshooting and self-hosting docs", "zh": "新增用户与开发帮助文档,包含工具使用说明、网络问题排查和自部署指南", + "zh-TW": "新增使用者與開發說明文件,包含工具使用說明、網路問題排查和自行部署指南", "fr": "Nouveau site de documentation pour les utilisateurs et les développeurs : guides des outils, dépannage réseau et auto-hébergement", "ru": "Новый сайт документации для пользователей и разработчиков: описания инструментов, диагностика сети и самостоятельный хостинг" } @@ -1511,6 +1654,7 @@ "change": { "en": "Improved the stability of the Service Status tool", "zh": "提升「服务可用性」高级工具的稳定性", + "zh-TW": "提升「服務可用性」進階工具的穩定性", "fr": "Amélioration de la stabilité de l'outil Disponibilité des services", "ru": "Повышена стабильность инструмента «Статус сервисов»" } @@ -1520,6 +1664,7 @@ "change": { "en": "Minor issues fixed", "zh": "修复了一些小问题", + "zh-TW": "修正了一些小問題", "fr": "Correction de petits problèmes", "ru": "Исправлены некоторые мелкие проблемы" } @@ -1535,6 +1680,7 @@ "change": { "en": "IP cards and IP lookup now show the time zone of the located IP, with its current UTC offset", "zh": "IP 信息卡片与 IP 查询新增时区显示,并附带当前 UTC 偏移", + "zh-TW": "IP 資訊卡片與 IP 查詢新增時區顯示,並附上目前的 UTC 偏移", "fr": "Les cartes IP et la recherche d'IP affichent désormais le fuseau horaire de l'IP localisée, avec son décalage UTC actuel", "ru": "На карточках IP и в поиске по IP теперь отображается часовой пояс найденного IP-адреса и его текущее смещение UTC" } @@ -1544,6 +1690,7 @@ "change": { "en": "Connectivity: import curated test lists — country packs (Iran, Russia, China) plus AI, social, streaming, gaming, developer, cloud, crypto and news sets", "zh": "网络连通性支持导入内置测试列表:伊朗、俄罗斯、中国等国家合集,以及 AI、社交、流媒体、游戏、开发者、云服务、加密交易所、新闻等主题合集", + "zh-TW": "網路連通性支援匯入內建測試列表:伊朗、俄羅斯、中國等國家合集,以及 AI、社群、串流影音、遊戲、開發者、雲端服務、加密貨幣交易所、新聞等主題合集", "fr": "Connectivité : importez des listes de tests prêtes à l'emploi — packs pays (Iran, Russie, Chine) et ensembles IA, réseaux sociaux, streaming, jeux, développeurs, cloud, crypto et actualités", "ru": "Проверка доступности: импорт готовых списков — наборы по странам (Иран, Россия, Китай), а также ИИ, соцсети, стриминг, игры, разработка, облака, криптобиржи и новости" } @@ -1553,6 +1700,7 @@ "change": { "en": "Earth Online: see visitor status, global network outages, and share your own status", "zh": "地球在线:查看全球访客的状态、全球网络故障情况,以及分享自己的状态", + "zh-TW": "地球線上:檢視全球訪客的狀態、全球網路故障情況,以及分享自己的狀態", "fr": "La Terre en ligne : voyez le statut des visiteurs, les pannes de réseau mondiales et partagez votre statut", "ru": "Земля онлайн: смотрите статус посетителей, глобальные сбои сети и делитесь своим статусом" } @@ -1562,6 +1710,7 @@ "change": { "en": "New achievements to unlock", "zh": "新增一批可以解锁的成就", + "zh-TW": "新增一批可以解鎖的成就", "fr": "Nouveaux succès à débloquer", "ru": "Новые достижения" } @@ -1571,6 +1720,7 @@ "change": { "en": "Connectivity cards now show real site favicons, and the test capacity grows to 60", "zh": "连通性卡片改用网站真实图标显示,可测试数量上限提升至 60 个", + "zh-TW": "連通性卡片改用網站真實圖示顯示,可測試數量上限提升至 60 個", "fr": "Les cartes de connectivité affichent désormais les vraies favicons des sites, et la capacité de test passe à 60", "ru": "Карточки доступности теперь показывают настоящие favicon сайтов, а лимит тестов увеличен до 60" } @@ -1580,6 +1730,7 @@ "change": { "en": "Optimized some program logic to increase code reuse rate", "zh": "优化了一些程序逻辑,提高代码复用率", + "zh-TW": "最佳化了一些程式邏輯,提高程式碼複用率", "fr": "Optimisation de certaines logiques de programmation pour augmenter le taux de réutilisation du code", "ru": "Оптимизация некоторых логических программ для повышения коэффициента повторного использования кода" } @@ -1589,6 +1740,7 @@ "change": { "en": "Fixed some issues", "zh": "修复了一些问题", + "zh-TW": "修正了一些問題", "fr": "Correction de petits problèmes", "ru": "Исправлены некоторые проблемы" } @@ -1604,6 +1756,7 @@ "change": { "en": "New tool: In-depth Persona Check — see how much of what sites read agrees with the country you want to be taken for", "zh": "新增工具:深度画像检测——看看网站能读到的信息,有多少和你想被当成的国家对得上", + "zh-TW": "新增工具:深度畫像檢測——看看網站能讀到的資訊,有多少和你想被當成的國家對得上", "fr": "Nouvel outil : Vérification de persona approfondie — voyez dans quelle mesure ce que lisent les sites correspond au pays pour lequel vous voulez passer", "ru": "Новый инструмент: углублённая проверка портрета — насколько то, что видят сайты, совпадает со страной, за жителя которой вы хотите себя выдавать" } @@ -1613,6 +1766,7 @@ "change": { "en": "Connectivity: preset sites are now removable, plus new Global E-commerce and Brazil Essentials import lists", "zh": "网络连通性测试可删除预设网站、新增国际电商平台、巴西常用网站导入列表", + "zh-TW": "網路連通性測試可刪除預設網站、新增國際電商平台、巴西常用網站匯入列表", "fr": "Connectivité : les sites prédéfinis sont désormais supprimables, avec de nouvelles listes importables « E-commerce mondial » et « Essentiels Brésil »", "ru": "Проверка доступности: предустановленные сайты теперь можно удалять, добавлены импортируемые списки «Электронная коммерция» и «Бразилия: основные»" } @@ -1622,6 +1776,7 @@ "change": { "en": "Connectivity: multi-round test results now render as beautiful latency bars", "zh": "使用精美的柱状图展示多次刷新模式下的网络连通性测试结果", + "zh-TW": "使用精美的長條圖展示多次重新整理模式下的網路連通性測試結果", "fr": "Connectivité : les résultats des tests multi-passes s'affichent désormais en élégantes barres de latence", "ru": "Проверка доступности: результаты многократных тестов теперь отображаются изящными столбиками задержки" } @@ -1631,6 +1786,7 @@ "change": { "en": "Optimized multiple user experience", "zh": "优化了多个地方的用户体验", + "zh-TW": "最佳化了多個地方的使用者體驗", "fr": "Optimisation de l'expérience utilisateur dans plusieurs endroits", "ru": "Оптимизация пользовательского опыта в нескольких местах" } @@ -1640,6 +1796,7 @@ "change": { "en": "Optimized date display in multiple places", "zh": "优化多处日期格式显示", + "zh-TW": "最佳化多處日期格式顯示", "fr": "Optimisation de l'affichage des dates dans plusieurs endroits", "ru": "Оптимизация отображения дат в нескольких местах" } @@ -1649,6 +1806,7 @@ "change": { "en": "Fixed some issues", "zh": "修复了一些问题", + "zh-TW": "修正了一些問題", "fr": "Correction de petits problèmes", "ru": "Исправлены некоторые проблемы" } @@ -1664,6 +1822,7 @@ "change": { "en": "For developers: refactored the multi-language architecture, making it easier to add new languages", "zh": "为开发者:重构多国语言架构,添加新语言变得更容易", + "zh-TW": "為開發者:重構多國語言架構,新增語言變得更容易", "fr": "Pour les développeurs : refonte de l'architecture multi-langue, rendant plus facile l'ajout de nouvelles langues", "ru": "Для разработчиков: переработана архитектура многоязычности, чтобы было легче добавлять новые языки" } @@ -1673,6 +1832,7 @@ "change": { "en": "For developers: added section promotion slots, can add promotion content in different sections as needed", "zh": "为开发者:新增 Section 推广位,可以根据需要,在不同的 Section 增加推广内容", + "zh-TW": "為開發者:新增 Section 推廣位,可以依需要在不同的 Section 增加推廣內容", "fr": "Pour les développeurs : ajout de slots promotionnels par section, permettant d'ajouter du contenu promotionnel dans différentes sections selon les besoins", "ru": "Для разработчиков: добавлены слоты продвижения, чтобы можно было добавлять продвижение в разные секции в зависимости от потребностей" } @@ -1682,6 +1842,7 @@ "change": { "en": "IPilot can now run some of the tests for you", "zh": "IPilot 现在可以帮使用者运行部分测试", + "zh-TW": "IPilot 現在可以幫你執行部分測試", "fr": "IPilot peut désormais exécuter certains tests pour vous", "ru": "IPilot теперь может запускать часть тестов за вас" } @@ -1691,6 +1852,7 @@ "change": { "en": "DNS Resolver now groups results by country", "zh": "DNS 解析器现在按国家分组显示结果", + "zh-TW": "DNS 解析器現在依國家分組顯示結果", "fr": "Le DNS Resolver affiche désormais les résultats par pays", "ru": "DNS Resolver теперь группирует результаты по странам" } @@ -1700,6 +1862,7 @@ "change": { "en": "Fixed some issues", "zh": "修复了一些问题", + "zh-TW": "修正了一些問題", "fr": "Correction de divers problèmes", "ru": "Исправлены некоторые проблемы" } diff --git a/index.html b/index.html index dce1b50a6..aea5762e2 100644 --- a/index.html +++ b/index.html @@ -56,7 +56,7 @@ "name": "IPCheck.ing", "url": "__SITE_URL__/", "description": "Open-source IP toolbox: lookup, connectivity tests, WebRTC and DNS leak detection, speed test, MTR, Whois, and browser fingerprint.", - "inLanguage": ["en", "zh-CN", "fr", "ru"], + "inLanguage": ["en", "zh-CN", "zh-TW", "fr", "ru"], "publisher": { "@type": "Person", "name": "Jason Ng" } } @@ -351,6 +351,16 @@ '正在问 DNS 你到底在哪…', '马上就好,真的…', ], + 'zh-TW': [ + '正在安裝網路卡驅動程式…', + '正在把水晶頭對準 RJ45 接頭…', + '正在把光纖插進路由器…', + '正在吹掉網路線接頭上的灰塵…', + '正在重新啟動數據機(第 1 次)…', + '正在與電信業者三次握手…', + '正在問 DNS 你到底在哪…', + '馬上就好,真的…', + ], fr: [ 'Installation du pilote de la carte réseau…', 'Alignement de la fiche RJ45…', @@ -379,6 +389,7 @@ const SLOW_HINTS = { en: 'Waiting too long? Try IPCheck.ing Lite, or refresh the page.', zh: '等得太久?试试 IPCheck.ing Lite,或刷新页面。', + 'zh-TW': '等太久了?試試 IPCheck.ing Lite,或重新整理頁面。', fr: 'C’est un peu long ? Essayez IPCheck.ing Lite, ou actualisez la page.', ru: 'Слишком долго? Попробуйте IPCheck.ing Lite или обновите страницу.', }; From 7b3594efee70e367e591d14733d20c4b90421074 Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Tue, 25 Aug 2026 00:15:22 +0800 Subject: [PATCH 09/17] docs: add the Traditional Chinese README Translate README_ZH into Taiwan-terminology Traditional Chinese, link it from every README's language switcher next to Simplified Chinese, extend the language-support line in all five, and count it among the maintained READMEs in CONTRIBUTING. Co-Authored-By: Claude Fable 5 --- CONTRIBUTING.md | 2 +- README.md | 4 +- README_FR.md | 4 +- README_RU.md | 4 +- README_ZH.md | 4 +- README_ZH_TW.md | 167 ++++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 176 insertions(+), 9 deletions(-) create mode 100644 README_ZH_TW.md diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fc70e71b4..b65cf2f4e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -80,7 +80,7 @@ runnable directly as `pnpm fetch-favicons`). Only if auto-fetch can't find a usa PNG do you hand-source one (on macOS, `sips` handles ICO→PNG). Remember to commit the PNGs with your change — CI stays offline and only checks they exist. -**README translations** — beyond the four READMEs we maintain (`en` / `zh` / `fr` / +**README translations** — beyond the five READMEs we maintain (`en` / `zh` / `zh-TW` / `fr` / `ru`), community-maintained translations in any language are welcome. Create `README_.md` from the English [README.md](README.md) (the canonical source), open it with a one-line "community-maintained translation — English is canonical" diff --git a/README.md b/README.md index 6576cfba7..373429d27 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) 👉 Demo: [https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ Feel free to bookmark the demo or deploy your own. * 📲 **PWA Supported**:Can be added as a desktop app on your phone as well as a Chrome app on your computer. * ⌨️ **Keyboard Shortcuts**: Supports keyboard shortcuts for all functions, press `?` to view the shortcut list. * 🌍 Based on availability test results, it indicates whether global internet access is currently feasible. -* 🇺🇸 🇨🇳 🇷🇺 🇫🇷 English, Chinese, Russian, French support. +* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 English, Simplified Chinese, Traditional Chinese, Russian, French support. ## 📕 How to Use diff --git a/README_FR.md b/README_FR.md index e20b47048..b07470173 100644 --- a/README_FR.md +++ b/README_FR.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) 👉 Démo: [https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ Notes: Vous pouvez utiliser ma démo gratuitement et vous pouvez également la d * 📲 **Prise en charge de PWA** : Peut être ajouté en tant qu'application de bureau sur votre téléphone ainsi qu'en tant qu'application Chrome sur votre ordinateur. * ⌨️ **Raccourcis clavier** : Prend en charge les raccourcis clavier pour toutes les fonctions, appuyez sur `?` pour afficher la liste des raccourcis. * 🌍 Basé sur les résultats des tests de disponibilité, il indique si l'accès Internet mondial est actuellement réalisable. -* 🇺🇸 🇨🇳 🇷🇺 🇫🇷 Prise en charge de l'anglais, du chinois, du russe et du français. +* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 Prise en charge de l'anglais, du chinois simplifié, du chinois traditionnel, du russe et du français. ## 📕 Comment utiliser diff --git a/README_RU.md b/README_RU.md index 9d2f10d2c..7d9b69216 100644 --- a/README_RU.md +++ b/README_RU.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Сборка и публикация Docker](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) 👉 Демо: [https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ * 📲 **Поддержка PWA**: сайт можно установить как приложение на телефон или компьютер через Chrome. * ⌨️ **Сочетания клавиш**: все функции поддерживают горячие клавиши; нажмите `?`, чтобы открыть их список. * 🌍 По результатам проверки доступности определяется, возможен ли полноценный доступ к глобальному интернету. -* 🇺🇸 🇨🇳 🇷🇺 🇫🇷 Поддерживаются английский, китайский, русский и французский языки. +* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 Поддерживаются английский, китайский (упрощённый и традиционный), русский и французский языки. ## 📕 Использование diff --git a/README_ZH.md b/README_ZH.md index eda9e9a12..f9ba9e76b 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) 👉 在这里体验:[https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ * 📲 **支持 PWA**:可以添加为手机应用以及电脑里的桌面应用,方便使用 * ⌨️ **支持快捷键**:可以随时输入 `?` 查看快捷键菜单 * 🌍 根据可用性检测结果,返回目前是否可以访问全世界网络的提示 -* 🇺🇸 🇨🇳 🇷🇺 🇫🇷 支持中文、英文、俄文、法文 +* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 支持简体中文、繁体中文、英文、俄文、法文 ## 📕 如何使用 diff --git a/README_ZH_TW.md b/README_ZH_TW.md new file mode 100644 index 000000000..a02a1639b --- /dev/null +++ b/README_ZH_TW.md @@ -0,0 +1,167 @@ +# 🧰 IP 工具箱 + +
+ +![IPCheck.ing Banner](https://raw.githubusercontent.com/jason5ng32/MyIP/main/public/github/gh_banner.png) + +jason5ng32%2FMyIP | Trendshift + +[![Mentioned in Awesome Self Hosted](https://awesome.re/mentioned-badge.svg)](https://github.com/awesome-selfhosted/awesome-selfhosted) + +![GitHub Repo stars](https://img.shields.io/github/stars/jason5ng32/MyIP) +![GitHub forks](https://img.shields.io/github/forks/jason5ng32/myip) +![Docker Pulls](https://img.shields.io/docker/pulls/jason5ng32/myip) + +[![Website](https://img.shields.io/website?url=https%3A%2F%2Fipcheck.ing&up_message=online&label=IPCheck.ing 'IPCheck.ing')](https://ipcheck.ing) +![PWA](https://img.shields.io/badge/PWA-Supported-blue) + +![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) +![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) + +🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) + +👉 在這裡體驗:[https://ipcheck.ing](https://ipcheck.ing) + +你可以直接使用我已經架設好的服務,也可以自行架設。 + +[![Deploy with Docker](https://raw.githubusercontent.com/jason5ng32/MyIP/main/public/github/Docker.svg)](https://hub.docker.com/r/jason5ng32/myip) + +
+ +## 👀 主要功能 + +* 🛜 **看自己的 IP**:從多個 IPv4 和 IPv6 來源偵測並顯示本機的 IP +* 🔍 **查任意 IP 資訊**:可以透過小工具查詢任意 IP 的資訊 +* 🕵️ **看 IP 資訊**:顯示所有 IP 的相關資訊,包括國家、地區、ASN、地理位置等 +* 🛰️ **ASN 歷史與上游拓撲**:查看 IP 前綴的歷史 AS 宣告記錄,以及該 ASN 到 Tier 1 骨幹網路的上游路徑圖 +* 🚦 **可用性偵測**:偵測一些網站的可用性:Google, Github, Youtube, 網易, 百度等 +* 📡 **服務可用性**:展示一些知名服務(Claude、OpenAI、GitHub、Cloudflare 等)的即時可用狀態,資料來自它們的官方狀態頁,可查看各子服務狀態與最近的事故 +* 🚥 **WebRTC 偵測**:查看使用 WebRTC 連線時使用的 IP +* 🛑 **DNS 洩漏測試**:查看 DNS 出口資訊,以便得知在 VPN/代理的情況下,是否存在 DNS 洩漏隱私的風險 +* 🚀 **網速測試**:利用邊緣網路進行網速測試 +* 🚏 **分流測試**:配合代理軟體的規則設定,測試規則設定是否正常 +* ⏱️ **全球延遲測試**:從分佈在全球的多個伺服器進行延遲測試,了解你與全球網路的連線速度 +* 🚉 **MTR 測試**:從分佈在全球的多個伺服器進行 MTR 測試,了解你與全球的連線路徑 +* 🔦 **DNS 解析**:從多個管道對網域名稱進行 DNS 解析,取得即時的解析結果,可用於污染判斷 +* 🚧 **封鎖測試**:檢查特定的網站在部分國家是否被封鎖 +* 📓 **Whois 查詢**:對網域名稱或 IP 進行 whois 資訊查詢 +* 📀 **MAC 位址查詢**:查詢實體位址的歸屬資訊 +* 🖥️ **瀏覽器指紋**:多種方式查看瀏覽器指紋 +* 📋 **網路安全檢查清單**:一共有 258 個項目、完整全面的網路安全檢查清單 + +## 💪 同時還支援 + +* 🌗 **深色模式**:根據系統設定自動切換深色/日間模式,也可以手動切換 +* 📲 **支援 PWA**:可以新增為手機應用程式以及電腦裡的桌面應用程式,方便使用 +* ⌨️ **支援快捷鍵**:可以隨時輸入 `?` 查看快捷鍵選單 +* 🌍 根據可用性偵測結果,回傳目前是否可以存取全世界網路的提示 +* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 支援簡體中文、繁體中文、英文、俄文、法文 + +## 📕 如何使用 + +### 在 Node 環境部署 + +確保你系統裡已經有 Node.js 環境。 + +複製程式碼: + +```bash +git clone https://github.com/jason5ng32/MyIP.git +``` + +安裝與編譯。本專案使用 pnpm,如果你還沒有,請先安裝(npm 隨 Node 一起提供,這條指令一定能用): + +```bash +npm install -g pnpm +pnpm install && pnpm run build +``` + +執行: + +```bash +pnpm start +``` + +程式會執行在 18966 連接埠。 + +### 使用 Docker + +點選頂部的部署到 Docker 按鈕,即可完成部署,又或者,直接輸入下面的指令: + +```bash +docker run -d -p 18966:18966 --name myip --restart always jason5ng32/myip:latest +``` + +## 📖 官方說明文件 + +完整說明文件在 MyIP 文件中心:**[docs.ipcheck.ing](https://docs.ipcheck.ing)**(右上角可切換中文) + +* [開發者指南](https://docs.ipcheck.ing/developer/zh) —— 部署、設定、架構說明與參與貢獻 +* [知識庫](https://docs.ipcheck.ing/knowledge-base/zh) —— 每個工具的使用說明、網路問題疑難排解指南、網路概念入門 + +## 🤝 參與貢獻 + +歡迎參與貢獻!我們維護著一批對新手友善的任務,每條都寫明了具體檔案、驗收標準,並有測試引導你完成: + +* 🏷️ [Good first issues](https://github.com/jason5ng32/MyIP/labels/good%20first%20issue) —— 新增你所在國家的 DNS 解析服務、新增精選網站清單、把 README 翻譯成你的語言、潤飾翻譯等 +* 🌐 [TRANSLATING.md](TRANSLATING.md) —— 把 UI 帶到你的語言:一個語言包加上一行註冊表,以及 **部分翻譯也是歡迎的首次 PR** +* 📄 [CONTRIBUTING.md](CONTRIBUTING.md) —— 環境架設、開發約定與 PR 流程(請將 PR 提交到 `dev` 分支) + +## ⚙️ 設定 + +開始之前,有兩項設定最重要: + +* **MaxMind GeoLite2(必須)** —— 免費憑證,為 IP 地理位置與 ASN 查詢提供資料。不設定時 MaxMind 資料來源會回傳 503。→ [MaxMind 設定指南](https://docs.ipcheck.ing/developer/getting-started/zh/maxmind-setup) +* **`ALLOWED_DOMAINS`(使用真實網域時必須)** —— 後端 API 的網域白名單。不設定時,來自非 localhost 網域的請求都會收到 403。→ [反向代理與網域](https://docs.ipcheck.ing/developer/getting-started/zh/reverse-proxy-and-domains) + +```bash +docker run -d -p 18966:18966 \ + -e MAXMIND_ACCOUNT_ID="YOUR_ACCOUNT_ID" \ + -e MAXMIND_LICENSE_KEY="YOUR_LICENSE_KEY" \ + -e MAXMIND_AUTO_UPDATE="true" \ + -e ALLOWED_DOMAINS="your-domain.com" \ + --name myip --restart always \ + jason5ng32/myip:latest +``` + +其餘全部為選用設定 —— 第三方 API Key、安全與流量限制、日誌、Sentry、CURL API 網域等,詳見[環境變數參考](https://docs.ipcheck.ing/developer/reference/zh/environment-variables)。 + + +## 👩🏻‍💻 進階用法 + +如果你在透過代理上網,可以考慮在你的代理設定裡,增加下面的規則(請根據你使用的用戶端進行修改),這樣就可以同時查詢真實 IP 和代理後的 IP: + +```ini +# IP Testing +IP-CIDR,1.0.0.2/32,Proxy,no-resolve +IP-CIDR6,2606:4700:4700::1111/128,Proxy,no-resolve +DOMAIN,4.ipcheck.ing,DIRECT +DOMAIN,6.ipcheck.ing,DIRECT +# Rule Testing +DOMAIN,ptest-1.ipcheck.ing,Proxy1 +DOMAIN,ptest-2.ipcheck.ing,Proxy2 +DOMAIN,ptest-3.ipcheck.ing,Proxy3 +DOMAIN,ptest-4.ipcheck.ing,Proxy4 +DOMAIN,ptest-5.ipcheck.ing,Proxy5 +DOMAIN,ptest-6.ipcheck.ing,Proxy6 +DOMAIN,ptest-7.ipcheck.ing,Proxy7 +DOMAIN,ptest-8.ipcheck.ing,Proxy8 +``` + +## 💖 贊助者 + +作為一個開源專案,我非常感謝以下贊助者對我的支持: + + + +1Password + +Greptile + +Sentry + +GitBook + +v.ps + +Cloudflare Project Alexandria From 2cc732a02733e49f0683a52567aae95829fb09b1 Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Tue, 25 Aug 2026 00:24:24 +0800 Subject: [PATCH 10/17] Improvements --- common/locale-registry.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/common/locale-registry.js b/common/locale-registry.js index c00fac374..67da805b7 100644 --- a/common/locale-registry.js +++ b/common/locale-registry.js @@ -12,7 +12,7 @@ export const LOCALES = [ { code: 'en', nativeName: 'English', flag: 'us', apiTag: 'en', htmlLang: 'en', status: 'full' }, { code: 'zh', nativeName: '简体中文', flag: 'cn', apiTag: 'zh-CN', htmlLang: 'zh-CN', status: 'full' }, - { code: 'zh-TW', nativeName: '繁體中文', flag: 'tw', apiTag: 'zh-CN', htmlLang: 'zh-TW', status: 'full' }, + { code: 'zh-TW', nativeName: '繁體中文', flag: 'tw', apiTag: 'zh-CN', htmlLang: 'zh-TW', status: 'full' }, // APIs does not support zh-TW, so apiTag alias to zh-CN { code: 'fr', nativeName: 'Français', flag: 'fr', apiTag: 'fr', htmlLang: 'fr', status: 'full' }, { code: 'ru', nativeName: 'Русский', flag: 'ru', apiTag: 'ru', htmlLang: 'ru', status: 'full' }, { code: 'pt-BR', nativeName: 'Português (Brasil)', flag: 'br', apiTag: 'pt-BR', htmlLang: 'pt-BR', status: 'beta' }, From 017e2b88782b4401c9965375630f314da67d76f0 Mon Sep 17 00:00:00 2001 From: iamprashanthchowdary Date: Mon, 24 Aug 2026 18:13:20 +0530 Subject: [PATCH 11/17] Feat(connectivity): add India import list --- frontend/data/connectivity-import-lists.js | 16 ++++++++++++++++ frontend/locales/en.json | 1 + frontend/locales/fr.json | 1 + frontend/locales/pt-BR.json | 1 + frontend/locales/ru.json | 1 + frontend/locales/zh.json | 1 + public/favicons/amfi.png | Bin 0 -> 681 bytes public/favicons/bigbasket.png | Bin 0 -> 548 bytes public/favicons/digilocker.png | Bin 0 -> 6452 bytes public/favicons/flipkart.png | Bin 0 -> 1421 bytes public/favicons/groww.png | Bin 0 -> 1317 bytes public/favicons/harghartiranga.png | Bin 0 -> 381 bytes public/favicons/paytm.png | Bin 0 -> 995 bytes public/favicons/phonepe.png | Bin 0 -> 1377 bytes public/favicons/policybazaar.png | Bin 0 -> 1914 bytes public/favicons/zomato.png | Bin 0 -> 566 bytes 16 files changed, 21 insertions(+) create mode 100644 public/favicons/amfi.png create mode 100644 public/favicons/bigbasket.png create mode 100644 public/favicons/digilocker.png create mode 100644 public/favicons/flipkart.png create mode 100644 public/favicons/groww.png create mode 100644 public/favicons/harghartiranga.png create mode 100644 public/favicons/paytm.png create mode 100644 public/favicons/phonepe.png create mode 100644 public/favicons/policybazaar.png create mode 100644 public/favicons/zomato.png diff --git a/frontend/data/connectivity-import-lists.js b/frontend/data/connectivity-import-lists.js index 77fabf968..093270eb5 100644 --- a/frontend/data/connectivity-import-lists.js +++ b/frontend/data/connectivity-import-lists.js @@ -94,6 +94,22 @@ export const IMPORT_LISTS = [ { id: 'dzen', name: 'Dzen', url: 'https://dzen.ru/favicon.ico' }, ], }, + { + id: 'india', + emoji: '🇮🇳', + members: [ + { id: 'harghartiranga', name: 'Har Ghar Tiranga', url: 'https://harghartiranga.com/favicon.ico' }, + { id: 'zomato', name: 'Zomato', url: 'https://www.zomato.com/favicon.ico' }, + { id: 'paytm', name: 'Paytm', url: 'https://paytm.com/favicon.ico' }, + { id: 'flipkart', name: 'Flipkart', url: 'https://www.flipkart.com/favicon.ico' }, + { id: 'bigbasket', name: 'Bigbasket', url: 'https://www.bigbasket.com/favicon.ico' }, + { id: 'phonepe', name: 'Phonepe', url: 'https://www.phonepe.com/favicon.ico' }, + { id: 'policybazaar', name: 'Policybazaar', url: 'https://www.policybazaar.com/favicon.ico' }, + { id: 'digilocker', name: 'Digilocker', url: 'https://cdn.digilocker.gov.in/digilocker-landing-page/assets/img/meta/favicon-32x32.png' }, + { id: 'amfi', name: 'AMFI', url: 'https://www.amfiindia.com/favicon.ico' }, + { id: 'groww', name: 'Groww', url: 'https://groww.in/favicon.ico' }, + ], + }, { id: 'china', emoji: '🇨🇳', diff --git a/frontend/locales/en.json b/frontend/locales/en.json index d08273a6c..8c5a1f3bc 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -1235,6 +1235,7 @@ "defaults": "System Defaults", "iran": "Iran Essentials", "russia": "Russia Essentials", + "india": "Indian Essentials", "china": "China Essentials", "brazil": "Brazil Essentials", "ai": "AI Services", diff --git a/frontend/locales/fr.json b/frontend/locales/fr.json index 9ae4ced8f..082875611 100644 --- a/frontend/locales/fr.json +++ b/frontend/locales/fr.json @@ -1235,6 +1235,7 @@ "defaults": "Sites par défaut", "iran": "Essentiels Iran", "russia": "Essentiels Russie", + "india": "Essentiels India", "china": "Essentiels Chine", "brazil": "Essentiels Brésil", "ai": "Services IA", diff --git a/frontend/locales/pt-BR.json b/frontend/locales/pt-BR.json index f7693d94f..17a230941 100644 --- a/frontend/locales/pt-BR.json +++ b/frontend/locales/pt-BR.json @@ -1235,6 +1235,7 @@ "defaults": "Padrões do sistema", "iran": "Essenciais do Irã", "russia": "Essenciais da Rússia", + "india": "Essenciais da Índia", "china": "Essenciais da China", "brazil": "Essenciais do Brasil", "ai": "Serviços de IA", diff --git a/frontend/locales/ru.json b/frontend/locales/ru.json index 4b1879e3a..6ee0ce8a3 100644 --- a/frontend/locales/ru.json +++ b/frontend/locales/ru.json @@ -1235,6 +1235,7 @@ "defaults": "Системный набор", "iran": "Иран: основные", "russia": "Россия: основные", + "india": "Индия: основные", "china": "Китай: основные", "brazil": "Бразилия: основные", "ai": "ИИ-сервисы", diff --git a/frontend/locales/zh.json b/frontend/locales/zh.json index acc7a9573..3f653fed4 100644 --- a/frontend/locales/zh.json +++ b/frontend/locales/zh.json @@ -1235,6 +1235,7 @@ "defaults": "系统预设", "iran": "伊朗常用", "russia": "俄罗斯常用", + "india": "印度常用", "china": "中国常用", "brazil": "巴西常用", "ai": "AI 服务", diff --git a/public/favicons/amfi.png b/public/favicons/amfi.png new file mode 100644 index 0000000000000000000000000000000000000000..8cfd0445491adaf17a23626083f6c307f9ff1804 GIT binary patch literal 681 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!bOU@sT-^(N7?!sZiJUYheF19Z zD+%%oX6TL)tL0pr{o%xIAFW*z9-mHNU|^EA8VftIP>#qYn@-)UuA z=$p`HsBT&R#`l`Sr<=^7*9!N1y=JesGrDS@-GP%_2}L`#&Rxs)NSd;-PjBD7l6mJX zP5&}3f3V|MK#9U>QNMpLDy7#lEc+9l;mZ2q{@QJf7ZroJ`5AXIx=7DsUUZ%z>!GB> z{8ZbmA9w_G8NIms8P+z&JQQ?@;Z;!kxq`WM?;+s>nd}Nnbsg?~kGr(_>rWMj%~2kb zI-6ylxULb{8CaO7R&eTz)kV(B|64XEpIRYn?!{vF^3M9%94~H$J4f*BXG{`Ikbjxu zbw26_!xLMV`|+zzb#A!%o*~lqLY!8tJ`us@jdM(WqIn@gB)Mi_`J3)3>R_(bCoq`x|vNg81z%VsQV{pH(}D<0OcNkw|P-|E!lU8%`(6HnU9D$Cwtz3@y(f$>qPfILH!S?t-( z6CW&XHFYrK-I9}Y^1>#=GTk+d%jWJ{b@PVG#Z88#mHLdICaqO<=wCLe_wM7L!P{A8 z=vkLq2=7*Ne9pJ)P;CU`l@GmVos66hT1vAPAK^N1`HhddG3y<-JVBiUvB`UP_r4RG v&9vpv-Azes7K;LBt3DC=a4q`(#(xZ4m$kQfDZR-BCLsn-S3j3^P6lPuK literal 0 HcmV?d00001 diff --git a/public/favicons/bigbasket.png b/public/favicons/bigbasket.png new file mode 100644 index 0000000000000000000000000000000000000000..4d01c40cea35ccb249756d8675ed647a4ebbb8d5 GIT binary patch literal 548 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 btN-Lbi|0%VmRWrO00000NkvXXu0mjf3B1p) literal 0 HcmV?d00001 diff --git a/public/favicons/groww.png b/public/favicons/groww.png new file mode 100644 index 0000000000000000000000000000000000000000..ccbd6432254459851cf42621d431c97582f48182 GIT binary patch literal 1317 zcmV+=1={+FP)3xd@HG93V9~?Ex1-cNndHur#~cwo7k0xH6GLrq#?h=*@y!VLPNT zpfwl`#tec8hytY|#K6bJ@TIbOr|n}obB6+qWY*}dwyieA9Po>v!yBYy0tzS#oH&$x z2up1J>QmkTx#h}R3V3dfnP(aHrYfl~1?nj3u-TGk_#gP{(Q{H4XV(v|tj+heYIakgDST z7hdK4p+SHZubH{Zq1zY;gGt~0FbNo2kXQ+{$Gjaoq+0=K;jNf6blazj92FqWH8_>= zY1_W%Z2)O`#Z<;(=8|Pg`c9u)IpmfPaTkte&T?X9Cls`c7tXdFhZZ{~>7X=q7J5X52M>xa0y=rZJP zS`Y+)sZ&5jIpL3Ip_mHkdg3zI>RsYlunS}O4nQ$&*t7W{R~P*Ux#VcI+JH!fJua(& zgpllm%MZC6Sa+EGjD83m>i5m%;cpg_zNRRqqo@ER1|T~#VDF}bNEH7;7|3Gk^z5Z{voI? zK-L*Qr8zMumQLFUN0b^Sz(8^UvNJ>WuRlcZ16QJ_6Ub=5q6NN1|9yS@zWz`&=35h! z12{IS5FD|MX155dP@qbX?1u}D{Tx_(7=KzG+~m-a+|mq?x1-}RM3-$M^1rT+|QU~}7 za0dEO${}GAXqi1toH#mOS_|?A#Fy;{&I%O+Irlcsc1?J=~^M%(@E8`hUZ72LiMaT=Mv z?EG*CHEPN9reoN41KFM~QnMi8-1$)?93eFe+}xsoVP8{=WPsEi!dTK|aByQp4X b*7y8>4fF#qolfyJ00000NkvXXu0mjf2+U;8 literal 0 HcmV?d00001 diff --git a/public/favicons/harghartiranga.png b/public/favicons/harghartiranga.png new file mode 100644 index 0000000000000000000000000000000000000000..595d216d1c4e32bf99afc8a7cfcd6c3c29009c7a GIT binary patch literal 381 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!!UKFlT-^(NggV*&&o&nB;rRdm z|L3K?{2lE7W|;|fumidO=b6-kC==lhj{h@_LCiTO3@r?Ej?VmlWb*%M8k;smi`#(ES{G_Lg zV@O2n+exQ|niY6l9ajaVE%_$s@Z|sg&9_7YX3pBN>Tu)%rDA^00})GuEEWIeZM)Pf zCAi|*>o0+eC2qf|NvShjVylr8mpzr^0&j|LLjD8iYNN)whn_6{OdB6mX(!AvUV7{4 z_JnPd8&94~X=H8SJP^d{eWUvI^j?jEV><+{P1RwLZ(`r{-~&gy{>LB2@BVxIZFcxG zb$4}VqQ)9^QI~_kKsX*3|mv ZyiNC0v_5TGk_7Y=gQu&X%Q~loCIA4~s$~EG literal 0 HcmV?d00001 diff --git a/public/favicons/paytm.png b/public/favicons/paytm.png new file mode 100644 index 0000000000000000000000000000000000000000..6b597777d94e30364da28363309b27b773d654b0 GIT binary patch literal 995 zcmV<9104K`P)D)U6vuzxC2s4%sqFy?pWK|V5pB~dwv=Qbs%lxHkS%m53?R~_f+Dp^U_k<`L>-VC zL|h4XG$k8LnuS0ts1u2$9(seTdWfYfk(14KY^X~c`xp-F9JbSQaPpT<-@Wg<_x}I) z-hKD!1OUqw1);|gwE((sa?lXsE;TX5m|YVrR}`e`gF_)UiJ(YL3Q7q5n?olD&~YO4 zxZtNhb*nxhm&AE@4Xj*ydK+U+gm`uAz9vP`$5Rv(-hxiP00H%eR0RQUMRxVW3o+*gS%e5Qn^Ap zvju=xc5>WdC!N_c-Jd!6GU?0~&wQ^im4S#Klw*d!_7nmR&?*peH#p9_CCIiB5a?@c zl^=h3$o0>Eps(*3qeFhi!l$_zOR%w7;L7{wSpGH5rysq+-0cKs=RQL%K~yt*)sj&S zXRk5d8)=A8?0dAp*=ydbUfIQ!_s+3he!})26-GyV_38j@Y!(2BpEaJ3_>FN=F$m{R zfntZpl}5~e&yRWq#Pk;p>*3d?#f@BnxmbdC#)r5WOE4Bb1HfD10e(wmnTsXx$}T#^ zZcbARv|JuVZZym*yI72Wh}Yxd)z{PY`Qr{dqr*Oa_vG0wKkbOTSgx3CQwy|zN(yj7 zb}<$n!0RzGymjLe0(f_PsGju++0CsRmjIZMjdG8_1cQCX*l#!H`|S-5^-<0wK#0@R z^;05p^#YNP-|Q%(P7z&LW9qA=x^1e!YAW00&~4mVN||hvfMhC5@&H97@2{gi+H5ZX zVD{Ue4@|&pY^7CzO_P^Q@U05T0`8HZE-}V{Pcc2|Y!#=*edV$c0 z-x6{1{yMX<6-zrxh=J(>I+p&70w+CuFh0!SYaRlpWSkD;6Q||!Xt_MAsVu70aQCo?5hAHqYe6#e+TQ|0Murko RwF3YE002ovPDHLkV1n4w+wK4W literal 0 HcmV?d00001 diff --git a/public/favicons/phonepe.png b/public/favicons/phonepe.png new file mode 100644 index 0000000000000000000000000000000000000000..6d91cb92d63c7818ff65c4d52962fc6d46624e51 GIT binary patch literal 1377 zcmV-n1)lneP)i(#eN>X`;q;w%$cI|Ik7mBUr`h7w z?Tli%eN48gh|hLHvGVHpqk_kOQMG3+re7tW|NsABCZPWQ|5_ZJT_B%tIjdF_n`bVj z!?4=x(^zZn+sn(;1$4>y4*vsdzm(R+&-iR^~4gdfEB6LztQvk_x3;g~5 z{sI9fbO8r==A}v#C+E26A3&7u|NsC0|Ns8cDtp}k00d!4L_t(og{4=Aa-%R11q=vG zGq?wYByhp?|3B|`C1O*=*)!Q>7(%p9+lyi7$@fBhB6&W%h4T3=!C60=&6lYa#6fIX z%jGYR|A=6$00v0kmWMmQ~mXJm0gHQX%` z!s}HqX$jx(wr0)ryuT2X3lu`nZ&)@XugfXTxdwvr+DvsK!2Q7rE!SSf7!^Vb!KiKN z5WINBU-uL0UN86i#bsl2fJf{=0}yohX>~o81<+kgAXo!SdWMyB^{=jFQ34hBit7+~ zlJzVZ8r$T3KMIje~8e5%giBL3lrHM?Mzmy1#XrVoEvX3QN;%IBalMoTVLMUC4@d<@cAi`M} z4mmOBEkd@ay8!e}m3=PI6&MakJ$^1?KU4yM3*Z0XtV1{VjGic;IsVl*G@(ia-vbxC zu}LnvM3olh1u{d_RZmjxs+^dc^!=T(M|12^gCSj%^8MPC0b?OUCoDHTfJ337Qf5Zc z^sUKk)FBG$js^%&_URV_-})iJe|8A4@A?2#&`I!1JpjraG(u)}eE=c)JfDy9-tw%d zk*;ju?cP^`)O!F}CVlTPE^51x@nb7b9HbwfHN5tZLYzReS^m&|9CChh6@Xiz_p6Hp zINXMTfB-XS1ob!(TM1l@znr%Kr$H!6Bg_ona)yE41we^j0E3IrU^6570{|TTn*`v8 zKT1GqFydcr0B#(8mjJ~V0L(>z%@{z%0hF>204k7@Q5-Nw6@f>EWr$4z5Wav=p6!R@ z0OkDL*23HAbgK>%02GTFWMeFby@#GIrEE*h;d;HCWn$?7n84nk^CJ_gsdOvK7=ZBA z5-ZZYS5pY-*S_;Q?ow}Nc1MUW@yZXjl-x~>6v#uTh z8q<5m(24L1GZo5wv-_QLd}C{B=9t$>EdW^HJ>y`5*ER6}0wmpm6=$4D1pa8JtzJ*r zSl!9rH==btp#>!Uvnge2zOQFa+}|9~47Fw&lf;}WP$%UeSJu&B^#~!HMiKo|qN-T+ zj#lK~j#ig2T*90%p~XNan8H`9|iTj(j7tl6+Jgy0^p5 zlUUQM8+=dqPR%ElCfvF<|KGa&&@%!PAUNbo7X&0H9N72ir_B+{^fp+m98AO(1Gh(( z%e8SAecU|JmR^gfvtIUpx8O;7Uj>Cs00000NkvXXu0mjf!3~wY literal 0 HcmV?d00001 diff --git a/public/favicons/policybazaar.png b/public/favicons/policybazaar.png new file mode 100644 index 0000000000000000000000000000000000000000..ebff3fbf3f7bfa1f11cbfe0f993794526a5949a7 GIT binary patch literal 1914 zcmV-=2Zi{FP)S%TIjZI}LSmt<}yjUm{D73w2fBbHD+j4u`TPpbd=l8qk z_dMr3-*cYxoadZ#gHyq>nE1djiBBmrNpv+nhlzq3oRyPo7JY~Yye_EMZmXA;SpFA7vdhlkdM*0QqU~ARc%<^ z{X;hbF<5AZ#A6tJs;v&KWYo~EWv%V(ZlbNd5zs<6MKuSJ1ATUz_&^F3jhjHPDA3>^d}nvClQtcgPCcfMH=vvW2}EQ^WYS_2SuP9sK3%(5&d z8G8&DOjp47s|Pc#I_UbuP zWk>}Fj`H?y-rAYYpCTy73|p+uIIdcmX@#UN8N)BXS>qAD|1fWC=kB?D?F!DW zB2$(&+Sts>r>WhTMxLHfJ%qb&;44!&dvMwrC)zl8l*e9Y=@T4oDMBHdrc!kV7vbDO zGW88iznja?qXQg5B=YL__KCZu%1y?iS9DeS*Z+Q}(xr`jj z?{8$(Fdli8|2A>ixml!+UC12&~&HUl-X_$p1Fk=#H7BFE1i)XQM z3x9sIh+)C>1XFt>(3Z`|@g(rqt*m)DZ#-#=@X*Vt50m=#RTp$_D@9cWYwEf8`MmL@ zBlY4I?tC)+U0%j**Qd`S1g=N~pYDwS#GDTtJ;A?r7mn-A$9d$H^t~)e{kuE%9p?4z zwD;f|>)%aX3N9GQMa5&|#6&czF9iCE=ike}PaS{q_uiI+Bgbjjm%b0KNOPzj5!ED; zfz9`~?8#5uF~dvOKiIPRpl(7!$mbbP|txQ=_)+DirZ#$aSgi;vT9@M0^N~Gc=RS} z>(V@^@kqMT53XR|G;W!hE|yE5NJDZF>=JFsXmP+0uVGGK2s9nz-VIDWpAA1rd%5Xo zIw}{BVe@WQKE-qIbk*w^u;TV}GX5j1?-~*V8>&UoQE+le;Gy)w}$FA!4uC(ewSeL*DeqQ1Ug%sZGl6f4AW((Nw`C z!AQ~2Tq}n~`$Ss>oAA>A|86tEAe>n?gQwAd?nE(I)07*qoM6N<$f=qb7 Ag8%>k literal 0 HcmV?d00001 diff --git a/public/favicons/zomato.png b/public/favicons/zomato.png new file mode 100644 index 0000000000000000000000000000000000000000..ede64c25a518d8b94292a15ab3bcc1302fc0cc94 GIT binary patch literal 566 zcmV-60?GY}P)Pue=LvVbsV2BH#v^SJ;3v300?0NHedrb zU;{n}=sf`Y`5_>xZOuhOT%YkTfYK5^6}5pQGsj4tBDCflMJ18GW>X@)0(6cF8HHOF z2~J%dJ#~?kg4AT1$Y|LHaheCdGG71)ZAorx7zwVWnsYE~s?wp9xn|SJk$3?_Hz)jy zxBUQ{@EP3*WngFZ#2OGiD9tyRJYt&sqXu(GAcqxXyW%&RT@!G&xu? zzX9sbvUIo)s}_wDu#(D7s%y3a*-KyPEvG+4G~PM{T1xO9f%|NSj?^5mQW1Ew6cEQc z)Q~QxpxG^HQCldPV}h>j{bKbqqm!D~R!T;1<=z{`AB}VhY|5<55UqRTyM^(JHXGlw zXwiTD7k-ru*nkb#fDQPs05`7QCXf4<@7JB{_w#st0aj;8wl&Frd;kCd07*qoM6N<$ Ef>(z9l>h($ literal 0 HcmV?d00001 From 107f6f8c99f754348a844e9e1feb6869b9b258fe Mon Sep 17 00:00:00 2001 From: iamprashanthchowdary Date: Mon, 24 Aug 2026 18:32:55 +0530 Subject: [PATCH 12/17] chore(remove) : digilocker it was under cdn --- frontend/data/connectivity-import-lists.js | 2 +- public/favicons/digilocker.png | Bin 6452 -> 0 bytes public/favicons/nykaa.png | Bin 0 -> 1144 bytes 3 files changed, 1 insertion(+), 1 deletion(-) delete mode 100644 public/favicons/digilocker.png create mode 100644 public/favicons/nykaa.png diff --git a/frontend/data/connectivity-import-lists.js b/frontend/data/connectivity-import-lists.js index 093270eb5..faa4d7c28 100644 --- a/frontend/data/connectivity-import-lists.js +++ b/frontend/data/connectivity-import-lists.js @@ -105,7 +105,7 @@ export const IMPORT_LISTS = [ { id: 'bigbasket', name: 'Bigbasket', url: 'https://www.bigbasket.com/favicon.ico' }, { id: 'phonepe', name: 'Phonepe', url: 'https://www.phonepe.com/favicon.ico' }, { id: 'policybazaar', name: 'Policybazaar', url: 'https://www.policybazaar.com/favicon.ico' }, - { id: 'digilocker', name: 'Digilocker', url: 'https://cdn.digilocker.gov.in/digilocker-landing-page/assets/img/meta/favicon-32x32.png' }, + { id: 'nykaa', name: 'Nykaa', url: 'https://www.nykaa.com/favicon.ico' }, { id: 'amfi', name: 'AMFI', url: 'https://www.amfiindia.com/favicon.ico' }, { id: 'groww', name: 'Groww', url: 'https://groww.in/favicon.ico' }, ], diff --git a/public/favicons/digilocker.png b/public/favicons/digilocker.png deleted file mode 100644 index db74368a3e7ec1290be3a4ed507177b5fb448ff0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6452 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 KMNUMnLSTXxavBu? literal 0 HcmV?d00001 From 855a6f82b815fbeb2129b23cc8d27f53f2b4918d Mon Sep 17 00:00:00 2001 From: iamprashanthchowdary Date: Mon, 24 Aug 2026 22:32:38 +0530 Subject: [PATCH 13/17] feat(connectivity): update India import list with new services as per suggestion --- frontend/data/connectivity-import-lists.js | 8 ++++---- frontend/locales/en.json | 2 +- frontend/locales/fr.json | 2 +- public/favicons/amfi.png | Bin 681 -> 0 bytes public/favicons/cricbuzz.png | Bin 0 -> 1099 bytes public/favicons/harghartiranga.png | Bin 381 -> 0 bytes public/favicons/justdail.png | Bin 0 -> 209 bytes 7 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 public/favicons/amfi.png create mode 100644 public/favicons/cricbuzz.png delete mode 100644 public/favicons/harghartiranga.png create mode 100644 public/favicons/justdail.png diff --git a/frontend/data/connectivity-import-lists.js b/frontend/data/connectivity-import-lists.js index faa4d7c28..d228eeb45 100644 --- a/frontend/data/connectivity-import-lists.js +++ b/frontend/data/connectivity-import-lists.js @@ -98,15 +98,15 @@ export const IMPORT_LISTS = [ id: 'india', emoji: '🇮🇳', members: [ - { id: 'harghartiranga', name: 'Har Ghar Tiranga', url: 'https://harghartiranga.com/favicon.ico' }, + { id: 'cricbuzz', name: 'Cricbuzz', url: 'https://www.cricbuzz.com/favicon.ico' }, { id: 'zomato', name: 'Zomato', url: 'https://www.zomato.com/favicon.ico' }, { id: 'paytm', name: 'Paytm', url: 'https://paytm.com/favicon.ico' }, { id: 'flipkart', name: 'Flipkart', url: 'https://www.flipkart.com/favicon.ico' }, - { id: 'bigbasket', name: 'Bigbasket', url: 'https://www.bigbasket.com/favicon.ico' }, - { id: 'phonepe', name: 'Phonepe', url: 'https://www.phonepe.com/favicon.ico' }, + { id: 'bigbasket', name: 'BigBasket', url: 'https://www.bigbasket.com/favicon.ico' }, + { id: 'phonepe', name: 'PhonePe', url: 'https://www.phonepe.com/favicon.ico' }, { id: 'policybazaar', name: 'Policybazaar', url: 'https://www.policybazaar.com/favicon.ico' }, { id: 'nykaa', name: 'Nykaa', url: 'https://www.nykaa.com/favicon.ico' }, - { id: 'amfi', name: 'AMFI', url: 'https://www.amfiindia.com/favicon.ico' }, + { id: 'justdail', name: 'Justdail', url: 'https://www.justdial.com/favicon.ico' }, { id: 'groww', name: 'Groww', url: 'https://groww.in/favicon.ico' }, ], }, diff --git a/frontend/locales/en.json b/frontend/locales/en.json index 8c5a1f3bc..e4917c208 100644 --- a/frontend/locales/en.json +++ b/frontend/locales/en.json @@ -1235,7 +1235,7 @@ "defaults": "System Defaults", "iran": "Iran Essentials", "russia": "Russia Essentials", - "india": "Indian Essentials", + "india": "India Essentials", "china": "China Essentials", "brazil": "Brazil Essentials", "ai": "AI Services", diff --git a/frontend/locales/fr.json b/frontend/locales/fr.json index 082875611..c9c7ffa2b 100644 --- a/frontend/locales/fr.json +++ b/frontend/locales/fr.json @@ -1235,7 +1235,7 @@ "defaults": "Sites par défaut", "iran": "Essentiels Iran", "russia": "Essentiels Russie", - "india": "Essentiels India", + "india": "Essentiels Inde", "china": "Essentiels Chine", "brazil": "Essentiels Brésil", "ai": "Services IA", diff --git a/public/favicons/amfi.png b/public/favicons/amfi.png deleted file mode 100644 index 8cfd0445491adaf17a23626083f6c307f9ff1804..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 681 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!bOU@sT-^(N7?!sZiJUYheF19Z zD+%%oX6TL)tL0pr{o%xIAFW*z9-mHNU|^EA8VftIP>#qYn@-)UuA z=$p`HsBT&R#`l`Sr<=^7*9!N1y=JesGrDS@-GP%_2}L`#&Rxs)NSd;-PjBD7l6mJX zP5&}3f3V|MK#9U>QNMpLDy7#lEc+9l;mZ2q{@QJf7ZroJ`5AXIx=7DsUUZ%z>!GB> z{8ZbmA9w_G8NIms8P+z&JQQ?@;Z;!kxq`WM?;+s>nd}Nnbsg?~kGr(_>rWMj%~2kb zI-6ylxULb{8CaO7R&eTz)kV(B|64XEpIRYn?!{vF^3M9%94~H$J4f*BXG{`Ikbjxu zbw26_!xLMV`|+zzb#A!%o*~lqLY!8tJ`us@jdM(WqIn@gB)Mi_`J3)3>R_(bCoq`x|vNg81z%VsQV{pH(}D<0OcNkw|P-|E!lU8%`(6HnU9D$Cwtz3@y(f$>qPfILH!S?t-( z6CW&XHFYrK-I9}Y^1>#=GTk+d%jWJ{b@PVG#Z88#mHLdICaqO<=wCLe_wM7L!P{A8 z=vkLq2=7*Ne9pJ)P;CU`l@GmVos66hT1vAPAK^N1`HhddG3y<-JVBiUvB`UP_r4RG v&9vpv-Azes7K;LBt3DC=a4q`(#(xZ4m$kQfDZR-BCLsn-S3j3^P6lPuK diff --git a/public/favicons/cricbuzz.png b/public/favicons/cricbuzz.png new file mode 100644 index 0000000000000000000000000000000000000000..01e69157a636a823d6ad5696cb017f99f96cf11d GIT binary patch literal 1099 zcmV-R1ho5!P)Dtx#^tSQn3df=C{{4yJ z%|g<&Y1+X6tZ@aF!0iA4019+cPE!CY|Np_;3XWUt;0gyV000B7NklRoG%DWn|G#0 z2X9>Z*Gh2grFTuMh-dq4@g(`84Lb*%nIktc@qZ(F>qL&9 z;U*+~cBh`i#DMT7ac9k;|IRtLS@N>6 zK=ns)&$yot^`jI*Zog0v#69R+65N#n43xAbD=~5D&5n%DO?V^^IM)W{g zHydr@p+2V#$7ZLJ#S$Pz;Uoc(akaM%GUqeJKx!SG>^HgQjSvy=$-wkd*#Kvm9?WqGB~B@Wfje@k<85U?Wdn&opMAq(BWg5=7rgrwck)JU z4NOFg)g{-(F6*FSLIgV(26DldG)4->kLt%ZVI~A;`@?U5Z-0&c0EG;|Wb9SYR|Ao0>kgcF`h~uk%t+c+JpIhnZx>Ec?n_ zkZ)Hv4be;5eY-{=u<(^7Pt|o;mi`#(ES{G_Lg zV@O2n+exQ|niY6l9ajaVE%_$s@Z|sg&9_7YX3pBN>Tu)%rDA^00})GuEEWIeZM)Pf zCAi|*>o0+eC2qf|NvShjVylr8mpzr^0&j|LLjD8iYNN)whn_6{OdB6mX(!AvUV7{4 z_JnPd8&94~X=H8SJP^d{eWUvI^j?jEV><+{P1RwLZ(`r{-~&gy{>LB2@BVxIZFcxG zb$4}VqQ)9^QI~_kKsX*3|mv ZyiNC0v_5TGk_7Y=gQu&X%Q~loCIA4~s$~EG diff --git a/public/favicons/justdail.png b/public/favicons/justdail.png new file mode 100644 index 0000000000000000000000000000000000000000..6c4a1292f2eb099702d8897eaedea837614f5c29 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!Zh%jS>)-!>{%14slpgrMv!#3A z)5}l4{GaabHRtO8rx*V(OaIp(Q?&Y;&4i2pJ5ByySbJ;AKVzWAcuyC{5Q(X+{kQoJ zC~!FI^66Xr{eOOLQ`)iiwfd^+7et=hO72VjT99f0sn&X2doS8q~%tLb8O1C zX4rLII6@=)#SOnQCy`DI=EOEJC9TD(Djt^~o%waV>WM%9le>%;E+yQN09wW1>FVdQ I&MBb@0E)&|J^%m! literal 0 HcmV?d00001 From c480efac903bd20a2d57dcf1cf15594c85e39b80 Mon Sep 17 00:00:00 2001 From: iamprashanthchowdary Date: Mon, 24 Aug 2026 22:40:32 +0530 Subject: [PATCH 14/17] feat(i18n): add India to Traditional Chinese locale --- frontend/locales/zh-TW.json | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/locales/zh-TW.json b/frontend/locales/zh-TW.json index 39b29073d..79f8be83a 100644 --- a/frontend/locales/zh-TW.json +++ b/frontend/locales/zh-TW.json @@ -1235,6 +1235,7 @@ "defaults": "系統預設", "iran": "伊朗常用", "russia": "俄羅斯常用", + "india": "印度常用", "china": "中國常用", "brazil": "巴西常用", "ai": "AI 服務", From 9b49bae4934704233f370523ed9b6d649bbf4e8c Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Tue, 25 Aug 2026 09:46:47 +0800 Subject: [PATCH 15/17] Improvements --- README.md | 4 ++-- README_FR.md | 4 ++-- README_RU.md | 4 ++-- README_ZH.md | 4 ++-- README_ZH_TW.md | 4 ++-- frontend/components/widgets/Preferences.vue | 2 -- 6 files changed, 10 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 373429d27..1e23bd8ee 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +[English](README.md) | [简体中文](README_ZH.md) | [繁體中文](README_ZH_TW.md) | [Русский](README_RU.md) | [Français](README_FR.md) 👉 Demo: [https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ Feel free to bookmark the demo or deploy your own. * 📲 **PWA Supported**:Can be added as a desktop app on your phone as well as a Chrome app on your computer. * ⌨️ **Keyboard Shortcuts**: Supports keyboard shortcuts for all functions, press `?` to view the shortcut list. * 🌍 Based on availability test results, it indicates whether global internet access is currently feasible. -* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 English, Simplified Chinese, Traditional Chinese, Russian, French support. +* 🔤 Multiple languages supported. ## 📕 How to Use diff --git a/README_FR.md b/README_FR.md index b07470173..94552a6ff 100644 --- a/README_FR.md +++ b/README_FR.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +[English](README.md) | [简体中文](README_ZH.md) | [繁體中文](README_ZH_TW.md) | [Русский](README_RU.md) | [Français](README_FR.md) 👉 Démo: [https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ Notes: Vous pouvez utiliser ma démo gratuitement et vous pouvez également la d * 📲 **Prise en charge de PWA** : Peut être ajouté en tant qu'application de bureau sur votre téléphone ainsi qu'en tant qu'application Chrome sur votre ordinateur. * ⌨️ **Raccourcis clavier** : Prend en charge les raccourcis clavier pour toutes les fonctions, appuyez sur `?` pour afficher la liste des raccourcis. * 🌍 Basé sur les résultats des tests de disponibilité, il indique si l'accès Internet mondial est actuellement réalisable. -* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 Prise en charge de l'anglais, du chinois simplifié, du chinois traditionnel, du russe et du français. +* 🔤 Prise en charge de plusieurs langues. ## 📕 Comment utiliser diff --git a/README_RU.md b/README_RU.md index 7d9b69216..de6f2c5df 100644 --- a/README_RU.md +++ b/README_RU.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Сборка и публикация Docker](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +[English](README.md) | [简体中文](README_ZH.md) | [繁體中文](README_ZH_TW.md) | [Русский](README_RU.md) | [Français](README_FR.md) 👉 Демо: [https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ * 📲 **Поддержка PWA**: сайт можно установить как приложение на телефон или компьютер через Chrome. * ⌨️ **Сочетания клавиш**: все функции поддерживают горячие клавиши; нажмите `?`, чтобы открыть их список. * 🌍 По результатам проверки доступности определяется, возможен ли полноценный доступ к глобальному интернету. -* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 Поддерживаются английский, китайский (упрощённый и традиционный), русский и французский языки. +* 🔤 Поддерживаются многочисленные языки. ## 📕 Использование diff --git a/README_ZH.md b/README_ZH.md index f9ba9e76b..598cbaefc 100644 --- a/README_ZH.md +++ b/README_ZH.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +[English](README.md) | [简体中文](README_ZH.md) | [繁體中文](README_ZH_TW.md) | [Русский](README_RU.md) | [Français](README_FR.md) 👉 在这里体验:[https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ * 📲 **支持 PWA**:可以添加为手机应用以及电脑里的桌面应用,方便使用 * ⌨️ **支持快捷键**:可以随时输入 `?` 查看快捷键菜单 * 🌍 根据可用性检测结果,返回目前是否可以访问全世界网络的提示 -* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 支持简体中文、繁体中文、英文、俄文、法文 +* 🔤 支持多种语言 ## 📕 如何使用 diff --git a/README_ZH_TW.md b/README_ZH_TW.md index a02a1639b..3c5ca48de 100644 --- a/README_ZH_TW.md +++ b/README_ZH_TW.md @@ -18,7 +18,7 @@ ![CodeQL](https://github.com/jason5ng32/MyIP/actions/workflows/github-code-scanning/codeql/badge.svg?branch=main) ![Docker Build and Push](https://github.com/jason5ng32/MyIP/actions/workflows/docker-image.yml/badge.svg?branch=main) -🇺🇸 [English](README.md) | 🇨🇳 [简体中文](README_ZH.md) | 🇹🇼 [繁體中文](README_ZH_TW.md) | 🇷🇺 [Русский](README_RU.md) | 🇫🇷 [Français](README_FR.md) +[English](README.md) | [简体中文](README_ZH.md) | [繁體中文](README_ZH_TW.md) | [Русский](README_RU.md) | [Français](README_FR.md) 👉 在這裡體驗:[https://ipcheck.ing](https://ipcheck.ing) @@ -55,7 +55,7 @@ * 📲 **支援 PWA**:可以新增為手機應用程式以及電腦裡的桌面應用程式,方便使用 * ⌨️ **支援快捷鍵**:可以隨時輸入 `?` 查看快捷鍵選單 * 🌍 根據可用性偵測結果,回傳目前是否可以存取全世界網路的提示 -* 🇺🇸 🇨🇳 🇹🇼 🇷🇺 🇫🇷 支援簡體中文、繁體中文、英文、俄文、法文 +* 🔤 支援多種語言 ## 📕 如何使用 diff --git a/frontend/components/widgets/Preferences.vue b/frontend/components/widgets/Preferences.vue index 2deb43054..c57849238 100644 --- a/frontend/components/widgets/Preferences.vue +++ b/frontend/components/widgets/Preferences.vue @@ -27,7 +27,6 @@ - {{ currentLang.label }} @@ -35,7 +34,6 @@ - {{ lang.label }} Beta From cd5b25fec41c383904b92c49f3c1ce9b188f0d81 Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Tue, 25 Aug 2026 10:01:36 +0800 Subject: [PATCH 16/17] Fix(connectivity): correct the Justdial spelling The India list entry misspelled the brand as Justdail in the id, the display name, and the favicon filename; the URL already pointed at justdial.com. Co-Authored-By: Claude Fable 5 --- frontend/data/connectivity-import-lists.js | 2 +- public/favicons/{justdail.png => justdial.png} | Bin 2 files changed, 1 insertion(+), 1 deletion(-) rename public/favicons/{justdail.png => justdial.png} (100%) diff --git a/frontend/data/connectivity-import-lists.js b/frontend/data/connectivity-import-lists.js index d228eeb45..751e12fc2 100644 --- a/frontend/data/connectivity-import-lists.js +++ b/frontend/data/connectivity-import-lists.js @@ -106,7 +106,7 @@ export const IMPORT_LISTS = [ { id: 'phonepe', name: 'PhonePe', url: 'https://www.phonepe.com/favicon.ico' }, { id: 'policybazaar', name: 'Policybazaar', url: 'https://www.policybazaar.com/favicon.ico' }, { id: 'nykaa', name: 'Nykaa', url: 'https://www.nykaa.com/favicon.ico' }, - { id: 'justdail', name: 'Justdail', url: 'https://www.justdial.com/favicon.ico' }, + { id: 'justdial', name: 'Justdial', url: 'https://www.justdial.com/favicon.ico' }, { id: 'groww', name: 'Groww', url: 'https://groww.in/favicon.ico' }, ], }, diff --git a/public/favicons/justdail.png b/public/favicons/justdial.png similarity index 100% rename from public/favicons/justdail.png rename to public/favicons/justdial.png From 9c0e36a74a5f76f53924357dfe0ad18f4ade9aff Mon Sep 17 00:00:00 2001 From: jason5ng32 Date: Tue, 25 Aug 2026 10:13:54 +0800 Subject: [PATCH 17/17] Improvements --- common/locale-registry.js | 2 +- frontend/components/widgets/Preferences.vue | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/common/locale-registry.js b/common/locale-registry.js index 67da805b7..a7f5cbe6e 100644 --- a/common/locale-registry.js +++ b/common/locale-registry.js @@ -12,7 +12,7 @@ export const LOCALES = [ { code: 'en', nativeName: 'English', flag: 'us', apiTag: 'en', htmlLang: 'en', status: 'full' }, { code: 'zh', nativeName: '简体中文', flag: 'cn', apiTag: 'zh-CN', htmlLang: 'zh-CN', status: 'full' }, - { code: 'zh-TW', nativeName: '繁體中文', flag: 'tw', apiTag: 'zh-CN', htmlLang: 'zh-TW', status: 'full' }, // APIs does not support zh-TW, so apiTag alias to zh-CN + { code: 'zh-TW', nativeName: '繁體中文', flag: 'tw', apiTag: 'zh-CN', htmlLang: 'zh-TW', status: 'full' }, // Upstream APIs do not support zh-TW, so apiTag aliases to zh-CN { code: 'fr', nativeName: 'Français', flag: 'fr', apiTag: 'fr', htmlLang: 'fr', status: 'full' }, { code: 'ru', nativeName: 'Русский', flag: 'ru', apiTag: 'ru', htmlLang: 'ru', status: 'full' }, { code: 'pt-BR', nativeName: 'Português (Brasil)', flag: 'br', apiTag: 'pt-BR', htmlLang: 'pt-BR', status: 'beta' }, diff --git a/frontend/components/widgets/Preferences.vue b/frontend/components/widgets/Preferences.vue index c57849238..de701eabc 100644 --- a/frontend/components/widgets/Preferences.vue +++ b/frontend/components/widgets/Preferences.vue @@ -171,7 +171,6 @@ import { Slider } from '@/components/ui/slider'; import { Switch } from '@/components/ui/switch'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Badge } from '@/components/ui/badge'; -import { Icon } from '@iconify/vue'; import { AppWindow, Database, @@ -197,11 +196,12 @@ const onOpenChange = (val) => { store.setOpenSheet(val ? 'preferences' : null); }; -// "Follow the system" uses circle-flags:earth; other entries use ISO codes. +// Text-only options — the picker deliberately shows no flags: a language +// isn't a country (e.g. English under a US flag reads wrong to Brits). const langOptions = [ - { value: 'auto', label: t('nav.preferences.systemAuto'), flag: 'earth' }, - ...LOCALES.map(({ code, nativeName, flag, status }) => ({ - value: code, label: nativeName, flag, beta: status === 'beta', + { value: 'auto', label: t('nav.preferences.systemAuto') }, + ...LOCALES.map(({ code, nativeName, status }) => ({ + value: code, label: nativeName, beta: status === 'beta', })), ]; const currentLang = computed(() =>